Docker-Compose

目录
显示
简介
学习了 Docker 之后,你一定遇到这样的困难,每次启动容器都要运行一大段的命令,那么长又记不住,每次写一也容易写错,一个容器就这么麻烦,那实际开发环境那么多项目容器,岂不是要累死。为了解决这个痛点,Docker Compose 孕育而生。
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它使用 YAML 文件来配置应用程序的服务,然后,使用一条命令,就可以从配置中创建并启动所有服务。
它有以下优势特点:
- 简化部署: 将多个容器的配置集中在一个 YAML 文件中,方便管理和部署。
- 提高效率: 一条命令即可启动整个应用程序,减少了手动操作。
- 易于理解: YAML 文件具有良好的可读性,易于维护。
- 适用于各种场景,方便迁移: 从开发环境到生产环境,都可以使用 Docker Compose。
好处这么多,那就学起来吧。
安装
方式一:yum安装
# 添加 epel 源
yum install -y epel-release
# 安装docker-compose
yum install -y docker-compose
# 查看 docker-compose 版本, 安装成功
docker-compose --version
方式二: 安装包安装
# 下载,移动到/usr/bin目录下,改文件名为docker-compose
curl -SL <https://github.com/docker/compose/releases/download/v2.29.2/docker-compose-linux-x86_64> -o /usr/local/bin/docker-compose
# 赋执行权
chmod +x /usr/local/bin/docker-compose
# 查看 docker-compose 版本
docker-compose --version
使用
Docker Compose 的核心文件:docker-compose.yml
,我们根据这个文件的配置来启动多个容器。
举个例子,将之前通过命令启动 redis 容器,改写成 docker-compose.yml
docker run -p 6379:6379 \\
-v /root/redis/data:/data \\
-v /root/redis/conf/redis.conf:/etc/redis/redis.conf \\
-d --name my_redis redis \\
redis-server /etc/redis/redis.conf
改写后的docker-compose.yml
version: '3.7'
services:
redis:
image: redis
container_name: my_redis
ports:
- "6379:6379"
volumes:
- /root/redis/data:/data
- /root/redis/conf/redis.conf:/etc/redis/redis.conf
这个 YAML 文件定义了应用程序的所有服务,可以包括:
- 服务(services): 每个服务对应一个 Docker 容器。
- 网络(networks): 定义容器之间的网络连接。
- 卷(volumes): 定义数据卷,用于数据持久化。
- 镜像(image): 定义启动的镜像
- 端口(ports): 定义暴露的端口号
- 环境变量(environment): 设置 PostgreSQL 密码,提高安全性。
配置文件写好了就是根据配置启动容器了,命令特别简单,如下所示:
# 运行默认文件,文件必须在当前目录,且文件名为 docker-compose.yml
docker-compose up -d
# 运行指定的文件,如果文件名不是docker-compose,就要通过 -f 指定。
docker-compose -f a.yaml up -d
# 修改配置文件后再次运行以下命令,只会重启修改了的容器
docker-compose up -d
# 停止配置文件中的全部容器
docker-compose stop
# 停止并删除配置文件中的全部容器
docker-compose down
举例
再来一个复杂点的例子说明下
一个简单的博客系统,包含三个服务:
- Nginx: 作为反向代理,负责分发请求。
- Python Flask: 一个 Python Flask 应用,提供博客内容。
- PostgreSQL: 数据库,用于存储博客数据。
docker-compose.yml 文件:
version: '3.7'
services:
web:
build: .
ports:
- "80:80"
depends_on:
- db
networks:
- blog-network
db:
image: postgres
environment:
POSTGRES_PASSWORD: mysecretpassword
volumes:
- db_data:/var/lib/postgresql/data
networks:
- blog-network
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./static:/usr/share/nginx/html
depends_on:
- web
networks:
- blog-network
networks:
blog-network:
volumes:
db_data:
解释:
- version: 指定 Docker Compose 文件格式版本。
- services: 定义服务。
- web:
- build: 从当前目录构建镜像。
- ports: 将容器的 80 端口映射到主机的 80 端口。
- depends_on: 确保数据库服务在 Web 服务启动前启动。
- networks: 连接到
blog-network
网络。
- db:
- image: 使用 Postgres 镜像。
- environment: 设置 PostgreSQL 密码。
- volumes: 将宿主机上的
db_data
卷挂载到容器的 PostgreSQL 数据目录。 - networks: 连接到
blog-network
网络。
- nginx:
- 同上,省略
- web:
- networks: 定义网络。
- blog-network: 创建一个名为
blog-network
的网络,用于连接所有服务。
- blog-network: 创建一个名为
- volumes: 定义卷。
- db_data: 创建一个名为
db_data
的卷,用于持久化数据库数据。
- db_data: 创建一个名为