Docker Compose应用实战

[复制链接]
发表于 2025-12-8 16:50:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

1、使用Docker Compose须要性及界说

用容器运行一个服务,必要使用docker run下令。但假如我要运行多个服务呢?
假设我要运行一个web服务,还要运行一个db服务,那么是用一个容器运行,照旧用多个容器运行呢?
一个容器运行多个服务会造成镜像的复杂度进步,docker倾向于一个容器运行一个应用。
那么复杂的架构就会必要很多的容器,而且必要它们之间有关联(容器之间的依赖和毗连)就更复杂了。
这个复杂的标题必要办理,这就涉及到了容器编排的标题了。
Compose 编排


  • 是对多个容器举行启动和管理的方法
  • 比方:LNMT,先启动MySQL,再启动Tomcat,末了启动Nginx
服务架构的演进

容器编排工具


  • docker machine

    • 在假造机中摆设docker容器引擎的工具

  • docker compose

    • 是一个用于界说和运行多容器Docker的应用步伐工具

  • docker swarm

    • 是Docker Host主机批量管理及资源调理管理工具

  • mesos+marathon

    • mesos 对盘算机盘算资源举行管理和调理
    • marathon 服务发现及负载均衡的功能

  • kubernetes

    • google开源的容器编排工具


2、Docker Compose应用参考资料

网址:https://docs.docker.com/compose/

YAML分析:https://yaml.org/

3、Docker Compose应用最佳实践步调

1_概念

工程(project)
服务 (Service)
容器 (Container)

2_步调

1 界说应用的Dockerfile文件,为了anywhere举行构建。
2 使用docker-compose.yaml界说一套服务,这套服务可以一起在一个隔离环境中运行。
3 使用docker-compose up
就可以启动整套服务。

4、Docker Compose安装





下载
  1. wget https://github.com/docker/compose/releases/download/v2.31.0/docker-compose-linux-x86_64
复制代码
加入到全局可实验文件目次下
  1. mv docker-compose-linux-x86_64 /usr/bin/docker-compose
复制代码
授予实验权限
  1. chmod +x /usr/bin/docker-compose
复制代码
验证
  1. [root@localhost ~]# docker-compose version
  2. Docker Compose version v2.31.0
  3. [root@localhost ~]# docker compose version
  4. Docker Compose version v2.29.7
复制代码
注意:docker 20.10 以上版本主动集成 v2 的 docker compose ( 没有连词符- )

5、Docker Compose应用案例

运行Python语言开辟的网站
1_网站文件准备

创建工作目次
  1. mkdir flaskproject
  2. cd flaskproject/
复制代码
准备网站文件
  1. vim app.py
复制代码
添加如下内容(python)
  1. import time
  2. import redis
  3. from flask import Flask
  4. app = Flask(__name__)
  5. cache = redis.Redis(host='redis', port=6379)
  6. # 用户的每一次访问都记录到redis中并返回给页面显示出来
  7. def get_hit_count():
  8.     retries = 5
  9.     while True:
  10.         try:
  11.             return cache.incr('hits')
  12.         except redis.exceptions.ConnectionError as exc:
  13.             if retries == 0:
  14.                 raise exc
  15.             retries -= 1
  16.             time.sleep(0.5)
  17. @app.route('/')
  18. def hello():
  19.     count = get_hit_count()
  20.     return 'Hello World! I have been seen {} times.\n'.format(count)
复制代码
可以看到必要两个告急服务flask和redis,将所需资源写入文件中生存
  1. vim requirements.txt
复制代码
添加:
  1. flask
  2. redis
复制代码

2_Dockerfile文件准备

编写Dockerfile文件
  1. vim Dockerfile
复制代码
内容如下:
  1. FROM python:3.7-alpine
  2. WORKDIR /code
  3. ENV FLASK_APP app.py
  4. ENV FLASK_RUN_HOST 0.0.0.0
  5. RUN apk add --no-cache gcc musl-dev linux-headers
  6. COPY requirements.txt requirements.txt
  7. RUN pip install -r requirements.txt
  8. COPY . .
  9. CMD ["flask", "run"]
复制代码

3_Compose文件准备

编写compose文件,在不使用额外选项的环境下,名字只能叫这个
  1. vim docker-compose.yaml
