参考源

https://www.bilibili.com/video/BV1og4y1q7M4?spm_id_from=333.999.0.0

https://www.bilibili.com/video/BV1kv411q7Qc?spm_id_from=333.999.0.0

版本

本文章基于 Docker 20.10.11


简介

使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker builddocker run 等命令操作容器。

然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,这样效率很低,也不方便管理。

使用 Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具。

yaml 官方示例

https://docs.docker.com/compose/compose-file/compose-file-v3/#compose-file-structure-and-examples

version: "3.9"
services:redis:image: redis:alpineports:- "6379"networks:- frontenddeploy:replicas: 2update_config:parallelism: 2delay: 10srestart_policy:condition: on-failuredb:image: postgres:9.4volumes:- db-data:/var/lib/postgresql/datanetworks:- backenddeploy:placement:max_replicas_per_node: 1constraints:- "node.role==manager"vote:image: dockersamples/examplevotingapp_vote:beforeports:- "5000:80"networks:- frontenddepends_on:- redisdeploy:replicas: 2update_config:parallelism: 2restart_policy:condition: on-failureresult:image: dockersamples/examplevotingapp_result:beforeports:- "5001:80"networks:- backenddepends_on:- dbdeploy:replicas: 1update_config:parallelism: 2delay: 10srestart_policy:condition: on-failureworker:image: dockersamples/examplevotingapp_workernetworks:- frontend- backenddeploy:mode: replicatedreplicas: 1labels: [APP=VOTING]restart_policy:condition: on-failuredelay: 10smax_attempts: 3window: 120splacement:constraints:- "node.role==manager"visualizer:image: dockersamples/visualizer:stableports:- "8080:8080"stop_grace_period: 1m30svolumes:- "/var/run/docker.sock:/var/run/docker.sock"deploy:placement:constraints:- "node.role==manager"networks:frontend:backend:volumes:db-data:

depends_on:依赖关系,如 web 依赖 redis 和 db,通过 depends_on 表明关系。

version: "3.9"
services:web:build: .depends_on:- db- redisredis:image: redisdb:image: postgres

安装

Docker Compose 是 Docker 的一个开源项目,目前托管到了 GitHub,需要前往 GitHub 下载。

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

由于存放在 GitHub,国内网络限制导致不太稳定,不推荐使用。

推荐使用 道客 提供的 Docker 极速下载 进行安装。

curl -L https://get.daocloud.io/docker/compose/releases/download/v2.2.3/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

安装

[root@sail ~]# curl -L https://get.daocloud.io/docker/compose/releases/download/v2.2.3/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose% Total    % Received % Xferd  Average Speed   Time    Time     Time  CurrentDload  Upload   Total   Spent    Left  Speed
100   423  100   423    0     0    394      0  0:00:01  0:00:01 --:--:--   394
100 23.5M  100 23.5M    0     0  8670k      0  0:00:02  0:00:02 --:--:-- 20.3M
[root@sail ~]# cd /usr/local/bin/
[root@sail bin]# ls
docker-compose

这样即表示安装成功。

授权

[root@sail ~]# chmod +x /usr/local/bin/docker-compose
[root@sail ~]#

查看版本

docker-compose version

[root@sail bin]# docker-compose version
Docker Compose version v2.2.3

显示了版本即代表 Docker Compose 安装完成。

卸载

rm /usr/local/bin/docker-compose

由于 Linux 一切皆文件,删除此文件夹即可完成 Docker Compose 的卸载。

使用

构建

创建项目目录

[root@sail sail]# mkdir docker-compose
[root@sail sail]# cd docker-compose
[root@sail docker-compose]#

创建 app.py

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

redis 是应用容器中 redis 容器的主机名,在同一网络下可以通过服务名访问,端口默认 6379。

创建 requirements.txt

[root@sail docker-compose]# vim requirements.txt
[root@sail docker-compose]# cat requirements.txt
flask
redis

创建 Dockerfile

