目录

一、为什么要学docker-compose

二、docker-compose是什么

三、docker-compose的组成

四、docker-compose的三层结构

五、docker-compose的配置文件

六、docker-compose的使用场景

七、docker-compose的实现原理

八、docker-compose部署

Docker Compose 环境安装

YAML 文件格式及编写注意事项

使用 YAML 时需要注意下面事项:

数据结构:

示例:

yaml 格式

Json 格式

Docker Compose配置常用字段

Docker Compose 常用命令

示例:搭建基于Nginx的Docker容器


一、为什么要学docker-compose

我们知道使用一个Dockerfile模板文件可以定义一个单独的应用容器,如果需要定义多个容器就需要服务编排。服务编排有很多种技术方案,因此我们需要学习了解Docker Compose 。

二、docker-compose是什么

Docker Compose 是 Docker 官方的开源项目,用于快速编排 Docker 容器集群。它允许用户在一个模板(使用 YAML 格式)中定义一组相关联的应用容器,这被称为一个项目(project)。例如,一个项目可以包括 Web 服务容器和后端数据库服务容器等。

三、docker-compose的组成

Docker Compose是用于定义和运行多容器Docker应用程序的工具。它使用YAML文件来配置应用程序的服务、网络和卷等。以下是Docker Compose的主要组成部分:

YAML文件: Docker Compose使用YAML文件来定义应用程序的服务、网络、卷等配置。这个文件通常称为docker-compose.yml。在这个文件中,可以指定应用程序的各个服务、它们之间的关系、容器的映像、端口映射、环境变量等。

Service(服务): 服务是应用程序的组件,可以是一个容器或一组相关的容器。在Docker Compose中,每个服务都由一个或多个容器组成,这些容器一起提供应用程序的特定功能。

Container(容器): 容器是Docker化的应用程序运行的实例。每个服务在Docker Compose中都会映射到一个或多个容器。

Networks(网络): Docker Compose允许定义应用程序中的网络。可以指定容器之间的网络连接方式,以实现服务之间的通信。

Volumes(卷): 卷是用于在容器之间共享数据的机制。在Docker Compose中,可以定义卷以在服务之间传递数据。

Environment Variables(环境变量): 可以在Docker Compose文件中设置环境变量,这些变量将传递给容器,以影响它们的行为。

Build(构建): 如果需要构建自定义镜像,可以使用Docker Compose文件中的build指令,指定构建上下文和Dockerfile的位置。

Ports(端口): 可以在Docker Compose文件中定义端口映射,将容器内部的端口映射到主机上的端口,以允许外部访问服务。

四、docker-compose的三层结构

Docker Compose 将管理的容器分为三层:工程(project)、服务(service)以及容器(container)。

工程(project): 由运行目录下的所有文件组成,包括 docker-compose.yml、extends 文件或环境变量文件。工程名默认为当前目录名。

服务(service): 一个工程可以包含多个服务,每个服务定义了容器运行的镜像、参数和依赖关系。

容器(container): 一个服务可以包含多个容器实例。

五、docker-compose的配置文件

Docker Compose 的工程配置文件默认为 docker-compose.yml,也可以通过环境变量 COMPOSE_FILE 或 -f 参数来自定义配置文件。该文件定义了多个有依赖关系的服务及每个服务运行的容器。

六、docker-compose的使用场景

在实际工作中,经常会遇到需要多个容器相互配合来完成某项任务的情况。比如,要实现一个 Web 项目,除了 Web 服务容器,还需要后端的数据库服务容器和可能的负载均衡容器。Compose 允许用户通过一个单独的 docker-compose.yml 模板文件来定义这组相关联的应用容器为一个项目。

七、docker-compose的实现原理

Docker Compose 项目由 Python 编写,利用 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 进行编排管理。

八、docker-compose部署
Docker Compose 环境安装

Docker Compose 是 Docker 的独立产品,因此需要安装 Docker 之后在单独安装 Docker Compose

#下载

curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-uname -s-uname -m -o /usr/local/bin/docker-compose

#安装

chmod +x /usr/local/bin/docker-compose

#查看版本

docker-compose --version

YAML 文件格式及编写注意事项

YAML 是一种标记语言,它可以很直观的展示数据序列化格式,可读性高。类似于 XML数据描述语言,语法比 XML 简单的很多。YAML 数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分隔,数组用中括号 [] 括起来, hash 用花括号 {} 括起来。

使用 YAML 时需要注意下面事项:

●大小写敏感:YAML 是大小写敏感的。 ●缩进表示层级关系:使用缩进表示数据的层次结构。 ●不支持制表符 tab 键缩进,只能使用空格缩进 ●缩进的空格数目不重要: 只要相同层级左对齐即可,通常开头缩进2个空格。 ●注释: 使用 # 号表示注释。 ●符号字符后缩进1个空格: 冒号 : 、逗号 , 、横杠 - 等符号后通常缩进1个空格。 ●引号的使用: 单引号''引起来的字符串会被处理为普通字符串,双引号""内的特殊字符会被解析为其本身的意思。 name: "Hi,\nTom"

数据结构:

●对象映射: 键值对的字典 animal: pets

●序列数组: 一组按次序排列的列表

  • Cat

  • Dog

  • Goldfish

["Cat", "Dog", "Goldfish"]

●布尔值 debug: true debug: false

示例:
yaml 格式

