目录
一、为什么要学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容器
我们知道使用一个Dockerfile模板文件可以定义一个单独的应用容器,如果需要定义多个容器就需要服务编排。服务编排有很多种技术方案,因此我们需要学习了解Docker Compose 。
Docker Compose 是 Docker 官方的开源项目,用于快速编排 Docker 容器集群。它允许用户在一个模板(使用 YAML 格式)中定义一组相关联的应用容器,这被称为一个项目(project)。例如,一个项目可以包括 Web 服务容器和后端数据库服务容器等。
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 将管理的容器分为三层:工程(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 的独立产品,因此需要安装 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 是一种标记语言,它可以很直观的展示数据序列化格式,可读性高。类似于 XML数据描述语言,语法比 XML 简单的很多。YAML 数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分隔,数组用中括号 [] 括起来, hash 用花括号 {} 括起来。
●大小写敏感:YAML 是大小写敏感的。 ●缩进表示层级关系:使用缩进表示数据的层次结构。 ●不支持制表符 tab 键缩进,只能使用空格缩进 ●缩进的空格数目不重要: 只要相同层级左对齐即可,通常开头缩进2个空格。 ●注释: 使用 # 号表示注释。 ●符号字符后缩进1个空格: 冒号 : 、逗号 , 、横杠 - 等符号后通常缩进1个空格。 ●引号的使用: 单引号''
引起来的字符串会被处理为普通字符串,双引号""
内的特殊字符会被解析为其本身的意思。 name: "Hi,\nTom"
●对象映射: 键值对的字典 animal: pets
●序列数组: 一组按次序排列的列表
Cat
Dog
Goldfish
["Cat", "Dog", "Goldfish"]
●布尔值 debug: true debug: false
languages: #序列的映射
Java
Golang
Python websites: #映射的映射 cpu: 2 memory: 1024M swap: 2048M disk: 60G
键:{值}
{ 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
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
build:
描述:重新构建服务,通常在对应的 Dockerfile 发生变化时使用,以确保使用最新的配置和代码。
ps:
描述:列出当前正在运行的容器,显示容器的状态、ID、名称等信息。
up:
描述:创建和启动容器。该命令根据 docker-compose.yml 文件中的配置启动服务。
exec:
描述:在容器内执行命令。可以通过这个命令进入正在运行的容器并执行特定的命令,用于调试和管理容器内部。
scale:
描述:指定一个服务容器的启动数量。允许动态地调整服务容器的规模,适用于需要水平扩展的场景。
top:
描述:显示容器内的进程。可以查看容器内部正在运行的进程,有助于监控和排查问题。
logs:
描述:查看容器的输出日志。用于检查容器的运行日志,帮助定位和解决问题。
down:
描述:停止并删除容器、网络、数据卷和镜像。用于清理整个应用程序的相关资源。
stop/start/restart:
描述:停止/启动/重启服务。分别用于停止、启动和重启指定的服务。
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 #站点网页
cd /opt
mkdir compose_nginx
cd compose_nginx
mkdir nginx
cd nginx/
此时顺便将nginx安装包拖进来
vim Dockerfile
mkdir /opt/compose_nginx/wwwroot
echo "
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