上一篇我们介绍了通过使用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:
p_w_picpath: lnmp/php:1.0
volumes:
- /web:/web
nginx:
p_w_picpath: lnmp/nginx:1.0
ports:
- 80:80
volumes:
- /web:/web
links:
- php
mysql:
p_w_picpath: lnmp/mysql:1.0
ports:
- 3306:3306
volumes:
- /opt/data:/var/lib/mysql
##p_w_picpath和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, p_w_picpaths, 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 p_w_picpaths
push Push service p_w_picpaths
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:
p_w_picpath: lnmp/nginx:1.0
volumes:
- /web_a:/web
expose:
- 80
web_b:
p_w_picpath: lnmp/nginx:1.0
volumes:
- /web_b:/web
expose:
- 80
web_c:
p_w_picpath: 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
©著作权归作者所有:来自51CTO博客作者小罗ge11的原创作品,如需转载,请注明出处,否则将追究法律责任
wordpressdockerfilecompose自动化
共同学习,写下你的评论
评论加载中...
作者其他优质文章