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
目录
相关文章
|
4天前
|
消息中间件 Kafka Docker
docker compose 安装 kafka
通过本文的步骤,您可以快速在本地使用 Docker Compose 安装并配置 Kafka 和 Zookeeper。Docker Compose 简化了多容器应用的管理,方便快速搭建和测试分布式系统。
35 2
|
5天前
|
消息中间件 监控 RocketMQ
Docker部署RocketMQ5.2.0集群
本文详细介绍了如何使用Docker和Docker Compose部署RocketMQ 5.2.0集群。通过创建配置文件、启动集群和验证容器状态,您可以快速搭建起一个RocketMQ集群环境。希望本文能够帮助您更好地理解和应用RocketMQ,提高消息中间件的部署和管理效率。
152 91
|
6天前
|
Ubuntu API 网络虚拟化
ubuntu22 编译安装docker,和docker容器方式安装 deepseek
本脚本适用于Ubuntu 22.04,主要功能包括编译安装Docker和安装DeepSeek模型。首先通过Apt源配置安装Docker,确保网络稳定(建议使用VPN)。接着下载并配置Docker二进制文件,创建Docker用户组并设置守护进程。随后拉取Debian 12镜像,安装系统必备工具,配置Ollama模型管理器,并最终部署和运行DeepSeek模型,提供API接口进行交互测试。
131 15
|
6天前
|
网络协议 API Docker
Docker+consul容器服务的更新与发现
通过本文的介绍,我们详细探讨了如何结合Docker和Consul来实现容器服务的更新与发现。通过Consul的服务注册和发现功能,可以高效地管理和监控容器化服务,确保系统的高可用性和可扩展性。希望本文能帮助您在实际项目中更好地应用Docker和Consul,提高系统的可靠性和管理效率。
41 23
|
6天前
|
存储 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` 到非默认目录,以防止数据无法正确持久化。
|
12天前
|
关系型数据库 MySQL 数据库
Docker Compose V2 安装常用数据库MySQL+Mongo
以上内容涵盖了使用 Docker Compose 安装和管理 MySQL 和 MongoDB 的详细步骤,希望对您有所帮助。
91 42
|
13天前
|
JavaScript 前端开发 Docker
如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
通过这些步骤,可以确保您的Next.js应用在多核服务器上高效运行,并且在Docker环境中实现高效的容器化管理。
72 44
|
21天前
|
存储 关系型数据库 MySQL
美团面试:MySQL为什么 不用 Docker部署?
45岁老架构师尼恩在读者交流群中分享了关于“MySQL为什么不推荐使用Docker部署”的深入分析。通过系统化的梳理,尼恩帮助读者理解为何大型MySQL数据库通常不使用Docker部署,主要涉及性能、管理复杂度和稳定性等方面的考量。文章详细解释了有状态容器的特点、Docker的资源隔离问题以及磁盘IO性能损耗,并提供了小型MySQL使用Docker的最佳实践。此外,尼恩还介绍了Share Nothing架构的优势及其应用场景,强调了配置管理和数据持久化的挑战。最后,尼恩建议读者参考《尼恩Java面试宝典PDF》以提升技术能力,更好地应对面试中的难题。
|
25天前
|
SQL Java Maven
docker部署apollo
docker部署apollo步骤
|
1月前
|
存储 Docker 容器
Docker-基础(数据卷、自定义镜像、Compose)
通过数据卷实现持久化存储,通过自定义镜像满足特定需求,通过Docker Compose方便地管理多容器应用
88 27

热门文章

最新文章