Docker Compose 基本概要

发布时间 2023-04-16 17:02:06作者: shadow_D

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/