- 論壇徽章:
- 1
|
上一篇我們介紹了通過使用Dockerfile構建LNMP環(huán)境,但是我們也發(fā)現(xiàn)了其中的缺陷;就是容器多的時候我們管理起來也是不方便的;我們需要考慮的就是把一組環(huán)境分組,然后按照執(zhí)行順序一鍵啟動即可。
下面我們具體按照上一次咱們構建的wordpress環(huán)境:
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、我們已經(jīng)安裝了compose之后,我們直接引用我們之前的創(chuàng)建的鏡像先來構建一個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必須存在一個,為了節(jié)約時間,我們沒有用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、看一下進程的啟動狀態(tài):
- [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、看到我們的環(huán)境都已經(jīng)起來了,我們訪問一下web試試:
K1.png (96.48 KB, 下載次數(shù): 74)
下載附件
2017-07-08 16:20 上傳
##可以看到效果出現(xiàn)了,因為我們之前用-v 把數(shù)據(jù)庫持久化到/opt/data下面,所以不管怎么換容器我們的數(shù)據(jù)庫還是一樣能用的。
7、構建這個還是比較簡單,我們了解一下compose啟動的相關參數(shù):
- [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有了兩個容器在運行,當然我們考慮的是平時在集群里構建,在多主機模式下才能發(fā)揮幾個副本的性能,所以后面像swarm 的scale可以把容器調度在不同的節(jié)點上。最大發(fā)揮其性能。還有compose v3的stack。(后面更新)
9,這個多容器我們做個好玩的事情,用web服務器來做個負載均衡,反向代理:架構圖如下:
K2.png (19.14 KB, 下載次數(shù): 69)
下載附件
2017-07-08 16:23 上傳
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創(chuàng)建的nginx容器,然后內(nèi)部暴露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"]
復制代碼 ##其實很簡單,就是引用我們上一次創(chuàng)建的鏡像,然后覆蓋掉之前的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來關聯(lián)容器,所以是可以通訊和解析的。
13、到這里完成了,我們創(chuàng)建三個目錄,/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、查看一下運行狀態(tài),然后測試下訪問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,可以看到反向代理已經(jīng)生效了:
- [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
復制代碼 網(wǎng)頁效果:
K3.png (25.06 KB, 下載次數(shù): 66)
下載附件
2017-07-08 16:28 上傳
到此對于compose的演示也告一段落,可以看到通過compose我們可以很好的對容器進行編排,但是我們需要思考一個問題,就是我們復制出來的容器,在一臺主機上意義其實不是很大,而且也達不到高可用的效果;所以往后我們要借鑒swarm等編排工具。在這個之前也涉及到Docker的網(wǎng)絡問題,后期有空我們先介紹。
|
|