Docker Compose容器編排

本章知識點歸納:

Docker Compose容器編排
構建自動發現的Docker服務架構
實現容器服務自動加入Nginx集羣php

**Docker Compose容器編排功能**
Docker compose的前身是Fig,它是一個定義及運行多個docker容器的工具
使用Docker Compose再也不須要使用shell腳原本啓動容器
Docker Compose很是適合組合是同多個容器進行開發的場景
能夠執行多個容器的操做
**Docker Compose容器編排**
YAML是一種標記語言很直觀的數據序列化格式
文件格式及編寫注意事項
不支持表符tab縮進,須要使用空格縮進
一般開頭縮進2個空格
字符後縮進1個空格,如冒號,逗號,橫槓
用#號註釋
若是包含特殊字符用單引號引發來
布爾值必須用引號括起來

Docker Compose配置經常使用字段

build dockerfile context 指定Dockerfile文件名構建鏡像上下文路徑
image   指定鏡像
command  執行命令,覆蓋默認命令
container name  指定容器名稱,因爲容器名稱是惟一的,若是指定自定義名稱,則沒法scale
deploy 指定部署和運行服務相關配置,只能在swarm模式使用
environment  添加環境變量
networks  加入網絡
ports  暴露容器端口,但端口不能低於60
volumes  掛載宿主機或命令卷,像數據卷同樣
restart  重啓策略
hostname 容器主機名

Docer Compose經常使用命令

build  從新構建服務
ps  列出容器
up  建立和啓動容器
exec  在容器裏面執行命令
scale  指定一個服務容器啓動數量
top 顯示容器進程
logs 查看容器輸出
down  刪除容器,網絡,數據卷和鏡像
stop/start/restart 中止/啓動/重啓服務

Compose 命令說明

docker-compose選項
--verbose 輸出更多調試信息
--version 打印版本並退出
-f,--file 使用特定的compose模板文件,默認爲docker-compose.yml
-p,指定項目名稱,默認使用目錄名稱

Consul

Consul是HashCorp公司推出獲得開源工具,用於實現分佈式系統的服務與配置
Consul的特性
Consul支持健康檢查,容許存儲鍵值對
一致性協議採用Raft算法,用來保證服務的高可用
成員管理和消息廣播採用GOSSIP協議,支持ACL訪問控制列表,與docker無縫配合

構建自動發現的Docker服務架構

創建Consul服務

每一個提供服務的節點上都要部署Consul的agent
Consul agent有兩種運行模式
Server
Client
Server和Client只是Conusl集羣層面的區分,與搭建在Cluster之上的應用服務無關

consul羣集架構,發現註冊nginx中的docker容器,監控節點服務器的狀態。
consul server服務器中的nginx作反向代理去輪詢訪問服務器池中的一個個容器。用戶訪問代理端口,就能訪問到後面的多個容器,咱們的端口作了兩次映射。consul服務器上能夠統一修改配置文件

Docker Compose容器編排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"]

編寫docker-compose編排安裝nginx

[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

利用編排工具開啓nginx

[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>

Docker Compose容器編排

-------------------------------------------------------------------consul部署----------------------------------------------------------------------linux

自動發現註冊多個docker容器節點,要想被consul管理,就要去註冊,知足搜索條件agent就會提交註冊請求,consul server自動發現去處理註冊請求,監控容器的狀態,template模板

[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

第二臺節點服務器(建立多個容器)容器服務自動加入nginx集羣

[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

驗證http和nginx服務是否註冊到consul

Docker Compose容器編排

consul服務器

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服務器處於監控狀態,咱們再開一臺終端同一臺服務器的

#驗證
Docker Compose容器編排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
相關文章
相關標籤/搜索