docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > Docker多容器Compose 实战

Docker多容器编排Compose实战案例

作者:敲上瘾

Docker Compose是用于管理多容器应用的工具,通过YAML文件定义服务、网络、卷,实现一键部署和配置,解决手动操作繁琐问题,简化依赖管理,适用于开发测试环境,生产需Kubernetes等更强大工具,本文给大家介绍Docker多容器编排Compose实战教程,感兴趣的朋友一起看看吧

概念简述

核心定义

  Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它允许您使用一个单独的配置文件(通常是 .yml 格式)来配置应用程序的所有服务、网络和卷,然后通过一条简单的命令就能创建和启动所有服务。
可以把它想象成一个自动化脚本编排工具,专门用于在单台主机上部署由多个容器组成的应用。

为什么要使用 Docker Compose?解决什么问题?

在理解 Compose 之前,先想想如果不用它,会多麻烦:
假设应用由以下服务组成:Web 应用、Redis 缓存服务、MySQL 数据库服务,如果没有 Docker Compose,你需要手动完成以下步骤:

  1. 创建一个 Docker 网络让容器可以通信。
  2. 单独启动 MySQL 容器,并指定网络、卷、环境变量等。
  3. 单独启动 Redis 容器,并指定网络、环境变量等。
  4. 构建你的 Web 应用的镜像。
  5. 启动 Web 应用容器,并链接到之前创建的网络,设置环境变量指向 Redis 和 PostgreSQL 的容器名。

你需要记住并输入一大堆 docker run 命令,这个过程非常繁琐且容易出错。

Docker Compose 解决了这个问题:

核心概念与工作流程

总结:Docker Compose 的优点

  1. 隔离环境:整个应用栈与主机环境完全隔离。
  2. 极简配置:一个命令替代了大量复杂的 docker run 命令。
  3. 快速部署:极大地简化了多容器应用的部署和测试流程,是开发、测试和 CI/CD 环境的理想选择。
  4. 服务发现:自动在服务之间创建网络,并通过服务名进行DNS解析,使容器间通信变得非常简单。

注意:Docker Compose 通常用于开发、测试和单机部署。对于生产环境中跨多台主机的集群管理和编排,更强大的工具如 KubernetesDocker Swarm 更为合适。不过,Compose 文件可以作为学习这些更复杂工具的基础。

配置文件格式

version:指定Docker Compose文件的版本格式,不同版本支持的功能和语法有所不同,高版本兼容低版本
services: 服务,可以存在多个
servicename: 服务名字,它也是内部bridge网络可以使用的DNS name,如果不是集群模式相当于docker run的时候指定的一个名称,集群(Swarm)模式是多个容器的逻辑抽象
  image: 镜像的名字(必选)
  command: 如果设置,则会覆盖默认镜像里的CMD命令
  environment: 等价于docker container run里的–env选项,设置环境变量
  volumes: 等价于docker container run里的-v选项,绑定数据卷
  networks: 等价于docker container run里的–network选项,指定网络
  ports: 等价于docker container run里的-p选项,指定端口映射
  expose: 可选,指定容器暴露的端口
  build: 构建目录
  depends_on: 服务依赖配置
  env_file: 环境变量文件
servicename2:
  image:
  command:
  networks:
  ports:
servicename3:
#…
volumes: # 可选,等价于 docker volume create
networks: # 可选,等价于 docker network create

参数详解

准备这样一个目录结构:

mycompose/
├── prj1
│   └── docker-compose.yml
├── prj2
│   └── docker-compose.yml
└── prj3
    └── docker-compose.yml
......

image
功能:指定容器镜像
示例:

  1. 创建prj1目录:
    • mkdir prj1
  2. 在prj1中创建文件docker-compose.yml
    • cd prj1
    • touch docker-compose.yml
  3. 编辑docker-compose文件
    • vim docker-compose.yml
    •  services: 
          web:
            image: nginx:1.24.0
  4. 启动配置
    • docker compose up
  5. 清除容器
    • docker compose down

接下来就不再详细展示每个步骤,重点讲解第3步文件的配置。
command
功能:覆盖容器启动的默认指令
格式:

command: ["bundle", "exec", "thin", "-p", "3000"]
//或
command: bundle exec thin -p 3000

