当前位置: 首页 > news >正文

Docker Compose从入门到实战:配置与命令全指南

一、核心概念

  1. Docker Compose:一个用于定义和运行多容器 Docker 应用程序的工具。
  2. docker-compose.yml:一个 YAML 格式的配置文件,用于配置应用程序的服务网络数据卷
  3. 服务 (Service):代表一个容器的配置,包括镜像、端口、环境变量等。一个 docker-compose.yml 可以定义多个服务(如一个 Web 服务,一个数据库服务)。
  4. 项目 (Project):由一组关联的服务组成,默认使用当前目录名作为项目名。可以通过 -p 选项指定。

二、基本文件结构

一个最简单的 docker-compose.yml 文件包含以下部分:

version: '3.8'  # 指定 Compose 文件格式的版本services:   # 定义所有服务的核心部分service1: # 第一个服务...配置...service2: # 第二个服务...配置...networks:   # (可选)定义自定义网络my-net:volumes:    # (可选)定义数据卷my-data:

三、常用服务配置项详解

1. 镜像与构建
配置项说明示例
image直接从仓库拉取镜像image: nginx:latest
build根据 Dockerfile 构建镜像build: .build: ./dir
context(在 build 下) 构建上下文路径build: { context: . }
dockerfile(在 build 下) 指定 Dockerfile 文件名build: { context: ., dockerfile: Dockerfile.dev }

示例

services:webapp:build: . # 使用当前目录下的 Dockerfile 构建镜像# 等同于:# build:#   context: .#   dockerfile: Dockerfiledb:image: postgres:13 # 使用现成的镜像
2. 端口映射
配置项说明示例
ports映射端口 [主机端口]:[容器端口]ports: - "8080:80"
随机映射主机端口ports: - "3000" (容器3000端口随机映射到主机)

示例

services:nginx:image: nginxports:- "80:80"       # 主机80端口 -> 容器80端口- "443:443"     # 主机443端口 -> 容器443端口api:image: my-apiports:- "3000"        # 容器3000端口随机映射到主机某端口
3. 环境变量
配置项说明示例
environment直接以 key-value 形式设置environment: MY_VAR: value
env_file从文件加载环境变量env_file: - ./.env

示例

services:db:image: postgres:13environment:POSTGRES_DB: mydbPOSTGRES_USER: userPOSTGRES_PASSWORD: password# 或者使用 env_fileenv_file:- ./db.env # 文件内容:POSTGRES_PASSWORD=secret
4. 数据卷与挂载
配置项说明示例
volumes挂载宿主机目录或命名的数据卷volumes: - /host/path:/container/path
使用匿名卷volumes: - /container/data
使用命名的数据卷volumes: - named-volume:/app/data

示例

services:web:image: nginxvolumes:- ./html:/usr/share/nginx/html  # 挂载主机目录(常用於代码开发)- nginx-logs:/var/log/nginx     # 使用命名的数据卷持久化日志# 在文件底部定义命名的数据卷
volumes:nginx-logs: # 声明一个名为 nginx-logs 的数据卷,Docker 会自动创建它
5. 依赖与启动顺序
配置项说明示例
depends_on指定服务依赖关系,控制启动顺序depends_on: - db
healthcheck定义健康检查,depends_on 可等待服务健康见下方示例

示例

services:webapp:build: .depends_on:- db       # 确保 db 服务先启动- redis# 更佳实践:使用健康检查确保依赖服务真正可用# depends_on:#   db:#     condition: service_healthy#   redis:#     condition: service_starteddb:image: postgres:13healthcheck: # 为 db 服务定义健康检查test: ["CMD-SHELL", "pg_isready -U postgres"]interval: 10stimeout: 5sretries: 5
6. 网络
配置项说明示例
networks将服务连接到自定义网络networks: - my-frontend
ports暴露端口到宿主机ports: - "80:80"

示例

services:proxy:image: nginxnetworks:- frontendapp:build: .networks:- frontend- backenddb:image: postgresnetworks:- backend# 在文件底部定义网络
networks:frontend:backend:

四、完整实战示例:WordPress + MySQL

这是一个经典的多服务应用示例。

