docker容器编排利器Docker Compose(二)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: docker容器编排利器Docker Compose(二)

docker容器编排利器Docker Compose(一):https://developer.aliyun.com/article/1416686

env_file

从文件中获取环境变量,可以指定一个或多个文件,其优先级低于 environment 指定的环境变量。

env_file:
  - /opt/runtime_opts.env # 绝对路径
  - ./common.env # 相对路径,相对当前 docker-compose.yml 文件所在目录
  - ./apps/web.env # 相对路径,相对当前 docker-compose.yml 文件所在目录

注意:env 文件中的每一行需采用 键=值 格式。以 # 开头的行会被视为注释并被忽略。空行也会被忽略。

command

覆盖容器启动后默认执行的命令。

command: echo "helloworld"

该命令也可以是一个列表

command: ["echo", "helloworld"]

volumes

数据卷,用于实现目录挂载,支持指定目录挂载、匿名挂载、具名挂载。

  • 指定目录挂载的格式为: 左边宿主机目录:右边容器目录 ,或者 左边宿主机目录:右边容器目录:读写权限 ;
  • 匿名挂载格式为: 容器目录即可 ,或者 容器目录即可:读写权限 ;
  • 具名挂载格式为: 数据卷条目名称:容器目录 ,或者 数据卷条目名称:容器目录:读写权限 。

关于匿名挂载/具名挂载更多的内容请阅读《Docker 最常用的镜像命令和容器命令》文章中容器相关命令部分的目录挂载(容器数据卷操作)的内容。

# 描述 Compose 文件的版本信息
version: "3.8"
# 定义服务,可以多个
services:
  mysql: # 服务名称
    image: mysql:8 # 创建容器时所需的镜像
    container_name: mysql8 # 容器名称,默认为"工程名称_服务条目名称_序号"
    ports: # 宿主机与容器的端口映射关系
      - "3306:3306" # 左边宿主机端口:右边容器端口
    environment: # 创建容器时所需的环境变量
      MYSQL_ROOT_PASSWORD: 1234
    volumes:
      # 绝对路径
      - "/mydata/docker_mysql/data:/var/lib/mysql"
      # 相对路径,相对当前 docker-compose.yml 文件所在目录
      - “./conf:/etc/mysql/conf.d“
      # 匿名挂载,匿名挂载只需要写容器目录即可,容器外对应的目录会在
      /var/lib/docker/volume 中生成
      - "/var/lib/mysql"
      # 具名挂载,就是给数据卷起了个名字,容器外对应的目录会在 /var/lib/docker/volume 中生
      - "mysql-data-volume:/var/lib/mysql"
# 定义数据卷,可以多个
volumes:
  mysql-data-volume: # 一个具体数据卷的条目名称
    name: mysql-data-volume # 数据卷名称,默认为"工程名称_数据卷条目名称"

network_mode

设置网络模式,类似 docker run 时添加的参数 --net host 或者 --network host 的用法。

network_mode: "bridge"
network_mode: "host"
network_mode: "none"
network_mode: "service:[service name]"
network_mode: "container:[container name/id]"

networks

配置容器连接的网络,引用顶级 networks 下的条目

# 定义服务,可以多个
services:
  nginx: # 服务名称
    networks: # 配置容器连接的网络,引用顶级 networks 下的条目
      - nginx-net # 一个具体网络的条目名称
      # 定义网络,可以多个。如果不声明,默认会创建一个网络名称为"工程名称_default"的 bridge 网络
networks:
  nginx-net: # 一个具体网络的条目名称
    name: nginx-net # 网络名称,默认为"工程名称_网络条目名称"
    driver: bridge # 网络模式,默认为 bridge

aliases

网络上此服务的别名。同一网络上的其他容器可以使用服务名或此别名连接到服务容器。同一服务在不同的网络上可以具有不同的别名。

# 定义服务,可以多个
services:
  nginx: # 服务名称
    networks: # 配置容器连接的网络,引用顶级 networks 下的条目
      nginx-net: # 一个具体网络的条目名称
        aliases: # 服务别名,可以多个
          - nginx1 # 同一网络上的其他容器可以使用服务名或此别名连接到服务容器
          # 定义网络,可以多个。如果不声明,默认会创建一个网络名称为"工程名称_default"的bridge 网络
