
一、docker-compose.ymldocker-compose.yml本质上是把多个docker run命令翻译成 YAML 格式。它描述了有哪些服务容器每个服务用什么镜像端口怎么映射数据怎么持久化服务之间怎么依赖二、文件的基本结构version: 3.8 # Compose 文件版本 services: # 定义所有服务必填 service_name: # 服务名自己起 image: ... # 镜像 ports: ... # 端口映射 environment: ... # 环境变量 volumes: ... # 数据卷 depends_on: ... # 依赖关系 volumes: # 声明数据卷可选 networks: # 声明网络可选三、怎么写从 docker run 翻译过来1. 先写一个 docker rundocker run -d \ --name mysql_db \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD123456 \ -e MYSQL_DATABASEmydb \ -v mysql_data:/var/lib/mysql \ --restart always \ mysql:8.02. 翻译成 docker-compose.ymlversion: 3.8 services: mysql: image: mysql:8.0 container_name: mysql_db ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: mydb volumes: - mysql_data:/var/lib/mysql restart: always volumes: mysql_data:3. 参数对应关系docker run 参数docker-compose.yml 字段--name mysql_dbcontainer_name: mysql_db-p 3306:3306ports: - 3306:3306-e KEYVALUEenvironment: KEY: VALUE-v mysql_data:/var/lib/mysqlvolumes: - mysql_data:/var/lib/mysql--restart alwaysrestart: alwaysmysql:8.0image: mysql:8.0四、多个服务的示例以 Python 应用 MySQL Redis 为例version: 3.8 services: # Python 应用 app: build: . # 从当前目录的 Dockerfile 构建 container_name: python_app ports: - 8080:8080 environment: DB_HOST: mysql # 用服务名访问不是 localhost DB_PORT: 3306 DB_USER: app_user DB_PASSWORD: app_pass REDIS_HOST: redis volumes: - ./app:/app # 挂载代码开发用 depends_on: - mysql - redis restart: always # MySQL 数据库 mysql: image: mysql:8.0 container_name: mysql_db ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: mydb MYSQL_USER: app_user MYSQL_PASSWORD: app_pass volumes: - mysql_data:/var/lib/mysql restart: always # Redis 缓存 redis: image: redis:7.0-alpine container_name: redis_cache ports: - 6379:6379 volumes: - redis_data:/data restart: always volumes: mysql_data: redis_data:五、常用字段1. image vs build# 用现成的镜像 image: mysql:8.0 # 从 Dockerfile 构建 build: context: . # 构建上下文 dockerfile: Dockerfile # Dockerfile 路径2. ports端口映射ports: - 8080:8080 # 主机:容器 - 443:443 - 127.0.0.1:3306:3306 # 只绑定本地3. environment环境变量# 方式一键值对 environment: DB_HOST: mysql DB_PORT: 3306 # 方式二列表 environment: - DB_HOSTmysql - DB_PORT3306 # 方式三从 .env 文件读取 env_file: - .env4. volumes数据卷volumes: # 命名卷Docker 管理 - mysql_data:/var/lib/mysql # 绑定挂载主机路径 - ./app:/app # 只读挂载 - ./config:/app/config:ro5. depends_on依赖关系depends_on: - mysql - redis注意depends_on只保证启动顺序不保证服务就绪。如果需要等待服务就绪要用healthcheckservices: app: depends_on: mysql: condition: service_healthy mysql: healthcheck: test: [CMD, mysqladmin, ping, -h, localhost] interval: 10s timeout: 5s retries: 56. restart重启策略值说明no不自动重启默认always总是重启on-failure失败时重启unless-stopped除非手动停止否则重启7. command覆盖启动命令command: python app.py # 或 command: [python, app.py]8. networks自定义网络services: app: networks: - app_network networks: app_network: driver: bridge六、用 .env 文件管理敏感信息不要在 docker-compose.yml 里写密码用.env文件# .env MYSQL_ROOT_PASSWORD123456 MYSQL_DATABASEmydb DB_USERapp_user DB_PASSWORDapp_pass# docker-compose.yml services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} MYSQL_DATABASE: ${MYSQL_DATABASE}备注Compose 会自动读取同目录下的.env文件。七、写 docker-compose.yml 的套路步骤列出所有服务应用、数据库、缓存、消息队列等确定每个服务的镜像从 Docker Hub 查官方镜像名配置端口需要外部访问的才映射配置环境变量查官方文档看哪些是必填的配置数据卷有状态的服务数据库必须挂载配置依赖depends_on控制启动顺序配置重启策略生产环境用always声明 volumes 和 networks在文件末尾统一声明docker-compose.yml 就是把多个docker run命令翻译成 YAML 格式。先写docker run再逐条翻译成 YAML 字段最后用docker-compose up -d一键启动。