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

Docker Compose

Compose介绍

1. Docker Compose 命令参数介绍

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过一个 docker-compose.yml 文件,你可以配置应用程序的服务,然后使用单个命令来创建和启动所有服务。

常用命令及其参数

  • docker compose up:

    • -d, --detach: 在后台运行服务。
    • --build: 在启动服务之前构建(或重建)服务的镜像。
    • --force-recreate: 强制重新创建容器,即使它们已经存在。
    • --no-deps: 不启动依赖的服务。
    • --remove-orphans: 移除没有在 docker-compose.yml 中定义的服务。
  • docker compose down:

    • --volumes: 删除关联的卷。
    • --rmi all|local: 删除镜像,all 表示删除所有镜像,local 表示只删除本地构建的镜像。
  • docker compose ps:

    • 列出当前正在运行的服务。
  • docker compose restart:

    • 重启服务。
    • --timeout TIMEOUT: 设置重启超时时间。
  • docker compose stop:

    • 停止服务。
  • docker compose start:

    • 启动已存在的服务。
  • docker compose logs:

    • 查看服务的日志。
    • -f, --follow: 实时跟踪日志输出。

2. compose.yaml 文件的详细介绍

compose.yaml 文件是 Docker Compose 的核心配置文件,用于定义应用程序的服务、网络和卷。以下是一个包含常用参数的示例 docker-compose.yml 文件:

version: '3.8'

services:
  web:
    image: nginx:latest
    container_name: web
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./html:/usr/share/nginx/html
    networks:
      - webnet
    depends_on:
      - db
    environment:
      - NGINX_HOST=web.example.com
    deploy:
      replicas: 3
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure
        max_attempts: 3
        window: 120s

  db:
    image: mysql:5.7
    container_name: db
    ports:
      - "3306:3306"
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - webnet
    environment:
      - MYSQL_ROOT_PASSWORD=my-secret-pw
      - MYSQL_DATABASE=mydb
      - MYSQL_USER=myuser
      - MYSQL_PASSWORD=mypassword
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 10s

networks:
  webnet:

volumes:
  db-data:

详细说明

  • version: 指定Compose文件格式的版本。
  • services: 定义应用程序的服务。
    • image: 指定要使用的Docker镜像。
    • container_name: 指定容器的名称。
    • ports: 映射主机端口到容器端口。
    • volumes: 挂载主机目录到容器内。
    • networks: 将服务连接到自定义网络。
    • depends_on: 指定服务之间的依赖关系。
    • environment: 设置环境变量。
    • deploy: 部署相关配置(适用于Docker Swarm)。
      • replicas: 指定服务的副本数量。
      • update_config: 更新配置。
      • restart_policy: 重启策略。
  • networks: 定义自定义网络。
  • volumes: 定义数据卷。

3. compose 停止和单独启动/重启服务

停止所有服务

docker compose down

单独启动服务

docker compose up -d <service_name>

例如,单独启动 web 服务:

docker compose up -d web

重启服务

docker compose restart <service_name>

例如,重启 db 服务:

docker compose restart db

4. compose.yaml 修改后的重新启动

当你修改了 docker-compose.yml 文件后,需要重新启动服务以应用更改。可以使用以下命令:

重新启动所有服务

docker compose up -d

这将重新创建并启动所有服务,并应用新的配置。

重新启动特定服务

如果你只想重新启动某个特定的服务,可以使用以下命令:

docker compose up -d --force-recreate <service_name>

例如,重新启动 web 服务:

docker compose up -d --force-recreate web

WordPress

部署WordPress和MySQL的最佳实践示例。这个示例将涵盖端口、存储和网络的配置,并确保服务的高可用性和安全性。

docker-compose.yml 文件

version: '3.8'

services:
  db:
    image: mysql:5.7
    container_name: wordpress_db
    environment:
      MYSQL_ROOT_PASSWORD: example_root_password
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress_user
      MYSQL_PASSWORD: example_wordpress_password
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - wordpress-net
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 10s
    restart: unless-stopped

  wordpress:
    image: wordpress:latest
    container_name: wordpress_app
    ports:
      - "80:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress_user
      WORDPRESS_DB_PASSWORD: example_wordpress_password
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wp_data:/var/www/html
    networks:
      - wordpress-net
    depends_on:
      - db
    restart: unless-stopped

networks:
  wordpress-net:
    driver: bridge

volumes:
  db_data:
  wp_data:

详细说明

1. version

  • version: '3.8': 指定Compose文件格式的版本。这里使用的是3.8版本,这是目前比较常用的一个版本。

