Docker-Compose详解与部署示例

发布时间:2024年01月15日

Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。它允许你使用YAML文件配置应用程序的服务、网络和卷,并通过一个简单的命令集启动和管理整个应用程序的容器。通过使用Docker Compose,可以轻松地将多个Docker容器协同工作,构建和管理复杂的应用程序环境。

在容器化应用的过程中,一个 Dockerfile 模板文件可以定义一个单独的应用容器。然而,如果需要定义多个容器并协同工作,就需要使用服务编排。服务编排有多种技术方案,下面将介绍 Docker 官方产品 Docker Compose。

Docker Compose 概述

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

三层结构

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

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

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

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

配置文件

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

使用场景

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

实现原理

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

总体而言,Docker Compose 简化了多容器应用的管理和协同工作,使得容器编排变得更加便捷。

Docker Compose 环境安装

????????Docker Compose 是 Docker 的独立产品,因此在安装 Docker Compose 之前,需要先安装 Docker。

# 1. 下载 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

# 2. 授予执行权限
chmod +x /usr/local/bin/docker-compose

# 3. 查看安装版本
docker-compose --version

YAML文件格式

  • YAML(YAML Ain't Markup Language 或 YAML 是一种人类友好的数据序列化标准。

  • YAML 文件是一种以人类可读的方式表示数据的格式,通常被用于配置文件和数据交换格式。它的语法简洁,使用空格来表示层次结构,避免了像 XML 和 JSON 这样的标记语言中使用的繁琐的符号。YAML 主要强调数据的可读性,使得编辑和理解文件变得更加容易。

  • YAML 文件可以包含键值对、数组、标量等数据形式。在容器编排工具中,比如 Docker Compose 中的配置文件就经常采用 YAML 格式。在 YAML 文件中,缩进和空格的使用很重要,它们用来表示数据的层次结构关系。

  • 与 XML 相比,YAML 语法更简单。YAML 数据结构通过缩进表示,连续的项目通过减号表示,键值对用冒号分隔,数组用中括号 [] 括起来,哈希用花括号 {} 括起来。

以下是一个简单的 YAML 文件示例:

name: John Doe
age: 30
city: New York
hobbies:
  - Reading
  - Traveling

在这个例子中,我们定义了一个人物的信息,包括姓名、年龄、城市和爱好。这种人类可读性高的格式使得 YAML 在配置文件和数据交换方面被广泛应用。

编写注意事项:

  • 大小写敏感: YAML 是大小写敏感的。

  • 缩进表示层级关系: 使用缩进表示数据的层次结构。

  • 不支持制表符: 只能使用空格进行缩进,不支持制表符(tab 键)。

  • 缩进的空格数目不重要: 只要相同层级左对齐即可,通常开头缩进2个空格。

  • 注释: 使用 # 号表示注释。

  • 符号字符后缩进1个空格: 冒号 : 、逗号 , 、横杠 - 等符号后通常缩进1个空格。

  • 引号的使用: 单引号''引起来的字符串会被处理为普通字符串,双引号""内的特殊字符会被解析为其本身的意思。

name: "Hi,\lihua"

数据结构:

  • 键值对: 键值对的字典。YAML 使用冒号 : 分隔键和值,形成键值对
animal: pets
  • 列表: 一组按次序排列的列表。使用连字符 - 表示列表中的每个项
- Cat
- Dog
- Bird

对应 JSON:["Cat", "Dog", "Bird"]

  • 布尔值:
debug: true
debug: false
  • 哈希映射: 使用花括号 {} 表示哈希映射,即键值对的字典。
person:
  name: John
  age: 30
  • 数组: 使用中括号 [] 表示数组。
fruits: [apple, orange, banana]

示例:

YAML 格式:

languages:
  - Java
  - Golang
  - Python
websites:
  cpu: 2
  memory: 1024M
  swap: 2048M
  disk: 60G

对应的 JSON 格式:

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

简单结构示例

person:
  name: Alice
  age: 25
  address:
    city: Wonderland
    country: Fantasyland
  hobbies:
    - Reading
    - Traveling
    - Coding

在这个示例中,person 包含了姓名、年龄、地址和爱好的信息。address 是一个哈希映射,而 hobbies 是一个列表。

复杂结构示例:

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

????????这个示例展示了一个包含学校信息、部门、课程和位置的复杂 YAML 结构。通过缩进和冒号的使用,清晰地表示了数据的层级关系。school 包含了 departmentslocation 两个子项,而 departments 下有两个子项,每个子项包含了部门名称和该部门的课程信息。最后,location 包含了校区、城市和国家的信息。这种结构使得数据的组织和理解变得直观和简洁。

Docker Compose配置常用字段

????????在 Docker Compose 配置文件中,常用的字段用于定义服务的各种属性,如构建、镜像、命令、网络、端口映射等。以下是一些常见字段及其描述:

  • build:

  • 描述: 指定 Dockerfile 文件名。

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

  • dockerfile:

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

  • context:

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

  • image:

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

  • command:

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

  • container_name:

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

  • deploy:

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

  • environment:

  • 描述: 添加环境变量。

  • networks:

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

  • network_mode:

  • 描述: 设置容器的网络模式,如 hostbridge 等。

  • ports:

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

  • volumes:

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

  • volumes_from:

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

  • hostname:

  • 描述: 容器主机名。

  • sysctls:

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

  • links:

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

  • privileged:

  • 描述: 赋予容器 root 权限,慎用,不安全,值为 truefalse

  • restart:

  • 描述: 设置容器的重启策略,如 noalwayson-failure 等。

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

  • depends_on:

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

示例:

php:
  depends_on:
    - apache
    - mysql

通过合理配置这些字段,可以有效管理和定义 Docker Compose 服务的各种属性,实现容器编排和部署的灵活性。

Docker Compose 常用命令

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。以下是一些常用命令的整理解析补充:

  • build:

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

  • ps:

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

  • up:

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

  • exec:

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

  • scale:

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

  • top:

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

  • logs:

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

  • down:

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

  • stop/start/restart:

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

这些命令使得 Docker Compose 更加灵活和方便,适用于开发、测试和部署多容器应用程序。

Docker-Compose文件结构

Docker Compose 文件结构通常包含以下元素:

  • version:

  • 描述:指定 Docker Compose 文件的版本。该版本决定了可以使用的 Docker Compose 的特性和语法。例如,version: '3' 表示使用 Docker Compose 版本 3 的语法。

  • services:

  • 描述:定义了各个服务及其配置。每个服务可以包括镜像、容器名称、端口映射、环境变量等信息。

services:
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
  mysql:
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: example
  • networks:

  • 描述:定义了服务之间的网络连接。可以指定自定义的网络名称、驱动程序和其他网络相关配置。

networks:
  custom_network:
    driver: bridge
  • volumes:

  • 描述:定义了服务使用的卷(volumes)。卷用于在容器之间共享和存储数据。

volumes:
  data_volume:
  • configs:

  • 描述:用于定义服务的配置。可以包括配置文件、密钥等敏感信息。

configs:
  config_file:
    file: ./config.ini
  • environment:

  • 描述:设置全局环境变量,可以在所有服务中使用。

environment:
  GLOBAL_VAR: value
  • secrets:

  • 描述:定义服务使用的密钥或敏感信息。

secrets:
  secret_key:
    file: ./secret.txt
  • volumes, networks, configs, secrets (外部定义):

  • 描述:允许引用外部定义的卷、网络、配置和密钥。

services:
  nginx:
    volumes:
      - data_volume:/app/data
  networks:
    - custom_network

这些元素可以组合使用,根据应用程序的需要进行配置。Docker Compose 文件的结构允许开发人员定义和管理多容器应用程序的整体配置。

yum -y install tree

tree /opt/compose_nginx/ -L 2
/opt/compose_nginx/
├── docker-compose.yml
├── mysql
│   ├── Dockerfile
│   ├── my.cnf
│   └── mysql-boost-5.7.20.tar.gz
├── nginx
│   ├── Dockerfile
│   └── nginx-1.12.0.tar.gz
├── php
│   ├── Dockerfile
│   └── php-7.1.10.tar.bz2
└── wwwroot
    ├── index.html
    ├── wordpress
    └── wordpress-4.9.4-zh_CN.tar.gz

解释:

  • docker-compose.yml:

  • 描述: 创建模板脚本,用于定义和配置多容器 Docker 应用程序。

  • mysql:

  • 描述: 包含 MySQL 服务的定义。

  • Dockerfile:

    • 描述: MySQL 容器的构建脚本,包含了构建 MySQL 镜像所需的指令。
  • my.cnf:

    • 描述: MySQL 配置文件,可能包含了自定义的 MySQL 配置。
  • mysql-boost-5.7.20.tar.gz:

    • 描述: MySQL 源码包,可能是用于构建 MySQL 镜像的源码文件。
  • nginx:

  • 描述: 包含 Nginx 服务的定义。

  • Dockerfile:

    • 描述: Nginx 容器的构建脚本,包含了构建 Nginx 镜像所需的指令。
  • nginx-1.12.0.tar.gz:

    • 描述: Nginx 源码包,可能是用于构建 Nginx 镜像的源码文件。
  • php:

  • 描述: 包含 PHP 服务的定义。

  • Dockerfile:

    • 描述: PHP 容器的构建脚本,包含了构建 PHP 镜像所需的指令。
  • php-7.1.10.tar.bz2:

    • 描述: PHP 源码包,可能是用于构建 PHP 镜像的源码文件。
  • wwwroot:

  • 描述: 存放站点网页的目录。

  • index.html:

    • 描述: 实际的站点网页文件。
  • wordpress:

    • 描述: WordPress 目录,可能包含 WordPress 应用程序的文件。
  • wordpress-4.9.4-zh_CN.tar.gz:

    • 描述: WordPress 源码包,可能是用于构建 WordPress 镜像的源码文件。

这个结构展示了一个包含多个服务的 Docker-Compose 应用程序,可以通过运行 docker-compose up 启动整个应用。每个服务都有自己的构建脚本和相关文件,使得整个应用的维护和扩展更加方便。

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

准备依赖文件:

mkdir -p /opt/compose_nginx/nginx /opt/compose_nginx/wwwroot
cd /opt/compose_nginx/nginx
cp nginx-1.12.0.tar.gz ./
  • 创建目录:/opt/compose_nginx/nginx/opt/compose_nginx/wwwroot

  • 进入目录:/opt/compose_nginx/nginx

  • 复制nginx-1.12.0.tar.gz到当前目录

编写脚本 run.sh:

vim run.sh

#!/bin/bash
/usr/local/nginx/sbin/nginx
  • 创建文件:vim run.sh

编写Dockerfile:

vim Dockerfile

FROM centos:7
MAINTAINER this is nginx image <hmj>
RUN yum -y update
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.0.tar.gz /usr/local/src/
WORKDIR /usr/local/src/nginx-1.12.0
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
EXPOSE 80
EXPOSE 443
#启动方法一:
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
#添加宿主机中run.sh到容器中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
#启动方法二:
ENTRYPOINT [ "/usr/local/nginx/sbin/nginx", "-g", "daemon off;" ]

解析:

  • 基于基础镜像:
FROM centos:7

使用CentOS 7作为基础镜像。

  • 用户信息:
MAINTAINER this is nginx image <hmj>

提供镜像的作者/维护者信息。

  • 添加环境包:
RUN yum -y update
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make

更新系统并安装Nginx编译所需的一些依赖包。

  • 创建非登录用户 nginx:
RUN useradd -M -s /sbin/nologin nginx

创建一个名为nginx的非登录用户,该用户将被用于运行Nginx服务。

  • 上传Nginx软件压缩包,并解压:
ADD nginx-1.12.0.tar.gz /usr/local/src/

将Nginx软件压缩包复制到容器中的指定目录,并在该目录下解压。

  • 指定工作目录:
WORKDIR /usr/local/src/nginx-1.12.0

设置工作目录为解压后的Nginx源代码目录。

  • 配置、编译并安装Nginx:
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install

使用指定的配置参数,编译并安装Nginx。

  • 设置环境变量 PATH:
ENV PATH /usr/local/nginx/sbin:$PATH

将Nginx的sbin目录添加到系统的PATH环境变量中。

  • 指定http和https端口:
EXPOSE 80
EXPOSE 443

暴露容器的80和443端口,以便外部可以访问Nginx服务。

  • 方法一 - 关闭Nginx后台运行:
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf

将"daemon off;"添加到Nginx配置文件,以关闭Nginx在后台运行。

  • 添加run.sh脚本到容器中,并设置权限:
ADD run.sh /run.sh
RUN chmod 755 /run.sh

将本地的run.sh脚本添加到容器中,并为该脚本设置可执行权限。

  • 方法二 - 使用ENTRYPOINT启动Nginx:
ENTRYPOINT [ "/usr/local/nginx/sbin/nginx", "-g", "daemon off;" ]

使用ENTRYPOINT指令指定Nginx作为容器的启动命令,同时传递"-g daemon off;"参数,以确保Nginx以非守护进程方式运行。

  • CMD指令 - 容器启动时执行的默认命令:
CMD ["/run.sh"]

设置容器启动时默认执行的命令为/run.sh脚本。这在使用方法一时启动Nginx。

创建测试网页:

echo "<h1>this is test web</h1>" > /opt/compose_nginx/wwwroot/index.html
  • /opt/compose_nginx/wwwroot 目录下创建 index.html 文件,内容为 <h1>this is test web</h1>

编写docker-compose.yml:

  • 创建文件:vim /opt/compose_nginx/docker-compose.yml
vim /opt/compose_nginx/docker-compose.yml

version: '3'
services:
  nginx:
    container_name: web1
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - 1216:80
      - 1217:443
    networks:
      lnmp:
        ipv4_address: 172.18.0.10
    volumes:
      - ./wwwroot:/usr/local/nginx/html
networks:
  lnmp:
    driver: bridge
    ipam:
      config:
        - subnet: 172.18.0.0/16

解析:

这是一个Docker Compose的配置文件,用于定义一个包含Nginx服务的Docker应用。以下是对每个部分的解析:

  • 版本和服务定义:
version: '3'
services:

使用Docker Compose版本3,并定义了一个services部分,其中包含Nginx服务。

  • Nginx服务配置:
nginx:
  container_name: web1
  hostname: nginx
  build:
    context: ./nginx
    dockerfile: Dockerfile
  ports:
    - 1216:80
    - 1217:443
  networks:
    lnmp:
      ipv4_address: 172.18.0.10
  volumes:
    - ./wwwroot:/usr/local/nginx/html
  • container_name: 指定容器的名称为web1。

  • hostname: 设置容器的主机名为nginx。

  • build: 指定构建镜像时的上下文和Dockerfile路径。

  • ports: 将主机的1216端口映射到容器的80端口,将主机的1217端口映射到容器的443端口。

  • networks: 将该服务连接到一个自定义网络lnmp,并指定了IPv4地址为172.18.0.10。

  • volumes: 将主机的./wwwroot目录挂载到容器的/usr/local/nginx/html目录。

  • 自定义网络配置:

networks:
  lnmp:
    driver: bridge
    ipam:
      config:
        - subnet: 172.18.0.0/16

定义一个名为lnmp的自定义网络,使用bridge驱动,并指定了IP地址池为172.18.0.0/16。

  • 通过这个配置,你可以使用docker-compose up -d命令启动应用,Docker Compose会自动构建Nginx镜像并启动一个包含Nginx服务的容器。此配置还设置了端口映射和网络设置,使得Nginx服务可以通过主机的1216和1217端口访问,并且该服务与其他容器连接到lnmp网络。

?

启动Docker容器:

cd /opt/compose_nginx/
docker-compose -f docker-compose.yml up -d
  • 进入 /opt/compose_nginx/ 目录

  • 执行命令:docker-compose -f docker-compose.yml up -d

  • Docker Compose参数解释:

  • -f, --file FILE: 使用特定的Compose模板文件,默认为docker-compose.yml

  • -p, --project-name NAME: 指定项目名称,默认使用目录名称

  • -d: 在后台运行

  • 查看Docker容器状态:

  • 执行命令:docker ps -a

  • 查看Docker Compose服务状态:

  • 执行命令:docker-compose ps(必须在docker-compose.yml所在目录执行此命令)

  • 通过浏览器访问:

  • 访问 http://192.168.41.31:1216

  • 这个配置创建了一个Nginx容器,通过Docker Compose进行管理,同时提供了一个简单的测试网页

文章来源:https://blog.csdn.net/qq_51545656/article/details/135604182
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。