Docker Compose(容器编排)_docker-compose
目录
什么是 Docker Compose
Docker Compose 的功能
Docker Compose 使用场景
Docker Compose 文件(docker-compose.yml)
Docker Compose 命令清单
常见命令说明
操作案例
总结
什么是 Docker Compose
docker-compose 是 Docker 官方的开源项目,使用 python 编写,实现上调用了 Docker 服务的 API 进行容器管理及编排,其官方定义为定义和运行多个 Docker 容器的应用。 docker-compose 中有两个非常重要的概念 : 服务 ( service ) :一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。 项目 ( project ) :由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义 , 整个 docker-compose.yml 定义一个项目。 Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。 通过 compose 可以方便的管理多个服务。 为什么要 Docker Compose Docker 是一个轻量化的应用程序, Docker 官方推荐每个 Docker 容器中只运行一个进程 。 如果一个应用需要涉及到 MySQL 、 nginx 等环境, 那么我们需要分别为应用、数据库和 nginx 创建单独的 docker 容器,然后分别启动容器。 想象一下,当我们构建好 Docker 之后,每次启动应用,都至少需要 docker run三次, 或者写一些脚本来实现, 这样会比较繁琐。 另外,这些 docker 容器都是分散独立的,也不方便镜像管理。那既然这些 docker容器 都是为了同一个应用服务,我们就应该把它们放到一起,这就引出了 docker-compose 来解决这类型的问题。 Docker Compose 的安装 安装 docker 的时候,我们默认已经安装了 docker-compose,安装的组件包名称为 docker-compose-plugin ,此处不再赘述 Shell # 检查安装是否成功 root@139-159-150-152:/data/myworkdir/compose# docker compose version Docker Compose version v2.16.0
Docker Compose 的功能
1. 使用步骤 Compose 使用的步骤: 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。 最后,执行 docker compose up 命令来启动并运行整个应用程序。 2. 核心功能 Compose 具有管理应用程序整个生命周期的命令: 启动,停止和重建服务 查看正在运行的服务的状态 流式传输运行服务的日志输出 在服务上运行一次性命令
Docker Compose 使用场景
单主机部署 快速搭建一个单节点开发或者测试环境,方便使用。 不同环境隔离 通过指定 project 来运行不同的环境,实现隔离的目的。
Docker Compose 文件(docker-compose.yml)
文件基本结构及常见指令 YAML 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: redisimage: redis:5image: redis@sha256:0ed5d5928d4737458944eb604cc8509e245c3e19d02ad83935398bc4b991aac7image: library/redisimage: docker.io/library/redisimage: my_private.registry:5000/redis
command 覆盖容器启动的默认命令。 Shell command: [\"bundle\", \"exec\", \"thin\", \"-p\", \"3000\"] command: bundle exec thin -p 3000entrypoint 覆盖容器默认的 entrypoint 。 Shell entrypoint: /code/entrypoint.sh 也可以是以下格式: Shell entrypoint: - php - -d - zend_extension=/usr/local/lib/php/extensions/no-debug-non zts-20100525/xdebug.so - -d - memory_limit=-1 - vendor/bin/phpunit environment 添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False 。 Shell #map 语法 environment: RACK_ENV: development SHOW: \"true\" USER_INPUT: # 数组语法 environment: - RACK_ENV=development - SHOW=true - USER_INPUT networks 指定容器运行的网络: 配置容器网络 Shell 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: 配置网络驱动和子网信息 Shell 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 将主机的数据卷或者文件挂载到容器里。 Shell # 短语法 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 指定端口映射。以下格式都可以: Shell # 完整语法 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 暴露端口,但不映射到宿主机,只被连接的服务访问。 仅可以指定内部端口为参数: Shell expose: - \"3000\" - \"8000\" build 指定为构建镜像上下文路径: 例如 webapp 服务,指定为从上下文路径 ./dir/Dockerfile 所构建的镜像: Shell version: \"3.7\" services: webapp: build: ./dir 或者,作为具有在上下文指定的路径的对象,以及可选的 Dockerfile 和 args : version: \"3.7\" services: webapp: build: context: ./dir dockerfile: Dockerfile-alternate args: buildno: 1 labels: - \"com.example.description=Accounting webapp\" - \"com.example.department=Finance\" - \"com.example.label-with-empty-value\" • 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 之前停止。 Shell 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 样例 Shell 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 env_file 从文件添加环境变量。可以是单个值或列表的多个值。 Shell env_file: .env
Docker Compose 命令清单
Docker Compose 有很多命令,但是常用的就几个,这里列出一些,有需要额外学习的可以去docker官网学习
命令格式 对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。 docker-compose 命令的基本的使用格式为 docker compose [OPTIONS] COMMAND [ARGS...] 常见选项说明 -f, --file 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定 -p, --project-name 指定项目名称,默认将使用所在目录名称作为项目名
常见命令说明
up 该命令的作用十分强大,它会尝试自动完成包括构建镜像、(重新)创建服务、启动服务并关联服务相关容器的一系列操作,可以直接通过该命令来启动一个项目。 Shell docker compose up [options] [SERVICE...] -d 在后台运行服务容器, 推荐在生产环境下使用该选项 --force-recreate 强制重新创建容器,不能与 --no-recreate 同时使用 --no-recreate 如果容器已经存在了,则不重新创建,不能与 --force-recreate 同时使用 down 停止所有容器,并删除容器和网络 docker compose down [options] [SERVICE...] -v, --volumes 删除容器同时删除目录映射 run 该命令可以在指定服务容器上执行相关的命令 Shell # 例如:启动一个 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=\"\" 指定运行容器的用户名或者 ui --rm 运行命令后自动删除容器 -p, --publish=[] 映射容器端口到本地主机
操作案例
1. 创建 compose 目录
mkdir -p /data/myworkdir/compose/base cd /data/myworkdir/compose/base 2. 进入 base 目录 , 创建 docker-compose.yml 文件 cd /data/myworkdir/compose/base/ vi docker-compose.yml 3. 输入一下内容
version: 3.8services: web: image: nginx:1.24.0 environment: TEST: 1 ports: - 8979:80 networks:- mytestnet volumes: - ./mynginxhome:/usr/share/nginx/html depends_on: mysql: condition: service_healthy redis: condition: service_healthy mysql: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: \"bit@123\" networks: - mytestnet 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 redis: image: redis:7 networks: - mytestnet healthcheck: test: redis-cli ping interval: 10s timeout: 5s retries: 10networks: mytestnet:
4. 输入 docker config 会做检查 root@139-159-150-152:/data/myworkdir/compose/base# docker compose config version must be a string 5. 我们修改错误信息,将版本转为字符串,再次检查,检查通过 6. 创建首页目录,编辑首页内容 Shell root@139-159-150-152:/data/myworkdir/compose/base# mkdir - p ./mynginxhome root@139-159-150-152:/data/myworkdir/compose/base# cd ./mynginxhome/ root@139-159-150-152:/data/myworkdir/compose/base/mynginxhome# echo \"Hello bit\" > index.html 7. 启动服务 root@139-159-150-152:/data/myworkdir/compose/base# docker compose up -d 8. 停止服务 root@139-159-150-152:/data/myworkdir/compose/base# docker compose stop 10. 启动服务 root@139-159-150-152:/data/myworkdir/compose/base# docker compose start 11. 删除服务 SQL root@139-159-150-152:/data/myworkdir/compose/base# docker compose down
总结
当docker某个项目牵扯多个微服务容器时,可以使用compose技术,实现对服务的容器定制化设置、网络的搭建和连接,以及容器的启动停止