复制代码
内容如下:
  1. version: '3'
  2. services:
  3.   web:
  4.     build: .
  5.     ports:
  6.       - "5000:5000"
  7.   redis:
  8.     image: "redis:alpine"
复制代码
versionyaml语法格式版本services工程中所包罗的服务webweb服务build.基于当前目次下的Dockerfile文件来构建镜像ports袒露容器5000端口到宿主机5000redisredis服务,同时使用了image指定了镜像注意启动序次是从文件界说的内容自上而下的。

4_使用docker-compose up
启动容器


颠末如上利用,统共准备好了如下文件:
  1. [root@localhost flaskproject]# ls
  2. app.py  docker-compose.yaml  Dockerfile  requirements.txt
复制代码
实验docker-compose.yaml,up表现创建并启动容器,克制则使用down。
假如不想容器在前台启动,加上-d选项。
  1. docker-compose up
复制代码
输出:
  1. [+] Running 9/9
  2. ✔ redis Pulled                                                                                                                                                                                            15.8s
  3.    ✔ da9db072f522 Pull complete                                                                                                                                                                             3.5s
  4.    ✔ dd8d46bd4047 Pull complete                                                                                                                                                                             3.5s
  5.    ✔ 5057e26f1a86 Pull complete                                                                                                                                                                             3.8s
  6.    ✔ be83d0fd33a3 Pull complete                                                                                                                                                                             4.6s
  7.    ✔ b3d150cb1b6c Pull complete                                                                                                                                                                             9.0s
  8.    ✔ 369ad5b9119b Pull complete                                                                                                                                                                             9.0s
  9.    ✔ 4f4fb700ef54 Pull complete                                                                                                                                                                             9.1s
  10.    ✔ 37d63ae71d35 Pull complete                                                                                                                                                                             9.1s
  11. [+] Running 0/0
  12. [+] Building 33.9s (8/10)                                                                                                                                                                         docker:default
  13. => [web internal] load build definition from Dockerfile                                                                                                                                                    0.0s
  14. [+] Building 42.5s (12/12) FINISHED                                                                                                                                                               docker:default
  15. => [web internal] load build definition from Dockerfile                                                                                                                                                    0.0s
  16. => => transferring dockerfile: 339B                                                                                                                                                                        0.0s
  17. => [web internal] load metadata for docker.io/library/python:3.7-alpine                                                                                                                                    4.5s
  18. => [web internal] load .dockerignore                                                                                                                                                                       0.0s
  19. => => transferring context: 2B                                                                                                                                                                             0.0s
  20. => [web internal] load build context                                                                                                                                                                       0.0s
  21. => => transferring context: 1.37kB                                                                                                                                                                         0.0s
  22. => [web 1/6] FROM docker.io/library/python:3.7-alpine@sha256:f3d31c8677d03f0b3c724446077f229a6ce9d3ac430f5c08cd7dff00292048c3                                                                              7.7s
  23. => => resolve docker.io/library/python:3.7-alpine@sha256:f3d31c8677d03f0b3c724446077f229a6ce9d3ac430f5c08cd7dff00292048c3                                                                                  0.0s
  24. => => sha256:f3d31c8677d03f0b3c724446077f229a6ce9d3ac430f5c08cd7dff00292048c3 1.65kB / 1.65kB                                                                                                              0.0s
  25. => => sha256:e6da3ee9bb64dd12b98fa609487f112fe1e365522e6e8345309db15c22a80a51 1.37kB / 1.37kB                                                                                                              0.0s
  26. => => sha256:1bac8ae77e4af0b868b62a75115616a20e025e0451eeed05d94a4cfc4523e58a 6.87kB / 6.87kB                                                                                                              0.0s
  27. => => sha256:96526aa774ef0126ad0fe9e9a95764c5fc37f409ab9e97021e7b4775d82bf6fa 3.40MB / 3.40MB                                                                                                              3.6s
  28. => => sha256:9875af95546db78168a6761b7fa205ed1cd0c153cd89356c1512e551c12b2d5c 622.29kB / 622.29kB                                                                                                          2.5s
  29. => => sha256:4819c95424fc4a94767c9329b02238ebcce0bc682384cb671379bc1fb8a12b55 10.94MB / 10.94MB                                                                                                            6.0s
  30. => => sha256:148762f75a1f92cc9857e9c488bf95d5aac61e9905ec47a7408025b2dd5c3b7a 240B / 240B                                                                                                                  3.0s
  31. => => sha256:ea1518237b3753b3fe40ee773d77651704178d9baa72ae5012e13a992cfa6c63 2.85MB / 2.85MB                                                                                                              5.2s
  32. => => extracting sha256:96526aa774ef0126ad0fe9e9a95764c5fc37f409ab9e97021e7b4775d82bf6fa                                                                                                                   0.1s
  33. => => extracting sha256:9875af95546db78168a6761b7fa205ed1cd0c153cd89356c1512e551c12b2d5c                                                                                                                   0.4s
  34. => => extracting sha256:4819c95424fc4a94767c9329b02238ebcce0bc682384cb671379bc1fb8a12b55                                                                                                                   1.0s
  35. => => extracting sha256:148762f75a1f92cc9857e9c488bf95d5aac61e9905ec47a7408025b2dd5c3b7a                                                                                                                   0.0s
  36. => => extracting sha256:ea1518237b3753b3fe40ee773d77651704178d9baa72ae5012e13a992cfa6c63                                                                                                                   0.5s
  37. => [web 2/6] WORKDIR /code                                                                                                                                                                                 0.3s
  38. => [web 3/6] RUN apk add --no-cache gcc musl-dev linux-headers                                                                                                                                            16.1s
  39. => [web 4/6] COPY requirements.txt requirements.txt                                                                                                                                                        0.0s
  40. => [web 5/6] RUN pip install -r requirements.txt                                                                                                                                                          13.3s
  41. => [web 6/6] COPY . .                                                                                                                                                                                      0.0s
  42. => [web] exporting to image                                                                                                                                                                                0.5s
  43. => => exporting layers                                                                                                                                                                                     0.5s
  44. => => writing image sha256:631b987cf5ad154d30190d2cdac81aeb50eea7b99d7cbb4f0258f32012f1a5d4                                                                                                                0.0s
  45. [+] Running 4/2o docker.io/library/flaskproject-web                                                                                                                                                         0.0s
  46. ✔ Service web                     Built                                                                                                                                                                   42.6s
  47. ✔ Network flaskproject_default    Created                                                                                                                                                                  0.4s
  48. ✔ Container flaskproject-web-1    Created                                                                                                                                                                  0.1s
  49. ✔ Container flaskproject-redis-1  Created                                                                                                                                                                  0.1s
  50. Attaching to redis-1, web-1
  51. redis-1  | 1:C 08 Dec 2024 17:00:37.695 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
  52. redis-1  | 1:C 08 Dec 2024 17:00:37.695 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
  53. redis-1  | 1:C 08 Dec 2024 17:00:37.695 * Redis version=7.4.1, bits=64, commit=00000000, modified=0, pid=1, just started
  54. redis-1  | 1:C 08 Dec 2024 17:00:37.695 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
  55. redis-1  | 1:M 08 Dec 2024 17:00:37.695 * monotonic clock: POSIX clock_gettime
  56. redis-1  | 1:M 08 Dec 2024 17:00:37.697 * Running mode=standalone, port=6379.
  57. redis-1  | 1:M 08 Dec 2024 17:00:37.698 * Server initialized
  58. redis-1  | 1:M 08 Dec 2024 17:00:37.698 * Ready to accept connections tcp
  59. web-1    |  * Serving Flask app 'app.py'
  60. web-1    |  * Debug mode: off
  61. web-1    | WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
  62. web-1    |  * Running on all addresses (0.0.0.0)
  63. web-1    |  * Running on http://127.0.0.1:5000
  64. web-1    |  * Running on http://172.18.0.2:5000
  65. web-1    | Press CTRL+C to quit
  66. w Enable Watch