[root@sail docker-compose]# vim Dockerfile
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"]

创建 docker-compose.yml

[root@sail docker-compose]# vim docker-compose.yml
version: "3.3"
services:web:build: .ports:- "5000:5000"redis:image: "redis:alpine"

这个文件定义了两个服务:web 和 redis。

启动

docker-compose up

运行应用

在项目目录中,运行 docker-compose up 来启动应用程序。

第一次启动需要安装很多环境,比较缓慢。

[root@sail docker-compose]# docker-compose up
[+] Running 7/7⠿ redis Pulled                                                                                                                                                                                              14.1s⠿ 59bf1c3509f3 Pull complete                                                                                                                                                                               3.0s⠿ 719adce26c52 Pull complete                                                                                                                                                                               3.1s⠿ b8f35e378c31 Pull complete                                                                                                                                                                               3.3s⠿ d034517f789c Pull complete                                                                                                                                                                               9.0s⠿ 3772d4d76753 Pull complete                                                                                                                                                                               9.0s⠿ 211a7f52febb Pull complete                                                                                                                                                                               9.1s
Sending build context to Docker daemon     725B
Step 1/10 : FROM python:3.7-alpine
3.7-alpine: Pulling from library/python
59bf1c3509f3: Already exists
8786870f2876: Pull complete
45d4696938d0: Pull complete
ef84af58b2c5: Pull complete
c3c9b71b9a69: Pull complete
Digest: sha256:d64e0124674d64e78cc9d7378a1130499ced66a7a00db0521d0120a2e88ac9e4
Status: Downloaded newer image for python:3.7-alpine---> a1034fd13493
Step 2/10 : WORKDIR /code---> Running in e23e4b173abf
Removing intermediate container e23e4b173abf---> 41eb64157cfc
Step 3/10 : ENV FLASK_APP=app.py---> Running in cdefb769398d
Removing intermediate container cdefb769398d---> ab741ac5cb17
Step 4/10 : ENV FLASK_RUN_HOST=0.0.0.0---> Running in 4976c1da428c
Removing intermediate container 4976c1da428c---> 5a5c24d67db6
Step 5/10 : RUN apk add --no-cache gcc musl-dev linux-headers---> Running in 53043bd38e33
fetch https://dl-cdn.alpinelinux.org/alpine/v3.15/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.15/community/x86_64/APKINDEX.tar.gz
(1/13) Installing libgcc (10.3.1_git20211027-r0)
(2/13) Installing libstdc++ (10.3.1_git20211027-r0)
(3/13) Installing binutils (2.37-r3)
(4/13) Installing libgomp (10.3.1_git20211027-r0)
(5/13) Installing libatomic (10.3.1_git20211027-r0)
(6/13) Installing libgphobos (10.3.1_git20211027-r0)
(7/13) Installing gmp (6.2.1-r0)
(8/13) Installing isl22 (0.22-r0)
(9/13) Installing mpfr4 (4.1.0-r0)
(10/13) Installing mpc1 (1.2.1-r0)
(11/13) Installing gcc (10.3.1_git20211027-r0)
(12/13) Installing linux-headers (5.10.41-r0)
(13/13) Installing musl-dev (1.2.2-r7)
Executing busybox-1.34.1-r3.trigger
OK: 139 MiB in 48 packages
Removing intermediate container 53043bd38e33---> 73e9550df596
Step 6/10 : COPY requirements.txt requirements.txt---> c5a73d6f1fe1
Step 7/10 : RUN pip install -r requirements.txt---> Running in 826790d0bfbb
Collecting flaskDownloading Flask-2.0.2-py3-none-any.whl (95 kB)
Collecting redisDownloading redis-4.1.0-py3-none-any.whl (171 kB)
Collecting itsdangerous>=2.0Downloading itsdangerous-2.0.1-py3-none-any.whl (18 kB)
Collecting click>=7.1.2Downloading click-8.0.3-py3-none-any.whl (97 kB)
Collecting Werkzeug>=2.0Downloading Werkzeug-2.0.2-py3-none-any.whl (288 kB)
Collecting Jinja2>=3.0Downloading Jinja2-3.0.3-py3-none-any.whl (133 kB)
Collecting packaging>=21.3Downloading packaging-21.3-py3-none-any.whl (40 kB)
Collecting deprecated>=1.2.3Downloading Deprecated-1.2.13-py2.py3-none-any.whl (9.6 kB)
Collecting importlib-metadata>=1.0Downloading importlib_metadata-4.10.0-py3-none-any.whl (17 kB)
Collecting wrapt<2,>=1.10Downloading wrapt-1.13.3-cp37-cp37m-musllinux_1_1_x86_64.whl (78 kB)
Collecting zipp>=0.5Downloading zipp-3.7.0-py3-none-any.whl (5.3 kB)
Collecting typing-extensions>=3.6.4Downloading typing_extensions-4.0.1-py3-none-any.whl (22 kB)
Collecting MarkupSafe>=2.0Downloading MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl (30 kB)
Collecting pyparsing!=3.0.5,>=2.0.2Downloading pyparsing-3.0.6-py3-none-any.whl (97 kB)
Installing collected packages: zipp, typing-extensions, wrapt, pyparsing, MarkupSafe, importlib-metadata, Werkzeug, packaging, Jinja2, itsdangerous, deprecated, click, redis, flask
Successfully installed Jinja2-3.0.3 MarkupSafe-2.0.1 Werkzeug-2.0.2 click-8.0.3 deprecated-1.2.13 flask-2.0.2 importlib-metadata-4.10.0 itsdangerous-2.0.1 packaging-21.3 pyparsing-3.0.6 redis-4.1.0 typing-extensions-4.0.1 wrapt-1.13.3 zipp-3.7.0
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
WARNING: You are using pip version 21.2.4; however, version 21.3.1 is available.
You should consider upgrading via the '/usr/local/bin/python -m pip install --upgrade pip' command.
Removing intermediate container 826790d0bfbb---> c1483947fad2
Step 8/10 : EXPOSE 5000---> Running in cd59e0408b47
Removing intermediate container cd59e0408b47---> 05c632dea80d
Step 9/10 : COPY . .---> 8c89b910e366
Step 10/10 : CMD ["flask", "run"]---> Running in 1d9d071fee96
Removing intermediate container 1d9d071fee96---> de4639486b50
Successfully built de4639486b50
Successfully tagged docker-compose_web:latestUse 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
[+] Running 3/3⠿ Network docker-compose_default    Created                                                                                                                                                                  0.3s⠿ Container docker-compose-redis-1  Created                                                                                                                                                                  0.0s⠿ Container docker-compose-web-1    Created                                                                                                                                                                  0.0s
Attaching to docker-compose-redis-1, docker-compose-web-1
docker-compose-redis-1  | 1:C 07 Jan 2022 08:36:26.687 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
docker-compose-redis-1  | 1:C 07 Jan 2022 08:36:26.687 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=1, just started
docker-compose-redis-1  | 1:C 07 Jan 2022 08:36:26.687 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
docker-compose-redis-1  | 1:M 07 Jan 2022 08:36:26.687 * monotonic clock: POSIX clock_gettime
docker-compose-redis-1  | 1:M 07 Jan 2022 08:36:26.688 * Running mode=standalone, port=6379.
docker-compose-redis-1  | 1:M 07 Jan 2022 08:36:26.688 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
docker-compose-redis-1  | 1:M 07 Jan 2022 08:36:26.688 # Server initialized
docker-compose-redis-1  | 1:M 07 Jan 2022 08:36:26.688 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. 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.
docker-compose-redis-1  | 1:M 07 Jan 2022 08:36:26.688 * Ready to accept connections
docker-compose-web-1    |  * Serving Flask app 'app.py' (lazy loading)
docker-compose-web-1    |  * Environment: production
docker-compose-web-1    |    WARNING: This is a development server. Do not use it in a production deployment.
docker-compose-web-1    |    Use a production WSGI server instead.
docker-compose-web-1    |  * Debug mode: off
docker-compose-web-1    |  * Running on all addresses.
docker-compose-web-1    |    WARNING: This is a development server. Do not use it in a production deployment.
docker-compose-web-1    |  * Running on http://172.18.0.2:5000/ (Press CTRL+C to quit)