2. services

  • db:

    • image: mysql:5.7: 使用MySQL 5.7镜像。
    • container_name: wordpress_db: 容器名称为wordpress_db
    • environment: 设置MySQL的环境变量,包括根密码、数据库名称、用户和密码。
    • volumes: 将主机上的db_data卷挂载到容器的/var/lib/mysql目录,以持久化数据。
    • networks: 将服务连接到自定义网络wordpress-net
    • healthcheck: 配置健康检查,确保MySQL服务正常运行。
    • restart: unless-stopped: 除非手动停止,否则自动重启容器。
  • wordpress:

    • image: wordpress:latest: 使用最新的WordPress镜像。
    • container_name: wordpress_app: 容器名称为wordpress_app
    • ports: 将主机的80端口映射到容器的80端口。
    • environment: 设置WordPress的环境变量,包括数据库主机、用户名、密码和数据库名称。
    • volumes: 将主机上的wp_data卷挂载到容器的/var/www/html目录,以持久化WordPress的数据。
    • networks: 将服务连接到自定义网络wordpress-net
    • depends_on: 确保在启动WordPress之前先启动MySQL服务。
    • restart: unless-stopped: 除非手动停止,否则自动重启容器。

3. networks

  • wordpress-net: 创建一个自定义的Docker网络wordpress-net,以便服务之间可以相互通信。

4. volumes

  • db_data: 用于持久化MySQL数据的卷。
  • wp_data: 用于持久化WordPress数据的卷。

最佳实践

1. 端口管理

  • 端口映射:确保端口映射正确且唯一,避免端口冲突。
  • 安全性:如果不需要外部访问,可以限制端口只在本地网络内可用。例如,使用-p 127.0.0.1:80:80

2. 存储管理

  • 数据持久化:使用Docker卷来持久化数据,确保数据不会因为容器重启而丢失。
  • 备份:定期备份数据卷中的数据,以防数据丢失。
  • 性能:确保数据卷所在的磁盘有足够的空间和良好的I/O性能。

3. 网络管理

  • 自定义网络:使用自定义网络来隔离和管理容器之间的通信。
  • DNS解析:利用Docker内置的DNS服务,通过服务名称进行通信。
  • 安全性:限制不必要的网络访问,确保只有需要的容器和服务能够访问MySQL。

启动和管理

启动服务

docker compose up -d

停止服务

docker compose down

查看服务状态

docker compose ps

重启服务

docker compose restart <service_name>

例如,重启wordpress服务:

docker compose restart wordpress

修改docker-compose.yml后的重新启动

如果你修改了docker-compose.yml文件,可以使用以下命令重新启动服务:

docker compose up -d --force-recreate

这将重新创建并启动所有服务,并应用新的配置。

Django

docker-compose.yml 文件

version: '3.8'

services:
  db:
    image: mysql:5.7
    container_name: django_db
    environment:
      MYSQL_ROOT_PASSWORD: example_root_password
      MYSQL_DATABASE: django_db
      MYSQL_USER: django_user
      MYSQL_PASSWORD: example_django_password
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - django-net
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 10s
    restart: unless-stopped

  redis:
    image: redis:alpine
    container_name: django_redis
    networks:
      - django-net
    restart: unless-stopped

  web:
    build: .
    container_name: django_web
    command: /usr/local/bin/uwsgi --ini uwsgi.ini
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    environment:
      DJANGO_DB_HOST: db
      DJANGO_DB_NAME: django_db
      DJANGO_DB_USER: django_user
      DJANGO_DB_PASSWORD: example_django_password
      REDIS_HOST: redis
    depends_on:
      - db
      - redis
    networks:
      - django-net
    restart: unless-stopped

networks:
  django-net:
    driver: bridge

volumes:
  db_data:

详细说明

1. version

  • version: '3.8': 指定Compose文件格式的版本。这里使用的是3.8版本,这是目前比较常用的一个版本。

2. services

  • db:

    • image: mysql:5.7: 使用MySQL 5.7镜像。
    • container_name: django_db: 容器名称为django_db
    • environment: 设置MySQL的环境变量,包括根密码、数据库名称、用户和密码。
    • volumes: 将主机上的db_data卷挂载到容器的/var/lib/mysql目录,以持久化数据。
    • networks: 将服务连接到自定义网络django-net
    • healthcheck: 配置健康检查,确保MySQL服务正常运行。
    • restart: unless-stopped: 除非手动停止,否则自动重启容器。
  • redis:

    • image: redis:alpine: 使用Redis Alpine镜像。
    • container_name: django_redis: 容器名称为django_redis
    • networks: 将服务连接到自定义网络django-net
    • restart: unless-stopped: 除非手动停止,否则自动重启容器。
  • web:

    • build: .: 使用当前目录下的Dockerfile构建镜像。
    • container_name: django_web: 容器名称为django_web
    • command: /usr/local/bin/uwsgi --ini uwsgi.ini: 启动uWSGI并使用uwsgi.ini配置文件。
    • volumes: 将当前目录挂载到容器的/code目录,以便代码变更可以实时生效。
    • ports: 将主机的8000端口映射到容器的8000端口。
    • environment: 设置Django应用的环境变量,包括数据库和Redis的连接信息。
    • depends_on: 确保在启动Django应用之前先启动MySQL和Redis服务。
    • networks: 将服务连接到自定义网络django-net
    • restart: unless-stopped: 除非手动停止,否则自动重启容器。

