【Docker】Docker Compose部署单节点多容器应用
文章目录
- 一. Docker Compose 的能力
- 二. 部署博客系统(博客+mysql)
- 1. docker命令部署
- 2. Compose文件部署多应用
- 三. Docker Compose使用讲解
- 1. 文件语法
- 2. 启动compose
- 3. 停止应用
- 4. 其他命令
- 四. 常用命令
一. Docker Compose 的能力
Docker Compose 通过一个 YAML 文件来定义应用的服务、网络和卷等,实现单宿主机下启动多容器的部署和管理。
二. 部署博客系统(博客+mysql)
1. docker命令部署
bitnami部署文档:
https://hub.docker.com/r/bitnami/wordpress?uuid=DEB26A7C-3F72-4B06-AA81-1A5A78638230
#创建网络
docker network create wordpress-network
创建数据库
docker run -d --name mariadb \
--env ALLOW_EMPTY_PASSWORD=yes \
--env MARIADB_USER=bn_wordpress \
--env MARIADB_PASSWORD=bitnami \
--env MARIADB_DATABASE=bitnami_wordpress \
--network wordpress-network \
--volume mariadb_data:/bitnami/mariadb \
bitnami/mariadb:latest
docker volume create --name wordpress_data
docker run -d --name wordpress \
-p 18080:8080 -p 8443:8443 \
--env ALLOW_EMPTY_PASSWORD=yes \
--env WORDPRESS_DATABASE_USER=bn_wordpress \
--env WORDPRESS_DATABASE_PASSWORD=bitnami \
--env WORDPRESS_DATABASE_NAME=bitnami_wordpress \
--network wordpress-network \
--volume wordpress_data:/bitnami/wordpress \
bitnami/wordpress:latest
访问:
2. Compose文件部署多应用
# 包含4个一级key:version、services、networks、volumes。
# 一. 服务
services:
mariadb:
# 1. 容器名称
# 如果不配置container_name
# a.容器的名称以项目名称(所在目录名称)为前缀。
# b. 以一个数字为后缀用于标识容器实例序号——因为Docker Compose允许扩缩容。
container_name: mariadb
# 2.本地镜像
image: bitnami/mariadb:latest
# 3. 端口映射
ports:
- '13306:3306'
# 4. 卷映射
## 会创建一个卷:如果容器中此目录下有则不用
volumes:
- 'mariadb_data:/bitnami/mariadb'
# 5. 环境变量映射
environment:
# ALLOW_EMPTY_PASSWORD is recommended only for development.
- ALLOW_EMPTY_PASSWORD=yes
- MARIADB_USER=bn_wordpress
- MARIADB_DATABASE=bitnami_wordpress
# 6. 重启策略
## always:开机就重启
restart: always
# 7. 网络:
networks:
- blog
wordpress:
container_name: wordpress
image: bitnami/wordpress:latest
ports:
- '10081:80'
- '10443:8443'
volumes:
- 'wordpress_data:/bitnami/wordpress'
environment:
# ALLOW_EMPTY_PASSWORD is recommended only for development.
- ALLOW_EMPTY_PASSWORD=yes
# 内部网络:直接使用容器端口和hostname
- WORDPRESS_DATABASE_HOST=mariadb
- WORDPRESS_DATABASE_PORT_NUMBER=3306
- WORDPRESS_DATABASE_USER=bn_wordpress
- WORDPRESS_DATABASE_NAME=bitnami_wordpress
depends_on:
- mariadb
networks:
- blog
restart: always
# 二. 卷配置
## 总体卷
volumes:
mariadb_data:
driver: local
wordpress_data:
driver: local
# 三. 网络
## 这里的容器都用此网络
networks:
blog:
启动
docker compose -f docker-compose.yaml up -d
注意:
增量更新:修改 Docker Compose 文件重新启动应用,只会触发修改的容器重新启动。
数据不删:默认就算down了容器,所有挂载的卷不会被移除。比较安全。
三. Docker Compose使用讲解
1. 文件语法
包含4个一级key:version、services、networks、volumes。
version:可选。位于文件的第一行。它定义了Compose文件格式(主要是API)的版本
services:用于定义不同的应用服务。Docker Compose会将每个服务部署在
各自的容器中
。networks: 用于指引Docker创建新的网络。默认情况下,Docker Compose会创建bridge网络。这是一种
单主机网络
,只能够实现在同一主机上容器的连接。当然,也可以使用driver属性来指定不同的网络类型。volumes用于指引Docker来创建新的卷。 当第一次部署该应用的时候,Docker Compose会检查是否有同名的卷存在。如果不存在,则会创建它。
Docker Compose会在部署服务之前创建网络和卷。如下可见,Docker
Compose会首先创建网络和卷(甚至先于构建和拉取镜像)。
2. 启动compose
默认情况下,docker-compose up会查找名为docker-compose.yml或docker-compose.yaml的Compose文件。
如果Compose文件是其他文件名,则需要通过-f参数来指定。
docker-compose -f prod-equus-bass.yml up -d
启动时会构建所需的镜像,创建网络和卷,并启动容器。
前台启动:&
# 前台启动:&
docker-compose -f prod-equus-bass.yml up -d &
# 后台启动
docker-compose up -d
# 修改完docker文件后重新发布
docker-compose up --build
3. 停止应用
停止应用:docker-compose down
docker-compose down
# 尝试关闭两个服务
1. Stopping counterapp_redis_1 ...
2. Stopping counterapp_web-fe_1 ...
# stop指令会发送SIGTERM信号。信号会被发送到每个容器中PID为1的进程。
1. redis_1 | 1:signal-handler Received SIGTERM scheduling shutdown...
2. redis_1 | 1:M 09 Jan 11:16:00.456 # User requested shutdown...
3. redis_1 | 1:M 09 Jan 11:16:00.456 * Saving the final RDB snap... |
# 优雅关闭
1. redis_1 1:M 09 Jan 11:16:00.463 * DB saved on disk
5. Stopping counterapp_redis_1 ... done
6. counterapp_redis_1 exited with code 0
# 已成功停止Redis。
8. Stopping counterapp_web-fe_1 ... done
# 容器被删除。
10. Removing counterapp_redis_1 ... done
11. Removing counterapp_web-fe_1 ... done
# 删除网络
12. Removing network counterapp_counter-net
# docker-compose up进程退出。
13. [1]+ Done docker-compose up
需要特别注意的是,counter-vol卷并没有被删除,因为卷应该是用于数据的长期持久化存储的。因此,卷的生命周期是与相应的容器完全解耦的。
4. 其他命令
查看应用状态
docker-compose ps
Name Command State Ports
--------------------------------------------------------------------------
counterapp_redis_1 docker-entrypoint... Up 6379/tcp
counterapp_web-fe_1 python app.py Up 0.0.0.0:5000->5000/tcp
列出各个容器内运行的进程
docker-compose top
counterapp_redis_1
PID USER TIME COMMAND
------------------------------------
843 dockrema 0:00 redis-server
counterapp_web-fe_1
PID USER TIME COMMAND
-------------------------------------------------
928 root 0:00 python app.py
1016 root 0:00 /usr/local/bin/python app.py
四. 常用命令
文件配置文档:
https://docs.docker.com/reference/compose-file/
创建并启动所有应用
docker-compose up -d
# 读取docker-compose.yml,启动各个容器
# -f:可以指定文件名
# -d:后台启动。
# 命令会停止Compose应用相关的所有容器,但不会删除它们。
docker-compose stop
# 删除已停止的Compose应用。它会删除容器和网络,但是不会删除卷和镜像。
docker-compose rm
# 重启已停止的Compose应用
# 注意:变更的内容不会反映在重启后的应用中,这时需要重新部署应用使变更生效。
docker-compose restart
# 停止并删除运行中的Compose应用。它会删除容器和网络,但是不会删除卷和镜像。
docker-compose down
docker compose start image_name
docker compose stop image_name
启动多实例:docker compose scale image_name=2