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
目录
相关文章
|
1月前
|
应用服务中间件 PHP nginx
今日小结通过aliyun的本地容器镜像部署我的nginx和php环境
简介: 本教程介绍如何基于 Dragonwell 的 Ubuntu 镜像创建一个运行 Nginx 的 Docker 容器。首先从阿里云容器镜像服务拉取基础镜像,然后编写 Dockerfile 确保 Nginx 作为主进程运行,并暴露 80 端口。最后,在包含 Dockerfile 的目录下构建自定义镜像并启动容器,确保 Nginx 在前台运行,避免容器启动后立即退出。通过 `docker build` 和 `docker run` 命令完成整个流程。
115 24
今日小结通过aliyun的本地容器镜像部署我的nginx和php环境
|
15天前
|
人工智能 Kubernetes jenkins
容器化AI模型的持续集成与持续交付(CI/CD):自动化模型更新与部署
在前几篇文章中,我们探讨了容器化AI模型的部署、监控、弹性伸缩及安全防护。为加速模型迭代以适应新数据和业务需求,需实现容器化AI模型的持续集成与持续交付(CI/CD)。CI/CD通过自动化构建、测试和部署流程,提高模型更新速度和质量,降低部署风险,增强团队协作。使用Jenkins和Kubernetes可构建高效CI/CD流水线,自动化模型开发和部署,确保环境一致性并提升整体效率。
|
1月前
|
消息中间件 监控 RocketMQ
Docker部署RocketMQ5.2.0集群
本文详细介绍了如何使用Docker和Docker Compose部署RocketMQ 5.2.0集群。通过创建配置文件、启动集群和验证容器状态,您可以快速搭建起一个RocketMQ集群环境。希望本文能够帮助您更好地理解和应用RocketMQ,提高消息中间件的部署和管理效率。
235 91
|
1月前
|
存储 NoSQL Redis
Docker 部署 Redis
在使用 Docker 部署 Redis 时,为实现数据持久化,需正确挂载容器内的数据目录到宿主机。推荐命令如下: ``` docker run -d --name redis -v /mnt/data/redis:/data -p 6379:6379 redis ``` 该命令将宿主机的 `/mnt/data/redis` 目录挂载到容器的 `/data` 目录,确保 Redis 数据持久化。此路径更通用,适合大多数场景。避免使用不匹配的挂载路径,如 `/var/lib/redis` 或 `/mnt/data/redis` 到非默认目录,以防止数据无法正确持久化。
|
6天前
|
存储 测试技术 对象存储
使用容器服务ACK快速部署QwQ-32B模型并实现推理智能路由
阿里云最新发布的QwQ-32B模型,通过强化学习大幅度提升了模型推理能力。QwQ-32B模型拥有320亿参数,其性能可以与DeepSeek-R1 671B媲美。
|
21天前
|
人工智能 文字识别 安全
Stirling-PDF:51.4K Star!用Docker部署私有PDF工作站,支持50多种PDF操作,从此告别在线工具
Stirling-PDF 是一款基于 Docker 的本地化 PDF 编辑工具,支持 50 多种 PDF 操作,包括合并、拆分、转换、压缩等,同时提供多语言支持和企业级功能,满足个人和企业用户的多样化需求。
74 6
Stirling-PDF:51.4K Star!用Docker部署私有PDF工作站,支持50多种PDF操作,从此告别在线工具
|
18天前
|
中间件 关系型数据库 数据库
docker快速部署OS web中间件 数据库 编程应用
通过Docker,可以轻松地部署操作系统、Web中间件、数据库和编程应用。本文详细介绍了使用Docker部署这些组件的基本步骤和命令,展示了如何通过Docker Compose编排多容器应用。希望本文能帮助开发者更高效地使用Docker进行应用部署和管理。
49 19
|
9天前
|
弹性计算 运维 Ubuntu
在阿里云ECS云服务器上安装、配置及高效使用Docker与Docker Compose
本文介绍了在阿里云ECS上使用Ubuntu系统安装和配置Docker及Docker Compose的详细步骤。通过这些工具,可以快速部署、弹性扩展和高效管理容器化应用,满足开发和运维需求。内容涵盖Docker的安装、镜像源配置、创建Web程序镜像以及使用Docker Compose部署WordPress等实际操作,并分享了使用体验,展示了阿里云实例的高性能和稳定性。
158 4
|
9天前
|
Linux 虚拟化 Docker
Linux服务器部署docker windows
在当今软件开发中,Docker成为流行的虚拟化技术,支持在Linux服务器上运行Windows容器。流程包括:1) 安装Docker;2) 配置支持Windows容器;3) 获取Windows镜像;4) 运行Windows容器;5) 验证容器状态。通过这些步骤,你可以在Linux环境中顺利部署和管理Windows应用,提高开发和运维效率。
59 1
|
11天前
|
安全 持续交付 云计算
课时5:阿里云容器服务:最原生的集成Docker和云服务
阿里云容器服务以服务化形式构建容器基础设施,大幅提升开发效率,简化应用部署流程。通过Docker容器和DevOps工具(如Jenkins),实现自动化部署与迭代,优化企业内部复杂部署问题。该服务支持GPU调度、混合云架构无缝迁移,并与阿里云产品体系无缝集成,提供安全防护、网络负载均衡等多重功能支持。凭借微服务架构,帮助企业突破业务瓶颈,提高资源利用率,轻松应对海量流量。
课时5:阿里云容器服务:最原生的集成Docker和云服务