Docker 使用基础(6)—容器编排

 

                                         🎬慕斯主页修仙—别有洞天

                                       ♈️今日夜电波:秒針を噛む—ずっと真夜中でいいのに。

                                                           0:34━━━━━━️💟──────── 4:20
                                                                🔄   ◀️   ⏸   ▶️    ☰  

                                 💗关注👍点赞🙌收藏您的每一次鼓励都是对我莫大的支持😍


目录

首先理解几个概念

Docker 容器编排(Compose)是什么?

为什么要 Docker Compose?

Docker Compose 的功能

docker-compose.yml常用的文件基本结构

1. image

2. command

3. entrypoint

4. environment

5. networks

6. volumes

7. ports

8. expose

9. build

10. depends_on

11. env_file

完整示例

Docker Compose常用命令

1. docker-compose up

2. docker-compose down

3. docker-compose run


 

首先理解几个概念

Docker 容器编排(Compose)是什么?

docker-compose 是 Docker 官方的开源项目,使用 python 编写,实现上调用了Docker 服务的 API 进行容器管理及编排,其官方定义为定义和运行多个 Docker 容器 的应用。

docker-compose 中有两个非常重要的概念:

• 服务 ( service ):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。

• 项目( project ):由一组关联的应用容器组成的一个完整业务单元,在 dockercompose.yml 文件中定义, 整个 docker-compose.yml 定义一个项目。

Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。

通过 compose 可以方便的管理多个服务。

为什么要 Docker Compose?

Docker Compose 被设计出来主要是为了解决在开发、测试和部署涉及多个容器的应用程序时的复杂性和一致性问题。在使用单一 Docker 容器的情况下,一个 Dockerfile 就足以描述和构建容器镜像,但是现代应用程序往往包含多个服务,比如 Web 服务器、数据库、缓存服务等,这些服务通常需要在不同的容器中运行。这就引入了一个新的挑战:如何保证这些服务能够一起正常工作,相互之间正确地通信,并且能够容易地在不同的环境中复制这种设置。

以下是使用 Docker Compose 的几个主要原因:

  1. 多容器编排
    Docker Compose 允许你在一个 YAML 文件中定义多个服务及其依赖关系。这意味着你可以用一个命令启动或停止所有相关的服务,而不是分别处理每个容器。
  2. 一致性
    使用 Docker Compose,无论是在开发者的本地机器上,还是在测试、预生产和生产环境中,都可以保持一致的环境配置。这有助于避免“在我的机器上能运行”的问题。
  3. 简化环境搭建
    开发者只需运行一个命令,即可在他们的本地环境中搭建起整个应用栈,包括所有服务和依赖。这对于新加入团队的成员尤其有用,可以快速设置开发环境。
  4. 资源隔离
    通过 Docker Compose,每个服务可以运行在自己的容器中,这样可以更好地隔离应用的不同组件,避免资源竞争。
  5. 易于维护和升级
    当需要更新应用的任何部分时,只需修改 docker-compose.yml 文件,然后重新启动服务即可,无需手动调整每个容器的设置。
  6. 可移植性和可重复性
    Docker Compose 文件是文本文件,可以被版本控制系统跟踪,这使得应用配置可以随代码库一起被管理和分发。
  7. 网络和环境变量管理
    Docker Compose 还允许你定义网络和环境变量,使得容器间通信更加容易,同时可以针对不同的环境配置不同的变量。
  8. 自动化和持续集成
    Docker Compose 可以很容易地整合到 CI/CD 流水线中,自动部署和测试应用的完整堆栈。

Docker Compose 的功能
  1. 使用步骤
    Compose 使用的步骤:
    • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中
    一起运行。
    • 最后,执行 docker compose up 命令来启动并运行整个应用程序。
  2. 核心功能
    Compose 具有管理应用程序整个生命周期的命令:
    • 启动,停止和重建服务
    • 查看正在运行的服务的状态
    • 流式传输运行服务的日志输出
    • 在服务上运行一次性命令
  3. 使用场景

        单主机部署

        快速搭建一个单节点开发或者测试环境,方便使用。

        不同环境隔离

        通过指定 project 来运行不同的环境,实现隔离的目的。

docker-compose.yml常用的文件基本结构

docker-compose.yml 文件是 Docker Compose 使用的主要配置文件,用于定义和管理多容器的 Docker 应用程序。以下是 docker-compose.yml 文件中一些常见指令的详细解释,包括它们的用途、语法和一个综合示例。

基本结构

version: '3' # 或其他版本号,如 '3.7'
services:
  <service_name>:
    # 指令定义
...
networks:
  <network_name>: # 可选
    # 网络定义
...
volumes:
  <volume_name>: # 可选
    # 卷定义
...

常见指令详解

1. image
  • 用途:指定服务使用的 Docker 镜像。
  • 语法
image: <image_name>:<tag>

2. command
  • 用途:覆盖容器的默认命令。
  • 语法
command: ["executable", "param1", "param2"] # 长语法
command: executable param1 param2 # 短语法

3. entrypoint
  • 用途:覆盖容器的默认入口点。
  • 语法
entrypoint: ["executable", "param1", "param2"] # 长语法
entrypoint: executable param1 param2 # 短语法
#数组语法
entrypoint:
- php
- -d
- zend_extension=/usr/local/lib/php/extensions/no-debug-nonzts-20100525/xdebug.so
- -d
- memory_limit=-1
- vendor/bin/phpunit

4. environment
  • 用途:设置环境变量。
  • 语法
#数组语法
environment:
  - KEY=VALUE
  - ANOTHER_KEY=ANOTHER_VALUE
#map 语法
environment:
RACK_ENV: development
SHOW: "true"

5. networks
  • 用途:定义服务所属的网络。
  • 语法
networks:
  - network_name