示例:

serveices:
  web:
    image: nginx:1.24.0
    command: bundle exec thin -p 3000

这些内容都写在配置文件docker-compose.yml里面

entrypoint
功能:覆盖容器默认的 entrypoint
格式:

entrypoint: /code/entrypoint.sh

也可以是列表格式:

entrypoint:
  - php
  - -d
  - zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so
  - -d
  - memory_limit=-1
  - vendor/bin/phpunit

示例:

services:
  web:
    image: nginx:1.24.0
    entrypoint:
      - tail
      - -f
      - /etc/os-release

environment
environment
功能:
  添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 TrueFalse
格式:

# map 格式
environment:
  RACK_ENV: development
  SHOW: "true"
  USER_INPUT:
# 数组格式
environment:
  - RACK_ENV=development
  - SHOW=true
  - USER_INPUT=

示例:

services:
  web:
    image: nginx:1.24.0
    environment:
      TEST: 1

networks
功能:配置容器网络
示例:

services:
  web:
    image: nginx:1.24.0
    networks:
      - web1
      - web2
networks:
  web1:
  web2:

volume
功能:配置容器的存储卷

#短语法
volumes:
  - "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
  - "/localhost/data:/var/lib/postgresql/data"
#完整语法
volumes:
	#命名卷
  - type: volume
    source: db-data
    target: /data
    volume:
      nocopy: true
	#绑定卷
  - type: bind
    source: /var/run/postgres/postgres.sock
    target: /var/run/postgres/postgres.sock

示例:

services:
  web:
    image: nginx:1.24.0
    volumes:
      - /home/qsy/gitDocker/data/myvolumes:/usr/share/nginx/html/

ports
功能:配置容器的端口映射

#完整语法
ports:
  - target: 80
    host_ip: 127.0.0.1
    published: 8080
    protocol: tcp
    mode: host
  - target: 80
    host_ip: 127.0.0.1
#短语法
ports:
  - "3000"
  - "3000-3005"
  - "8000:8000"
  - "9090-9091:8080-8081"
  - "49100:22"
  - "127.0.0.1:8001:8001"
  - "127.0.0.1:5000-5010:5000-5010"
  - "6060:6060/udp"

示例:

services:
  web:
    image: nginx:1.24.0
    ports:
      - 7070:80

expose
功能:暴露端口,但不映射到宿主机,只被连接的服务访问。仅可以指定内部端口为参数.
格式/示例:

expose:
  - "3000"
  - "8000"

depends_on
功能:设置依赖关系

version: "3.7"
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

env_file
从文件添加环境变量。可以是单个值或列表的多个值。

env_file: xxx.env

也可以是列表格式:

env_file:
  - ./.env
  - ./apps/web.env
  - /opt/secrets.env

docker compose指令

docker compose 指令与容器操作相似,只不过把容器改成了服务
命令格式:
docker-compose 命令的基本的使用格式为

docker compose [OPTIONS] COMMAND [ARGS...]

命令清单:

用法和功能与容器的相关指令类似,只是docker compose的操作对象是服务而已。
参考文章:Docker容器核心指令
关键命令选项
up
功能:
  该命令的作用十分强大,它会尝试自动完成包括构建镜像、(重新)创建服务、启动服务并关联服务相关容器的一系列操作,可以直接通过该命令来启动一个项目。
语法:

docker compose up [options] [service...]

选项说明:

down
功能:停止所有容器,并删除容器和网络。
语法:

docker compose down [options] [SERVICE...]

选项说明:

run
功能:该命令可以在指定服务器上执行相关的命令
语法:

# 例如:启动一个 ubuntu 服务容器,并执行 ping docker.com 命令
# docker compose run ubuntu ping docker.com
docker compose run [options] SERVICE [COMMAND] [ARGS...]

与docker run的区别,该指令是用服务启动容器,而不是镜像
选项说明:

示例:

综合案例

docker-compose.yml配置

启动,会先启动依赖的服务。

清理,与启动相反,先清理主要的服务,然后清理依赖的服务。

到此这篇关于Docker多容器编排:Compose 实战教程的文章就介绍到这了,更多相关Docker多容器Compose 实战内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文