查看镜像

[root@sail docker-compose]# docker images
REPOSITORY           TAG          IMAGE ID       CREATED          SIZE
docker-compose_web   latest       6df8b78250a1   44 seconds ago   185MB
redis                alpine       3900abf41552   5 weeks ago      32.4MB
python               3.7-alpine   a1034fd13493   5 weeks ago      41.8MB

启动 Docker Compose 时,会自动拉取需要的镜像。

查看容器

[root@sail docker-compose]# docker ps
CONTAINER ID   IMAGE                COMMAND                  CREATED         STATUS         PORTS                    NAMES
78a6f8b03a49   docker-compose_web   "flask run"              8 minutes ago   Up 8 minutes   0.0.0.0:5000->5000/tcp   docker-compose-web-1
b4da6da4364f   redis:alpine         "docker-entrypoint.s…"   8 minutes ago   Up 8 minutes   6379/tcp                 docker-compose-redis-1

可以看到容器命名都带有数字,是因为需要集群管理,数字代表副本序号。

查看网络

[root@sail docker-compose]# docker network ls
NETWORK ID     NAME                     DRIVER    SCOPE
b89f719e94e0   bridge                   bridge    local
619a5845a105   docker-compose_default   bridge    local
28d77e958643   host                     host      local
801fbbe1b38c   mynet                    bridge    local
c3ff850e96f0   none                     null      local