networks:
  nginx-net: # 一个具体网络的条目名称
    name: nginx-net # 网络名称,默认为"工程名称_网络条目名称"
    driver: bridge # 网络模式,默认为 bridge

volumes

通过顶级配置 services 的学习,大家应该已经明白顶级配置 volumes 是干嘛的了,这里再详细把配置的不同方式讲解一下。

以下方式的数据卷声明创建卷时会使用默认的名称: “工程名称_数据卷条目名称” 。

# 描述 Compose 文件的版本信息
version: "3.8"
# 定义服务,可以多个
services:
  mysql:
  image: mysql:8
  container_name: mysql8
  ports:
    - "3306:3306"
  environment
  MYSQL_ROOT_PASSWORD: 1234
  volumes:
    # 具名挂载,就是给数据卷起了个名字,容器外对应的目录会在 /var/lib/docker/volume 中生
    - "mysql-data-volume:/var/lib/mysql"
# 定义数据卷,可以多个
volumes:
  mysql-data-volume: # 一个具体数据卷的条目名称

以下方式的数据卷声明创建卷时会使用自定义的名称。

# 描述 Compose 文件的版本信息
version: "3.8"
# 定义服务,可以多个
services:
  mysql:
  image: mysql:8
  container_name: mysql8
  ports:
    - "3306:3306"
  environment
  MYSQL_ROOT_PASSWORD: 1234
  volumes:
    # 具名挂载,就是给数据卷起了个名字,容器外对应的目录会在 /var/lib/docker/volume 中生
    - "mysql-data-volume:/var/lib/mysql"
# 定义数据卷,可以多个
volumes:
  mysql-data-volume: # 一个具体数据卷的条目名称
    name: mysql-data-volume # 数据卷名称,默认为"工程名称_数据卷条目名称"

networks

如果不声明网络,每个工程默认会创建一个网络名称为 “工程名称_default” 的 bridge 网络。

# 描述 Compose 文件的版本信息
version: "3.8"
# 定义服务,可以多个
  services:
  nginx:
  image: nginx
  container_name: mynginx
  ports:
    - "80:80"
# 定义网络,可以多个。如果不声明,默认会创建一个网络名称为"工程名称_default"的 bridge 网络
#networks:

以下方式的网络声明创建网络时会使用默认的名称: “工程名称_网络条目名称” ,网络模式默认bridge 。

# 描述 Compose 文件的版本信息
version: "3.8"
# 定义服务,可以多个
services:
  nginx:
  image: nginx
  container_name: mynginx
  ports:
    - "80:80"
  networks: # 配置容器连接的网络,引用顶级 networks 下的条目
  nginx-net:
# 定义网络,可以多个
networks:
  nginx-net: # 一个具体网络的条目名称

以下方式的网络声明创建网络时会使用自定义的名称,还可以通过 driver 选择网络模式,默认为bridge 。

# 描述 Compose 文件的版本信息
version: "3.8"
# 定义服务,可以多个
services:
  nginx:
  image: nginx
  container_name: mynginx
  ports:
    - "80:80"
  networks: # 配置容器连接的网络,引用顶级 networks 下的条目
    nginx-net:
# 定义网络,可以多个
networks:
  nginx-net: # 一个具体网络的条目名称
    name: nginx-net # 网络名称,默认为"工程名称_网络条目名称"
    driver: bridge # 网络模式,默认为 bridge


Compose 常用命令

官方文档:https://docs.docker.com/compose/reference/overview/

为了更熟练的使用 Compose,以下常用命令大家多多练习,方可熟能生巧。

docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]

部分命令选项如下:

  • -f,–file :指定使用的 Compose 模板文件,默认为 docker-compose.yml ,可以多次指定,指定多个 yml;
  • -p, --project-name :指定工程名称,默认使用 docker-compose.yml 文件所在目录的名称;
  • -v :打印版本并退出;
  • –log-level :定义日志等级(DEBUG, INFO, WARNING, ERROR, CRITICAL)。

