Docker compose基於容器編排構建實踐

  上一篇我們介紹了通過使用Dockerfile構建LNMP環境,但是我們也發現了其中的缺陷;就是容器多的時候我們管理起來也是不方便的;我們需要考慮的就是把一組環境分組,然後按照執行順序一鍵啓動即可。(http://xiaoluoge.blog.51cto.com/9141967/1902501上一篇地址):


下面我們具體按照上一次咱們構建的wordpress環境:

1、安裝docker compose,我們還是使用daocloud來進行安裝,你懂得github有時候也挺慢的:

[root@test ~]# curl -L https://get.daocloud.io/docker/compose/releases/download/1.11.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
[root@test ~]# chmod +x /usr/local/bin/docker-compose
[root@test ~]# docker-compose version
docker-compose version 1.11.2, build dfed245
docker-py version: 2.1.0
CPython version: 2.7.13
OpenSSL version: OpenSSL 1.0.1t  3 May 2016

2、我們已經安裝了compose之後,我們直接引用我們之前的創建的鏡像先來構建一個wordpress,首先看一下我們compose版本的編寫(在v3版本支持stask,後面講):

[root@test docker-compose]# cat lnmp.yml 
version: "2"
services:
  php:
    image:  lnmp/php:1.0
    volumes:
       -  /web:/web
  nginx:
    image:  lnmp/nginx:1.0
    ports:
      - 80:80
    volumes:
      - /web:/web
    links:
      - php
  mysql:
    image: lnmp/mysql:1.0
    ports:
      - 3306:3306
    volumes:
      - /opt/data:/var/lib/mysql

##image和build必須存在一個,爲了節約時間,我們沒有用dockerfile構建一個鏡像,剩下的指令基本上和docker run一樣的所以這裏不多介紹。


3、我們啓動一下docker-compose 構建這些鏡像:

[root@test docker-compose]# docker-compose -f lnmp.yml up -d
Starting dockercompose_mysql_1
Starting dockercompose_php_1
Starting dockercompose_nginx_1

##-f指定文件,-d表示後臺運行。up表示構建之後直接一步啓動。


4、我們可以看下docker-compose 日誌:

[root@test docker-compose]# docker-compose  -f lnmp.yml logs
Attaching to dockercompose_nginx_1, dockercompose_mysql_1, dockercompose_php_1
mysql_1  | Installing MySQL system tables...
mysql_1  | OK
mysql_1  | Filling help tables...
mysql_1  | OK
mysql_1  | 
mysql_1  | To start mysqld at boot time you have to copy
mysql_1  | support-files/mysql.server to the right place for your system

5、看一下進程的啓動狀態:
[root@test docker-compose]# docker-compose  -f lnmp.yml ps
        Name                      Command             State           Ports          
------------------------------------------------------------------------------------
dockercompose_mysql_1   /bin/bash /opt/startup.sh     Up      0.0.0.0:3306->3306/tcp 
dockercompose_nginx_1   /usr/local/nginx/sbin/nginx   Up      0.0.0.0:80->80/tcp     
dockercompose_php_1     /usr/local/php/sbin/php-fpm   Up      9000/tcp


6、看到我們的環境都已經起來了,我們訪問一下web試試:

wKiom1i4PQiSYIB-AAG1eWHuvps133.png-wh_50

##可以看到效果出現了,因爲我們之前用-v 把數據庫持久化到/opt/data下面,所以不管怎麼換容器我們的數據庫還是一樣能用的。


7、構建這個還是比較簡單,我們瞭解一下compose啓動的相關參數:

[root@test docker-compose]# docker-compose --help
Commands:
  build              Build or rebuild services
  bundle             Generate a Docker bundle from the Compose file
  config             Validate and view the compose file
  create             Create services
  down               Stop and remove containers, networks, images, and volumes
  events             Receive real time events from containers
  exec               Execute a command in a running container
  help               Get help on a command
  kill               Kill containers
  logs               View output from containers
  pause              Pause services
  port               Print the public port for a port binding
  ps                 List containers
  pull               Pull service images
  push               Push service images
  restart            Restart services
  rm                 Remove stopped containers
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
  stop               Stop services
  top                Display the running processes
  unpause            Unpause services
  up                 Create and start containers
  version            Show the Docker-Compose version information

##compose文件的編寫基本跟docker run差不多的;我們需要強調的是scale這個指令。通過compose 我們可以快速的複製出這樣一個容器副本。當然是我們沒有做像外部的端口映射情況下,我們可以這樣做;這個應用像比如我們跑多個任務,我們可以用scale複製出多個任務,看一下。


8、scale複製出兩個php容器:

[root@test docker-compose]# docker-compose -f lnmp.yml scale php=2
Creating and starting dockercompose_php_2 ... done
[root@test docker-compose]# docker-compose -f lnmp.yml ps
        Name                      Command             State           Ports          
------------------------------------------------------------------------------------
dockercompose_mysql_1   /bin/bash /opt/startup.sh     Up      0.0.0.0:3306->3306/tcp 
dockercompose_nginx_1   /usr/local/nginx/sbin/nginx   Up      0.0.0.0:80->80/tcp     
dockercompose_php_1     /usr/local/php/sbin/php-fpm   Up      9000/tcp               
dockercompose_php_2     /usr/local/php/sbin/php-fpm   Up      9000/tcp

##可以看到我們的php有了兩個容器在運行,當然我們考慮的是平時在集羣裏構建,在多主機模式下才能發揮幾個副本的性能,所以後面像swarm 的scale可以把容器調度在不同的節點上。最大發揮其性能。還有compose v3的stack。(後面更新)


9,這個多容器我們做個好玩的事情,用web服務器來做個負載均衡,反向代理:架構圖如下:

wKiom1i4RXOiaji4AABXKQkTqac006.png


10、因爲是Dockerfile我們要做反向代理,所以我們基於lnmp/nginx:1.0這個鏡像修改,然後別的nginx可以不變:

首先看一下當前目錄下的文件:

[root@test upstram]# tree
├── docker-compose.yml
└── nginx
    ├── default_nginx.conf
    └── Dockerfile


11、我們首先看一下我們docker-compose是如何構建的:

[root@test upstram]# cat docker-compose.yml 
version: "2"
services:
  web_a:
    image:  lnmp/nginx:1.0
    volumes:
       -  /web_a:/web
    expose:
       -  80
  web_b:
    image:  lnmp/nginx:1.0
    volumes:
       -  /web_b:/web
    expose:
       -  80
  web_c:
    image:  lnmp/nginx:1.0
    volumes:
       -  /web_c:/web
    expose:
       -  80  
  nginx:
    build: nginx
    ports:
      - 80:80
    links:
      - web_a
      - web_b
      - web_c

##可以看到,我們有web_a,web_b,web_c三個容器;都是上一篇我們講到的Dockerfile創建的nginx容器,然後內部暴露80端口,分別掛載有到本地的,/web_a,/web_b,/web_c三個目錄:


12、看一下dockerfile:

[root@test upstram]# cd nginx/
[root@test nginx]# ls
default_nginx.conf  Dockerfile
[root@test nginx]# cat Dockerfile 
from lnmp/nginx:1.0
ADD default_nginx.conf /usr/local/nginx/conf/vhosts/default.conf
EXPOSE 80
CMD ["/usr/local/nginx/sbin/nginx"]

##其實很簡單,就是引用我們上一次創建的鏡像,然後覆蓋掉之前的nginx文件,換成下面的反向代理文件default_nginx.conf。

[root@test nginx]# cat default_nginx.conf 
upstream web_up{
        server web_a  max_fails=3 fail_timeout=20s weight=2;
        server web_b  max_fails=3 fail_timeout=20s weight=2;
        server web_c  max_fails=3 fail_timeout=20s weight=2;
}
server {
    listen       80 default_server;
    server_name  localhost;
    #charset koi8-r;
    location / {
                proxy_pass http://web_up;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwared-For $proxy_add_x_forwarded_for; 
    } 
}

##這裏反向代理因爲我們用了--link來關聯容器,所以是可以通訊和解析的。


13、到這裏完成了,我們創建三個目錄,/web_a,/web_b,/web_c,分表放index.html文件到下面:

[root@test nginx]# cat /web_a/index.html 
web_a
[root@test nginx]# cat /web_b/index.html 
web_b
[root@test nginx]# cat /web_c/index.html 
web_c

##主要是爲了測試反向代理效果:


14、啓動docker compose:

[root@test upstram]# docker-compose up -d

Starting upstram_web_a_1

Starting upstram_web_b_1

Starting upstram_web_c_1


15、查看一下運行狀態,然後測試下訪問web的效果:

[root@test upstram]# docker-compose up -d
[root@test upstram]# docker-compose ps
     Name                   Command             State         Ports        
--------------------------------------------------------------------------
upstram_nginx_1   /usr/local/nginx/sbin/nginx   Up      0.0.0.0:80->80/tcp 
upstram_web_a_1   /usr/local/nginx/sbin/nginx   Up      80/tcp             
upstram_web_b_1   /usr/local/nginx/sbin/nginx   Up      80/tcp             
upstram_web_c_1   /usr/local/nginx/sbin/nginx   Up      80/tcp

訪問本機的URL,可以看到反向代理已經生效了:

[root@test upstram]# curl 192.168.63.200
web_a
[root@test upstram]# curl 192.168.63.200
web_b
[root@test upstram]# curl 192.168.63.200
web_c

網頁效果:

wKiom1i4UuvRSW91AABSLVF_9Vg581.png-wh_50


   到此對於compose的演示也告一段落,可以看到通過compose我們可以很好的對容器進行編排,但是我們需要思考一個問題,就是我們複製出來的容器,在一臺主機上意義其實不是很大,而且也達不到高可用的效果;所以往後我們要借鑑swarm等編排工具。在這個之前也涉及到Docker的網絡問題,後期有空我們先介紹。

 

 

Docker詳情與集羣架構部分可以查看:http://www.roncoo.com/course/view/3e9d9c48f76f4c698b8349d04b763467

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章