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