复制代码

5_访问



6_常见利用增补

详见官网:https://docs.docker.com/compose/reference/
根本语法如下:
  1. docker compose [OPTIONS] [COMMAND]
复制代码
范例参数或指令分析Options-f指定compose文件的路径和名称-p指定project名称,project 就是当前compose文件中设置的多个service的聚集,是逻辑概念Commandsup创建并启动全部service容器down克制并移除全部容器、网络ps列出全部启动的容器logs检察指定容器的日志日志stop克制容器start启动容器restart重启容器top检察运行的历程exec在指定的运行中容器中实验下令
6、Docker Compose的版本

version 是 Docker Compose 文件中的一个顶级字段,用来指定 Compose 文件的版本。
它直接影响文件的语法规则和功能支持,以下是对 version 的详细先容:

1_支持的版本

Docker Compose 支持多个版本,每个版本提供差异的功能。告急版本包罗:
1.x


  • 使用的是较早的 Compose 文件格式。
  • 没有顶级 version 字段。
  • 功能较为有限。
2.x


  • 引入了更复杂的功能,如 volumes、networks 和 depends_on。
  • 必须在文件中声明 version,如:
  1. version: '2'
复制代码
3.x


  • 当前保举的版本,支持更多 Docker 的今世功能,如 Swarm 和服务扩展。
  • 常见版本为 3、3.1、3.2 等,需声明为:
  1. version: '3'