项目中的内容都在同个网络下。

访问测试

[root@sail docker-compose]# curl localhost:5000
Hello World! I have been seen 1 times.
[root@sail docker-compose]# curl localhost:5000
Hello World! I have been seen 2 times.
[root@sail docker-compose]# curl localhost:5000
Hello World! I have been seen 3 times.

Docker Compose 启动完成。

停止

docker-compose stop

示例

[root@sail docker-compose]# docker-compose stop
[+] Running 2/2⠿ Container docker-compose-redis-1  Stopped                                                                                                                 0.2s⠿ Container docker-compose-web-1    Stopped

停止并删除容器和网络

docker-compose down

示例

[root@sail docker-compose]# docker-compose down
[+] Running 3/3⠿ Container docker-compose-web-1    Removed                                                                                                                              10.2s⠿ Container docker-compose-redis-1  Removed                                                                                                                               0.2s⠿ Network docker-compose_default    Removed
[root@sail docker-compose]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@sail docker-compose]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
b89f719e94e0   bridge    bridge    local
28d77e958643   host      host      local
801fbbe1b38c   mynet     bridge    local
c3ff850e96f0   none      null      local

可以看出,容器网络都被删除了。

更多配置

https://docs.docker.com/compose/compose-file/compose-file-v3/#compose-file-structure-and-examples

