Docker Compose多容器部署(五)

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

著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

为什么要有Docker Compose多容器部署

为了多快好省,总结起来就是为了偷懒,如图所示,一个 dockerfile 文件可以启动多个容器

c7138224c8c8d4c983cac94b3375c5e.png

在使用 docker Compose之前,我们是怎么部署多个容器的APP应用的呢???

  1. 使用docker build -t [imageName]:[tag] .命令或者 docker pull [imageName]从Dockerhub 拉取镜像
  2. docker run创建启动多个container
  3. 依次管理这些container(启动停止删除)

多容器部署的APP太恶心了(每次都重复这么多步骤)

docker Compose到底是什么

  • Docker Compose 是一个命令行工具
  • 这个工具可以通过一个yml文件定义多个容器的docker应用
  • 通过一条命令就可以根据yml文件的定义去创建或者管理这些容器

docker yml 文件有一个默认的名字叫docker-compose.yml,其中有三个重要的概念:

  • Services
  • Networks
  • Volumes

Services

  • 一个Services代表一个 container,这个 container 可以从 dockerhub registory 的 image 来创建,或者从本地的 Dockerfile build 出来的 image 来创建
  • Service的启动类似docker run命令,我们可以给其指定networkvolume,所以可以给 service 指定networkVolume的语法
#docker-compose.yml文件内容示例
services:
    db:     #APP NAME
        images:postgres:9.4     #使用的镜像
        volumes:    #数据卷映射名为db-data
            - "db-data:/var/lib/postgresql/data"
        networks:   #docker network 使用back-tier
            - back-tier

以上内容等同于:

docker run -d --name db --network back-tier -v db-data:/var/lib/postgresql/data postgres:9.4

Volumes

b017e13e8e8dae57a761aa6556790ee.png

Networks

be42e3a6bd2c7c37569c9105f381b00.png

接下来看一个实际的应用例子

version: '3'    #docke compose版本
services:
  wordpress:    #App name
    image: wordpress    #使用镜像
    ports:      #端口映射
      - 8080:80
    environment:    #容器环境变量配置
      WORDPRESS_DB_HOST: mysql
      WORDPRESS_DB_PASSWORD: root
    networks:   # docker 网卡
      - my-bridge
  mysql:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: wordpress
    volumes:    #数据卷名mysql-data,对应备份容器中/var/lib/mysql所有内容
      - mysql-data:/var/lib/mysql
    networks:
      - my-bridge
volumes:    #声明
  mysql-data:
networks:   #声明
  my-bridge:
    driver: bridge  # 使用drive为bridge

Docker Compose 的安装

具体安装过程可以参考:docker docs-安装Docker Compose

Docker 水平扩展和负载均衡

# 以后台方式启动运行
docker-compose up -d   
# 查看启动的服务容器
docker-compose ps  
# 帮助指令
docker-compose up --help
# 停止所有运行中的容器
docker-compose down  
# 构建镜像
docker-compose build

以下面这个 docker-compose.yml 文件为例:

version: "3"
services:
  redis:
    image: redis
  web:
    build:
      context: ./dir
      dockerfile: Dockerfile
    ports:
      - 8080:5000
    environment:
      REDIS_HOST: redis

context:是 Dockerfile 的文件路径,也可以是链接到 git 仓库的 url 当提供的值是相对路径时,它被解析为相对于撰写文件的路径,此目录也是发送到 Docker 守护进程的 context

dockerfile参数:dockerfile文件,必须指定的文件构建路径

scale 参数可以把一个服务扩展成多个,但是如果用上面这个文件启动的话

docker-compose up --scale web=3 -d

,会发现报错:

RROR : for flaskredis _ web _3 Cannot start service web : driver failed programming external connectivity on ndpoint flaskredis _ web _3(f2aea3a19f5a6f3eb949436293815da88d327228ff791390f9335e56acce9966): Bind for 0.0
0.0:8080-f8ed:79popeeots already alloCated 
 RROR : for web Cannot start service web : driver failed programming external cqnnecttvtty on endipotnt fias 
 redis _ web _2(a99bb015ed96780630baf05e42f65e13676be9faca695602b3eb228f108c445f):
 Bind for 0.0.0.0:8080 fai 
 ed : port is already allocated 
 RROR : Encountered errors while bringing up the project .
 flask - redis git :( master ) x docker - compose down 
 topping flaskredis _ web _1
 topping flaskredis _ redis _1
 emoving flaskredis _ web _3
 nnoncuah 7
 done 
 done 
 done 
