【Docker 系列】docker 学习九,Compose 内容编排官网初步体验

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 【Docker 系列】docker 学习九,Compose 内容编排官网初步体验

【Docker 系列】docker 学习九,Compose 内容编排官网初步体验

我们前面的文章学习了 docker ,为什么还要 Compose 呢?Compose到底是个啥玩意?

Docker Compose 可以来轻松的高效的管理容器,定义运行多个容器

咱们一起来看看官方的介绍 docs

Compose 是什么

Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration. To learn more about all the features of Compose, see the list of features.

讲了三个点:

  • Compose 可以定义和运行多个容器
  • 需要使用给到 YAML 配置文件
  • 单个命令就可以创建和启动所有的服务

Compose works in all environments: production, staging, development, testing, as well as CI workflows. You can learn more about each case in Common Use Cases.

Docker Compose 可以运行在所有的环境中

Using Compose is basically a three-step process:

1、Define your app’s environment with a Dockerfile so it can be reproduced anywhere.

2、Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment.

3、Run docker compose up and the Docker compose command starts and runs your entire app. You can alternatively run docker-compose up using the docker-compose binary.

三个步骤:

  • 需要定义好 Dockerfile ,保证它在任何环境都能运行
  • 在 docker-compose.yml  文件中定义好 services,那么这个 yml 文件如何写呢?services 咋定义呢
  • 使用docker-compose binary启动项目

总结上述官方说明:

Docker Compose 用于批量容器编排

如果一个项目中的多个微服务(几十个或者几百个),我们都一个一个的使用 docker run是不是很傻?而且对于运维来说也是一个非常不友好的事情,优化这样的问题,我们有了 Docker Compose

Compose 在 Docker 中默认就有吗?

Docker 中默认是没有 Compose 的,Compose 是 Docker 官方的开源项目,我们使用 Compose  ,是需要自己另外安装的

Compose 的 yml 文件如何编写?

一起来看看官方文档的 yml 是怎样的结构:

A docker-compose.yml looks like this:


version: "3.9"  # optional since v1.27.0
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    links:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}
  • services

指定服务

  • volumes

指定挂载卷

通过官方文档的上述说明,我们可以知道 Compose 有这么 2 个重要的概念:

  • services 服务,就是容器和相关的应用
  • 项目,就是一组关联的容器

Compose 安装

Docker Compose install

1、咱们选择在 linux 下面安装 Docker Compose ,运行如下指令进行安装


sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

安装成功后在我们的 linux 目录 /usr/local/bin/会有 docker-compose 程序

2、 给程序 docker-compose  加上可执行的权限


sudo chmod +x /usr/local/bin/docker-compose

3、安装成功,查看 docker-compose 的版本,看到如下信息即为成功

# docker-compose version
docker-compose version 1.29.2, build 5becea4c
docker-py version: 5.0.0
CPython version: 3.7.10
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

Compose 官方案例体验

Docker Compose gettingstarted

咱们安装好了 docker-compose ,我们一起来体验一下官方的 例子,先会使用,再来研究

准备环境和代码

1、创建 compose 测试目录,自己可以在任意目录下执行如下指令


mkdir composetest
cd composetest

2、编写 app.py 文件

app.py


import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)
@app.route('/')
def hello():
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

该 py 文件的功能就是,注册了一个路由为 /,我们访问服务器的/时,程序会去读取 redis 的计数器,来确认这个网站是访问了第几次了

3、创建一个文件 requirements.txt,用于之后的安装

requirements.txt


flask
redis

创建 DockerFile 文件

写 Dockerfile 文件

Dockerfile

# syntax=docker/dockerfile:1
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]

Dockerfile 文件中的含义是:

  • 基于 python:3.7-alpine 构建镜像
  • 设置工作目录为 /code
  • 设置 FLASK_APP 环境变量
  • 设置 FLASK_RUN_HOST 环境变量
  • 运行 apk add --no-cache gcc musl-dev linux-headers指令
  • 拷贝文件requirements.txt到容器中
  • 运行 pip 安装 requirements.txt 中的组件
  • 暴露 5000 端口
  • 拷贝 . 到 .
  • 执行 flask run 命令