Docker 15 Compose相关推荐

  1. Docker之compose介绍

    前言 使用一个Dockerfile模板文件可以定义一个单独的应用容器,如果需要定义多个容器就需要服务编排.下面介绍Docker官方产品,Docker Compose. Dockerfile可以让用户管 ...

  2. docker supervisor + compose

    一: Supervisor Docker  容器在启动的时候开启单个进程,比如,一个  ssh  或者  apache  的  daemon  服务. 但我们经常需要在一个机器上开启多个服务,这可以有 ...

  3. 跟我一起学docker(15)--监控日志和日志管理

    为什么要进行日志收集? 应用程序跑在集群中,产生很多的日志,日志中包含着程序运行的情况的纪录,查看单个机器的日志过程繁琐,所以需要统一的日志管理平台对日志进行统一处理,将所有应用程序的日志收集起来,可 ...

  4. docker学习 --Compose 容器编排,常用命令等.集成spring。mysql。redis

    一切皆容器 处处云原生 有什么用 写好容器之间的编排调用关系 ,一个命令直接使用,相当于spring中的application.xml 例如你可以编排先启动elasticsearch再启动kabbin ...

  5. docker 高级 compose/swarm

    docker高级 前言:最近让我部署一个项目,该项目是多个服务的,在启动多个容器的时候是比较麻烦的.于是就想到了docker-compose 容器编排. 结构: docker-compose 容器编排 ...

  6. 附005.Docker Compose文件详解

    一 Docker Compose文件简介 compose文件使用yml格式,主要分为了四个区域: version:用于指定当前docker-compose.yml语法遵循哪个版本 services:服 ...

  7. 使用Docker Compose管理多个容器

    使用Docker Compose管理多个容器 Docker Compose是一个用来定义和运行复杂应用的Docker工具.使用Compose,你可以在一个文件中定义一个多容器应用,然后使用一条命令来启 ...

  8. docker/Dockerfile/docker compose

    安装docker https://mirror.tuna.tsinghua.edu.cn/help/docker-ce/ 在x86环境下,由容器统一管理开发及运行环境. Docker https:// ...

  9. Docker - 使用Docker Compose部署应用

    简介 Docker Compose是一个基于Docker Engine进行安装的Python工具.该工具使得用户可以在一个声明式的配置文件中定义一个多容器的应用,在Docker节点上,以单引擎模式(S ...

最新文章

  1. P2888 [USACO07NOV]牛栏Cow Hurdles(Floyd算法)
  2. 零字节WSASend,WSARecv
  3. xmlWriter 以UTF-8格式写xml问题
  4. P2055-假期的宿舍【网络流,最大流,最大匹配】
  5. Hbase Compaction 队列数量较大分析
  6. 三维曲线图的绘制方法大全
  7. vue手机端回退_vue移动端弹框组件 - osc_eiolhkks的个人空间 - OSCHINA - 中文开源技术交流社区...
  8. Ruby module ---模块,组件
  9. iphone-common-codes-ccteam源代码 CCCompile.h
  10. paip.提升性能--多核编程中的java .net php c++最佳实践 v2.0 cah
  11. 计算机硬盘小影响,系统C盘容量太小有哪些危害?又要如何扩容呢?今天再说一遍!...
  12. 【论文笔记】Beyond a Gaussian Denoiser: Residual Learning of Deep CNN for Image Denoising
  13. linux ubuntu木马,Ubuntu病毒查杀 ClamAV 简介以及适用范围
  14. 使用python制作矢量图
  15. odoo学习笔记(一)
  16. 在桌面右键菜单添加【切换电源计划-卓越性能】选项
  17. Postman测试工具调试接口详细教程【向后端发送Json数据并接收返回的Json结果】
  18. ai描边工具怎么打开_AI描边工具命令讲解,教你ai描边功能实用技巧
  19. Redis 之BIO与RIO
  20. 你信吗?任正非在华为持股仅1.42%!华为轮值CEO徐直军全面剖析华为

热门文章

  1. WPS使用技巧之Excel表格两列数据合并
  2. 【Kafka】(四)Kafka使用 Consumer 接收消息消费
  3. 【mcuclub】PWM(呼吸灯、调节灯亮度)
  4. 被寄予厚望的 Serverless,争议和问题都解决了吗
  5. Nginx的前世今生
  6. PCA主成分分析实现方法Matlab
  7. 数据摆渡服务器_云桌面环境下 如何建立数据安全便捷交换的统一通道?
  8. TrackPopupMenu和DoModal
  9. 陈水冬:励志戎马寄情翰墨
  10. 1. 尝试用双重循环打印出直角三角形、等腰三角形和等腰三角形的对称图形