docker componse容器编排
在实际工作中,部署一个应用可能需要部署多个容器,一个一个部署非常不方便。docker compose可以一键部署和启动多个容器,它使用yaml文件来编排服务。
github和docker hub很多项目都提供了docker-compose.yaml文件,我们可以一键部署项目,非常方便。
一键部署wordpress
wordpress是一个著名的开源博客系统。
将以下内容保存到本地的docker-compose.yml文件中。
docker compose
命令启动时,默认在当前目录下寻找compose.yaml
或compose.yml
,
为了兼容之前的版本,也会查找docker-compose.yaml
或docker-compose.yml
。
也可以使用-f
参数手动指定文件docker compose -f docker-compose-dev.yml up -d
version: '3.1'
services:
wordpress:
image: wordpress
restart: always
ports:
- 8080:80
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser
WORDPRESS_DB_PASSWORD: examplepass
WORDPRESS_DB_NAME: exampledb
volumes:
- wordpress:/var/www/html
db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- db:/var/lib/mysql
volumes:
wordpress:
db:
docker compose up -d
一键部署启动
docker compose start/stop
启动/停止服务
docker compose down
停止并删除容器,不会删除存储卷volume
compose文件结构
docker-compose.yml
通常需要包含以下几个顶级元素:
version
已弃用,早期版本需要此元素。
services
必要元素,定义一个或多个容器的运行参数
在services
中可以通过以下元素定义容器的运行参数
image
容器 镜像
ports
端口映射
environment
环境变量
networks
容器使用的网络
volumes
容器挂载的存储卷
command
容器启动时执行的命令
depends_on
定义启动顺序
复数形式(例如ports
,networks
,volumes
,depends_on
)参数需要传入列表
networks
创建自定义网络
volumes
创建存储卷
yaml文件语法
- 缩进代表上下级关系
- 缩进时不允许使用Tab键,只允许使用空格
:
键值对,后面必须有空格-
列表,后面必须有空格[ ]
数组#
注释{key:value,k1:v1}
map|
多行文本块
如果一个文件中包含多个文档---
表示一个文档的开始
还有一种常见的用法:
把公共的配置提取出来,用&
来建立锚点,<<
合并到当前数据,用*
引用锚点,例如
version: '3.7'
# Settings and configurations that are common for all containers
x-minio-common: &minio-common
image: quay.io/minio/minio:RELEASE.2022-08-13T21-54-44Z
command: server --console-address ":9001" http://minio{1...2}/data{1...2}
expose:
- "9000"
- "9001"
services:
minio1:
<<: *minio-common
volumes:
- data1-1:/data1
- data1-2:/data2
minio2:
<<: *minio-common
volumes:
- data2-1:/data1
- data2-2:/data2
volumes:
data1-1:
data1-2:
data2-1:
data2-2:
编排自己的项目
以ruoyi项目为例子,先采用挂载目录的方式部署应用,等我们学完dockfile打包,就可以完整的部署应用了
version: '3.1'
services:
ruoyi-app:
# docker run --name ruoyi-app \
# -p 8080:8080 \
# --network ruoyi-net \
# -v /home/app/ruoyi-admin.jar:/usr/local/src/ruoyi-admin.jar \
# -d openjdk:8u342-jre \
# java -jar /usr/local/src/ruoyi-admin.jar
image: openjdk:8u342-jre
ports:
- 8080:8080
volumes:
- /home/app/ruoyi-admin.jar:/usr/local/src/ruoyi-admin.jar
command: java -jar /usr/local/src/ruoyi-admin.jar
networks:
- ruoyi-net
depends_on:
- ruoyi-db
ruoyi-db:
# docker run --name ruoyi-db -p 3303:3306 \
# --network ruoyi-net \
# -v ruoyi-data:/var/lib/mysql \
# -v /home/app/sql:/docker-entrypoint-initdb.d \
# -e MYSQL_DATABASE=ry \
# -e MYSQL_ROOT_PASSWORD=123456 \
# -d mysql:5.7 \
# --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --skip-character-set-client-handshake
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=ry
command: [
"--character-set-server=utf8mb4",
"--collation-server=utf8mb4_general_ci",
"--skip-character-set-client-handshake"
]
volumes:
- /home/app/sql:/docker-entrypoint-initdb.d
- ruoyi-data:/var/lib/mysql
networks:
- ruoyi-net
volumes:
ruoyi-data:
networks:
ruoyi-net:
command
支持以下写法:
#推荐使用数组或列表的方式
#数组
command:
["java",
"-jar",
"/usr/local/src/ruoyi-admin.jar"
]
#列表
command:
- java
- -jar
- /usr/local/src/ruoyi-admin.jar
# shell命令模式
command: java -jar /usr/local/src/ruoyi-admin.jar
environment
支持如下两种写法
# 使用map
environment:
MYSQL_DATABASE: exampledb
MYSQL_USER: exampleuser
MYSQL_PASSWORD: examplepass
MYSQL_RANDOM_ROOT_PASSWORD: '1'
#使用列表
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=ry
- LANG=C.UTF-8
容器启动顺序depends_on
数据库初始化完成之前,不会建立connections。
depends_on
只能保证容器的启动和销毁顺序,不能确保依赖的容器是否ready。
version: "3.9"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
condition
有三种状态:
service_started
容器已启动service_healthy
容器处于健康状态service_completed_successfully
容器执行完成且成功退出(退出状态码为0)
我们来改造一下我们自己的docker-compose.yaml文件,完整例子如下:
services:
ruoyi-app:
# docker run --name ruoyi-app \
# -p 8080:8080 \
# --network ruoyi-net \
# -v /home/app/ruoyi-admin.jar:/usr/local/src/ruoyi-admin.jar \
# -d openjdk:8u342-jre \
# java -jar /usr/local/src/ruoyi-admin.jar
image: openjdk:8u342-jre
restart: always
ports:
- 8080:8080
networks:
- ruoyi-net
volumes:
- /home/app/ruoyi-admin.jar:/usr/local/src/ruoyi-admin.jar
command: [ "java", "-jar", "/usr/local/src/ruoyi-admin.jar" ]
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080"]
interval: 5m30
timeout: 5s
retries: 5
start_period: 20s
depends_on:
ruoyi-db:
condition: service_healthy
ruoyi-db:
# docker run --name ruoyi-db -p 3303:3306 \
# --network ruoyi-net \
# -v ruoyi-data:/var/lib/mysql \
# -v /home/app/sql:/docker-entrypoint-initdb.d \
# -e MYSQL_DATABASE=ry \
# -e MYSQL_ROOT_PASSWORD=123456 \
# -d mysql:5.7 \
# --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --skip-character-set-client-handshake
image: mysql:5.7
environment:
- MYSQL_DATABASE=ry
- MYSQL_ROOT_PASSWORD=123456
volumes:
- ruoyi-data:/var/lib/mysql
- /home/app/sql:/docker-entrypoint-initdb.d
networks:
- ruoyi-net
command:
[
"--character-set-server=utf8mb4",
"--collation-server=utf8mb4_unicode_ci",
"--skip-character-set-client-handshake"
]
healthcheck:
test: ["CMD", 'mysqladmin', 'ping', '-h', 'localhost', '-u', 'root', '-p$$MYSQL_ROOT_PASSWORD']
interval: 5m
timeout: 5s
retries: 5
start_period: 20s
volumes:
ruoyi-data:
networks:
ruoyi-net:
评论区