1. Docker Compose 简介
Docker Compose 允许通过 docker-compose.yml
文件来定义一个多服务的应用环境。每个服务可以是一个容器,这些容器可以共享网络,存储卷等资源。
2. 安装 Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
3. 使用 Docker Compose
3.1 创建 docker-compose.yml
创建一个目录,然后在该目录下创建一个 docker-compose.yml
文件,文件内容和注释如下:
version: "3.3" # 指定使用的 Docker Compose 文件版本。
services: # 定义要运行的服务。
labelstudio: # 定义一个服务,名为 labelstudio。
image: heartexlabs/label-studio:1.6.0 # 指定 labelstudio 服务使用的 Docker 镜像及其版本。
env_file: # 指定环境变量文件。相当于docker run -e参数
- .env # 引用同目录下的 .env 文件
ports: # 指定端口映射。
- ${LABEL_TOOL_HOST_PORT}:8080 # 将环境变量 LABEL_TOOL_HOST_PORT 指定的端口映射到容器的 8080 端口。
environment: # 在此服务中设置额外的环境变量。
- LOCAL_FILES_SERVING_ENABLED=true
- LABEL_STUDIO_USERNAME=${FIRST_ADMIN}
- LABEL_STUDIO_PASSWORD=${FIRST_ADMIN_PASSWORD}
- LABEL_STUDIO_USER_TOKEN=${LABEL_TOOL_TOKEN}
volumes: # 定义数据卷,用于持久化和共享数据。
- "${USER_PATH}/label-studio_data:/label-studio/data" # 将宿主机的路径映射到容器中的 /label-studio/data。
- "${BACKEND_SANDBOX_ROOT}:${BACKEND_SANDBOX_ROOT}" # 映射宿主机的路径到容器相同的路径。
restart: on-failure:10 # 设置失败重启策略,最多重试 10 次。
networks: # 指定网络配置。
- usernetwork # 将服务加入到 usernetwork 网络。
gateway: # 定义第二个服务,名为 gateway。
image: industryessentials/traefik:release-2.5.0 # 指定服务使用的镜像
env_file: # 指定环境变量文件
- .env
ports: # 映射端口
- ${NGINX_PORT}:80 # 映射宿主机的端口到容器的 80 端口
volumes: # 指定卷,用于持久化和共享数据
- ${USER_PATH}/user-data/logs:/app_logs # 映射日志目录
networks: # 指定网络
- usernetwork # 连接到 usernetwork 网络
yapi: # 定义第三个服务,名为 yapi。
image: industryessentials/user-backend:release-2.5.0 # 使用的 Docker 镜像及其版本
command: bash -c 'cd /yapi && supervisord -nc supervisor/supervisord.conf' # 容器启动后执行的命令。
env_file: # 指定环境变量文件列表。
- .env # 引用当前目录下的 .env 文件
volumes: # 定义数据卷,用于持久化和共享数据。
- ${USER_PATH}/user-data/logs:/app_logs # 将宿主机的 ${USER_PATH}/user-data/logs 目录挂载到容器的 /app_logs 目录。
runtime: ${SERVER_RUNTIME} # 指定容器的运行时环境,${SERVER_RUNTIME} 也是一个环境变量,用于支持不同的 Docker 运行时。
networks: # 定义网络配置。
- usernetwork # 指定该服务应连接到的网络。
depends_on: # 定义服务启动顺序。
- backend # 指定 yapi 服务依赖 backend 服务,确保 backend 服务先启动。
healthcheck: # 定义如何检查服务的健康状态。
test: curl --fail -s http://localhost:80/health || exit 1 # 使用 curl 访问 http://localhost:80/health,如果请求失败,则退出码为 1。
interval: 60s # 设置为每 60 秒执行一次。
timeout: 6s # 健康检查的超时时间。设置为 6 秒。
retries: 3 # 如果健康检查失败,重试的次数。
start_period: 30s # 服务启动后,延迟开始执行健康检查的时间。
backend: # 定义第四个服务,名为 backend。
image: industryessentials/backend:release-2.5.0
env_file:
- .env
runtime: ${SERVER_RUNTIME}
environment: # 环境变量
- BACKEND_REDIS_URL=redis://redis:6379/0 # Redis 服务的 URL
volumes:
# 卷的配置,同之前
depends_on: # 此服务依赖的其他服务
- redis
command: bash -c 'cd /app && supervisord -nc supervisor/supervisord.conf' # 容器启动后执行的命令。
restart: on-failure:10 # 在失败时重启,最多重启 10 次
healthcheck: # 健康检查配置,与 yapi 服务类似
networks:
- usernetwork
redis: # 定义第五个服务,名为 redis。
image: industryessentials/backend-redis
command: redis-server /config/redis/redis.conf --loadmodule /usr/lib/redis/modules/redisgraph.so # 启动 Redis 服务器的命令
volumes:
# 卷的配置,同之前
restart: on-failure:10
healthcheck: # 健康检查配置
networks:
- usernetwork
networks: # 定义网络。
usernetwork: # 定义一个名为 usernetwork 的网络。
name: ${COMPOSE_PROJECT_NAME}_network # 使用环境变量 COMPOSE_PROJECT_NAME 定义网络的名称。
external: true # 指定这是一个外部网络,意味着这个网络应该已经存在,不会由这个 Docker Compose 文件创建。
3.2 启动服务
在 docker-compose.yml
文件所在的目录中运行以下命令来启动服务:
docker-compose up
3.3 停止服务
要停止并移除由 docker-compose up
命令创建的所有容器,您可以使用:
docker-compose down
4. Docker Compose 命令
docker-compose up
:启动服务docker-compose down
:停止并移除容器、网络、卷和镜像docker-compose build
:构建或重新构建服务docker-compose logs
:查看服务的日志输出