help

docker-compose -help 查看帮助。

config

docker-compose config -q 验证 docker-compose.yml 文件。当配置正确时,不输出任何内容,当配置错误时,输出错误信息。

pull

docker-compose pull 拉取服务依赖的镜像。

# 拉取工程中所有服务依赖的镜像
docker-compose pull
# 拉取工程中 nginx 服务依赖的镜像
docker-compose pull nginx
# 拉取镜像过程中不打印拉取进度信息
docker-compose pull -q


up

docker-compose up 创建并启动所有服务的容器。指定多个 yml 加 -f 选项。以守护进程模式运行加 -d 选项。

# 前台启动
docker-compose up
# 后台启动
docker-compose up -d
# -f 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定,指定多个 yml
docker-compose -f docker-compose.yml up -d

logs

docker-compose logs 查看服务容器的输出日志。默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分。可以通过 --no-color 来关闭颜色。

# 输出日志,不同的服务输出使用不同的颜色来区分
docker-compose logs
# 跟踪日志输出
docker-compose logs -f
# 关闭颜色
docker-compose logs --no-color

ps

docker-compose ps 列出工程中所有服务的容器。

# 列出工程中所有服务的容器
docker-compose ps
# 列出工程中指定服务的容器
docker-compose ps nginx

run

docker-compose run 在指定服务容器上执行一个命令。

# 在工程中指定服务的容器上执行 echo "helloworld"
docker-compose run nginx echo "helloworld"

exec

docker-compose exec 进入服务容器。

# 进入工程中指定服务的容器
docker-compose exec nginx bash
# 当一个服务拥有多个容器时,可通过 --index 参数进入到该服务下的任何容器
docker-compose exec --index=1 nginx bash

pause

docker-compose pause 暂停服务容器。

# 暂停工程中所有服务的容器
docker-compose pause
# 暂停工程中指定服务的容器
docker-compose pause nginx

unpause

docker-compose unpause 恢复服务容器。

# 恢复工程中所有服务的容器
docker-compose unpause
# 恢复工程中指定服务的容器
docker-compose unpause nginx

restart

docker-compose restart 重启服务容器。

# 重启工程中所有服务的容器
docker-compose restart
# 重启工程中指定服务的容器
docker-compose restart nginx

start

docker-compose start 启动服务容器。

# 启动工程中所有服务的容器
docker-compose start
# 启动工程中指定服务的容器
docker-compose start nginx

stop

docker-compose stop 停止服务容器。

# 停止工程中所有服务的容器
docker-compose stop
# 停止工程中指定服务的容器
docker-compose stop nginx

kill

docker-compose kill 通过发送 SIGKILL 信号停止指定服务的容器。

# 通过发送 SIGKILL 信号停止工程中指定服务的容器
docker-compose kill nginx

rm

docker-compose rm 删除服务(停止状态)容器。

# 删除所有(停止状态)服务的容器
docker-compose rm
# 先停止所有服务的容器,再删除所有服务的容器
docker-compose rm -s
# 不询问是否删除,直接删除
docker-compose rm -f
# 删除服务容器挂载的数据卷
docker-compose rm -v
# 删除工程中指定服务的容器
docker-compose rm -sv nginx

down

停止并删除所有服务的容器、网络、镜像、数据卷。

# 停止并删除工程中所有服务的容器、网络
docker-compose stop
# 停止并删除工程中所有服务的容器、网络、镜像
docker-compose down --rmi all
# 停止并删除工程中所有服务的容器、网络、数据卷
docker-compose down -v

images

docker-compose images 打印服务容器所对应的镜像。

# 打印所有服务的容器所对应的镜像
docker-compose images
# 打印指定服务的容器所对应的镜像
docker-compose images nginx

port

docker-compose port 打印指定服务容器的某个端口所映射的宿主机端口。

[root@localhost docker-nginx]# docker-compose port nginx 80 0.0.0.0:80


top

