目录
Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。它允许你使用YAML文件配置应用程序的服务、网络和卷,并通过一个简单的命令集启动和管理整个应用程序的容器。通过使用Docker Compose,可以轻松地将多个Docker容器协同工作,构建和管理复杂的应用程序环境。
在容器化应用的过程中,一个 Dockerfile 模板文件可以定义一个单独的应用容器。然而,如果需要定义多个容器并协同工作,就需要使用服务编排。服务编排有多种技术方案,下面将介绍 Docker 官方产品 Docker Compose。
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 是 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
包含了 departments
和 location
两个子项,而 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:
-
描述: 设置容器的网络模式,如
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
通过合理配置这些字段,可以有效管理和定义 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进行管理,同时提供了一个简单的测试网页