一、概念
1.1 Docker Compose 定义
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它通过一个 YAML 文件(默认为 docker-compose.yml)来定义构成应用程序的多个服务及其网络、卷等依赖关系。使用 Docker Compose 可以通过一个简单的命令(如 docker-compose up)来启动、停止和重建整个应用环境,大大简化了多容器应用的部署和管理流程。Docker Compose 适合于单主机或多主机(但非集群化)环境下的应用部署,适用于开发、测试及小型生产环境。
1.2 Docker Swarm 定义
Docker Swarm 是 Docker 官方提供的容器编排工具,用于管理 Docker 容器集群。Swarm 将一组 Docker 引擎(称为节点)组织成一个集群,这些节点可以是物理服务器或虚拟机。在 Swarm 模式下,你可以定义服务(Services),每个服务可以跨越多个节点部署多个实例(Replicas),从而实现高可用性和负载均衡。Swarm 提供了服务发现、负载均衡、故障恢复等功能,并且支持多种调度策略。Swarm 更适用于大型生产环境,特别是需要自动伸缩、滚动更新和复杂服务管理的场景。
1.3 区别
(1)目标场景:Docker Compose 侧重于单主机或多主机环境下应用的快速部署和配置管理,而 Docker Swarm 则是面向大规模容器集群的编排和管理。
(2)规模与复杂度:Compoose 适合小型项目或简单的微服务架构,管理相对直接;Swarm 则是为了处理更大规模的服务部署,提供高级功能如跨节点的服务发现、负载均衡和故障转移。
(3)编排能力:Swarm 提供了更强大的服务编排功能,如自动扩缩容、滚动更新等,而 Compose 缺乏这些高级编排特性。
(4)配置方式:两者都使用 YAML 文件来定义服务,但 Docker Compose 文件直接描述了服务的配置和依赖关系,而 Docker Swarm 服务定义则嵌入在集群层面的命令或API调用中。
(5)网络和存储:Swarm 提供了更高级的网络配置选项(如覆盖网络)和数据管理功能,以适应复杂的集群环境。
总的来说,Docker Compose 是一个轻量级的本地开发和小型部署工具,而 Docker Swarm 是一个面向生产环境的容器编排平台,适合构建和管理大型容器化应用。
1.4 Docker-compose 组成
Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡,比如 Consul。
1.5 Docker-compose 配置文件
Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。
1.6 Docker-compose 工作原理
使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API, 就可以在其上利用Compose来进行编排管理。
二、安装
2.1 环境安装
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
2.2 YAML文件格式及编写注意事项
YAML 是一种标记语言,它可以很直观的展示数据序列化格式,可读性高。类似于 XML数据描述语言,语法比 XML 简单的很多。YAML 数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分隔,数组用中括号 [] 括起来, hash 用花括号 {} 括起来。
2.2.1使用YAML注意事项
大小写敏感
通过缩进表示层级关系
不支持制表符 tab 键缩进,只能使用空格缩进
缩进的空格数目不重要,只要相同层级左对齐,通常开头缩进2个空格
用 # 号注释
符号字符后缩进1个空格,如冒号 : 、逗号 , 、横杠 -
如果包含特殊字符用单引号('')引起来会作为普通字符串处理,双引号(""): 特殊字符作为本身想表示的意思(name: "Hi,\nTom")
2.2.2 数据结构
对象映射: 键值对的字典(animal: pets)
序列数组: 一组按次序排列的列表
- Cat
- Dog
- Goldfish
["Cat", "Dog", "Goldfish"]
此处的Cat、Dog、Goldfish均属于不同的数组
布尔值
debug: true
debug: false
布尔值:用于判断是否为真
2.2.3 示例
yaml 格式
用于配置和管理 ,yaml 是一个简洁的非标记性语言,内容格式人性化,较易读。
languages: #序列的映射
- Java
- Golang
- Python
websites: #映射的映射
cpu: 2
memory: 1024M
swap: 2048M
disk: 60G
Json 格式
主要用于API接口之间的消息传递。
{
languages: [
'Java',
'Golang',
'Python'
],
resources: {
cpu: '2',
memory: '1024M',
swap: '2048M',
disk: '60G'
}
}
2.2.4 Docker Compose配置常用字段
| 字段 | 描述 |
| build | 指定 Dockerfile 文件名,要指定Dockerfile文件需要在build标签的子级标签中使用dockerfile标签指定 |
| dockerfile | 构建镜像上下文路径 |
| context | 可以是 dockerfile 的路径,或者是指向 git 仓库的 url 地址 |
| image | 指定镜像 |
| command | 执行命令,覆盖容器启动后默认执行的命令 |
| container_name | 指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale指定容器数量 |
| deploy | 指定部署和运行服务相关配置,只能在 Swarm 模式使用 |
| environment | 添加环境变量 |
| networks | 加入网络,引用顶级networks下条目 |
| network_mode | 设置容器的网络模式,如 host,bridge等 |
| ports | 暴露容器端口,与 -p 相同,但端口不能低于 60 |
| volumes | 挂载一个宿主机目录或命令卷到容器,命名卷要在顶级 volumes 定义卷名称 |
| volumes_from | 从另一个服务或容器挂载卷,可选参数 :ro 和 :rw,仅版本 '2' 支持 |
| hostname | 容器主机名 |
| sysctls | 在容器内设置内核参数 |
| links | 连接到另外一个容器,- 服务名称[:服务别名] |
| privileged | 用来给容器root权限,注意是不安全的,true | false |
| restart | 设置重启策略,no,always,nounless-st-failure,oped no,默认策略,在容器退出时不重启容器。 on-failure,在容器非正常退出时(退出状态非0),才会重启容器。 on-failure:3,在容器非正常退出时重启容器,最多重启3次。 always,在容器退出时总是重启容器。 unless-stopped,在容器退出的容器时总是重启容器,但是不考虑在 Docker 守护进程启动时就已经停止了。 |
| no | 默认策略,在容器退出时不重启容器 |
| on-failure | 在容器非正常退出时(退出状态非0),才会重启容器 |
| on-failure:3 | 在容器非正常退出时重启容器,最多重启3次 |
| always | 在容器退出时总是重启容器 |
| unless-stopped | 在容器退出的容器时总是重启容器,但是不考虑在 Docker 守护进程启动时就已经停止了 |
| depends_on | 在使用Compose时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,可能会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出。depends_on标签用于解决容器的依赖、启动先后的问题。 |
#depends_on
php:
depends_on:
- apache
- mysql
2.2.5 Docker Compose 常用命令

