Docker入门与进阶(下)
作者 |
刘畅 |
时间 |
2020-11-12 |
实验主机配置
系统centos7.5
主机名 |
ip |
配置 |
应用 |
172.16.1.71 |
2核4G/60G |
docker、docker-compose、harbor、Grafana、 Prometheus、cAdvisor |
|
harbor-backup |
172.16.1.72 |
2核4G/60G |
docker、docker-compose、harbor |
docker-client |
172.16.1.73 |
2核4G/60G |
docker、docker-compose、cAdvisor、portainer |
本文不赘述docker的安装。
目录
2.4 docker-compose.yml编排... 10
2.6 一键部署Nginx反向代理Tomcat集群... 13
3 Prometheus+Grafana监控Docker主机... 16
1 企业级镜像仓库Harbor
1.1 Harbor 概述
1 Harbor是由VMWare公司开源的容器镜像仓库。事实上,Harbor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理用户界面,基于角色的访问控制,AD/LDAP集成以及审计日志等,足以满足基本企业需求。
官方:https://goharbor.io/
Github:https://github.com/goharbor/harbor
2 Harbor 部署先决条件
(1) 服务器硬件配置
1) 最低要求:CPU2核/内存4G/硬盘40GB
2) 推荐:CPU4核/内存8G/硬盘160GB
(2) 软件
1) Docker CE 17.06版本+
2) Docker Compose 1.18版本+
(3) Harbor安装有2种方式
1) 在线安装:从Docker Hub下载Harbor相关镜像,因此安装软件包非常小。
2) 离线安装:安装包包含部署的相关镜像,因此安装包比较大,本文采用离线方式安装harbor。
下载docker compose地址
https://github.com/docker/compose/releases/download/1.27.4/docker-compose-Linux-x86_64
下载docker harbor离线包地址
https://github.com/goharbor/harbor/releases/download/v2.1.1/harbor-offline-installer-v2.1.1.tgz
1.2 Harbor HTTP搭建与使用
在172.16.1.71节点上操作
1 先安装Docker Compose
# mv docker-compose-Linux-x86_64 /usr/bin/docker-compose
# chmod +x /usr/bin/docker-compose
2 部署Harbor HTTP
# tar -xzf harbor-offline-installer-v2.1.1.tgz
# cp -a harbor.yml.tmpl harbor.yml
# vim harbor.yml
hostname: reg.lc.com
# 先注释https相关配置
https:
harbor_admin_password: Harbor12345
# ./prepare
# ./install.sh
# docker-compose ps
3 通过浏览器访问
(1) 修改windows的C:\Windows\System32\drivers\etc\hosts文件添加如下内容
172.16.1.71 reg.lc.com
(2) 在浏览器中输入http://reg.lc.com 进行访问,用户:admin 密码:Harbor12345
4 通过linux主机访问
在172.16.1.73节点上操作
(1) 修改/etc/hosts文件解析
# vim /etc/hosts
172.16.1.71 reg.lc.com
(2) 登录
# docker login reg.lc.com
错误原因:docker harbor默认使用https方式登录,现在配的docker harbor连接方式为http,所以需要在docker中配置信任该http域名,解决方法如下。
# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://b1cx9cn7.mirror.aliyuncs.com"],
"insecure-registries":["reg.lc.com"]
}
# systemctl daemon-reload
# systemctl restart docker
# docker login reg.lc.com
1.3 Harbor HTTPS搭建与使用
在172.16.1.71节点上操作,在"2 部署Harbor HTTP"基础上更新配置
1 使用cfssl工具生成域名为reg.lc.com的自签名服务证书
(1) 下载cfssl工具
# cat cfssl.sh
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
chmod +x cfssl*
mv cfssl_linux-amd64 /usr/bin/cfssl
mv cfssljson_linux-amd64 /usr/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo
# sh cfssl.sh
(2) 执行certs.sh脚本生成相关证书
# cat certs.sh
cat > ca-config.json <<EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"server": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF
cat > ca-csr.json <<EOF
{
"CN": "harbor",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing"
}
]
}
EOF
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
cat > reg.lc.com-csr.json <<EOF
{
"CN": "reg.lc.com",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing"
}
]
}
EOF
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server reg.lc.com-csr.json | cfssljson -bare reg.lc.com
# sh certs.sh
生成的证书中reg.lc.com-key.pem和reg.lc.com.pem是我所需要的
# mkdir -p /data/ssl
# cp -a reg.lc.com.pem reg.lc.com-key.pem /data/ssl/
2 Harbor启用HTTPS
# cd harbor/
# cp -a harbor.yml.tmpl harbor.yml
# vim harbor.yml
hostname: reg.lc.com
https:
# https port for harbor, default is 443
port: 443
# The path of cert and key files for nginx
certificate: /data/ssl/reg.lc.com.pem
private_key: /data/ssl/reg.lc.com-key.pem
harbor_admin_password: Harbor12345
3 重新配置并部署Harbor
# docker-compose down
down: 停止并删除容器,网络
harbor容器数据持久化目录为/data,日志持久化目录为/var/log/harbor,
删除harbor容器不会删除harbor中的数据。
# ./prepare
# docker-compose up -d
up:创建和启动容器
-d:将容器放到后台运行
4浏览器访问查看自签证书信息
5 linux主机登录docker harbor
在172.16.1.73节点上操作
# docker login reg.lc.com
解决办法:
# mkdir /etc/docker/certs.d/reg.lc.com -p
# scp -rp root@172.16.1.71:/data/ssl/reg.lc.com.pem /etc/docker/certs.d/reg.lc.com/reg.lc.com.crt
提示:
出现上面报错的原因为证书为自签证书,如果是正规机构颁发的证书不会出现如上错误。
1.4 Harbor主从复制
1 harbor主从复制架构
2、在172.16.1.72节点上部署从harbor
# mv docker-compose-Linux-x86_64 /usr/bin/docker-compose
# chmod +x /usr/bin/docker-compose
# tar -xzf harbor-offline-installer-v2.1.1.tgz
# cd harbor/
# cp -a harbor.yml.tmpl harbor.yml
# vim harbor.yml
hostname: 172.16.1.72
# 注释掉https证书相关的内容
#https:
# https port for harbor, default is 443
# port: 443
# The path of cert and key files for nginx
# certificate: /your/certificate/path
# private_key: /your/private/key/path
harbor_admin_password: Harbor12345
# ./prepare
# ./install.sh
3、在172.16.1.71节点上创建主从复制
(1) 系统管理—>仓库管理—>新建目标
(2) 系统管理—>仓库管理—>新建规则
(3) 测试
1) 当在172.16.1.71主节点上提交镜像后,172.16.1.72从节点会被同步到镜像。
2) harbor镜像同步只会同步镜像。
3) 比如一个项目和镜像只在主节点上存在,当启动复制规则后,会把项目名和镜像同步到
从节点,项目下的用户不会被同步,当主节点删除该项目,从节点的镜像会被删除,但项
目名会被保留。
1.5 Harbor 基本使用
以library项目为例
1 在项目中标记镜像
docker tag SOURCE_IMAGE[:TAG] reg.lc.com/library/REPOSITORY[:TAG]
2 推送镜像到当前项目
docker push reg.lc.com/library/REPOSITORY[:TAG]
1.6 Harbor运维维护
1 harbor相关容器及服务
容器 |
功能 |
harbor-core |
配置管理中心 |
harbor-db PG |
数据库 |
harbor-jobservice |
负责镜像复制 |
harbor-log |
记录操作日志 |
harbor-portal Web |
管理页面和API |
nginx |
前端代理,负责前端页面和镜像上传/下载转发 |
redis |
会话 |
registryctl |
镜像存储 |
容器数据持久化目录:/data
日志文件目录:/var/log/harbor
数据库做好定期备份。
docker-compose命令引用的配置文件默认是当前目录下的docker-compose.yml文件。
2 单机编排利器Docker Compose
在172.16.1.73节点上操作
2.1 Compose是什么
1 Compose是用于定义和运行多容器的工具。
2 通过Compose可以使用YAML文件来配置容器。然后,使用一个命令就可以从配置中创建并
启动所有服务。
3 使用Compose大致为三步
(1) 定义Dockerfile,以便可以在任意环境运行
(2) 定义应用程序启动配置文件docker-compose.yml
(3) docker-compose启动并管理整个应用程序生命周期
4 官方文档
https://docs.docker.com/compose/
2.2 Linux安装Compose
1 下载二进制文件
curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-Linux-x86_64 -o /usr/bin/docker-compose
2 添加可执行权限:
chmod +x /usr/bin/docker-compose
2.3 Compose常用选项与命令
1 常用选项
(1) -f,--file 指定yaml文件,默认docker-compose.yml
1) Docker-compose读取文件的目录是根据指定"-f docker-compose.yml"所在的目录确定的。
2) 如果编写的文件名就是docker-compose.yml,docker-compose命令操作时可以不指定。
(2) -p,--project-name 指定项目名称,默认是当前目录
2 命令
build |
重新构建服务 |
ps |
列出所有容器(包括在线或不在线的) |
up |
创建和启动容器 |
exec |
在容器里执行命令 |
scale |
指定一个服务容器启动数量 |
down |
删除容器、网络、数据卷和镜像 |
stop/start/restart |
停止/启动/重启服务 |
2.4 docker-compose.yml编排
1 示例
https://docs.docker.com/compose/compose-file/
2 常用yml参数
2.5 一键部署LNMP网站平台
1 环境设置
[root@docker-client ~]# cd /root/compose_lnmp/
[root@docker-client compose_lnmp]# tree -L 2
# docker-compose配置文件内容
2 构建镜像
[root@docker-client compose_lnmp]# docker-compose build
[root@docker-client compose_lnmp]# docker-compose up -d
4 查看服务
[root@docker-client compose_lnmp]# docker-compose ps
5 访问wordpress网站
http://172.16.1.73/wordpress/
因为所有的docker服务都在同一个docker网络中,在不暴露docker服务端口的情况下
可以通过docker容器的名称访问到docker容器内部服务的端口号。
2.6 一键部署Nginx反向代理Tomcat集群
1 环境设置
[root@docker-client ~]# cd compose_lnmt/
[root@docker-client compose_lnmt]# tree -L 2
# docker-compose.yml文件内容
2 构建镜像
[root@docker-client compose_lnmt]# docker-compose build
3 创建容器并在后台运行
[root@docker-client compose_lnmt]# docker-compose up -d
4 查看服务
[root@docker-client compose_lnmt]# docker-compose ps
5 访问网站
http://172.16.1.73/
6 查看docker网络信息
2.7 小结
以上通过docker-compose安装的lnmp、lnmt服务,执行docker-compose down命令后不会删除挂
载卷中存储的数据,执行docker-compose up -d命令即可在保留原来数据的情况下将容器服务拉起。
3 Prometheus+Grafana监控Docker主机
3.1 监控系统概述
1 cAdvisor(Container Advisor)
用于收集正在运行的容器资源使用和性能信息。
https://github.com/google/cadvisor
2 Prometheus(普罗米修斯)
容器监控系统。
https://prometheus.io
https://github.com/prometheus
3 Grafana
是一个开源的度量分析和可视化系统。
https://grafana.com/grafana
4 数据采集顺序
3.2 监控系统部署
1 Docker部署cAdvisor
在172.16.1.71、73节点上操作
# docker run -d \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
--restart=always \
google/cadvisor:latest
# cadvisor访问url地址
http://172.16.1.73:8080/containers/
http://172.16.1.73:8080/metrics
2 Docker部署Grafana
在172.16.1.71节点上操作
# mkdir -p /opt/grafana/
# chown -R 472.472 /opt/grafana/
# docker run -d \
--name grafana7.1.5 \
-p 3000:3000 \
-v /opt/grafana:/var/lib/grafana \
--restart=always \
grafana/grafana:7.1.5
# 数据目录/var/lib/grafana
# grafana访问url地址
http://172.16.1.71:3000
grafana初次访问的用户名和密码都是"admin",输入初始密码后会让你修改
密码,我这里密码设置为"123456"
3 Docker部署Prometheus
在172.16.1.71节点上操作
# mkdir -p /opt/prometheus/
# 上传prometheus.yml文件到/opt/prometheus/目录,添加监控主机如下
# docker run -d \
--name prometheus \
-p 9090:9090 \
-v /opt/prometheus:/etc/prometheus \
--restart=always \
prom/prometheus
# 配置文件目录/etc/prometheus
# Prometheus访问url地址
http://172.16.1.71:9090/
3.3 Grafana展示
1 添加prometheus库
2 添加模版
https://grafana.com/dashboards
ID:193
3 会看到一个监控172.16.1.71、72上所有容器(cpu、内存、网络)的dashboard。
3.4 监控多Docker主机
1 添加选择多节点按钮
label_values(up,instance)
2 图表增加筛选条件
' ,instance="$Node" '
4 补充
4.1 docker图形化界面
在172.16.1.73节点上操作
1 说明
Docker 图形化管理提供了很多工具,有Portainer、Docker UI、Shipyard等等,本文主要介绍Portainer。Portainer是一个开源、轻量级Docker管理用户界面,基于Docker API,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型单位对容器管理的全部需求。
官方网站:https://portainer.io/
官方文档:https://portainer.readthedocs.io/
演示网址:http://demo.portainer.io 账号admin 密码 tryportainer
2 安装
# docker run -d \
--name portainerUI \
-p 9000:9000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /opt/portainer_data:/data \
portainer/portainer
# 数据目录/data
# 访问portainer
http://172.16.1.73:9000/
3 设置一个密码即可,点击创建用户
4 我们搭建的是单机版,直接选择Local ,点击连接
5 现在就可以使用了,点击Local进入仪表盘主页面
6 容器页面
7 portainer 管理远程docker主机
(1) 在172.16.1.72节点上开启DockerAPI
# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
# systemctl daemon-reload
# systemctl restart docker
# netstat -tulp | grep docker
tcp6 0 0 [::]:2375 [::]:* LISTEN 2132/dockerd
(2) 添加远程docker主机
(3) 添加成功
4.2 grafana图标不出数据的原因
1 时间没有同步
2 promql有问题,可能是版本不兼容
3 prometheus里没有数据