-- exit - code - from SERVICE 
 Return the exit code of the selected service container . Implies -- abort - on - container - exit .
 -- scale SERVICE = NUM 
 Scale SERVIcE to NUM instances . Overrides the scale ~
 setting in the compose file if present .

原因是因为ports: - 8080:5000重复绑定,端口占用了,删除这条语句即可,表示不指定宿主机端口绑定。如下图启动成功:

→ flask - redis git :( master ) x docker - compose up flaskredis _ redis _1 is up - to - date 
 Starting flaskredis _ web _1...
 done 
 Creating flaskredis _ web _2...
 done 
 Creating flaskredis _ web _3..
 done 
 flask - redis git :( master )
 flask - redis git :( master )
-- scale web =3- d 
 docker - compose ps 
 Name command State Ports 
 flaskredis _ rediS _1
 flaskredisweb _1
 flaskredis _ web _2
 flaskredis _ web _3
 docker - entrypoint . sh redis ... python app . py 
 python app . py 
 python app . py 
 Up 
 Up 
 Up 
 Up 
6379/tcp
5000/tcp
5000/tcp
5000/tcp

来看一个负载均衡的例子

# Dockerfile
FROM python:2.7
LABEL maintaner="Peng Xiao xiaoquwl@gmail.com"
COPY . /app
WORKDIR /app
RUN pip install flask redis
EXPOSE 80
CMD [ "python", "app.py" ]
#docker-compose.yml
version: "3"
services:
  redis:
    image: redis
  web:
    build:      #指定的镜像需要build
      context: .    #build的路径
      dockerfile: Dockerfile    #要build的dockerfile文件名(上面的文件)
    environment:
      REDIS_HOST: redis
  lb:
    image: dockercloud/haproxy  #负载均衡的镜像
    links:      #连接到上面的service名为web的App
      - web
    ports:
      - 8080:80
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock 

结构调用图

43f1064fbf66aa4f3c5e72b0c71cf49.png

