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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:

  上一篇我们介绍了通过使用Dockerfile构建LNMP环境,但是我们也发现了其中的缺陷;就是容器多的时候我们管理起来也是不方便的;我们需要考虑的就是把一组环境分组,然后按照执行顺序一键启动即可。(http://xiaoluoge.blog.51cto.com/9141967/1902501上一篇地址):


下面我们具体按照上一次咱们构建的wordpress环境:

1、安装docker compose,我们还是使用daocloud来进行安装,你懂得github有时候也挺慢的:

1
2
3
4
5
6
7
[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,后面讲):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[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 构建这些镜像:

1
2
3
4
[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 日志:

1
2
3
4
5
6
7
8
9
10
11
[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、看一下进程的启动状态:
1
2
3
4
5
6
[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启动的相关参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[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容器:

1
2
3
4
5
6
7
8
9
[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可以不变:

首先看一下当前目录下的文件:

1
2
3
4
5
[root@ test  upstram] # tree
├── docker-compose.yml
└── nginx
     ├── default_nginx.conf
     └── Dockerfile


11、我们首先看一下我们docker-compose是如何构建的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[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:

1
2
3
4
5
6
7
8
[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。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[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文件到下面:

1
2
3
4
5
6
[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的效果:

1
2
3
4
5
6
7
8
[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,可以看到反向代理已经生效了:

1
2
3
4
5
6
[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










本文转自 小罗ge11 51CTO博客,原文链接:http://blog.51cto.com/xiaoluoge/1902816,如需转载请自行联系原作者
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
17天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
157 77
|
3天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
30 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
9天前
|
关系型数据库 应用服务中间件 PHP
实战~如何组织一个多容器项目docker-compose
本文介绍了如何使用Docker搭建Nginx、PHP和MySQL的环境。首先启动Nginx容器并查看IP地址,接着启动Alpine容器并安装curl测试连通性。通过`--link`方式或`docker-compose`配置文件实现服务间的通信。最后展示了Nginx配置文件和PHP代码示例,验证了各服务的正常运行。
29 3
实战~如何组织一个多容器项目docker-compose
|
15天前
|
人工智能 运维 监控
阿里云ACK容器服务生产级可观测体系建设实践
本文整理自2024云栖大会冯诗淳(花名:行疾)的演讲,介绍了阿里云容器服务团队在生产级可观测体系建设方面的实践。冯诗淳详细阐述了容器化架构带来的挑战及解决方案,强调了可观测性对于构建稳健运维体系的重要性。文中提到,阿里云作为亚洲唯一蝉联全球领导者的容器管理平台,其可观测能力在多项关键评测中表现优异,支持AI、容器网络、存储等多个场景的高级容器可观测能力。此外,还介绍了阿里云容器服务在多云管理、成本优化等方面的最新进展,以及即将推出的ACK AI助手2.0,旨在通过智能引擎和专家诊断经验,简化异常数据查找,缩短故障响应时间。
阿里云ACK容器服务生产级可观测体系建设实践
|
14天前
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
75 24
|
15天前
|
供应链 安全 Cloud Native
阿里云容器服务助力企业构建云原生软件供应链安全
本文基于2024云栖大会演讲,探讨了软件供应链攻击的快速增长趋势及对企业安全的挑战。文中介绍了如何利用阿里云容器服务ACK、ACR和ASM构建云原生软件供应链安全,涵盖容器镜像的可信生产、管理和分发,以及服务网格ASM实现应用无感的零信任安全,确保企业在软件开发和部署过程中的安全性。
|
15天前
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
阿里云容器服务ACK提供强大的产品能力,支持弹性、调度、可观测、成本治理和安全合规。针对拥有IDC或三方资源的企业,ACK One分布式云容器平台能够有效解决资源管理、多云多集群管理及边缘计算等挑战,实现云上云下统一管理,提升业务效率与稳定性。
|
16天前
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
94 6
|
25天前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
19天前
|
数据建模 应用服务中间件 nginx
docker替换宿主与容器的映射端口和文件路径
通过正确配置 Docker 的端口和文件路径映射,可以有效地管理容器化应用程序,确保其高效运行和数据持久性。在生产环境中,动态替换映射配置有助于灵活应对各种需求变化。以上方法和步骤提供了一种可靠且易于操作的方案,帮助您轻松管理 Docker 容器的端口和路径映射。
60 3

相关产品

  • 容器服务Kubernetes版