【赵渝强老师】使用Docker Compose管理容器

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: Docker Compose 通过 YAML 文件管理多个容器,简化复杂系统的部署和管理。本文介绍了 Docker Compose 的基本概念,并通过一个包含 Redis DB 和 Python Web 模块的示例,展示了如何使用 Docker Compose 部署和管理多容器应用。手动部署和 Docker Compose 部署的对比突显了 Docker Compose 在系统复杂度增加时的优势。

b100.png

Docker Compose 通过一个yml的描述文件来管理一个复杂系统中的多个容器。在该描述文件中,所有的容器都是通过services来进行定义。Docker Compose使用docker-compose脚本来完成服务的启动、停止、管理和扩容等工作。因此Docker Compose非常适合使用多个容器来组成一个复杂应用系统的场景。

   

视频讲解如下:

   

这里将通过一个具体的示例来演示如何使用Docker Compose。下图便描述了本小节示例的架构。该示例系统中包含两个功能模块:Redis DB模块和Python Web模块。


   

其中:

  • Redis DB模块将使用Redis的NoSQL数据库来保存用户在Web界面上刷新网页的次数。
  • Python Web模块将用于Web界面的展示。

   

这样的一个系统结构利用前面已经掌握的Docker知识完全可以搭建起来,即:通过手动部署的方式来完成。但是当系统变得越来越复杂时,这样的手动管理方式是非常不利于系统的管理的。而使用Docker Compose便可以非常容易地解决这样的问题。下面将分别通过手动部署的方式和Docker Compose的方式来完成部署和管理,从而对比它们之前的区别和展示使用Docker Compose的优点。


一、使用手动方式构建应用程序

   

手动方式构建应用程序需要创建Dockerfile来描述应用系统。下面演示了具体的操作步骤。

(1)创建文件“app.py”使用Python来创建Web应用程序,文件内容如下:

01   from flask import Flask
02   from redis import Redis
03   import os
04   app = Flask(__name__)
05   redis = Redis(host='redis', port=6379)
06    
07   @app.route('/')
08   def hello():
09       redis.incr('hits')
10       return 'I have been seen %s times.' % redis.get('hits')
11    
12   if __name__ == "__main__":
13       app.run(host="0.0.0.0", debug=True)


其中:

  • 第01行使用了Flask这样一个轻量级Web框架来使用Python语言快速实现一个网站或Web服务。
  • 第02行使用Python Redis模块来访问Redis数据库,将用户在Web界面上刷新次数保存到Redis中。
  • 第05行指定Redis数据库的地址信息,这里指定了运行Redis的主机名和端口。
  • 第09行通过变量“redis”访问Redis数据库完成计数的功能。
  • 第10行Web界面上显示的内容,即:用户刷新Web网页的次数。


(2)创建文件“requirements.txt”,并输入下面的内容。这是由于在应用程序中使用了Python的flask和redis组件,因此在文件中输入下面的内容:

flask
redis


(3)创建文件“Dockerfile”,并输入下面的内容。

FROM python
ADD . /code
WORKDIR /code
COPY app.py /code
RUN pip install -r requirements.txt
CMD ["python", "app.py"]


(4)使用“docker build”命令编译Dockerfile。

docker build -t myapplication .

提示:“-t”参数指定生成的镜像名称为“myapplication”,并且将其存放在本地。


(5)由于应用程序中,需要redis的支持,首先启动一个Redis容器

docker run --name myredis -d -p 6379:6379 redis

# 其中的myredis是容器的名称,在启动Web应用程序时需要用到这个名称。


(6)使用docker run命令启动Web应用程序,并使用--link参数连接到redis容器中。

docker run --name myapp_using_redis -p 5000:5000 --link myredis:redis -d myapplication


其中的参数:

  • -p 5000:5000将宿主机的5000端口映射到容器的5000端口上。
  • --link myredis:redis连接运行Redis数据库的myredis容器,并指定其主机名是“redis”,即:app.py应用程序代码中05行指定的host名称。


(7)打开浏览器访问宿主机的5000端口并刷新网页,便可以观察到计数器自增的效果,如下图所示。



二、使用Docker Compose构建应用程序

 

在上一个小节中使用手动方式完成了应用系统的部署和启动,实现了计数器的自增功能。在该系统架构中只包含了两个模块,即:Redis DB模块和Python Web模块。但是随着系统架构的不断复杂和模块的不断增多,这样的手动管理方式将变得越来越不方便。另一方面,如果要实现扩容或者缩容等操作,例如:随着负载的增大,想对Redis DB模块进行扩容,将其扩展到三个容器中从而实现负载均衡的功能。手动方式下也无法很好地解决这样的问题。而使用Docker Compose便可以非常方便地解决这样的问题,其核心是定义一个yml文件来对即将部署的服务进行描述。注意:此时的目录结构如下图所示。


 

