Docker Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。(需要下载)
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
如果你还不了解 YML 文件配置,可以先阅读 YAML 入门教程。
Docker Compose将所管理的容器分为三层,分别是项目(project),服务(service)以及容器(container)
(Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡。 Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。 使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。 Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。 Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API,就可以在其上利用Compose来进行编排管理。)
Compose 使用的三个步骤:
1. 使用 Dockerfile 定义应用程序的环境。
2. 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
3. 最后,执行 docker-compose up 命令来启动并运行整个应用程序。
docker-compose.yml 的配置案例如下:
# yaml 配置实例 version: "3.7" services: app: image: node:12-alpine command: sh -c "yarn install && yarn run dev" ports: - 3000:3000 working_dir: /app volumes: - ./:/app environment: MYSQL_HOST: mysql MYSQL_USER: root MYSQL_PASSWORD: secret MYSQL_DB: todos
# 直接使用软件仓库安装 docker-compose-plugin [root@fedora ~]# yum install -y docker-compose-plugin ...... ...... 已安装: docker-compose-plugin-2.6.0-3.fc36.x86_64 完毕! # 测试安装 [root@fedora ~]# docker compose version Docker Compose version v2.6.0
# 1.为项目创建一个目录 [root@fedora ~]# mkdir composetest [root@fedora ~]# cd composetest/ # 2.创建一个名为 app.py 文件 [root@fedora composetest]# touch 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)
# 3.创建一个名为 requirements.txt 文件 [root@fedora composetest]# vim requirements.txt [root@fedora composetest]# cat requirements.txt flask redis
在 composetest 目录中,创建一个名为 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 内容解释:
ENV FLASK_APP app.py ENV FLASK_RUN_HOST 0.0.0.0
设置 flask 命令使用的环境变量。
COPY requirements.txt requirements.txt RUN pip install -r requirements.txt
复制 requirements.txt 并安装 Python 依赖项。
version: "3.9" services: web: build: . ports: - "8000:5000" redis: image: "redis:alpine"
该 Compose 文件定义了两个服务:web 和 redis。
在测试目录中,执行以下命令来启动应用程序:
docker-compose up
如果你想在后台执行该服务可以加上 -d 参数:
docker-compose up -d若执行时遇到以下错误:
Step 5/9 : RUN apk add --no-cache gcc musl-dev linux-headers ---> [Warning] IPv4 forwarding is disabled. Networking will not work. ---> Running in 7b29f4df9539 fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/main/x86_64/APKINDEX.tar.gz fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/community/x86_64/APKINDEX.tar.gz WARNING: Ignoring http://dl-cdn.alpinelinux.org/alpine/v3.11/main/x86_64/APKINDEX.tar.gz: temporary error (try again later) WARNING: Ignoring http://dl-cdn.alpinelinux.org/alpine/v3.11/community/x86_64/APKINDEX.tar.gz: temporary error (try again later) ERROR: unsatisfiable constraints: gcc (missing): required by: world[gcc] linux-headers (missing): required by: world[linux-headers] musl-dev (missing): required by: world[musl-dev] ERROR: Service 'web' failed to build: The command '/bin/sh -c apk add --no-cache gcc musl-dev linux-headers' returned a non-zero code: 3
我通过使用来自以下网址的博客部分解决了 Fedora 上的这个问题: https
启用旧 CGroups:
sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0"
防火墙中的白名单:(若出现异常,可关闭防火墙)
sudo firewall-cmd --permanent --zone=trusted --add-interface=docker0 sudo firewall-cmd --permanent --zone=FedoraWorkstation --add-masquerade
为 docket-composer 安装依赖项:
sudo dnf install python3-attrs python3-bcrypt python3-cached_property python3-docker python3-docker-pycreds python3-dockerpty python3-docopt python3-fluidity-sm python3-invoke python3-jsonschema python3-lexicon python3-paramiko python3-pyasn1 python3-pynacl python3-pyrsistent python3-texttable python3-websocket-client
sudo reboot
[root@fedora ~]# docker network ls NETWORK ID NAME DRIVER SCOPE cfe7a624b7d7 bridge bridge local 9082dd33ec54 composetest_default bridge local 652ac854120d host host local # composetest_default # 项目中的所有容器都在同一个网络内,可以通过域名访问 [root@fedora ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE composetest_web latest ed2275100142 27 minutes ago 185MB redis alpine 3900abf41552 6 months ago 32.4MB python 3.7-alpine a1034fd13493 6 months ago 41.8MB [root@fedora ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c264f9403f6b composetest_web "flask run" 6 minutes ago Up 5 minutes 0.0.0.0:8000->5000/tcp, :::8000->5000/tcp composetest_web_1 0c7d14bf51b7 redis:alpine "docker-entrypoint.s…" 6 minutes ago Up 5 minutes 6379/tcp composetest_redis_1 # 默认的容器名 : 文件名_服务名_number [root@fedora ~]# curl localhost:8000 Hello World! I have been seen 1 times. [root@fedora ~]# curl localhost:8000 Hello World! I have been seen 2 times. [root@fedora ~]# curl localhost:8000 Hello World! I have been seen 3 times.
docker-compose.yml
in your project directory to add a bind mount for the web
service:
version: "3.9" services: web: build: . ports: - "8000:5000" # 添加以下内容 # --------------------------- volumes: - .:/code environment: FLASK_ENV: development # --------------------------- redis: image: "redis:alpine"The new
volumes
key mounts the project directory (current directory) on the host to /code
inside the container, allowing you to modify the code on the fly, without having to rebuild the image. The environment
key sets the FLASK_ENV
environment variable, which tells flask run
to run in development mode and reload the code on change. This mode should only be used in development.
docker-compose up
使用更新的 Compose 文件构建应用程序并运行它。
[root@fedora ~]# docker-compose up ...... ...... [root@fedora ~]# curl localhost:8000 Hello World! I have been seen 4 times.
因为应用程序代码现在使用卷安装到容器中, 您可以对其代码进行更改并立即查看更改,而无需重新构建镜像。
更改问候语 app.py
并保存它。 例如,更改 Hello World!
留言给 Hello from Docker!
:
return 'Hello from Docker! I have been seen {} times.\n'.format(count)
[root@fedora ~]# curl localhost:8000 Hello from Docker! I have been seen 5 times.
# 后台运行服务 docker-compose up -d # 查看正在运行的容器 docker-compose ps # 查看哪些环境变量可用于 web服务 docker-compose run web env # 查看该命令帮助信息 docker-compose --help # 停止服务 docker-compose stop # 删除服务,同时删除容器使用的数据卷 docker-compose down --volumes
小结
以前都是 docker run 启动单个容器。有了docker-compose,编写好 yaml 配置文件,可以通过 compose 一键启动、停止所有服务,以及更加轻松高效的管理容器。