Docker Compose 完全指南:从入门到实战部署

B站影视 韩国电影 2025-09-10 04:32 1

摘要:在现代应用开发中,微服务架构已成为主流,一个应用往往由多个相互关联的服务组成。手动管理这些服务的启动、停止和互联变得异常复杂。Docker Compose 应运而生,它通过一个简单的 YAML 文件就能定义和运行多容器 Docker 应用,极大地简化了容器化应

在现代应用开发中,微服务架构已成为主流,一个应用往往由多个相互关联的服务组成。手动管理这些服务的启动、停止和互联变得异常复杂。Docker Compose 应运而生,它通过一个简单的 YAML 文件就能定义和运行多容器 Docker 应用,极大地简化了容器化应用的管理工作。

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它允许您使用一个单独的 YAML 文件来配置应用的所有服务,然后通过一条命令就能创建并启动所有服务。

Linux 系统安装

sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-composesudo chmod +x /usr/local/bin/docker-composedocker-compose --version

Windows/macOS 安装 :Docker Desktop 已经包含了 Docker Compose,无需单独安装。

docker compose versiondocker-compose --versionsudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-composesudo chmod +x /usr/local/bin/docker-compose

典型的 Docker Compose 项目结构:

my-app/├── docker-compose.yml # 主配置文件├── .env # 环境变量文件├── backend/ # 后端服务目录│ ├── Dockerfile │ └── src/ ├── frontend/ # 前端服务目录│ ├── Dockerfile │ └── src/ └── database/ # 数据库初始化脚本└── init.sqlversion: '3.8'services: web: build: . ports: - "5000:5000"redis: image: "redis:alpine"networks: app-network: driver: bridgevolumes: db-data: driver: local

基本配置

services: webapp: image: nginx:latest container_name: my-nginx restart: unless-stopped depends_on: - db - redis

构建配置

services: app: build: context: ./dir dockerfile: Dockerfile args: buildno: 1 user: someuser

网络配置

services: web: networks: - frontend - backendnetworks: frontend: driver: bridge ipam: config: - subnet: 172.16.238.0/24 backend: driver: bridge

数据卷配置

services: db: volumes: - db-data:/var/lib/mysql - ./logs:/app/logs - /etc/localtime:/etc/localtime:rovolumes: db-data: driver: local driver_opts: type: nfs o: addr=192.168.1.1,rw device: ":/path/to/nfs"

环境变量配置

services: web: environment: - DATABASE_HOST=db - REDIS_HOST=redis - DEBUG=false env_file: - ./common.env - ./apps/web.envdocker-compose up -ddocker-compose up -d web redisdocker-compose downdocker-compose psdocker-compose logs docker-compose logs -f webdocker-compose restart webdocker-compose pause web docker-compose unpause webdocker-compose exec web bashdocker-compose exec db mysql -u root -pdocker-compose run --rm web python manage.py migratedocker-compose configdocker-compose imagesdocker-compose build --no-cachedocker-compose up --scale web=3 --scale worker=2wordpress-site/├── docker-compose.yml├── .env├── mysql/│ └── init.sql└── wordpress/ └── wp-config.phpversion: '3.8'services: db: image: mysql:8.0 container_name: wordpress_db restart: always environment: MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD} MYSQL_DATABASE: ${DB_NAME} MYSQL_USER: ${DB_USER} MYSQL_PASSWORD: ${DB_PASSWORD} volumes: - db_data:/var/lib/mysql - ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql networks: - wordpress_network healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 30s timeout: 10s retries: 5wordpress: image: wordpress:6.3 container_name: wordpress_app restart: always depends_on: db: condition: service_healthy environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: ${DB_USER} WORDPRESS_DB_PASSWORD: ${DB_PASSWORD} WORDPRESS_DB_NAME: ${DB_NAME} volumes: - wp_data:/var/www/html - ./wordpress/wp-config.php:/var/www/html/wp-config.php ports: - "80:80" networks: - wordpress_network healthcheck: test: ["CMD", "curl", "-f", "http://localhost:80"] interval: 30s timeout: 10s retries: 5phpmyadmin: image: phpmyadmin:latest container_name: wordpress_phpmyadmin restart: always depends_on: - db environment: PMA_HOST: db PMA_PORT: 3306 PMA_USER: ${DB_USER} PMA_PASSWORD: ${DB_PASSWORD} ports: - "8080:80" networks: - wordpress_networkvolumes: db_data: driver: local wp_data: driver: localnetworks: wordpress_network: driver: bridge ipam: config: - subnet: 172.20.0.0/16cd wordpress-sitedocker-compose up -ddocker-compose psdocker-compose logs -fdocker-compose downdocker-compose down -vdocker run --rm -v wordpress-site_db_data:/source -v $(pwd):/backup alpine tar czf /backup/db-backup-$(date +%Y%m%d).tar.gz -C /source .docker-compose up -d --scale wordpress=3version: '3.8'x-common-variables: &common-variables SPRING_PROFILES_ACTIVE: docker EUREKA_CLIENT_SERVICE_URL_DEFAULTZONE: http://discovery:8761/eurekaservices: discovery: image: springcloud/eureka-server:latest container_name: eureka-discovery ports: - "8761:8761" networks: - microservices-net healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8761"] interval: 30sgateway: build: ./api-gateway container_name: api-gateway ports: - "8080:8080" environment: docker-compose up -d --builddocker-compose up -d --build gateway user-servicedocker-compose logs -f gatewaydocker-compose up -d --scale user-service=3docker-compose run --rm user-service ./migrate.shdocker-compose ps docker-compose topdocker-compose exec user-service bashdocker-compose build user-service docker-compose up -d --no-deps user-service

使用多个 Compose 文件

docker-compose.ymldocker-compose.override.ymldocker-compose.prod.ymldocker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

环境特定的配置

version: '3.8'services: web: volumes: - ./src:/app/src ports: - "9229:9229" environment: - NODE_ENV=development - DEBUG=truedb: ports: - "5432:5432"services: web: deploy: resources: limits: cpus: '0.50' memory: 512M reservations: cpus: '0.25' memory: 256Mhealthcheck: test: ["CMD", "curl", "-f", "http://localhost:3000/health"] interval: 30s timeout: 10s retries: 3 start_period: 40sservices: database: read_only: true security_opt: - no-new-privileges:true tmpfs: - /tmp:rw,size:64Mapp: user: "1000:1000" cap_drop: - ALL cap_add: - NET_BIND_SERVICEdocker-compose network lsdocker-compose exec web nslookup databasedocker-compose port web 80docker-compose logs --tail=100 webdocker-compose up -d --force-recreate webdocker-compose config --services

Docker Compose 是一个极其强大的工具,它通过声明式的 YAML 配置文件简化了多容器应用的管理。通过本文的学习,你应该能够:

理解 Docker Compose 的核心概念 和价值主张掌握 Compose 文件的语法和结构 ,能够编写复杂的配置使用各种 Compose 命令 来管理应用生命周期部署实际项目 ,如 WordPress 和微服务架构遵循最佳实践 ,确保配置的可维护性和安全性

记住,Docker Compose 特别适合开发、测试和单机部署场景。对于生产环境的多机部署,建议考虑 Docker Swarm 或 Kubernetes 等编排工具。

通过不断实践和探索,你将能够充分利用 Docker Compose 的强大功能,显著提高开发效率和部署可靠性。

来源:墨码行者

相关推荐