Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。它允许你使用YAML文件配置应用程序的服务、网络和卷,并通过一个简单的命令集启动和管理整个应用程序的容器。通过使用Docker Compose,可以轻松地将多个Docker容器协同工作,构建和管理复杂的应用程序环境。
在容器化应用的过程中,一个 Dockerfile 模板文件可以定义一个单独的应用容器。然而,如果需要定义多个容器并协同工作,就需要使用服务编排。服务编排有多种技术方案,下面将介绍 Docker 官方产品 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 的独立产品,因此在安装 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 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"
:
分隔键和值,形成键值对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 配置文件中,常用的字段用于定义服务的各种属性,如构建、镜像、命令、网络、端口映射等。以下是一些常见字段及其描述:
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 应用程序的工具。以下是一些常用命令的整理解析补充:
build:
描述:重新构建服务,通常在对应的 Dockerfile 发生变化时使用,以确保使用最新的配置和代码。
ps:
描述:列出当前正在运行的容器,显示容器的状态、ID、名称等信息。
up:
描述:创建和启动容器。该命令根据 docker-compose.yml
文件中的配置启动服务。
exec:
描述:在容器内执行命令。可以通过这个命令进入正在运行的容器并执行特定的命令,用于调试和管理容器内部。
scale:
描述:指定一个服务容器的启动数量。允许动态地调整服务容器的规模,适用于需要水平扩展的场景。
top:
描述:显示容器内的进程。可以查看容器内部正在运行的进程,有助于监控和排查问题。
logs:
描述:查看容器的输出日志。用于检查容器的运行日志,帮助定位和解决问题。
down:
描述:停止并删除容器、网络、数据卷和镜像。用于清理整个应用程序的相关资源。
stop/start/restart:
描述:停止/启动/重启服务。分别用于停止、启动和重启指定的服务。
这些命令使得 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:
my.cnf:
mysql-boost-5.7.20.tar.gz:
nginx:
描述: 包含 Nginx 服务的定义。
Dockerfile:
nginx-1.12.0.tar.gz:
php:
描述: 包含 PHP 服务的定义。
Dockerfile:
php-7.1.10.tar.bz2:
wwwroot:
描述: 存放站点网页的目录。
index.html:
wordpress:
wordpress-4.9.4-zh_CN.tar.gz:
这个结构展示了一个包含多个服务的 Docker-Compose 应用程序,可以通过运行 docker-compose up
启动整个应用。每个服务都有自己的构建脚本和相关文件,使得整个应用的维护和扩展更加方便。
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到当前目录
vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx
vim run.sh
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编译所需的一些依赖包。
RUN useradd -M -s /sbin/nologin nginx
创建一个名为nginx的非登录用户,该用户将被用于运行Nginx服务。
ADD nginx-1.12.0.tar.gz /usr/local/src/
将Nginx软件压缩包复制到容器中的指定目录,并在该目录下解压。
WORKDIR /usr/local/src/nginx-1.12.0
设置工作目录为解压后的Nginx源代码目录。
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
使用指定的配置参数,编译并安装Nginx。
ENV PATH /usr/local/nginx/sbin:$PATH
将Nginx的sbin目录添加到系统的PATH环境变量中。
EXPOSE 80
EXPOSE 443
暴露容器的80和443端口,以便外部可以访问Nginx服务。
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
将"daemon off;"添加到Nginx配置文件,以关闭Nginx在后台运行。
ADD run.sh /run.sh
RUN chmod 755 /run.sh
将本地的run.sh脚本添加到容器中,并为该脚本设置可执行权限。
ENTRYPOINT [ "/usr/local/nginx/sbin/nginx", "-g", "daemon off;" ]
使用ENTRYPOINT指令指定Nginx作为容器的启动命令,同时传递"-g daemon off;"参数,以确保Nginx以非守护进程方式运行。
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>
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:
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网络。?
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进行管理,同时提供了一个简单的测试网页