#配置网络驱动和子网信息
services:
  frontend:
    image: awesome/webapp
  networks:
    front-tier:
      ipv4_address: 172.16.238.10
networks:
  front-tier:
    ipam:
      driver: default
        config:
          - subnet: "172.16.238.0/24"

6. volumes
  • 用途:定义数据卷或挂载宿主机目录到容器。
  • 语法
volumes:
  - /host/path:/container/path:rw # 挂载宿主机路径
  - volume_name:/container/path # 使用命名卷

7. ports
  • 用途:映射容器端口到宿主机端口。
  • 语法
#短语法
ports:
  - "80:80"
  - "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
#完整语法
ports:
  - target: 80
    host_ip: 127.0.0.1
    published: 8080
    protocol: tcp
    mode: host
  - target: 80
    host_ip: 127.0.0.1
    published: 8000-9000
    protocol: tcp
    mode: host

8. expose
  • 用途:声明容器监听的端口,但不进行映射。
  • 语法
expose:
  - "80"
  - "443"

9. build
  • 用途:指定 Dockerfile 构建镜像。
  • 语法
build:
  context: .
  dockerfile: Dockerfile-alternate
  args:
    buildno: 1
  cache_from:
    - alpine:latest
    - corp/web_app:3.14

10. depends_on
  • 用途:定义服务之间的依赖。
  • 语法
depends_on:
  - service_name

设置依赖关系。

• docker compose up :以依赖性顺序启动服务。在以下示例中,先启动 db 和

redis ,才会启动 web。

• docker compose up SERVICE :自动包含 SERVICE 的依赖项。在以下示例中,

docker compose up web 还将创建并启动 db 和 redis。

• docker compose stop :按依赖关系顺序停止服务。在以下示例中, web 在 db 和

redis 之前停止

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

可以指定条件, healthy 需要配置 healthcheck 来完成

services:
  web:
    build: .
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started
  redis:
    image: redis
  db:
    image: postgres

health check 样例

version: "3.8"
services:
  web:
    image: nginx:1.24.0
    environment:
      TEST: 1
    depends_on:
      mysql:
        condition: service_healthy
mysql:
  image: mysql:5.7
  environment:
    MYSQL_ROOT_PASSWORD: "bit@123"
  volumes:
    - /data/maxhou/mysqldata/varlib/:/var/lib/mysql
  healthcheck:
    test: mysql --user=root --password='bit@123' -e "SELECT 1;"
    interval: 10s
    timeout: 5s
    retries: 10

11. env_file
  • 用途:从文件加载环境变量。
  • 语法
env_file:
  - .env

完整示例

下面是一个 docker-compose.yml 文件的完整示例:

version: '3.7'

services:
  web:
    build:
      context: ./app
      dockerfile: Dockerfile.prod
    command: gunicorn wsgi:app
    volumes:
      - .:/code
      - static_volume:/home/app/web/static
    expose:
      - "8000"
    env_file:
      - ./.env.prod
    depends_on:
      - db
    networks:
      - app-network
  db:
    image: postgres:12.0-alpine
    volumes:
      - db_data:/var/lib/postgresql/data/
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=example
      - POSTGRES_DB=dev_db

volumes:
  static_volume:
  db_data:

networks:
  app-network:
    driver: bridge

在这个示例中,web 服务依赖于 db 服务,使用自定义的 Dockerfile 构建,并将代码卷入容器。同时,db 服务使用 Postgres 数据库镜像,并配置了环境变量。两个服务都在名为 app-network 的网络上通信。此外,静态文件和数据库数据分别被存储在命名卷中。

Docker Compose常用命令
 

1. docker-compose up

docker-compose up 命令用来启动和建立在 docker-compose.yml 文件中定义的所有服务。它会创建并启动所有必要的容器,并处理任何依赖关系。

  • 基本语法:
docker-compose up [options] [SERVICE...]
  • 选项:
    • -d: 后台运行服务。这意味着容器将在后台启动,而不是在前台运行并输出日志到控制台。
    • --build: 在启动之前重新构建服务的镜像。
    • --force-recreate: 强制重新创建容器,即使容器已经在运行中。
    • --no-recreate 如果容器已经存在了,则不重新创建,不能与 --forcerecreate 同时使用
  • 示例:
docker-compose up -d

2. docker-compose down

docker-compose down 命令用来停止和删除在 docker-compose.yml 文件中定义的服务的容器、网络、卷和图像(默认情况下图像不会被删除)。这是清理环境的好方法。

  • 基本语法:
docker-compose down [options]
  • 选项:
    • --volumes,-v: 删除所有未被外部服务使用的数据卷。
    • --rmi type: 删除类型为 localall 的镜像。local 表示只删除由 Compose 创建的本地镜像,all 则会删除所有镜像。
  • 示例:
docker-compose down

3. docker-compose run

docker-compose run 命令用来启动一个服务的一次性容器。这很有用,比如当你想要在容器内执行一个命令然后让容器退出时。

  • 基本语法:
docker-compose run [options] SERVICE [COMMAND] [ARGS...]
  • 选项:
    • -d: 在后台运行命令。
    • --rm: 运行后自动删除容器。
    • --service-ports: 将服务的端口映射到宿主机。
    • --name NAME 为容器指定一个名字 。
    • --entrypoint CMD 覆盖默认的容器启动指令。
    • -u, --user="" 指定运行容器的用户名或者 uid 。
    • -p, --publish=[] 映射容器端口到本地主机。
    • -e KEY=VAL 设置环境变量值,可多次使用选项来设置多个环境变量。
  • 示例:
docker-compose run --rm web python manage.py shell

                       感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o! 

                                       

                                                                        给个三连再走嘛~  

 

  • 14
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕斯( ˘▽˘)っ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值