languages: #序列的映射

  • Java

  • Golang

  • Python websites: #映射的映射 cpu: 2 memory: 1024M swap: 2048M disk: 60G

键:{值}

Json 格式

{ languages: [ 'Java', 'Golang', 'Python' ], resources: { cpu: '2', memory: '1024M', swap: '2048M', disk: '60G' } }

简单结构示例

person: name: Alice age: 25 address: city: Wonderland country: Fantasyland hobbies:

- Reading

- Traveling

- Coding

复杂结构示例:

school: university departments:

  • name: computer science courses:

    • course_name: algorithms professor: Dr. Smith

    • course_name: databases professor: Dr. Johnson

      • name: literature courses:

    • course_name: poetry professor: Dr. Williams

    • course_name: novels professor: Dr. Davis location: campus: west city: Example City country: Example Country

  1. Docker Compose配置常用字段

    build:

    描述: 指定 Dockerfile 文件名。

    补充: 若要指定 Dockerfile 文件,需要在 build 标签的子级标签中使用 dockerfile 指定。

    dockerfile:

    描述: 构建镜像时使用的 Dockerfile 文件路径。

    context:

    描述: 构建镜像的上下文路径,可以是 Dockerfile 的路径,也可以是指向 git 仓库的 URL 地址。

    image:

    描述: 指定服务使用的镜像。

    command:

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

    container_name:

    描述: 指定容器名称,唯一性,不能与其他容器名称重复。

    deploy:

    描述: 指定部署和运行服务的相关配置,仅在 Swarm 模式使用。

    environment:

    描述: 添加环境变量。

    networks:

    描述: 加入网络,引用顶级 networks 下的条目。

    network_mode:

    描述: 设置容器的网络模式,如 host、bridge 等。

    ports:

    描述: 暴露容器端口,与 -p 选项相同。

    volumes:

    描述: 挂载宿主机目录或命名卷到容器,命名卷需在顶级 volumes 定义卷名称。

    volumes_from:

    描述: 从另一个服务或容器挂载卷,可选参数 :ro 和 :rw,仅版本 '2' 支持。

    hostname:

    描述: 容器主机名。

    sysctls:

    描述: 在容器内设置内核参数。

    links:

    描述: 连接到另一个容器,使用 - 服务名称[:服务别名]。

    privileged:

    描述: 赋予容器 root 权限,慎用,不安全,值为 true 或 false。

    restart:

    描述: 设置容器的重启策略,如 no、always、on-failure 等。

    no:默认策略,在容器退出时不重启容器。 on-failure:在容器非正常退出时(退出状态非0),才会重启容器。 on-failure:3:在容器非正常退出时重启容器,最多重启3次。 always:在容器退出时总是重启容器。 unless-stopped:在容器退出时总是重启容器,但不考虑在 Docker 守护进程启动时就已经停止的容器。

    depends_on:

    描述: 定义容器之间的依赖关系,确保指定的服务在启动之前已经启动。在使用 Compose 时,解决容器启动顺序和依赖关系的问题。

    示例:

    php: depends_on:

    - apache

    - mysql

  2. Docker Compose 常用命令

    build:

    描述:重新构建服务,通常在对应的 Dockerfile 发生变化时使用,以确保使用最新的配置和代码。

    ps:

    描述:列出当前正在运行的容器,显示容器的状态、ID、名称等信息。

    up:

    描述:创建和启动容器。该命令根据 docker-compose.yml 文件中的配置启动服务。

    exec:

    描述:在容器内执行命令。可以通过这个命令进入正在运行的容器并执行特定的命令,用于调试和管理容器内部。

    scale:

    描述:指定一个服务容器的启动数量。允许动态地调整服务容器的规模,适用于需要水平扩展的场景。

    top:

    描述:显示容器内的进程。可以查看容器内部正在运行的进程,有助于监控和排查问题。

    logs:

    描述:查看容器的输出日志。用于检查容器的运行日志,帮助定位和解决问题。

    down:

    描述:停止并删除容器、网络、数据卷和镜像。用于清理整个应用程序的相关资源。

    stop/start/restart:

    描述:停止/启动/重启服务。分别用于停止、启动和重启指定的服务。

  3. Docker Compose 文件结构

    yum install -y tree
    tree /opt/compose_nginx
    /opt/compose_nginx/
    ├── docker-compose.yml                #创建模板脚本
    ├── nginx
    │?? ├── Dockerfile                    #创建容器脚本
    │?? ├── nginx-1.12.0.tar.gz            #复制源码包
    │?? └── run.sh                        #启动服务脚本
    └── wwwroot
        └── index.html                    #站点网页

示例:搭建基于Nginx的Docker容器

cd /opt

mkdir compose_nginx

cd compose_nginx

mkdir nginx

cd nginx/

此时顺便将nginx安装包拖进来

vim Dockerfile

mkdir /opt/compose_nginx/wwwroot

echo "<h1>this is test web</h1>" > /opt/compose_nginx/wwwroot/index.html

docker network ls

vim run.sh

进入到compose_nginx目录

vim docker-compose.yml

#上传 docker-compose安装包

mv docker-compose /usr/local/bin/

chmod +x /usr/local/bin/docker-compose

yum install -y tree

tree compose_nginx/

docker-compose --version

cd compose_nginx/

docker-compose -f docker-compose.yml up -d

docker ps -a

docker-compose ps

浏览器访问:http://192.16886.30:1216

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