复制代码


  • 特性:支持 deploy、configs、secrets 等功能,专为 Swarm 模式优化。

选择 version 时,应根据以下因素举行判定:
1 Docker 和 Compose 的版本兼容性


  • 运行环境的 Docker 和 Docker Compose 必须支持指定的 Compose 文件版本。
  • 可以通过下令查抄支持的版本:
  1. docker-compose version
  2. docker version
复制代码
2 功能需求


  • 简单场景: 假如仅必要根本功能(如界说服务、端口、卷等),可以使用 version: '2'
    或 version: '3'
    。
  • 复杂场景: 假如必要使用 Swarm 或高级功能(如 deploy 设置),则必要使用 version: '3.x'。

2_常见示例

以下是差异版本的 Compose 文件示例:
Version 1(无 version 字段)
实用于最根本的环境,仅界说服务。
  1. web:
  2.   image: nginx
  3.   ports:
  4.     - "80:80"
复制代码
Version 2
支持卷、网络、依赖等功能。
  1. version: '2'
  2. services:  web:    image: nginx    ports:      - "80:80"    depends_on:      - redis  redis:    image: redis:alpine
复制代码
Version 3
支持 Swarm 集乐成能。
  1. version: '3.8'
  2. services:
  3.   web:
  4.     image: nginx
  5.     ports:
  6.       - "80:80"
  7.     deploy:
  8.       replicas: 3
  9.   redis:
  10.     image: redis:alpine
  11. volumes:
  12.   data:
  13.     driver: local
复制代码

3_关键点

1 向后兼容


  • Docker Compose 支持向后兼容:较新版本的 Compose 文件可以在支持旧版本的环境中运行,但反之不愿定创建。
  • 假如不确定兼容性,使用较低版本(如 2.4)可以进步通用性。
2 语法限定


  • 差异 version 支持的功能差异,某些字段(如 deploy)仅在 version: '3.x' 中可用。
3 最新保举


  • 当前保举使用 version: '3.8',这是最新功能最美满的版本。

7、增补

假如在 docker-compose.yaml 文件中必要使用如 ${DOCKER_IP} 这种情势的环境变量可以有三种方式:
方法一:在运行下令前设置环境变量(保举)
在下令行运行 docker compose 前设置变量:
  1. export DOCKER_IP=192.168.1.100
  2.   # 你的宿主机 IP
  3. docker compose up -d
复制代码
实用于暂时启动,变量只在当前终端有效。
方法二:使用 .env 文件
创建一个与 docker-compose.yml 同目次下的 .env 文件:
  1. DOCKER_IP=192.168.1.100
复制代码
然后 docker compose 会主动读取 .env 文件并将此中的变量用于模板更换。
示例布局:
  1. project-folder/
  2. ├── docker-compose.yml
  3. └── .env
复制代码
实用于长期化设置,不必要每次手动 export。
方法三:直接在 docker-compose.yml 中写死
  1. environment:
  2.   ACT_KEYCLOAK_URL: "http://192.168.1.100/auth"
复制代码
不保举用于多人协作或差异主机摆设,由于写死 IP 会缺乏机动性。
8、总结

docker compose 强吗? 很强,由于我们会发现不管多么复杂的应用,使用 docker compose 都可以轻松将其构建起来!
但是它实在功能还不是太全,好比不能跨 docker host 工作,在云原生范畴中,真正强大的是kubernetes。

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表