Docker Compose配置详解

1. 什么是Docker Compose?

Docker Compose是一种用于定义和运行多容器Docker应用程序的工具。通过一个docker-compose.yml文件,你可以配置应用程序的所有服务(例如,Web服务器、数据库、缓存)并轻松管理它们。

2. 基本Docker Compose命令

  • docker-compose up:启动并运行docker-compose.yml文件中定义的容器。
  • docker-compose down:停止并删除由docker-compose up创建的容器、网络和卷。
  • docker-compose build:构建或重新构建服务。
  • docker-compose stop:停止运行中的容器,但不删除它们。
  • docker-compose restart:重启服务。
  • docker-compose logs:显示所有服务或特定服务的日志。
  • docker-compose ps:列出容器。
  • docker-compose exec:在运行的容器中执行命令。
  • docker-compose run:对服务运行一次性命令。

3. Docker Compose文件结构 (docker-compose.yml)

docker-compose.yml文件是你定义应用程序服务、网络和卷的地方。下面是一个基本结构:

version: '3.8'  # Compose文件版本

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./web:/usr/share/nginx/html
    environment:
      - NGINX_HOST=localhost
      - NGINX_PORT=80

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: example_db
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

4. 常见配置选项

a. version

指定Docker Compose文件格式的版本。常用版本为3.83.7等。

b. services

定义要运行的容器。每个服务运行一个镜像,可以定义端口、卷和环境变量。

c. image

指定要使用的服务镜像。你可以使用预构建的镜像,也可以通过Dockerfile构建自己的镜像。

d. build

指定一个目录从Dockerfile构建镜像:

build:
  context: .
  dockerfile: Dockerfile

e. ports

将容器端口映射到主机端口:

ports:
  - "80:80"  # 主机:容器

f. volumes

将主机路径或命名卷挂载到容器内部路径:

volumes:
  - ./web:/usr/share/nginx/html

g. environment

为容器设置环境变量:

environment:
  - MYSQL_ROOT_PASSWORD=example

h. networks

定义服务的自定义网络:

networks:
  frontend:
  backend:

5. 高级配置示例

a. 链接服务

你可以使用depends_on指令将服务链接在一起:

services:
  web:
    image: nginx
    depends_on:
      - db

  db:
    image: mysql

b. 定义自定义网络

version: '3.8'
services:
  web:
    image: nginx
    networks:
      - frontend
  db:
    image: mysql
    networks:
      - backend

networks:
  frontend:
  backend:

c. 使用多个Compose文件

你可以将配置拆分为多个文件:

docker-compose -f docker-compose.yml -f docker-compose.prod.yml up

d. Compose中的环境变量

你可以使用.env文件设置docker-compose.yml中使用的变量:

version: '3.8'
services:
  web:
    image: nginx
    ports:
      - "${HOST_PORT}:80"

.env文件:

HOST_PORT=8080

e. 健康检查

你可以为服务定义健康检查,确保它们正常工作:

services:
  web:
    image: nginx
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 1m30s
      timeout: 10s
      retries: 3

6. 与Docker Swarm一起使用Docker Compose

Docker Compose可以与Docker Swarm一起使用,在集群上部署多容器应用程序:

docker stack deploy -c docker-compose.yml my_stack

7. 最佳实践

  • 保持docker-compose.yml简洁:使用多个文件来分离开发和生产配置。
  • 版本控制:将你的docker-compose.yml放入版本控制系统中,以管理跨环境的配置。
  • 使用命名卷:确保数据在容器重启后依然存在。

version: '3.8'  # 指定Compose文件的版本

services:  # 定义多个服务
  web:  # Web服务,通常是前端或后端的应用
    image: nginx:latest  # 使用Nginx镜像
    ports:
      - "80:80"  # 将容器的80端口映射到主机的80端口
    volumes:
      - ./web:/usr/share/nginx/html  # 挂载本地目录到容器中
    environment:
      - NGINX_HOST=localhost  # 设置环境变量
      - NGINX_PORT=80
    networks:
      - frontend  # 连接到前端网络
    depends_on:
      - app  # 该服务将在'app'服务启动后才启动
    restart: always  # 在容器崩溃后总是重启

  app:  # 应用服务,可以是任何语言的后端服务
    build:  # 从Dockerfile构建镜像
      context: ./app  # Dockerfile所在的目录
      dockerfile: Dockerfile  # 使用的Dockerfile名称
    ports:
      - "3000:3000"  # 将容器的3000端口映射到主机的3000端口
    volumes:
      - ./app:/usr/src/app  # 挂载本地代码目录到容器中
    environment:
      - NODE_ENV=development  # 设置环境变量
      - PORT=3000
    networks:
      - frontend  # 连接到前端网络
      - backend  # 连接到后端网络
    depends_on:
      - db  # 该服务将在'db'服务启动后才启动
    restart: on-failure  # 仅在容器非正常退出时重启

  db:  # 数据库服务,使用MySQL
    image: mysql:5.7  # 使用MySQL 5.7镜像
    volumes:
      - db_data:/var/lib/mysql  # 持久化MySQL数据到命名卷
    environment:
      MYSQL_ROOT_PASSWORD: example  # MySQL root用户的密码
      MYSQL_DATABASE: example_db  # 自动创建的数据库名称
      MYSQL_USER: user  # 创建的用户名称
      MYSQL_PASSWORD: password  # 用户密码
    networks:
      - backend  # 连接到后端网络
    restart: unless-stopped  # 仅在手动停止时不重启

volumes:  # 定义命名卷,用于数据持久化
  db_data:  # MySQL数据卷

networks:  # 定义自定义网络
  frontend:  # 前端网络,连接web和app服务
  backend:  # 后端网络,连接app和db服务

posted @ 2024-08-27 11:36  daikq  阅读(439)  评论(0编辑  收藏  举报