设为首页 收藏本站
查看: 883|回复: 0

[经验分享] Docker compose基于容器编排构建实践

[复制链接]

尚未签到

发表于 2018-5-28 10:05:06 | 显示全部楼层 |阅读模式
  上一篇我们介绍了通过使用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试试:

DSC0000.png

##可以看到效果出现了,因为我们之前用-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服务器来做个负载均衡,反向代理:架构图如下:
DSC0001.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:
    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  网页效果:

DSC0002.png

  

  到此对于compose的演示也告一段落,可以看到通过compose我们可以很好的对容器进行编排,但是我们需要思考一个问题,就是我们复制出来的容器,在一台主机上意义其实不是很大,而且也达不到高可用的效果;所以往后我们要借鉴swarm等编排工具。在这个之前也涉及到Docker的网络问题,后期有空我们先介绍。
  Docker详情与集群架构部分可以查看:http://www.roncoo.com/course/view/3e9d9c48f76f4c698b8349d04b763467

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-482065-1-1.html 上篇帖子: 使用Tempest Docker测试OpenStack 下篇帖子: DOCKER构建本地局域网镜像
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表