本篇摘要
详细解说核心概念以及用法, 包含服务或者项目定义, 还有yml文件参数,像image等等, 以及常用命令, 例如up、down、run这些, 借助图文来演示环境搭建以及配置技巧, 帮助迅速掌握多容器应用编排。
一. (容器编排) 概念介绍
要是官方所拥有的开源项目, 借助编写进而形成, 用来界定并且编排也就是管理多个容器这件事, 最终达成运行繁杂应用这项任务。
关键概念:

它借助一个起名为 -.yml 的配置文件用以定义项目以及内里的全部服务, 其默认的管理对象是整个项目, 可便捷地针对项目内所有容器的生命周期, 像启动、停止、重建等予以统一管理, 还能够轻松地定义与管理由多个相互存在依赖关系的服务, 诸如 Web 应用、数据库、缓存等共同构成的应用。
为啥会有需求, 是针对功能, 是为了使用场景, 二是关于文件即-.yml, 且要进行解析。
关于不同参数选项用法可以查阅对应文档:
点我查看对应

yml文件基本使用格式:
顶级资源的定义是: 除了服务之外, 还能够在顶层去定义, 以及等独立资源, 以供各服务去使用。服务发现方面: 服务名称()能够作为容器间网络通信的内部 DNS 名称直接予以使用。
注意:
被设定为以yml所处的目录作为项目的目录, 接着呢, 与之对应的yml的缩进呈现的是空格的格式而非Tab, 缩进体现着层级的关系, 一定要采用空格(一般是2个空格)而且要做到严格地对齐。
1·image选项
使用方法:
仅镜像名: 采用官方镜像仓库当中的镜像名称, 就像 image: redis 这样的。镜像名加标签: 于名称的后面来指定版本标签, 例如 image: redis:5 这般情况。镜像摘要: 借助唯一的哈希值()去精确锁定镜像版本, 好比 image: redis@:0ed5... 这样。仓库路径: 明确镜像在仓库里的命名空间路径, 像 image: /redis 这种。完整仓库地址: 涵盖注册服务器地址的完整路径, 比如 image: .io//redis 这样子。私有仓库镜像, 要运用私有仓库地址以及端口去拉取镜像, 比如说像这样, image 这个镜像, 它对应的是.:5000/redis。
下面演示下:
首先创建对应项目目录:

2·选项
用来达到覆盖这个目的, 针对容器镜像里所设定的那个默认启动命令;处于文件或者那种状况之中运用指定那条指令之时, 进而能够去定义全新的启动命令。
两种写法:
应用场景呈现为, 常常出现在有着需要自行定义服务启动参数的状况之中, 举例来说, 像是为 Web服务器去指定运行时的端口, 又或者是为应用传递特异性的环境变量等情形。
演示下:



3.选项
覆盖容器镜像内默认启动入口点, 即主命令, 所使用的是指令。
使用格式:
存在适合于那种需要对容器初始化流程进行自定义, 或者有着复杂命令参数的场景, 比如说在设置特定扩展, 配置运行参数之后, 才去启动主程序的情况中适用。
演示下:



注意:
若属于后台进程, 便会默认其启动完毕且已执行完毕, 随即让其进入相应状态, 然而要是为前台进程, 那就相当于占用控制台, 始终在前台运行, 也就不会认定容器主进程已执行完毕, 故而不会让它直接退出;所以当中的nginx默认启动时属于前台进程, 不会直接终止。
4.选项
用来在配置里给服务设定环境变量, 它支持运用映射以及数组这两种语法格式去定义变量, 要是值属于布尔类型, 像 true 或者 false 这样, 那就得用引号把它括起来, 以此避免 YAML 解析器把它转变成 True 或者 False。
格式:
以缩进的键值对形式来使用, 比如说: 数组语法示例方面, 采用短横线列表形式, 变量借助等号来赋值, 就像这样:
演示下:



works选项
为容器设立分组, 对和谁通信进行配置, 将容器通信权限予以隔离, 达成分组管控的目的。
用法 (在 -.yml 里):
yaml
services:
web: # 服务1
image: nginx
networks:
- frontend # 加入前端网络组
- backend # 同时加入后端网络组
db: # 服务2
image: mysql
networks:
- backend # 仅加入后端网络组
networks:
frontend: # 网络组1(前端专用)
driver: bridge # 使用桥接模式(默认)
backend: # 网络组2(后端专用)
driver: bridge
演示下:



6.选项
将电脑之中那些文件夹, 或者是诸多文件, 都映射于容器里边, 以此来能够达成数据的同步, 以及实现持久化效果。
简单写法
yaml
volumes:
- "电脑路径:容器路径" # 冒号左边是电脑上的位置,右边是容器里的位置
复杂写法
yaml
volumes:
- type: volume # 类型:volume (docker管理的卷) | bind (你电脑的路径)
source: 来源名 # 卷名 或 电脑上的具体路径
target: 容器路径 # 容器里出现的路径
volumes: # 表明主机的目录位置(比如命名卷)
name:
核心就一点:电脑(源):容器(目标)
演示下:





