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
这将重新创建并启动所有服务,并应用新的配置。