下面的步骤演示了如何使用Docker Compose来完成服务的编排与部署。


(1)在当前目录下创建文件“docker-compose.yml”,输入下面的内容。

01   version: '3'
02   services:
03     web:
04       build: .
05       ports:
06        - "5000:5000"
07     redis:
08       image: "redis"

   

其中:

  • 第02行开始讲定义该应用系统中包含的模块信息。这里定义应用系统中包含了两个模块,即:第03行的web模块和第07行的redis模块。
  • 第03行到第06行为定义web模块。通过使用“build”命令在当前目录下编译Dockerfile,将生成的镜像存放到本地;并且在启动容器时,将宿主机的5000端口映射到容器的5000端口。
  • 第07行~第08行定义redis模块。通过参数“image”指定启动容器时使用“redis”的镜像。如果本地没有该镜像,将会从镜像仓库中拉取该镜像。

提示:yml文件的全称是Yet Another Markup Language,因此也可以称为yaml文件,这种文件的设计目的就是方便人类读写,这种文件使用缩进表示层级关系,因此特别适合在脚本语言中使用。


(2)通过命令“docker-compose up”来启动应用

docker-compose up


(3)打开浏览器访问访问宿主机的5000端口,这时候可以观察到与上图同样的效果。


(4)执行“docker-compose ps”的命令别名检查此时启动的容器信息,如下图所示。

从图中可以看出在该应用程序包含了两个模块,即“demo_redis_1”和“demo_web_1”。并且这两个模块各自运行在一个Docker的容器中。


(5)执行“docker-compose images”命令可以查看由Docker Compose管理的镜像信息,如下图所示。



相关文章
|
6天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
28 2
|
4天前
|
运维 Cloud Native 虚拟化
一文吃透云原生 Docker 容器,建议收藏!
本文深入解析云原生Docker容器技术,涵盖容器与Docker的概念、优势、架构设计及应用场景等,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
一文吃透云原生 Docker 容器,建议收藏!
|
5天前
|
缓存 监控 开发者
掌握Docker容器化技术:提升开发效率的利器
在现代软件开发中,Docker容器化技术成为提升开发效率和应用部署灵活性的重要工具。本文介绍Docker的基本概念,并分享Dockerfile最佳实践、容器网络配置、环境变量和秘密管理、容器监控与日志管理、Docker Compose以及CI/CD集成等技巧,帮助开发者更高效地利用Docker。
|
6天前
|
监控 持续交付 Docker
Docker 容器化部署在微服务架构中的应用有哪些?
Docker 容器化部署在微服务架构中的应用有哪些?
|
6天前
|
监控 持续交付 Docker
Docker容器化部署在微服务架构中的应用
Docker容器化部署在微服务架构中的应用
|
6天前
|
安全 持续交付 Docker
微服务架构和 Docker 容器化部署的优点是什么?
微服务架构和 Docker 容器化部署的优点是什么?
|
8天前
|
Kubernetes 负载均衡 Linux
【赵渝强老师】Docker三剑客
本文介绍了Docker容器中的三个重要工具:Docker Compose、Docker Machine 和 Docker Swarm。Docker Compose用于定义和运行多容器应用,通过YAML文件简化容器管理。Docker Machine支持远程主机上的Docker安装和管理,适用于跨平台使用。Docker Swarm则提供集群管理功能,实现负载均衡和故障迁移,适合大规模部署。文中还提供了相关示例和架构图,帮助读者更好地理解和使用这些工具。
|
8天前
|
API Docker 容器
【赵渝强老师】构建Docker Swarm集群
本文介绍了如何使用三台虚拟主机构建Docker Swarm集群。首先在master节点上初始化集群,然后通过特定命令将node1和node2作为worker节点加入集群。最后,在master节点上查看集群的节点信息,确认集群构建成功。文中还提供了相关图片和视频教程,帮助读者更好地理解和操作。
|
8天前
|
调度 Docker 容器
【赵渝强老师】Docker Swarm集群的体系架构
Docker Swarm自1.12.0版本起集成至Docker引擎,无需单独安装。它内置服务发现功能,支持跨多服务器或宿主机创建容器,形成集群提供服务。相比之下,Docker Compose仅限于单个宿主机。Docker Swarm采用主从架构,Swarm Manager负责管理和调度集群中的容器资源,用户通过其接口发送指令,Swarm Node根据指令创建容器运行应用。
|
8天前
|
应用服务中间件 网络安全 数据安全/隐私保护
【赵渝强老师】使用Docker Machine远程管理Docker
Docker Machine 是 Docker 官方提供的远程管理工具,可帮助开发人员在远程主机或虚拟机上安装和管理 Docker 环境。本文介绍了如何在远程主机上安装 Docker 并配置免密码登录,以及使用 Docker Machine 管理远程 Docker 主机的常用命令。