目录
一.Docker Compose简介
Docker Compose是一个用来定义和运行复杂应用的Docker工具。使用Compose,你可以在一个文件中定义一个多容器应用,然后使用一条命令来启动你的应用,完成一切准备工作。一个使用Docker容器的应用,通常由多个容器组成。使用Docker Compose,不再需要使用shell脚本来启动容器。在配置文件中,所有的容器通过services
来定义,然后使用docker-compose
脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器。
常用命令列表:
字段 | 描述 |
build | 重新构建服务 |
ps | 列出容器 |
up | 创建和启动容器 |
exec | 在容器里面执行命令 |
scale | 指定一个服容器启动数量 |
top | 显示容器进程 |
logs | 查看容器输出 |
down | 删除容器、网络、数据卷和镜像 |
stop/start/restart | 停止/启动/重启服务 |
配置常用字段:
字段 | 描述 |
build dockerfile context | 指定Dockerfile文件名构建镜像上下文路径 |
image | 指定镜像 |
command | 执行命令,覆盖默认命令 |
container name | 指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale |
deploy | 指定部署和运行服务相关配置,只能在Swarm模式使用 |
environment | 添加环境变量 |
networks | 加入网络 |
ports | 暴露端口号,与-p相同,但端口号不能低于60 |
volume | 挂载宿主机路径或命令卷 |
restart | 重启策略,默认no,always,no-failure,unless-stoped |
hostname | 容器主机名 |
二.部署compose
1.环境部署所有主机安装docker环境
[root@localhost ~]# yum -y install docker-ce
2.将compose放入指定目录
[root@localhost local]# mv docker-compose /usr/local/bin/
[root@localhost local]# ll
总用量 0
drwxr-xr-x. 2 root root 28 11月 30 18:53 bin
[root@localhost local]# cd bin/
[root@localhost bin]# ll
总用量 10616
-rw-r--r--. 1 root root 10867152 11月 30 11:43 docker-compose
[root@localhost bin]# chmod +x /usr/local/bin/docker-compose
3.搭建nginx服务 (搭建方法参照nginx服务搭建)
4.将需要的文件放入compose目录内
[root@localhost compose_nginx]# vi docker-compose.yml
version: '3'
services:
nginx:
hostname: nginx
build:
context: ./nginx
dockerfile: Dockerfile
ports:
- 1216:80
- 1218:443
networks:
- abc
volumes:
- ./wwwroot:/usr/local/nginx/html
networks:
abc:
[root@localhost compose_nginx]# tree ./
./
├── docker-compose.yml
└── nginx
├── Dockerfile
├── nginx-1.12.2.tar.gz
└── run.sh
5.启动compose
[root@localhost compose_nginx]# docker-compose -f docker-compose.yml up -d
Successfully built 1367ff129fd5
Successfully tagged compose_nginx_nginx:latest
[root@localhost compose_nginx]# docker ps -a ##查看容器状态
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5ec2cd46f839 compose_nginx_nginx "/run.sh" 32 seconds ago Up 31 seconds 0.0.0.0:1216->80/tcp, 0.0.0.0:1218->443/tcp compose_nginx_nginx_1
[root@localhost compose_nginx]# ll
总用量 4
-rw-r--r--. 1 root root 253 11月 30 19:07 docker-compose.yml
drwxr-xr-x. 2 root root 65 11月 30 19:09 nginx
drwxr-xr-x. 2 root root 6 11月 30 19:14 wwwroot ##生成新的目录
创建测试网页
[root@localhost compose_nginx]# cd wwwroot/
[root@localhost wwwroot]# echo '<h1>test web</h1>' > index.html
测试
三.服务发现-consul
在分布式系统结构中,往往由成百上千的业务服务组成,为了容灾(节点宕机)、扩容(增加节点)、提高运维效率(动态配置)等原因,需要服务能够实现灵活发现,避免问题节点等功能,以提高系统稳定性
安装consul
创建文件夹,导入consul包解压
[root@localhost ~]# mkdir consul
[root@localhost ~]# cd consul/
[root@localhost consul]# rz -E
rz waiting to receive.
[root@localhost consul]# unzip consul_0.9.2_linux_amd64.zip
Archive: consul_0.9.2_linux_amd64.zip
inflating: consul
[root@localhost consul]# mv consul /usr/local/bin/
[root@localhost consul]# mv consul /usr/local/bin/
[root@localhost consul]# consul agent \ ##使用代理功能
> -server \
> -bootstrap \
> -ui \
> -data-dir=/var/lib/consul-data \
> -bind=192.168.100.10 \
> -client=0.0.0.0 \
> -node=consul-server01 &> /var/log/consul.log & ##放入后台运行
[1] 65904
参数解释:
-server: 运行在server模式
-data-dir:指定数据目录,其他的节点对于这个目录必须有读的权限
-node:指定节点的名称
-bind:为该节点绑定一个地址
-ui:使用自带的ui,
-ui-dir:指定ui的目录,使用自己定义的ui
-client:指定web ui、的监听地址,默认127.0.0.1只能本机访问。
查看集群信息
[root@localhost consul]# consul members
Node Address Status Type Build Protocol DC
consul-server01 192.168.100.10:8301 alive server 0.9.2 2 dc1
[root@localhost consul]# consul info | grep leader
leader = true
leader_addr = 192.168.100.10:8300
登录测试
在另一台容器上安装Gliderlabs/Registrator
[root@localhost ~]# docker run -d \
> --name=registrator \
> --net=host \
> -v /var/run/docker.sock:/tmp/docker.sock \
> --restart=always \
> gliderlabs/registrator:latest \
> -ip=192.168.100.13 \
> consul://192.168.100.10:8500
测试服务发现功能
[root@localhost ~]# docker run -itd -p 83:80 --name test1 -h test01 nginx
[root@localhost ~]# docker run -itd -p 84:80 --name test2 -h test02 nginx
四.consul-template
consul-template是一个守护进程,用于实时查询consul集群信息,并更新文件系统上任意数量的指定模板,生成配置文件,更新完成以后,可以选择运行shell命令执行更新操作,重新加载Nginx。consul-template可以查询consul中的服务目录、Key、Key-values等。这种强大的抽象功能和查询语言模板可以使consul-template特别适合动态的创建配置文件
准备template nginx模板文件
[root@localhost ~]# vim /root/consul/nginx.ctmpl
upstream http_backend {
{{range service "nginx"}}
server {{.Address}}:{{.Port}};
{{end}}
}
server {
listen 83;
server_name localhost 192.168.100.14;
access_log /var/log/nginx/kgc.cn-access.log;
index index.html index.php;
location / {
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Client-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://http_backend;
}
}
编译安装nginx
[root@localhost consul]# yum -y install gcc gcc-gcc++ pcre-devel zlib-devel
[root@localhost conf]# mkdir /var/log/nginx ##建立日志文件目录
[root@localhost conf]# /usr/local/nginx/sbin/nginx ##启动nginx服务
[root@localhost conf]# netstat -anpt | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 63784/nginx: master
配置并启动template
[root@localhost ~]# mv consul-template /usr/local/bin/
[root@localhost ~]# consul-template -consul-addr 192.168.100.14:8500 -template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/kgc.conf:/usr/local/nginx/sbin/nginx -s reload" --log-level=info ##将template模板导入nginx
2020/12/01 06:31:27.687818 [INFO] consul-template v0.19.3 (ebf2d3d)
2020/12/01 06:31:27.687834 [INFO] (runner) creating new runner (dry: false, once: false)
2020/12/01 06:31:27.688223 [INFO] (runner) creating watcher
2020/12/01 06:31:27.688915 [INFO] (runner) starting
2020/12/01 06:31:27.688929 [INFO] (runner) initiating run
2020/12/01 06:31:27.695701 [INFO] (runner) initiating run
2020/12/01 06:31:27.702410 [INFO] (runner) rendered "/root/consul/nginx.ctmpl" => "/usr/local/nginx/conf/vhost/kgc.conf"
2020/12/01 06:31:27.702438 [INFO] (runner) executing command "/usr/local/nginx/sbin/nginx -s reload" from "/root/consul/nginx.ctmpl" => "/usr/local/nginx/conf/vhost/kgc.conf"
2020/12/01 06:31:27.702533 [INFO] (child) spawning: /usr/local/nginx/sbin/nginx -s reload
测试nginx服务
查看容器日志
[root@localhost ~]# docker logs -f test1
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
192.168.100.14 - - [01/Dec/2020:06:38:48 +0000] "GET / HTTP/1.0" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36" "192.168.100.1"
查看consul主机配置文件
[root@localhost vhost]# cat kgc.conf
upstream http_backend {
server 192.168.100.13:83; ##自动发现容器服务
server 192.168.100.13:84;
}
server {
listen 83;
server_name localhost 192.168.100.14;
access_log /var/log/nginx/kgc.cn-access.log;
index index.html index.php;
location / {
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Client-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://http_backend;
}
}
五.consul多节点配置
新建一个拥有docker服务的主机加入已有群集中
与之前consul配置一致
[root@localhost docker]# consul agent \
> -server \
> -bootstrap \
> -ui \
> -data-dir=/var/lib/consul-data \
> -bind=192.168.100.15 \
> -client=0.0.0.0 \
> -node=consul-server02 \
> -enable-script-checks=true \
> -datacenter=dc1 \
> -join 192.168.100.14 &> /var/log/consul.log &
参数解释:
-bootstrap-expect:集群期望的节点数,只有节点数量达到这个值才会选举leader。
-server: 运行在server模式
-data-dir:指定数据目录,其他的节点对于这个目录必须有读的权限
-node:指定节点的名称
-bind:为该节点绑定一个地址
-config-dir:指定配置文件,定义服务的,默认所有一.json结尾的文件都会读
-enable-script-checks=true:设置检查服务为可用
-datacenter: 数据中心没名称,
-join:加入到已有的集群中