Docker Compose 基本概要
Docker Compose 基本概要
Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。使用 YAML 文件来配置多个应用程序的服务,包括生产、暂存、开发、测试以及 CI 工作流。
尝试构建 Docker Compose
一个简单的 Python Web 应用程序服务:使用 Flask 框架并在 Redis 中维护
基础素材
-
项目创建一个目录
mkdir compose-test && cd compose-test
-
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) -
创建 requirements.txt,为之后的 pip 使用
flask redis
创建 Dockerfile
# syntax=docker/dockerfile:1 # Python 3.7 映像开始构建映像 FROM python:3.7-alpine # 设置环境变量 ENV FLASK_APP=app.py ENV FLASK_RUN_HOST=0.0.0.0 # 安装 gcc 以及相关依赖 # set -e 表示之后任意命令错误立刻退出而不继续 # --no-cache 表示不使用缓存,相当与自己执行 apk update 绕过缓存的使用 RUN <<EOF set -e sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories apk add --no-cache gcc musl-dev linux-headers EOF # 设置工作区 WORKDIR /code # pip 安装相关 Python 包 COPY requirements.txt requirements.txt RUN pip install -r requirements.txt -i https://mirrors.ustc.edu.cn/pypi/web/simple # 将项目中的当前目录复制到工作区 COPY . . # 添加容器正在监听端口并启动 flask run EXPOSE 5000 CMD ["flask", "run"]
编写 docker-compose.yml 文件定义了两个服务:web, redis
version: "3.9" services: web: build: . ports: - "8000:5000" volumes: - .:/code environment: FLASK_DEBUG: "true" redis: image: "redis:alpine"
- ports 映射端口到宿主机
- volumes 当前目录挂载到 /code 容器内部
- environment 设置环境变量
- FLASK_DEBUG 环境变量告诉 flask 在开发模式下运行并在更改时重新加载代码
最后使用 docker compose up
即可构建并运行服务
docker compose 命令
常用命令
-
docker compose up 根据 yml 文件构建服务并运行
-d
选项可以挂后台,类似docker run -d
挂容器
-
docker compose ps 查看活跃服务
-
docker compose run 允许为服务运行一次性命令
-
docker compose stop 停止服务
-
docker compose down 关闭所有内容,完全删除容器
--volumes
移除容器使用的数据卷
最重要命令 docker compose --help
😋
环境变量
.env
文件:存储环境变量,有点 requirements.txt 对于 pip 的感觉
- 该文件应放在文件旁边的项目目录的根目录下 docker-compose.yml
- 使用
--env-file
选项指定文件位置 - docker-compose.yml 的 env_file 属性指定文件位置
docker-compose.yml 使用 environment 属性定义环境变量
web: environment: - DEBUG=1
docker-compose.yml 中对于环境变量是可以直接使用 shell 中的环境变量
优先级(由高到低):
- 在 CLI 中 docker compose 的 -e 选项
- shell 自带
- docker-compose.yml 的 environment 属性
- 命令行的 --env-file
- docker-compose.yml 的 env_file 属性
- docker-compose.yml 同级目录的
.env
文件 - 镜像的 ENV 设置
使用环境文件
-
#
注释符 -
\
转义字符 -
通过键值方式,其中值可以使用单引号或双引号,比如
VAL=EMV
-
双引号支持转义,比如
\n
-
四种作用方法
- 直接使用变量
${VAR}
- 默认值
${VAR:-default}
如果 VAR 没有被设置且非空,就使用 default - 必须值
${VAR:?error}
如果 VAR 没有被设置且非空,以 error 退出 - 替代值
${VAR:+replacement}
如果 VAR 被设置且非空,使用 replacement 替代 - 其中不涉及非空状态使用去除
:
- 直接使用变量
参考资料
其中 Docker Compose 文件标准 https://docs.docker.com/compose/compose-file/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了