Docker Compose容器编排
构建自动发现的Docker服务架构
实现容器服务自动加入Nginx集群php
**Docker Compose容器编排功能** Docker compose的前身是Fig,它是一个定义及运行多个docker容器的工具 使用Docker Compose再也不须要使用shell脚原本启动容器 Docker Compose很是适合组合是同多个容器进行开发的场景 能够执行多个容器的操做
**Docker Compose容器编排** YAML是一种标记语言很直观的数据序列化格式 文件格式及编写注意事项 不支持表符tab缩进,须要使用空格缩进 一般开头缩进2个空格 字符后缩进1个空格,如冒号,逗号,横杠 用#号注释 若是包含特殊字符用单引号引发来 布尔值必须用引号括起来
build dockerfile context 指定Dockerfile文件名构建镜像上下文路径 image 指定镜像 command 执行命令,覆盖默认命令 container name 指定容器名称,因为容器名称是惟一的,若是指定自定义名称,则没法scale deploy 指定部署和运行服务相关配置,只能在swarm模式使用 environment 添加环境变量 networks 加入网络 ports 暴露容器端口,但端口不能低于60 volumes 挂载宿主机或命令卷,像数据卷同样 restart 重启策略 hostname 容器主机名
build 从新构建服务 ps 列出容器 up 建立和启动容器 exec 在容器里面执行命令 scale 指定一个服务容器启动数量 top 显示容器进程 logs 查看容器输出 down 删除容器,网络,数据卷和镜像 stop/start/restart 中止/启动/重启服务
docker-compose选项 --verbose 输出更多调试信息 --version 打印版本并退出 -f,--file 使用特定的compose模板文件,默认为docker-compose.yml -p,指定项目名称,默认使用目录名称
Consul是HashCorp公司推出获得开源工具,用于实现分布式系统的服务与配置 Consul的特性 Consul支持健康检查,容许存储键值对 一致性协议采用Raft算法,用来保证服务的高可用 成员管理和消息广播采用GOSSIP协议,支持ACL访问控制列表,与docker无缝配合
每一个提供服务的节点上都要部署Consul的agent Consul agent有两种运行模式 Server Client Server和Client只是Conusl集群层面的区分,与搭建在Cluster之上的应用服务无关
consul群集架构,发现注册nginx中的docker容器,监控节点服务器的状态。
consul server服务器中的nginx作反向代理去轮询访问服务器池中的一个个容器。用户访问代理端口,就能访问到后面的多个容器,咱们的端口作了两次映射。consul服务器上能够统一修改配置文件html
-----------------------------------------------------docker-compose容器编排----------------------------------------------------------------node
#宿主机的共享目录有nginx软件包,咱们挂载到/opt/目录下 mount.cifs //192.168.100.25/LNMP /opt/ #建立容器编排目录 mkdir /root/compose_ngin #建立nginx容器镜像 cd compose_nginx/ mkdir nginx cd nginx/ cd /opt/ cp nginx-1.12.0.tar.gz /root/compose_nginx/nginx/ cd /root/compose_nginx/nginx/ #加上nginx启动脚本 vim run.sh #!/bin/bash /usr/local/nginx/sbin/nginx [root@localhost nginx]# vim Dockerfile FROM centos:7 MAINTAINER this is nginx <chen> RUN yum -y update RUN yum -y install wget pcre-devel zlib-devel make zlib gcc gcc-c++ openssl-devel net-tools RUN useradd -M -s /sbin/nologin nginx ADD nginx-1.12.0.tar.gz /usr/local/src WORKDIR /usr/local/src WORKDIR nginx-1.12.0 RUN ./configure \ --prefix=/usr/local/nginx \ --user=nginx \ --group=nginx \ --with-http_stub_status_module && make && make install ENV PATH /usr/local/nginx/sbin:$PATH EXPOSE 80 EXPOSE 443 RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf WORKDIR /root/nginx ADD run.sh /run.sh RUN chmod 755 /run.sh CMD ["/run.sh"]
[root@localhost compose_nginx]# vim docker-compose.yml version: '3' services: nginx: hostname: nginx build: context: ./nginx dockerfile: Dockerfile ports: - 1216:80 - 1217:443 networks: - chen volumes: - ./wwwroot:/usr/local/nginx/html networks: chen: [root@localhost compose_nginx]# mount.cifs //192.168.100.25/compose /mnt/ Password for root@//192.168.100.25/compose: [root@localhost compose_nginx]# cd /mnt/ [root@localhost mnt]# ls consul_0.9.2_linux_amd64.zip consul-template_0.19.3_linux_amd64.zip docker-compose [root@localhost mnt]# cp -p docker-compose /usr/local/bin/ [root@localhost mnt]# chmod +x /usr/local/bin/docker-compose #开启路由转发 [root@localhost compose_nginx]# vim /etc/sysctl.conf net.ipv4.ip_forward=1[root@localhost compose_nginx]# sysctl -p net.ipv4.ip_forward = 1
[root@localhost compose_nginx]# docker-compose -f docker-compose.yml up -d [root@localhost compose_nginx]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 66d7cee5692d compose_nginx_nginx "/run.sh" 11 seconds ago Up 9 seconds 0.0.0.0:1216->80/tcp, 0.0.0.0:1217->443/tcp compose_nginx_nginx_1
[root@localhost compose_nginx]# ls docker-compose.yml nginx wwwroot [root@localhost compose_nginx]# cd wwwroot/ [root@localhost wwwroot]# vim index.html <h1>this is chen web ! ! !</h1>
-------------------------------------------------------------------consul部署----------------------------------------------------------------------linux
[root@localhost ~]# mkdir consul [root@localhost ~]# cd /mnt/ [root@localhost mnt]# ls consul_0.9.2_linux_amd64.zip consul-template_0.19.3_linux_amd64.zip docker-compose [root@localhost mnt]# cp consul_0.9.2_linux_amd64.zip /root/consul/ [root@localhost mnt]# cd /root/consul/ [root@localhost consul]# ls consul_0.9.2_linux_amd64.zip [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/bin/ #使用conusl agent代理功能 [root@localhost consul]# consul agent \ #指定server功能 #参与领袖 #ui界面 #参数指定位置 #绑定本地地址 #面对全部节点 #本地节点名称混合输出到日志中,放在后台运行 > -server \ > -bootstrap \ > -ui \ > -data-dir=/var/lib/consul-data \ > -bind=192.168.136.142 \ > -client=0.0.0.0 \ > -node=consul-server01 &> /var/log/consul.log & [1] 37957 #查看群集信息 [root@localhost consul]# consul members Node Address Status Type Build Protocol DC consul-server01 192.168.136.142:8301 alive server 0.9.2 2 dc1 #如今只有一台,它就是老大 [root@localhost consul]# consul info | grep leader leader = true leader_addr = 192.168.136.142:8300
[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.136.167 \ #指定你本地的地址 > consul://192.168.136.142:8500 #指定consul的地址 #两个nginx服务容器 [root@localhost ~]# docker run -itd -p:83:80 --name test-01 -h test01 nginx root@localhost ~]# docker run -itd -p:84:80 --name test-02 -h test02 nginx #两个apache服务5容器 [root@localhost ~]# docker run -itd -p:88:80 --name test-03 -h test02 httpd [root@localhost ~]# docker run -itd -p:89:80 --name test-04 -h test04 httpd #查看全部容器 [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 00a94fe6fd0c httpd "httpd-foreground" 6 seconds ago Up 5 seconds 0.0.0.0:89->80/tcp test-04 b47b89287e43 httpd "httpd-foreground" 38 seconds ago Up 37 seconds 0.0.0.0:88->80/tcp test-03 9b695e1d8660 nginx "nginx -g 'daemon of…" About a minute ago Up About a minute 0.0.0.0:84->80/tcp test-02 3cbf17118dab nginx "nginx -g 'daemon of…" 2 minutes ago Up 2 minutes 0.0.0.0:83->80/tcp test-01 055caf398060 gliderlabs/registrator:latest "/bin/registrator -i…" 3 minutes ago Up 3 minutes registrator
Consul-Templatee 是一个守护进程,用于实时查询Consul集群信息,并更新文件系统上 任意数量的指定模板,生成配置文件。更新完成之后,能够选择运行shell命令执行更新操做,从新加载nginx,Consul-template 能够查询Consul中的服务目录,key,key-values等 这种强大的抽象功能和查询语言模板可使Consul-template特别适合动态的建立配置文件 [root@localhost ~]# cd /root/ [root@localhost ~]# ls anaconda-ks.cfg compose_nginx initial-setup-ks.cfg 公共 文档 模板 音乐 chen consul 下载 图片 桌面 视频 [root@localhost ~]# cd consul/ [root@localhost consul]# ls consul_0.9.2_linux_amd64.zip [root@localhost consul]# #准备temlate nginx 模板文件 [root@localhost consul]# vim nginx.ctmpl upstream http_backend { {{range service "nginx"}} server {{.Address}}:{{.port}}; {{end}} } server { listen 1216; server_name localhost 192.168.136.167; 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 nginx-1.12.0]# yum install gcc gcc-c++ pcre-devel zlib-devel -y [root@localhost nginx-1.12.0]# ./configure --prefix=/usr/local/nginx [root@localhost nginx-1.12.0]# make && make install [root@localhost nginx-1.12.0]# vim /usr/local/nginx/conf/nginx.conf #nginx中有events,http,if,location,字段 19 include vhost/*.conf; [root@localhost nginx-1.12.0]# cd /usr/local/nginx/conf/ [root@localhost conf]# mkdir vhost [root@localhost consul]# cd /var/log/ [root@localhost log]# mkdir /var/log/nginx [root@localhost log]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ [root@localhost log]# nginx [root@localhost log]# netstat -ntap | grep nginx tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 107612/nginx: ma [root@localhost opt]# cd /mnt/ [root@localhost mnt]# cp consul-template_0.19.3_linux_amd64.zip /root/ [root@localhost mnt]# cd /root/ [root@localhost ~]# unzip consul-template_0.19.3_linux_amd64.zip [root@localhost ~]# mv consul-template /usr/bin/ #启用模板 [root@localhost ~]# consul-template -consul-addr 192.168.136.142:8500 \ > -template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/kgc.conf:/usr/local/nginx/sbin/nginx -s reload" \ > --log-level=info #coul服务器处于监控状态,咱们再开一台终端同一台服务器的
#验证nginx
#增长一个nginx容器节点 增长一个nginx容器节点,测试服务发现及配置更新功能 //在registrator服务端注册 dockers run -itd -p:85:80 --name test-05 -h test05 nginx docker logs -f test-01 docker logs -f test-02 docker logs -f test-05