为了账号安全,请及时绑定邮箱和手机立即绑定

Docker compose基于容器编排构建实践

标签:
Docker


  上一篇我们介绍了通过使用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自动化


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消