定义 Compose 文件(yml文件)

docker-compose.yml

version: "3.9"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

这个 compose 文件定义了 2 个服务

  • web 服务,暴露的是 5000 端口
  • redis

构建和运行我们的 Compose

运行指令前,我们来查看一下我们的 compose 测试目录都有些啥了:

image.png

开始构建

docker-compose up

shell

复制代码

#docker-compose up

image.png

可以看到执行指令 docker-compose up之后, Compose 也是在一层一层的执行,并且我们可以看到 compose 是最先建立了一个自定义网络

Creating network "composetest_default"with the default driver

image.png

看到这里,我们发现 Compose 会自动帮我们创建 redis 容器和 web 容器

Creating composetest_web_1   ... done
Creating composetest_redis_1 ... done

image.png

最后,我们看到 Compose 帮我们将 redis 和 web 启动起来了,程序正常运行,

咱们在宿主机使用 curl 命令,来请求一下这个 web 服务

curl localhost:5000

image.png

果然 ok,官方的 compose 体验 no problem ,nice

查看一下镜像使用 docker images 查看一下镜像,发现多了 composetest_web,python,redis alpine 版本 ,这些也都是 compose 自动为我们做的,非常方便

image.png

查看一下网络

docker network ls

compose 构建的时候,一开始就会为我们创建一个网络

image.png

疑问?

细心的朋友发现了,我们的容器名字为什么是 composetest_web_1 , 和 composetest_redis_1

这个是 Docker Compose 里面的一种规则,便于标识对应的副本

例如,compose 里面对于容器会是这样的命名:

文件名_服务名_num

多个服务器集群的时候,这个 num 的作用就体现出来的,num 标识第几个副本

网络规则

多个容器只要是在一个局域网内,就可以互相 ping 通,相互通信,通过域名访问

例如 mysql 集群里面的服务,我们就可以访问 mysql:3306 , compose 就会给我们访问到 mysql:3306 这个服务

我们可以查看上面的 docker compose 给我们新建的自定义网络

docker network ls

image.png


# docker network inspect composetest_default
  ...
        "Containers": {
            "25b5814cfded10e00d2e59a8e17fcba670232bce135fdabd558b7c0530d011a4": {
                "Name": "composetest_web_1",
                "EndpointID": "cb131464ea9112403f851b14a37fa5c67b023f2ce28a1e85c409e3f284f78db4",
                "MacAddress": "02:42:ac:13:00:03",
                "IPv4Address": "172.19.0.3/16",
                "IPv6Address": ""
            },
            "e7fedce77d3759fefde5bef84c759a5c59e033a6f48850e5930825bfc8a8444c": {
                "Name": "composetest_redis_1",
                "EndpointID": "3af891f7d52cba7ec75eb01533af1d5dae4dcd0d8bf4c55e6b342075f971be22",
                "MacAddress": "02:42:ac:13:00:02",
                "IPv4Address": "172.19.0.2/16",
                "IPv6Address": ""
            }
        },
       ...

发现上面的例子, web 服务和 redis 服务,是在同一个网络下的,所有可以相互通信

停止 compose

咱们可以使用 ctrl + c 停止 compose

也可以通过 docker-compose down停止 compose

停止 compose ,那么 compose 里面涉及的服务,全部都会停止掉

# docker-compose down
Stopping composetest_web_1   ... done
Stopping composetest_redis_1 ... done
Removing composetest_web_1   ... done
Removing composetest_redis_1 ... done
Removing network composetest_default
• 停止 composetest_web_1
• 停止 composetest_redis_1
• 删除 composetest_web_1
• 删除 composetest_redis_1
• 移除自定义网络 composetest_default

小结

  • 咱们使用 docker 镜像,通过 docker run 命令可以创建并启动容器
  • DockerFile 可以构建镜像,也就是将服务打包
  • docker-compose 可以启动项目,进行多个微服务的编排和在环境里面一键部署
  • Docker 网络,自定义网络