docker-compose top 显示正在运行的进程。

# 显示工程中所有服务的容器正在运行的进程
docker-compose top
# 显示工程中指定服务的容器正在运行的进程
docker-compose top nginx

总结

Docker Compose 的整体使用步骤还是比较简单的,三个步骤为:

  • 使用 Dockerfile 文件定义应用程序的环境;
  • 使用 docker-compose.yml 文件定义构成应用程序的服务,这样它们可以在隔离环境中一起运行;
  • 最后,执行 docker-compose up 命令来创建并启动所有服务。

虽然 docker-compose.yml 文件详解和Compose 常用命令这两大块的内容比较多,但是如果要快速入门使用 Compose ,其实只需要了解其中部分内容即可。后期大家可在项目生产环境中根据自身情况再进一步深入学习即可。

参考资料

https://docs.docker.com/compose/install/

http://get.daocloud.io/#install-compose

https://docs.docker.com/compose/

https://docs.docker.com/compose/compose-file/

https://docs.docker.com/compose/reference/overview/


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
30天前
|
数据库 Docker 容器
docker容器为啥会开机自启动
通过配置适当的重启策略,Docker容器可以在主机系统重启后自动启动。这对于保持关键服务的高可用性和自动恢复能力非常有用。选择适合的重启策略(如 `always`或 `unless-stopped`),可以确保应用程序在各种情况下保持运行。理解并配置这些策略是确保Docker容器化应用可靠性的关键。
209 93
|
5天前
|
关系型数据库 MySQL 数据库
Docker Compose V2 安装常用数据库MySQL+Mongo
以上内容涵盖了使用 Docker Compose 安装和管理 MySQL 和 MongoDB 的详细步骤,希望对您有所帮助。
69 42
|
27天前
|
存储 Docker 容器
Docker-基础(数据卷、自定义镜像、Compose)
通过数据卷实现持久化存储,通过自定义镜像满足特定需求,通过Docker Compose方便地管理多容器应用
81 27
|
1月前
|
Ubuntu NoSQL Linux
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
142 6
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
|
28天前
|
存储 Docker 容器
Docker-基础(数据卷、自定义镜像、Compose)
通过数据卷实现持久化存储,通过自定义镜像满足特定需求,通过Docker Compose方便地管理多容器应用。掌握这些Docker基础概念和操作,可以显著提高开发和部署效率,确保应用程序的可移植性和可扩展性。
70 22
|
2月前
|
搜索推荐 安全 数据安全/隐私保护
7 个最能提高生产力的 Docker 容器
7 个最能提高生产力的 Docker 容器
170 35
|
1月前
|
数据库 Docker 容器
docker容器为啥会开机自启动
通过配置适当的重启策略,Docker容器可以在主机系统重启后自动启动。这对于保持关键服务的高可用性和自动恢复能力非常有用。选择适合的重启策略(如 `always`或 `unless-stopped`),可以确保应用程序在各种情况下保持运行。理解并配置这些策略是确保Docker容器化应用可靠性的关键。
56 17
|
2月前
|
Ubuntu Linux 开发工具
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包成标准化单元(容器),确保在任何支持 Docker 的操作系统上一致运行。容器共享主机内核,提供轻量级、高效的执行环境。本文介绍如何在 Ubuntu 上安装 Docker,并通过简单步骤验证安装成功。后续文章将探讨使用 Docker 部署开源项目。优雅草央千澈 源、安装 Docker 包、验证安装 - 适用场景:开发、测试、生产环境 通过以上步骤,您可以在 Ubuntu 系统上成功安装并运行 Docker,为后续的应用部署打下基础。
93 5
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
|
1月前
|
运维 Java 虚拟化
《docker基础篇:1.Docker简介》,包括Docker是什么、容器与虚拟机比较、能干嘛、去哪下
《docker基础篇:1.Docker简介》,包括Docker是什么、容器与虚拟机比较、能干嘛、去哪下
112 12
|
1月前
|
Kubernetes Linux 虚拟化
入门级容器技术解析:Docker和K8s的区别与关系
本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
133 11