🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343
🔥 系列专栏:Docker_秦jh_的博客-CSDN博客
目录
Docker Compose(容器编排)
什么是 Docker Compose
为什么要 Docker Compose
Docker Compose 的功能
Docker Compose 使用场景
Docker Compose 文件(docker-compose.yml)
文件语法版本
文件基本结构及常见指令
Docker Compose 命令清单
命令格式
常见选项说明
常见命令说明
常见问题
前言
💬 hello! 各位铁子们大家好哇。
今日更新了Docker相关内容
🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝
Docker Compose(容器编排)
什么是 Docker Compose
docker-compose 是 Docker 官方的开源项目,使用 python 编写,实现上调用了 Docker 服务的 API 进行容器管理及编排,其官方定义为定义和运行多个 Docker 容器的应用。
docker-compose 中有两个非常重要的概念:
• 服务 ( service ):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
• 项目( project ):由一组关联的应用容器组成的一个完整业务单元,在 dockercompose.yml 文件中定义, 整个 docker-compose.yml 定义一个项目。
Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周 期管理。
通过 compose 可以方便的管理多个服务。
为什么要 Docker Compose
• Docker 是一个轻量化的应用程序,Docker 官方推荐每个 Docker 容器中只运行一 个进程。
• 如果一个应用需要涉及到 MySQL、nginx 等环境, 那么我们需要分别为应用、数 据库和 nginx 创建单独的 docker 容器,然后分别启动容器。
• 想象一下,当我们构建好 Docker 之后,每次启动应用,都至少需要 docker run 三次, 或者写一些脚本来实现, 这样会比较繁琐。
• 另外,这些 docker 容器都是分散独立的,也不方便镜像管理。那既然这些 docker 容器 都是为了同一个应用服务,我们就应该把它们放到一起,这就引出了 dockercompose 来解决这类型的问题。
Docker Compose 的功能
1. 使用步骤
Compose 使用的步骤:
• 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中 一起运行。
• 最后,执行 docker compose up 命令来启动并运行整个应用程序。
2. 核心功能
Compose 具有管理应用程序整个生命周期的命令:
• 启动,停止和重建服务
• 查看正在运行的服务的状态
• 流式传输运行服务的日志输出
• 在服务上运行一次性命令
Docker Compose 使用场景
单主机部署
快速搭建一个单节点开发或者测试环境,方便使用。
不同环境隔离
通过指定 project 来运行不同的环境,实现隔离的目的。
Docker Compose 文件(docker-compose.yml)
文件语法版本
目前官方支持三个大版本, 即 Version 1、Version 2 及 Version 3, 其中 Version 1 已 经被废弃掉了。
这里主 要基于 3.8 版本的 Compose file 语法进行讲解。
文件基本结构及常见指令
version: "3.8" # 定义版本, 表示当前使用的 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常见字段格式语法
image
指定容器运行的镜像。以下格式都可以:
image: redis image: redis:5 image:redis@sha256:0ed5d5928d4737458944eb604cc8509e245c3e19d02ad83935398bc4b991aac7 image: library/redis image: docker.io/library/redis image: my_private.registry:5000/rediscommand
覆盖容器启动的默认命令。
command: ["bundle", "exec", "thin", "-p", "3000"] command: bundle exec thin -p 3000entrypoint
覆盖容器默认的 entrypoint。
entrypoint: /code/entrypoint.sh也可以是以下格式:
entrypoint: - php - -d - zend_extension=/usr/local/lib/php/extensions/no-debug-nonzts-20100525/xdebug.so - -d - memory_limit=-1 - vendor/bin/phpunitenvironment
添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以 确保 YML 解析器不会将其转换为 True 或 False。
#map 语法 environment: RACK_ENV: development SHOW: "true" USER_INPUT: #数组语法 environment: - RACK_ENV=development - SHOW=true - USER_INPUTnetworks
指定容器运行的网络:
services: frontend: image: awesome/webapp networks: - front-tier - back-tier monitoring: image: awesome/monitoring networks: - admin backend: image: awesome/backend networks: back-tier: aliases: - database admin: aliases: - mysql networks: front-tier: back-tier: admin:配置网络驱动和子网信息
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"volumes
将主机的数据卷或者文件挂载到容器里。
#短语法 services: db: image: postgres:latest volumes: - "/localhost/postgres.sock:/var/run/postgres/postgres.sock" - "/localhost/data:/var/lib/postgresql/data" #完整语法 services: backend: image: awesome/backend 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 volumes: db-data:ports
指定端口映射。以下格式都可以:
#完整语法 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 #短语法 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"expose
暴露端口,但不映射到宿主机,只被连接的服务访问。
仅可以指定内部端口为参数:
expose: - "3000" - "8000"build
指定为构建镜像上下文路径:
例如 webapp 服务,指定为从上下文路径 ./dir/Dockerfile 所构建的镜像:
version: "3.7" services: webapp: build: ./dir或者,作为具有在上下文指定的路径的对象,以及可选的 Dockerfile 和 args:
• context:上下文路径。
• dockerfile:指定构建镜像的 Dockerfile 文件名。
• args:添加构建参数,这是只能在构建过程中访问的环境变量。
• labels:设置构建镜像的标签。
depends_on
设置依赖关系。
• docker compose up :以依赖性顺序启动服务。在以下示例中,先启动 db 和 redis ,才会启动 web。
• docker compose up SERVICE :自动包含 SERVICE 的依赖项。在以下示例中, docker compose up web 还将创建并启动 db 和 redis。
• docker compose stop :按依赖关系顺序停止服务。在以下示例中,web 在 db 和 redis 之前停止
可以指定条件,healthy 需要配置 healthcheck 来完成
health check 样例
env_file
从文件添加环境变量。可以是单个值或列表的多个值。
env_file: .env也可以是列表格式:
Docker Compose 命令清单
命令格式
对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的 服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服 务都会受到命令影响。
docker-compose 命令的基本的使用格式为
docker compose [OPTIONS] COMMAND [ARGS...]
常见选项说明
• -f, --file 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可 以多次指定
• -p, --project-name 指定项目名称,默认将使用所在目录名称作为项目名
常见命令说明
up
该命令的作用十分强大,它会尝试自动完成包括构建镜像、(重新)创建服务、启动服 务并关联服务相关容器的一系列操作,可以直接通过该命令来启动一个项目。
docker compose up [options] [SERVICE...]
• -d 在后台运行服务容器, 推荐在生产环境下使用该选项
• --force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用
• --no-recreate 如果容器已经存在了,则不重新创建,不能与 --forcere-create 同时使用
down
停止所有容器,并删除容器和网络
docker compose down [options] [SERVICE...]
• -v, --volumes 删除容器同时删除目录映射
run
该命令可以在指定服务容器上执行相关的命令
# 例如:启动一个 ubuntu 服务容器,并执行 ping docker.com 命令
# docker compose run ubuntu ping docker.com
docker compose run [options] SERVICE [COMMAND] [ARGS...]
• -d 后台运行容器
• --name NAME 为容器指定一个名字
• --entrypoint CMD 覆盖默认的容器启动指令
• -e KEY=VAL 设置环境变量值,可多次使用选项来设置多个环境变量
• -u, --user="" 指定运行容器的用户名或者 uid
• --rm 运行命令后自动删除容器
• -p, --publish=[] 映射容器端口到本地主机
常见问题
1. up、run 和 start 之间有什么区别?
通常,你想要 docker compose up. 用于 up 启动或重新启动 docker-compose.yml. 在默认的“附加”模式下,会看到来自所有容器的所有日志。在“分离”模式 ( -d) 中,启 动容器后 Compose 退出,但容器继续在后台运行。
该 docker compose run 命令用于运行“一次性”或“临时”任务。它需要您要运行的服 务名称,并且只为正在运行的服务所依赖的服务启动容器。用于 run 运行测试或执行 管理任务,例如从数据卷容器中删除或添加数据。该 run 命令的作用类似于 docker run -ti 它打开容器的交互式终端并返回与容器中进程的退出状态匹配的退出状态。
docker compose start 命令仅对重新启动先前创建但已停止的容器有用。它从不创建新容器。
2. 如何在同一主机上运行 Compose 文件的多个副本?
Compose 使用项目名称为项目的所有容器和其他资源创建唯一标识符。要运行项目的 多个副本,请使用-p 命令行选项 或 COMPOSE_PROJECT_NAME 环境变量设置自定 义项目名称。
3. 可以控制服务启动顺序吗?
可以控制启动顺序,通过依赖指定,并且可以配合 healthcheck 等健康检查成功以后 再启动。