2.2.6 Docker Compose 文件结构
# 定义 compose 文件的版本号,这里使用的是版本3
version: '3'
# services 部分定义了要启动的服务
services:
# 定义名为 nginx 的服务
nginx:
# 设置容器的名字为 web1
container_name: web1
# 设置容器内的主机名
hostname: nginx
# build 部分指定了如何构建镜像
build:
# 指定构建上下文目录,即 Dockerfile 所在目录
context: ./nginx
# 指定使用的 Dockerfile 文件名
dockerfile: Dockerfile
# ports 配置服务端口映射
ports:
# 将容器的80端口映射到宿主机的1216端口
- 1216:80
# 将容器的443端口映射到宿主机的1217端口
- 1217:443
# networks 配置容器网络设置
networks:
# 指定容器加入名为 lnmp 的网络
lnmp:
# 为容器在 lnmp 网络中指定静态 IPv4 地址
ipv4_address: 172.18.0.10
# volumes 配置数据卷挂载
volumes:
# 将宿主机的 ./wwwroot 目录挂载到容器的 /usr/local/nginx/html 目录
- ./wwwroot:/usr/local/nginx/html
# networks 部分定义了自定义网络
networks:
# 定义名为 lnmp 的网络,类型为桥接
lnmp:
driver: bridge
# IPAM (IP Address Management) 配置
ipam:
config:
# 配置网络的子网
- subnet: 172.18.0.0/16
2.3 编辑Dockerfile文件
vim Dockerfile
#基于基础镜像
FROM centos:7
#用户信息
MAINTAINER this is nginx image <shibin>
#添加环境包
RUN yum -y update
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
#上传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
#指定http和https端口
EXPOSE 80
EXPOSE 443
//方法一:
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf #关闭 nginx 在后台运行
#添加宿主机中run.sh到容器中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
2.4 编写nginx页面
echo "<h1>this is test web</h1>" > /opt/compose_nginx/wwwroot/index.html
2.5 编写配置文件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
2.6 启动 docker-compose
cd /opt/compose_nginx/
docker-compose -f docker-compose.yml up -d
-f, --file FILE :使用特定的 compose 模板文件,默认为 docker-compose.yml
-p, --project-name NAME :指定项目名称,默认使用目录名称
-d :在后台运行
2.7 查看 docker容器情况
docker ps -a
2.8 浏览器访问

三、小结
1.Docker-Compose概述
Docker-Compose实现在单机上完成容器集群编排的管理 单机容器编排
Docker-Compose.yml Compose模板文件
工程(项目) Project LNMP
服务Service Nginx Mysql php
容器Container Container 容器名 --name 主机名 -h 镜像 image:tag 端口 -p 网络 --network 数据卷 -v......
使用Dokcer-Compose 可以完成多个Docker Run的所有操作
2.使用YAML注意事项
大小写敏感
通过缩进表示层级关系
不支持制表符 tab 键缩进,只能使用空格缩进
缩进的空格数目不重要,只要相同层级左对齐,通常开头缩进2个空格
用 # 号注释
符号字符后缩进1个空格,如冒号 : 、逗号 , 、横杠 -
如果包含特殊字符用单引号('')引起来会作为普通字符串处理,双引号(""): 特殊字符作为本身想表示的意思(name: "Hi,\nTom")
3.Docker-Compose常用字段
Dockerfile:构建镜像上下文路径
context:可以是 dockerfile 的路径,或者是指向 git 仓库的 url 地址
command:执行命令,覆盖容器启动后默认执行的命令
ports:暴露容器端口,与 -p 相同,但端口不能低于 60
container_name:指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale指定容器数量
networks_mode:设置容器的网络模式,如 host,bridge,...
environment:添加环境变量
volumes_from:从另一个服务或容器挂载卷,可选参数 :ro 和 :rw,仅版本 '2' 支持,‘3’版本代表混合支持
image:指定镜像
restart:设置重启策略,no,always,nounless-st-failure,oped
no,默认策略,在容器退出时不重启容器。
on-failure,在容器非正常退出时(退出状态非0),才会重启容器。
on-failure:3,在容器非正常退出时重启容器,最多重启3次。
always,在容器退出时总是重启容器。
unless-stopped,在容器退出的容器时总是重启容器,但是不考虑在 Docker 守护进程启动时就已经停止了。
