- 论坛徽章:
- 1
|
上一篇我们介绍了通过使用Dockerfile构建LNMP环境,但是我们也发现了其中的缺陷;就是容器多的时候我们管理起来也是不方便的;我们需要考虑的就是把一组环境分组,然后按照执行顺序一键启动即可。
下面我们具体按照上一次咱们构建的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的网络问题,后期有空我们先介绍。
|
|