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:
      • 同上,省略
  • networks: 定义网络。
    • blog-network: 创建一个名为 blog-network 的网络,用于连接所有服务。
  • volumes: 定义卷。
    • db_data: 创建一个名为 db_data 的卷,用于持久化数据库数据。
SystemCaller
SystemCaller

https://gravatar.com/noisily745e35dad0

文章: 47

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注