> lb - scale git :( master ) x docker - compose up -- scale web =3- d lbscale _ redis _ l is up - to - date 
 Starting Tbscale _ web _1...
 done 
 Creating lbscale _ web _2...
 done 
 Creating lbscale _ web _3...
 done 
 lbscale _ lb _1 is up - to - date 
 lb - scale gt :( maSter x 
 docker - compose ps 
 command 
 State Ports 
 Namle 
 Lbscale _ lb _1
/ sbin / tini -- dockercloud -
 Lbscale _ redis _1
 docker - entrypoint . sh redis ...
 lbscale _ web _1
 python app . py 
 ibscale _ web _2
 python app . py 
 Lbscale _ web _3
 python app . py 
→ lb - scale git :( master ) x curl 127.0.0.1:8080
 Hello Container World ! I have been seen 2 times and my hostname is -> lb - scale git :( master ) x curl 127.0.0.1:8080
 Hello Container World ! I have been seen 3 times and my hostname is → lb - scale git :( master ) x cur1127.0.0.1:8080
 Hello Container World ! I have been seen 4 times and my hostname is -→ Tb - scale git :( master ) x curl 127.0.0.1:8080
-.
1936/tcp,443/tcp,0.0.0.0:8
6379/tcp
80/tcp
80/tcp
8o/ tcp 
 Up 
 Up 
 Up 
 D 
068a6ee30234.
745ba7f91665.
63a35d2a9bef.

实践-部署一个复杂的Application

Voting App 用于投票,redids Queue用来保存投票结果,Java worker实时获取redis 中的数据插入PG database数据库中,Result app 实时从PG database中获取数据展示到页面。

这里涉及了5个docker容器,看到这里,你觉得应该怎么实现呢?这就当做一个练习给你们了,完成了的读者可以在下方评论留言,公布自己的docker-compose.yml内容

更多内容参考=>docker-compose.yml 配置文件详解及项目发布

cf3bb9224e5e7eec8059aa3597ed0f4.png

1652d9347c5f2a56_tplv-t2oaga2asx-zoom-in-crop-mark_3024_0_0_0.gif

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3天前
|
存储 安全 数据安全/隐私保护
【Docker 专栏】Docker 容器化应用的备份与恢复策略
【5月更文挑战第9天】本文探讨了Docker容器化应用的备份与恢复策略,强调了备份在数据保护、业务连续性和合规要求中的关键作用。内容涵盖备份的重要性、内容及方法,推荐了Docker自带工具和第三方工具如Portainer、Velero。制定了备份策略,包括频率、存储位置和保留期限,并详细阐述了恢复流程及注意事项。文章还提及案例分析和未来发展趋势,强调了随着技术发展,备份与恢复策略将持续演进,以应对数字化时代的挑战。
【Docker 专栏】Docker 容器化应用的备份与恢复策略
|
3天前
|
监控 Kubernetes Docker
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
【5月更文挑战第9天】本文探讨了Docker容器中应用的健康检查与自动恢复,强调其对应用稳定性和系统性能的重要性。健康检查包括进程、端口和应用特定检查,而自动恢复则涉及重启容器和重新部署。Docker原生及第三方工具(如Kubernetes)提供了相关功能。配置检查需考虑检查频率、应用特性和监控告警。案例分析展示了实际操作,未来发展趋势将趋向更智能和高效的检查恢复机制。
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
|
1天前
|
Cloud Native 测试技术 数据安全/隐私保护
云原生之使用Docker部署Teedy轻量级文档管理系统
【5月更文挑战第8天】云原生之使用Docker部署Teedy轻量级文档管理系统
11 1
|
2天前
|
NoSQL Redis Docker
Mac上轻松几步搞定Docker与Redis安装:从下载安装到容器运行实测全程指南
Mac上轻松几步搞定Docker与Redis安装:从下载安装到容器运行实测全程指南
12 0
|
2天前
|
Cloud Native 测试技术 Linux
云原生之使用Docker部署homer静态主页
【5月更文挑战第7天】云原生之使用Docker部署homer静态主页
9 0
|
3天前
|
监控 Cloud Native 测试技术
云原生之使用Docker部署ServerBee服务器监控工具
【5月更文挑战第6天】云原生之使用Docker部署ServerBee服务器监控工具
12 1
|
3天前
|
缓存 关系型数据库 数据库
【Docker 专栏】Docker 与容器化数据库的集成与优化
【5月更文挑战第9天】本文探讨了Docker与容器化数据库集成的优势,如快速部署、环境一致性、资源隔离和可扩展性,并列举了常见容器化数据库(如MySQL、PostgreSQL和MongoDB)。讨论了集成方法、注意事项、优化策略,包括资源调整、缓存优化和监控告警。此外,强调了数据备份、恢复测试及性能评估的重要性。未来,随着技术发展,二者的集成将更紧密,为数据管理带来更多可能性。掌握此技术将应对数字化时代的机遇与挑战。
【Docker 专栏】Docker 与容器化数据库的集成与优化
|
3天前
|
存储 安全 数据库
【Docker 专栏】Docker 容器内应用的状态持久化
【5月更文挑战第9天】本文探讨了Docker容器中应用状态持久化的重要性,包括数据保护、应用可用性和历史记录保存。主要持久化方法有数据卷、绑定挂载和外部存储服务。数据卷是推荐手段,可通过`docker volume create`命令创建并挂载。绑定挂载需注意权限和路径一致性。利用外部存储如数据库和云服务可应对复杂需求。最佳实践包括规划存储策略、定期备份和测试验证。随着技术发展,未来将有更智能的持久化解决方案。
【Docker 专栏】Docker 容器内应用的状态持久化
|
3天前
|
机器学习/深度学习 监控 Kubernetes
【Docker 专栏】Docker 容器内服务的自动扩展与缩容
【5月更文挑战第9天】本文探讨了Docker容器服务的自动扩展与缩容原理及实践,强调其在动态业务环境中的重要性。通过选择监控指标(如CPU使用率)、设定触发条件和制定扩展策略,实现资源的动态调整。方法包括云平台集成和使用Kubernetes等框架。实践中,电商平台和实时数据处理系统受益于此技术。注意点涉及监控数据准确性、扩展速度和资源分配。未来,智能算法将提升扩展缩容的效率和准确性,成为关键技术支持。
【Docker 专栏】Docker 容器内服务的自动扩展与缩容
|
3天前
|
Java 数据库连接 Docker
【Docker 专栏】Docker 容器内环境变量的管理与使用
【5月更文挑战第9天】本文介绍了Docker容器中环境变量的管理与使用,环境变量用于传递配置信息和设置应用运行环境。设置方法包括在Dockerfile中使用`ENV`指令或在启动容器时通过`-e`参数设定。应用可直接访问环境变量或在脚本中使用。环境变量作用包括传递配置、设置运行环境和动态调整应用行为。使用时注意变量名称和值的合法性、保密性和覆盖问题。理解并熟练运用环境变量能提升Docker技术的使用效率和软件部署质量。
【Docker 专栏】Docker 容器内环境变量的管理与使用