一、docker-compose基础概念
docker-compose项目是docker官方的开源项目, 负责实现对docker容器集群的快速编排。
docker-compose将所管理的容器分为三层, 分别是工程(project),服务(service)以及容器(containner)
- docker-compose运行目录下的所有文件(docker-compose.yml文件、extends文件或环境变量等)组成一个工程,如无特殊指定,工程名即为当前目录名。
- 一个工程当中,可以包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。
- 一个服务中可以包括多个容器实例,docker-compose并没有解决负载均衡的问题。因此需要借助其他工具实现服务发现及负载均衡,比如consul。
docker-compose的工程配置文件默认为docker-compose.yml。可以通过环境变量COMPOSE_FILE -f 参数自定义配置文件,其自定义多个有依赖关系的服务及每个人服务运行的容器。
2、为什么要使用docker-compose
使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况,
- 例如要实现一个web项目,除了web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
compose允许用户通过一个单独docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器为一个项目(project)
- docker-compose项目由pypthon编写,调用docker服务提供的API来对容器进行管理,因此, 只要所操作的平台支持docker-API,就可以在其上利用compose来进行编排管理。
- 简单来说:就是来管理多个容器的,定义启动顺序的,合理编排,方便管理。
3、compose的安装
在 Linux 上的也安装十分简单,从 GitHub Release处直接下载编译好的二进制文件即可。
(1)先把docker-compose文件下载到当前目录:
wget https://github.com/docker/compose/releases/download/v2.12.2/docker-compose-linux-x86_64
(2)然后拷贝到/usr/bin/ 。
sudo cp -arf docker-compose-linux-x86_64 /usr/bin/docker-compose
sudo chmod +x /usr/bin/docker-compose
4、使用
docker-compose.yml
文件用于定义和运行多个 Docker 容器的应用,常用的配置指令:
1. 版本声明
在 docker-compose.yml
文件开头,需要声明所使用的 Compose 文件版本,不同版本支持的功能有所差异。
version: '3'
- Version 1:是最早的版本,语法简单,主要用于在单机环境下定义和运行多个容器,适用于非常简单的 Docker 应用,不支持网络、数据卷等高级配置,也没有服务依赖、部署配置等复杂功能。
- Version 2.x:在 Version 1 的基础上增加了网络和数据卷的显式定义、服务依赖管理、环境变量扩展等功能,支持使用
networks
和volumes
关键字来创建和管理网络与数据卷,通过depends_on
定义服务之间的依赖关系,适用于需要更复杂配置的单机应用。 - Version 3.x:主要是为了支持 Docker Swarm 集群模式而设计,在 Version 2.x 的基础上进一步增强。引入了
deploy
关键字,可用于定义服务的部署配置,如副本数量、资源限制、更新策略等,同时对网络和数据卷的配置进行了优化,支持更灵活的配置方式,既适用于单机环境,也适用于 Docker Swarm 集群环境,适合需要进行大规模部署和管理的应用。
2. 服务定义(services
)
services
部分用于定义各个容器化服务的配置,每个服务都有自己的配置项。
image
指定服务使用的 Docker 镜像。
services:
web:
image: nginx:latest
注意services
部分用来定义应用程序里的各个服务,这些服务名称可以依据实际情况灵活命名比如web
build
若要构建自定义镜像,可以使用 build
指令指定构建上下文和 Dockerfile。
services:
app:
build:
context: ./app # 指定 Dockerfile 所在目录
dockerfile: Dockerfile # 指定 Dockerfile 文件名
container_name
为容器指定自定义名称。
services:
db:
image: mysql:8.0
container_name: my-mysql-ct
restart
定义容器的重启策略。
services:
redis:
image: redis:alpine
restart: always # 总是重启
常见的重启策略有:
no
:默认值,不自动重启。always
:无论容器因何原因停止,都会自动重启。on-failure
:容器因非零退出状态码停止时重启。unless-stopped
:除非手动停止,否则容器会一直重启。
environment
设置容器内的环境变量。
从 .env
文件加载环境变量
可以把环境变量存放在 .env
文件中,然后在 docker-compose.yml
里引用这些变量。
- 创建
.env
文件:在docker-compose.yml
文件所在的目录下创建一个.env
文件,内容如下:
DB_HOST=localhost
DB_PORT=5432
- 在
docker-compose.yml
中引用:
version: '3'
services:
app:
image: my-app
environment:
- DB_HOST
- DB_PORT
这样,app
服务的容器会从 .env
文件中读取 DB_HOST
和 DB_PORT
的值并设置为环境变量
ports
将容器内的端口映射到宿主机的端口。
services:
web:
image: nginx:latest
ports:
- "8080:80" # 宿主机 8080 端口映射到容器 80 端口
volumes
将宿主机的目录或文件挂载到容器内。
services:
app:
image: python:3.9
volumes:
- ./app:/app # 宿主机当前目录下的 app 目录挂载到容器的 /app 目录
depends_on
定义服务之间的依赖关系,确保依赖的服务先启动。
services:
web:
image: nginx:latest
depends_on:
- app
app:
image: python:3.9
networks
指定服务要连接的网络。
services:
web:
image: nginx:latest
networks:
- my-network
networks:
my-network:
external: true
3. 网络定义(networks
)
networks
部分用于定义 Docker 网络,可指定网络驱动和其他配置。
networks:
my-network:
driver: bridge # 使用桥接网络
4. 数据卷定义(volumes
)
volumes
部分用于定义 Docker 数据卷,可实现数据的持久化存储。
volumes:
my-volume:
driver: local # 使用本地驱动
5. 其他高级配置
command
覆盖容器启动时默认执行的命令。
services:
app:
image: python:3.9
command: python app.py
deploy
在 Docker Swarm 模式下,deploy
用于定义服务的部署配置,如副本数量、资源限制等。
services:
web:
image: nginx:latest
deploy:
replicas: 3 # 部署 3 个副本
resources:
limits:
cpus: '0.50'
memory: 512M
以上就是 docker-compose.yml
文件中常见的配置指令,你可以根据实际需求组合使用这些指令来定义和管理复杂的 Docker 应用。
6.下面是一个完整的yml 配置
version: '3'
networks:
# 指定要连接的已有网络,需确保该网络已存在
lishibiao_network:
external: true
volumes:
# 引用提前创建的数据卷,需替换为实际的数据卷名称
mysql-data:
external: true
services:
db:
image: mysql:8.0
container_name: mysql-ct-3
restart: always
environment:
# MySQL 初始化所需的基本环境变量
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: zyy
MYSQL_USER: root
MYSQL_PASSWORD: 123456
volumes:
# 挂载提前创建的数据卷到 MySQL 数据存储目录
- mysql-data:/var/lib/mysql
ports:
# 映射 MySQL 端口到宿主机
- "3306:3306"
networks:
# 连接到指定网络
- lishibiao_network
app:
image: zyy:3.0
container_name: my-zyy-app-7 # 替换为实际的 app 容器名称
depends_on:
- db
networks:
- lishibiao_network
volumes:
# 挂载宿主机上的 JAR 文件到容器内的指定路径
- /home/docker-zyy/zyy-0.0.1-SNAPSHOT.jar:/app/zyy.jar
# 挂载应用配置文件到容器内指定位置,按实际情况修改路径
- /home/docker-zyy/application.properties:/app/config/application.properties
ports:
# 端口映射,将宿主机的 8903 端口映射到容器内的 8903 端口,可按需修改
- "8903:8903"
command: java -jar /app/zyy.jar -Dspring.config.location=/app/config/application.properties