上一篇我們介紹了通過使用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試試:
##可以看到效果出現了,因爲我們之前用-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服務器來做個負載均衡,反向代理:架構圖如下:
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
網頁效果:
到此對於compose的演示也告一段落,可以看到通過compose我們可以很好的對容器進行編排,但是我們需要思考一個問題,就是我們複製出來的容器,在一臺主機上意義其實不是很大,而且也達不到高可用的效果;所以往後我們要借鑑swarm等編排工具。在這個之前也涉及到Docker的網絡問題,後期有空我們先介紹。
Docker詳情與集羣架構部分可以查看:http://www.roncoo.com/course/view/3e9d9c48f76f4c698b8349d04b763467