3. networks

  • django-net: 创建一个自定义的Docker网络django-net,以便服务之间可以相互通信。

4. volumes

  • db_data: 用于持久化MySQL数据的卷。

Dockerfile

为了使web服务能够正常运行,你需要一个Dockerfile来构建Django应用的镜像。以下是一个简单的Dockerfile示例:

# 使用官方Python基础镜像
FROM python:3.9-slim

# 设置工作目录
WORKDIR /code

# 复制依赖文件
COPY requirements.txt .

# 安装依赖
RUN pip install -r requirements.txt

# 复制项目代码
COPY . .

# 安装uWSGI
RUN pip install uwsgi

# 暴露端口
EXPOSE 8000

# 默认命令
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

uWSGI配置文件 (uwsgi.ini)

以下是一个简单的uWSGI配置文件示例:

[uwsgi]
module = your_project_name.wsgi:application
master = true
processes = 4
socket = :8000
chmod-socket = 660
vacuum = true
die-on-term = true

最佳实践

1. 端口管理

  • 端口映射:确保端口映射正确且唯一,避免端口冲突。
  • 安全性:如果不需要外部访问,可以限制端口只在本地网络内可用。例如,使用-p 127.0.0.1:8000:8000

2. 存储管理

  • 数据持久化:使用Docker卷来持久化数据,确保数据不会因为容器重启而丢失。
  • 备份:定期备份数据卷中的数据,以防数据丢失。
  • 性能:确保数据卷所在的磁盘有足够的空间和良好的I/O性能。

3. 网络管理

  • 自定义网络:使用自定义网络来隔离和管理容器之间的通信。
  • DNS解析:利用Docker内置的DNS服务,通过服务名称进行通信。
  • 安全性:限制不必要的网络访问,确保只有需要的容器和服务能够访问MySQL和Redis。

启动和管理

启动服务

docker compose up -d

停止服务

docker compose down

查看服务状态

docker compose ps

重启服务

docker compose restart <service_name>

例如,重启web服务:

docker compose restart web

修改docker-compose.yml后的重新启动

如果你修改了docker-compose.yml文件,可以使用以下命令重新启动服务:

docker compose up -d --force-recreate

这将重新创建并启动所有服务,并应用新的配置。

SpingBoot

项目结构

假设你的项目结构如下:

my-springboot-app/
├── docker-compose.yml
├── Dockerfile
├── application.yml
└── src/
    └── main/
        └── java/
            └── com/
                └── example/
                    └── MySpringBootApp.java

docker-compose.yml 文件

version: '3.8'

services:
  db:
    image: mysql:5.7
    container_name: springboot_db
    environment:
      MYSQL_ROOT_PASSWORD: example_root_password
      MYSQL_DATABASE: springboot_db
      MYSQL_USER: springboot_user
      MYSQL_PASSWORD: example_springboot_password
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - springboot-net
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 10s
    restart: unless-stopped

  redis:
    image: redis:alpine
    container_name: springboot_redis
    networks:
      - springboot-net
    restart: unless-stopped

  app:
    build: .
    container_name: springboot_app
    ports:
      - "8080:8080"
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/springboot_db
      SPRING_DATASOURCE_USERNAME: springboot_user
      SPRING_DATASOURCE_PASSWORD: example_springboot_password
      SPRING_REDIS_HOST: redis
    depends_on:
      - db
      - redis
    networks:
      - springboot-net
    restart: unless-stopped

networks:
  springboot-net:
    driver: bridge

volumes:
  db_data:

详细说明

1. version

  • version: '3.8': 指定Compose文件格式的版本。这里使用的是3.8版本,这是目前比较常用的一个版本。