version: '3.8'services:db:image: mysql:8.0volumes:- db_data:/var/lib/mysql # 使用数据卷持久化数据库restart: alwaysenvironment:MYSQL_ROOT_PASSWORD: some_root_passwordMYSQL_DATABASE: wordpressMYSQL_USER: wordpressMYSQL_PASSWORD: wordpress_passwordnetworks:- wordpress-nethealthcheck: # 健康检查,确保数据库完全启动test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-p$$MYSQL_ROOT_PASSWORD"]interval: 10stimeout: 5sretries: 5wordpress:depends_on:db:condition: service_healthy # 等待数据库健康后再启动image: wordpress:latestports:- "8000:80" # 将主机的8000端口映射到容器的80端口restart: alwaysenvironment:WORDPRESS_DB_HOST: db:3306 # 使用服务名“db”作为主机名(Docker DNS)WORDPRESS_DB_USER: wordpressWORDPRESS_DB_PASSWORD: wordpress_passwordWORDPRESS_DB_NAME: wordpressvolumes:- ./wp-content:/var/www/html/wp-content # 挂载主题和插件目录方便开发networks:- wordpress-netvolumes:db_data: # 声明一个命名卷用于数据库持久化networks:wordpress-net: # 声明一个自定义网络,让两个容器可以互通

五、常用命令

编写好 docker-compose.yml 后,使用以下命令操作:

命令说明
docker-compose up创建并启动所有服务(前台)
docker-compose up -d创建并在后台启动所有服务(最常用)
docker-compose down停止并删除所有容器、网络(最常用)
docker-compose down -vdown 的同时删除数据卷(慎用!)
docker-compose ps列出本项目中的所有容器
docker-compose logs查看所有服务的日志
docker-compose logs -f service_name实时追踪特定服务的日志
docker-compose exec service_name command在服务的容器中执行命令
docker-compose build重新构建服务的镜像
docker-compose restart重启所有服务
docker-compose pull拉取服务的最新镜像

最佳实践

  1. 使用 .env 文件:将敏感信息(密码、密钥)和可能变化的配置(端口号)放在 .env 文件中,并在 docker-compose.yml 中引用:${VARIABLE_NAME}
  2. 指定版本:始终在文件顶部使用 version 键,并选择与你的 Docker Engine 兼容的版本。
  3. 使用自定义网络:让 Compose 为你管理网络,服务间可以使用服务名作为主机名互相访问(Docker 内置 DNS)。
  4. 合理使用数据卷:对需要持久化的数据(数据库、日志)使用命名卷绑定挂载
  5. 定义健康检查:确保服务间的依赖是真正可用的,而不仅仅是容器启动了。
http://www.dtcms.com/a/390547.html

相关文章:

  • 10.1 输入子系统模型
  • Unity手游输入笔记
  • SpringCloud-注册中心Nacos[笔记3]
  • 关于MySQL与Python后端命令交互备份
  • 大模型上下文工程实践- 上下文管理策略
  • 资产测绘工具-Nmap
  • 智能体环境配置测试
  • 如何将非结构化文档智能解析高质量数据,并按照阅读顺序还原版面?
  • 第八章 惊喜11 认知觉醒
  • 嵌入式系统学习Day37(ARM)
  • 02-Media-10-video_decoder.py 对H.264或H.265格式视频解码并在液晶屏或外接HDMI显示屏上进行显示的示例程序
  • Go面试题及详细答案120题(61-80)
  • 第二部分:VTK核心类详解(第35章:vtkDataSetAttributes数据集属性类)
  • 智能文献分析系统:让AI成为学术研究助手
  • MATLAB基于AHP-熵权法-TOPSIS的学习能力评价研究
  • Ubuntu 部署 PostgreSQL 数据库(附shell脚本一键部署↓)
  • 《数据驱动下的双样本推断:均值与比例的硬核技术实践与方法论思考》
  • Git设置单个仓库用户名和邮箱的方法
  • MongoDB Integer
  • 深度学习第二章 线性代数简介
  • HTB precious
  • 【前后端与数据库交互】从零构建 Python + Vue + MongoDB 网站
  • 对比django,flask,opencv三大
  • 【6/20】MongoDB 入门:连接数据库,实现数据存储与查询
  • 【笔记】Docker使用
  • k8s自定义CNI插件实现指南
  • 使用Docker部署Kubernetes(K8s)详解
  • 【Docker】网络
  • 磁共振成像原理(理论)8:射频回波 (RF Echoes)-三脉冲回波(1)
  • 华为云 ELB:智慧负载均衡,让您的应用永葆流畅体验