参考资料:

docker docs


欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

image.png

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

相关文章
|
2月前
|
人工智能 前端开发 Docker
从本地到云端:用 Docker Compose 与 Offload 构建可扩展 AI 智能体
在 AI 智能体开发中,开发者常面临本地调试与云端部署的矛盾。本文介绍如何通过 Docker Compose 与 Docker Offload 解决这一难题,实现从本地快速迭代到云端高效扩容的全流程。内容涵盖多服务协同、容器化配置、GPU 支持及实战案例,助你构建高效、一致的 AI 智能体开发环境。
268 1
从本地到云端:用 Docker Compose 与 Offload 构建可扩展 AI 智能体
|
23天前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
209 5
|
2月前
|
运维 数据可视化 开发者
2025年 三个 Docker Compose 可视化管理器测评
本文对比了三款主流的 Docker Compose 可视化管理工具。随着 Docker 的普及,Compose 已成为多容器应用部署的标准,但 YAML 配置复杂、协作困难等问题也日益突出。三款工具各有侧重:Docker Desktop 适合个人本地开发,Portainer 适合小团队运维管理,而 Websoft9 则通过 GitOps 实现了强大的版本控制与团队协作能力。文章从可视化编辑、部署便捷性、版本管理等方面进行评测,为不同使用场景提供了推荐方案,展望了未来 Compose 管理向 GitOps 深度融合的发展趋势。
255 1
2025年 三个 Docker Compose 可视化管理器测评
|
数据可视化 开发工具 git
GitOps 驱动的 Docker Compose 可视工具化来了,图形化编辑器上玩转容器编排
Docker Compose 简化了多容器应用的部署,但随着应用复杂度上升,文本配置方式逐渐暴露出维护难、协作效率低等问题。基于 GitOps 的可视化 Docker Compose 工具应运而生,通过图形界面降低使用门槛,提升配置准确性和团队协作效率。结合 GitOps,实现配置变更的版本追踪、自动化部署与环境一致性,为多容器应用管理提供高效、安全的解决方案。
|
4月前
|
NoSQL 安全 Redis
Docker Compose :从入门到企业级部署
Docker Compose 是用于定义和运行多容器应用的工具,支持服务、网络和卷三大核心要素。通过简洁的 YAML 文件,可实现应用的快速部署与管理,适用于开发、测试及生产环境。
285 1
|
分布式计算 Java Linux
【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(Dockerfile使用手册)
Docker 是一套构建在 Linux 内核之上的高级工具,旨在帮助开发人员和运维人员更轻松地交付应用程序和依赖关系,实现跨系统和跨主机的部署。使用安全且轻量级的容器环境来实现这一目标。容器可以手动创建,也可以通过编写 Dockerfile 自动创建。开发人员和运维人员可以将应用程序及其依赖打包到容器中,实现应用程序的可移植性和环境一致性。
448 5
【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(Dockerfile使用手册)
|
Linux 应用服务中间件 Shell
docker学习--docker容器镜像常用命令大全(简)
本文档详细介绍了Docker中的镜像命令与容器管理命令。镜像命令部分涵盖了镜像搜索、下载、上传等操作;容器管理命令则包括了容器的创建、启动、停止、删除及日志查看等功能。通过具体示例,帮助用户更好地理解和使用Docker相关命令。
765 0
|
关系型数据库 MySQL Java
Docker学习重点(6)~容器数据卷
Docker学习重点(6)~容器数据卷
468 0
|
存储 运维 Linux
精彩推荐 | 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(实战技术总结)
在使用Docker时,管理维护工作可能会显得复杂。然而,实际上,Docker提供了许多便捷且人性化的工具,这些工具的使用技巧可以大大简化维护工作,并提升效率。通过掌握这些技巧,你不仅能够更轻松地管理Docker环境,还能展现出专业的能力。接下来我们就给大家介绍一下对于我在工作当中对于Docker容器使用的技术实战总结
148 2
精彩推荐 | 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(实战技术总结)
下一篇
开通oss服务