2. services

  • db:

    • image: mysql:5.7: 使用MySQL 5.7镜像。
    • container_name: springboot_db: 容器名称为springboot_db
    • environment: 设置MySQL的环境变量,包括根密码、数据库名称、用户和密码。
    • volumes: 将主机上的db_data卷挂载到容器的/var/lib/mysql目录,以持久化数据。
    • networks: 将服务连接到自定义网络springboot-net
    • healthcheck: 配置健康检查,确保MySQL服务正常运行。
    • restart: unless-stopped: 除非手动停止,否则自动重启容器。
  • redis:

    • image: redis:alpine: 使用Redis Alpine镜像。
    • container_name: springboot_redis: 容器名称为springboot_redis
    • networks: 将服务连接到自定义网络springboot-net
    • restart: unless-stopped: 除非手动停止,否则自动重启容器。
  • app:

    • build: .: 使用当前目录下的Dockerfile构建镜像。
    • container_name: springboot_app: 容器名称为springboot_app
    • ports: 将主机的8080端口映射到容器的8080端口。
    • environment: 设置Spring Boot应用的环境变量,包括数据库和Redis的连接信息。
    • depends_on: 确保在启动Spring Boot应用之前先启动MySQL和Redis服务。
    • networks: 将服务连接到自定义网络springboot-net
    • restart: unless-stopped: 除非手动停止,否则自动重启容器。

3. networks

  • springboot-net: 创建一个自定义的Docker网络springboot-net,以便服务之间可以相互通信。

4. volumes

  • db_data: 用于持久化MySQL数据的卷。

Dockerfile 文件

为了使app服务能够正常运行,你需要一个Dockerfile来构建Spring Boot应用的镜像。以下是一个简单的Dockerfile示例:

# 使用官方Java基础镜像
FROM openjdk:11-jdk-slim

# 设置工作目录
WORKDIR /app

# 复制JAR文件到容器中
COPY target/my-springboot-app.jar /app/app.jar

# 暴露端口
EXPOSE 8080

# 启动Spring Boot应用
CMD ["java", "-jar", "app.jar"]

application.yml 文件

确保你的Spring Boot应用的application.yml文件包含以下配置,以便从环境变量中读取数据库和Redis的连接信息:

spring:
  datasource:
    url: ${SPRING_DATASOURCE_URL}
    username: ${SPRING_DATASOURCE_USERNAME}
    password: ${SPRING_DATASOURCE_PASSWORD}
  redis:
    host: ${SPRING_REDIS_HOST}
    port: 6379
server:
  port: 8080

最佳实践

1. 端口管理

  • 端口映射:确保端口映射正确且唯一,避免端口冲突。
  • 安全性:如果不需要外部访问,可以限制端口只在本地网络内可用。例如,使用-p 127.0.0.1:8080:8080

2. 存储管理

  • 数据持久化:使用Docker卷来持久化数据,确保数据不会因为容器重启而丢失。
  • 备份:定期备份数据卷中的数据,以防数据丢失。
  • 性能:确保数据卷所在的磁盘有足够的空间和良好的I/O性能。

3. 网络管理

  • 自定义网络:使用自定义网络来隔离和管理容器之间的通信。
  • DNS解析:利用Docker内置的DNS服务,通过服务名称进行通信。
  • 安全性:限制不必要的网络访问,确保只有需要的容器和服务能够访问MySQL和Redis。

启动和管理

启动服务

docker compose up -d

停止服务

docker compose down

查看服务状态

docker compose ps

重启服务

docker compose restart <service_name>

例如,重启app服务:

docker compose restart app

修改docker-compose.yml后的重新启动

如果你修改了docker-compose.yml文件,可以使用以下命令重新启动服务:

docker compose up -d --force-recreate

这将重新创建并启动所有服务,并应用新的配置。

相关文章:

  • git tag以及git
  • 视频翻译器免费哪个好?轻松玩转视频直播翻译
  • JavaScript如何判断一个变量是否为数组的多种方法及原理,除Array.isArray()外还有哪些方式?
  • 鸿蒙保姆级教学
  • MCP入门实践,Cursor+MCP
  • System.getProperty(“user.dir“)获取用户工作目录及绝对路径和相对路径的说明
  • Linux驱动学习笔记(一)
  • 爬虫 crawler 入门爬取不设防网页 并实现无限增生
  • DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加导出数据功能示例4,TableView15_04导出当前页数据示例
  • C++ 入门第27天:异常处理详细讲解
  • 麒麟V10 arm cpu aarch64 下编译 RocketMQ-Client-CPP 2.2.0
  • 【OCR】总结github上开源 OCR 工具:让文字识别更简单
  • YOLO obb全流程
  • mapbox-gl源码中解析style加载地图过程详解
  • win本地部署Dify,并接入deepseek-r1
  • 【Java集合夜话】第1篇:拨开迷雾,探寻集合框架的精妙设计
  • 蓝桥杯_拔河_java
  • Flutter:页面滚动,导航栏背景颜色过渡动画
  • 前后端项目
  • 创新实训项目初始化——gitee的使用
  • 做家装家居网站/如何免费开自己的网站
  • 独立网站商城/大连网站建设
  • 企业管理控制系统/百度seo查询系统
  • 丽江古城区建设局网站/百度开户代理
  • 做爰网站美女图片/业务员用什么软件找客户
  • 做网站推荐/为什么seo工资不高