企业自助建站策划方案站长之家查询网
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:latestcontainer_name: webports:- "80:80"volumes:- ./nginx.conf:/etc/nginx/nginx.conf- ./html:/usr/share/nginx/htmlnetworks:- webnetdepends_on:- dbenvironment:- NGINX_HOST=web.example.comdeploy:replicas: 3update_config:parallelism: 2delay: 10srestart_policy:condition: on-failuremax_attempts: 3window: 120sdb:image: mysql:5.7container_name: dbports:- "3306:3306"volumes:- db-data:/var/lib/mysqlnetworks:- webnetenvironment:- MYSQL_ROOT_PASSWORD=my-secret-pw- MYSQL_DATABASE=mydb- MYSQL_USER=myuser- MYSQL_PASSWORD=mypasswordhealthcheck:test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]interval: 10stimeout: 5sretries: 3start_period: 10snetworks: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.7container_name: wordpress_dbenvironment:MYSQL_ROOT_PASSWORD: example_root_passwordMYSQL_DATABASE: wordpressMYSQL_USER: wordpress_userMYSQL_PASSWORD: example_wordpress_passwordvolumes:- db_data:/var/lib/mysqlnetworks:- wordpress-nethealthcheck:test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]interval: 10stimeout: 5sretries: 3start_period: 10srestart: unless-stoppedwordpress:image: wordpress:latestcontainer_name: wordpress_appports:- "80:80"environment:WORDPRESS_DB_HOST: db:3306WORDPRESS_DB_USER: wordpress_userWORDPRESS_DB_PASSWORD: example_wordpress_passwordWORDPRESS_DB_NAME: wordpressvolumes:- wp_data:/var/www/htmlnetworks:- wordpress-netdepends_on:- dbrestart: unless-stoppednetworks:wordpress-net:driver: bridgevolumes: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.7container_name: django_dbenvironment:MYSQL_ROOT_PASSWORD: example_root_passwordMYSQL_DATABASE: django_dbMYSQL_USER: django_userMYSQL_PASSWORD: example_django_passwordvolumes:- db_data:/var/lib/mysqlnetworks:- django-nethealthcheck:test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]interval: 10stimeout: 5sretries: 3start_period: 10srestart: unless-stoppedredis:image: redis:alpinecontainer_name: django_redisnetworks:- django-netrestart: unless-stoppedweb:build: .container_name: django_webcommand: /usr/local/bin/uwsgi --ini uwsgi.inivolumes:- .:/codeports:- "8000:8000"environment:DJANGO_DB_HOST: dbDJANGO_DB_NAME: django_dbDJANGO_DB_USER: django_userDJANGO_DB_PASSWORD: example_django_passwordREDIS_HOST: redisdepends_on:- db- redisnetworks:- django-netrestart: unless-stoppednetworks:django-net:driver: bridgevolumes: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.7container_name: springboot_dbenvironment:MYSQL_ROOT_PASSWORD: example_root_passwordMYSQL_DATABASE: springboot_dbMYSQL_USER: springboot_userMYSQL_PASSWORD: example_springboot_passwordvolumes:- db_data:/var/lib/mysqlnetworks:- springboot-nethealthcheck:test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]interval: 10stimeout: 5sretries: 3start_period: 10srestart: unless-stoppedredis:image: redis:alpinecontainer_name: springboot_redisnetworks:- springboot-netrestart: unless-stoppedapp:build: .container_name: springboot_appports:- "8080:8080"environment:SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/springboot_dbSPRING_DATASOURCE_USERNAME: springboot_userSPRING_DATASOURCE_PASSWORD: example_springboot_passwordSPRING_REDIS_HOST: redisdepends_on:- db- redisnetworks:- springboot-netrestart: unless-stoppednetworks:springboot-net:driver: bridgevolumes: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
这将重新创建并启动所有服务,并应用新的配置。