7.ports选项
- 精细控制:
yaml
ports:
- target: 80 # 容器内端口
host_ip: 127.0.0.1 # 宿主机绑定IP(默认所有IP)
published: 8080 # 宿主机映射端口
protocol: tcp # 协议类型(tcp/udp)
mode: host # 模式(host/ingress)
2.短语法格式:
yaml
ports:
- "8000:8000" # 主机端口:容器端口
- "3000" # 随机主机端口→容器3000端口
- "127.0.0.1:5000:5000" # 指定IP映射
- "6060:6060/udp" # UDP协议映射
- "9090-9091:8080-8081" # 端口段批量映射
演示下:


8.选项
用以声明容器内部进行监听的端口, 只准许处于同一网络之下的其他容器去访问, 并不会映射至宿主机, 在服务配置的情形下以列表的形式去声明内部端口号, 此端口号支持字符串或者数字格式。
用法:
yaml
services:
app:
image: your-app
expose:
- "3000" # 暴露3000端口(推荐字符串格式)
- 8000 # 暴露8000端口(数字格式也可)
被暴露的端口, 仅仅能够被处于同一网络范围之内的其他服务去进行访问, 外部的主机以及宿主机都没办法直接去访问该端口;这样的情况啊, 一般被应用于微服务之间的内部通信场景当中, 就好比后端服务把API端口给暴露出来, 从而供前端服务在其内部进行调用。
演示下:



9.build 选项
用于指定为构建镜像上下文路径。
yaml
services:
服务名:
build:
context: . # 必填:Dockerfile所在目录(`.`表示当前目录)
dockerfile: Dockerfile # 可选:自定义Dockerfile文件名
args: # 可选:构建时传递变量
KEY: value
使用如:
yaml
services:
webapp:
build: . # 最短写法:直接指定上下文目录
api:
build:
context: ./backend # 指定子目录
dockerfile: dev.Dockerfile # 使用非标准文件名
args:
NODE_ENV: production
这里用法后面的会用到。
- 选项
指令被用来定义服务之间的启动依赖顺序, 为了能够让依赖控制变得更加精确, 能够配合健康检查, 确保不但依赖服务已经启动, 并且其内部应用已经准备好就绪了。
- 基础依赖(仅控制启动顺序)
yaml
services:
web:
depends_on:
- db # 先启动db,再启动web
- redis # 先启动redis,再启动web
- 高级依赖(等待服务就绪)
凭借 : 明确规定一定要等待依赖的服务经由健康检查合格之后, 方可起始当前的服务。这必然得伴随着 配置一同运用。
yaml
services:
web:
depends_on:
db:
condition: service_healthy # 必须等待db服务健康
db:
image: mysql
healthcheck: # 定义健康检查
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] # 检查命令
interval: 10s # 每10秒检查一次
timeout: 5s # 检查超时时间
retries: 10 # 失败重试次数
- 健康检查 () 参数说明
演示下:



- 单一文件格式所采用的方式为, 借助关键字直接去指定一个环境变量文件的路径, 举例来说就是像 : .env 这样。列表格式的做法是, 运用列表形式去指定多个环境变量文件, 依照顺序进行加载, 比如 - ./.env。路径类型涵盖了, 支持相对路径, 像 ./.env 这样 , 以及绝对路径, 例如 /opt/.env。文件所起到的作用是, 把指定文件当中的环境变量成批地注入到容器里, 以此来防止在配置文件里进行硬编码。
演示下:




三. 命令 命令清单 命令功能备注
build
构建服务
规范的格式来显示服务配置
cp
在本地系统和服务容器直接拷贝文件
创建服务的容器
down
停止所有容器,并删除容器
从服务器获取实时事件
exec
在容器中执行命令
列出所有容器使用的镜像
kill
强制停止服务的容器
logs
显示日志
ls
显示所有项目
pause
暂停服务
port
列出所有的端口映射
该命令可以列出项目中目前的所有容器
pull
拉取服务镜像
push
推送服务镜像
重启或者重启某个服务
rm
删除服务停止的容器
run
在指定服务容器上执行相关的命令
start
启动当前停止的某个容器
stop
停止当前运行的某个容器
top
显示运行的进程
恢复服务
up
up命令会对一个与服务相关的容器进行构建, (重新)创建, 启动以及链接操作。倘若容器已然存在, 在默认情形下, 它将会被停止, 并且尝试重新创建它们, 同时会运用之前挂载的卷。-no-参数能够使容器不被停止或者重新创建, -d则指明是在后台运行。
查看版本