什么是容器编排?
- 由于大量的应用容器化,部署和管理繁多的服务变得越来越困难且需要耗费大量的资源,而 Docker Compose 正好能解决
Docker
单节点上以单引擎模式(Single-Engine Mode
)进行多容器应用的部署和管理问题,这一过程就叫容器编排; Docker Compose
并不是通过脚本和各种冗长的docker
命令来将应用组件组织起来,而是通过一个【声明式的配置文件】描述整个应用,从而使用一条命令完成部署。容器编排有以下四个特征(批量操作):
- 容器同时启动;
- 容器同时关闭;
- 镜像和容器同时删除;
- 镜像和容器同时构建;
目前主流容器编排工具有哪些?
- docker-compose;
- docker-swarm;
- Kubernetes/k8s(当下行业标准);
- 其他工具自行查看资料;
docker-compose 简介
Compose
的前身是Fig
,Fig 被Docker
收购之后正式更名为Compose
,Compose
向下兼容Fig
(Fig 是一个由 Orchard 公司开发的强有力的基于Docker
的Python
工具,允许用户基于一个YAML
文件定义多容器应用,从而可以使用fig
命令行工具进行应用的部署,同时还可对应用的全生命周期进行管理);Compose
是一个用于部署(定义和运行)多容器Docker
应用的工具,只需要一个Compose
的配置文件和一个简单的命令就可以创建并运行应用所需的所有容器;- 在配置文件中,所有容器通过【
services
】来定义,并使用【docker-compose
命令】启动或停止容器以及所有依赖容器; - 使用它时,首先编写定义多容器(多服务)应用的
YAML
文件,然后将其交由docker-compose
命令处理,Docker Compose
就会基于Docker
引擎API
完成应用的部署和管理;
docker 操作镜像-容器流程
docker-compose 容器编排工作流程
Linux 环境安装 docker-compose
- 检查
Linux
系统上面是否已经安装Docker
sudo docker version
curl
下载compose
(版本1.11.2)地址
sudo curl -L "https://github.com/docker/compose/releases/download/1.11.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
- 添加
compose
可执行权限
chmod +x /usr/local/bin/docker-compose
- 查看
compose
安装结果
docker-compose --version
- 卸载使用
sudo rm /usr/local/bin/docker-compose
- 创建
compose
快捷方式
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose 命令
查看 docker-compose
命令集
docker-compose --help
命令说明:
build =》构建或重新构建容器服务
bundle =》从compose文件生成一个Docker包
config =》验证并查看compose文件
create =》创建容器服务
down =》停止并删除容器、网络、映像和卷
events =》从容器接收实时事件
exec =》在正在运行的容器中执行命令
help =》帮助命令
images =》镜像列表
kill =》杀死容器
logs =》查看容器的日志
pause =》暂停容器服务
port =》输出端口号
ps =》容器列表
pull =》下载容器服务镜像
push =》上传容器服务镜像
restart =》容器服务重新开始
rm =》删除停止的容器
run =》运行一次性命令
scale =》设置服务的容器数量
start =》开始容器服务
stop =》停止容器服务
top =》显示正在运行的进程
unpause =》暂停容器服务
up =》创建并启动容器
version =》显示Docker-Compose版本信息
docker-compose.yml 文件
- 类似
josn
文件,YAML
是 "YAML Ain't a Markup Language"(YAML
不是一种标记语言)的递归缩写,是一个可读性高,用来表达数据序列化的格式。 YAML
语法格式参考:https://www.runoob.com/w3cnote/yaml-intro.htmldocker-compose.yml
文件配置:
version 指定compose版本,最好是 3.0 以上版本,目前最新是 3.7 版本
services 配置容器[容器列表]
nginx: #配置容器标识(唯一编号)
image: #配置容器镜像
ports: #配置容器映射端口号[数组]
networks: #配置容器网络[数组]
networks 网络指定配置
nginx-rmcore: #配置网络名称
external: true #网络自定义
volumes 数据挂载配置
extensions 扩展配置
容器编排使用场景
- 批量管理
docker
容器上面的镜像和容器化应用;
容器编排如何应用,目标同时操作 nginx
和 .net core
构建的镜像?
- 准备
nginx
镜像; - 准备
.net core
项目构建的镜像; docker-compose
工具;docker-compose.yml
配置文件;
Linux 实践操作
- 进入创建的容器目录 =》cd nginx
- 查看当前目录列表 =》ls
- 创建 compose 文件夹 =》mkdir compose
- 再次查看当前目录列表 =》ls 此时会有一个 compose 文件夹
- 进入 compose 文件夹 =》cd compose
- 创建 docker-compose.yml (严格命名)文件 =》touch docker-compose.yml
- 编辑 docker-compose.yml (语法严格规范)文件=》vi docker-compose.yml 编辑配置信息如下:
version: '3' #标识 componse 版本信息
services:
netcore: #镜像标识(唯一)
image: netcore #当前环境镜像名称,不用指明路径,会自动从本地寻找镜像
ports: #暴露端口,端口映射
- 8080:80 #把容器端口80映射到外部主机访问端口8080
- 8081:443 #把容器镜像文件所在目录端口443映射到外部访问端口8081
nginx:
image: nginx
ports:
- 8090:80
#注:上面符号 - 表示数组,注意空格缩进表示层级,该文件配置严格遵循YAML语法配置
- 以上
docker-compose.yml
文件配置完成,保存并推出 =》:wq - 再次查看当前文件目录 =》ls 查看里面是否存在 docker-compose.yml 文件
- 通过
docker-compose.yml
文件配置信息批量运行容器 =》docker-compose up 此时会输出两个信息
Creating compose_netcore_1 ... done
Creating compose_nginx_1 ... done
- 查看批量创建的容器信息 =》docker ps -a / docker container ls -a
以上配置过程就实现了容器编排,通过当前主机ip和对应端口即可访问批量创建的容器【netcore和nginx】。
- compose 批量停止容器(并删除容器、网络、映像和卷) =》docker-compose down
- 为了验证是否删除信息,查看所有容器列表 =》docker ps -a / docker container ls -a
注意:容器编排缺陷 =》docker-compose 只支持 docker 单节点主机上面的容器应用部署和编排管理;
如何使用创建的 Nginx 容器反向代理 netcore ?
- 进入
nginx
容器(通过Bash Shell
桥接) =》docker exec -it [container-name/id] /bin/bash - 进入当前目录 =》cd /
- 查看列表文件夹目录 =》ls
- 进入 nginx 容器安装目录(通常情况在 /usr/local 目录下)=》cd /usr/local
- 再次查看列表文件夹目录 =》ls
- 进入 nginx 容器目录 =》cd nginx/ 在查看当前文件目录列表 =》ls 会看到 conf 文件目录
- 进入 conf 目录 =》cd conf 查看列表 =》ls 存在 nginx.conf
编辑 nginx.conf 文件 =》vi nginx.conf / vim nginx.conf
- 在 【server】/【location】注释默认配置,编写【netcore】容器ip:port(暴露端口) =》http_proxy http://192.168.48.3:8081;
- 保存并推出 nginx.conf =》wq
- 退出 ngixn 容器 =》exit
- 查看当前目录列表 =》ls
- 重启 componse =》docker-componse restart
容器间如何实现网络通信?
此时浏览器查看 nginx
容器可能访问无效(不会反向代理运行 netcore
容器),由于 docker
中的容器是相互隔离的,所以容器间是不能直接相互通信的,此时需要找一个中介(docker 容器 网络管理工具 =》network),linux shell
终端输入=》docker --help
显示的管理命令中会有一个 =》【network Manage networks】
- 查看
docker
容器【网络管理命令】信息 =》docker network --help
- 方案:使用自定义方式桥接模式(DRIVER/bridge)接入网络,实现容器间相互通信
- 创建网络(默认 bridge,范围本地 local),桥接标识/名称为(netcore-nginx) =》docker network create netcore-nginx
- 查看当前
docker
节点网络目录列表 =》docker network ls 显示信息【NETWORK ID/网络id,NAME/网络名称,DRIVER/网络驱动模式,SCOPE/网络范围】 - 找到
docker-compose.yml
文件并切换到文件所在目录 =》ls - 编辑
docker-compose.yml
文件,对容器【netcore,nginx
】接入网络桥接模式,配置信息如下:
version: '3' #标识 compones 版本信息
services:
netcore: #镜像标识(唯一)
image: netcore #当前环境镜像名称,不用指明路径,会自动从本地寻找镜像
ports: #暴露端口,端口映射
- 8080:80 #把容器端口80映射到外部主机访问端口8080
- 8081:443 #把容器镜像文件所在目录端口443映射到外部访问端口8081
networks:
- netcore-nginx
nginx:
image: nginx
ports:
- 8090:80
networks: #单个容器内局部网络配置
- netcore-nginx
networks: #docker 网络配置声明,此处是全局网络配置
netcore-nginx: #自定义网络名称
external: true #启动外部访问
# 1. 上面符号 - 表示数组,注意空格缩进表示层级,该文件配置严格遵循YAML语法配置
# 2. 上面配置信息,services 配置了两个容器,分别是 netcore 和 nginx ,并且同时使用自定义的网络桥接模式 netcore-nginx 实现容器相互通信;
# 3. 和 serices 同级的 networks 配置信息,告诉 docker 启动自定义桥接模式网络 netcore-nginx ;
- 退出
docker-componse.yml
文件并保存 =》:wq
- 重启
componse
让配置信息生效 =》docker-componse restart
再次浏览器查看 nginx
容器是否实现反向代理 netcore
容器,若出现 nginx 默认站点信息,注意查看 nginx.conf
配置信息,因为 componse
工具配置重启后,信息不会被保存,原有容器会被还原,注意修改 nginx.conf / server / location
【proxy_pass http://[netcore容器ip:port];】信息,:wq
推出并保存,然后在 nginx
容器内部重启:
- 切换目录 =》cd ..
- 查看当前目录列表 =》ls
- 进入 sbin 目录 =》cd sbin
- 再次查看当前目录列表 =》ls 此时会看到 nginx
- 重启 nginx =》./nginx restart 或 重新加载 =》./nginx -s reload
此时再次浏览器查看,确保以上配置信息都对的前提下,通常情况都可以正常访问了 =》实现 nginx
反向代理 netcore
;
如何查看容器 netcore 网络 ip 地址?
查看 netcore
容器分层信息(安装配置详细信息)=》docker container inspect [container-name/id]
- =》查看【
NetworkSettings
】/【Networks
】/【IPAddress
】,文件配置展示的IP
就是netcore
的ip
- =》查看对外暴露的端口号【
NetworkSettings
】/【Ports
】/【HostPort
】
查看 docker 所有容器信息 =》dockre container ls -a
- =》找到对应的
netcore
容器查看对外暴露的端口;
注意:在以上的配置过程中,容器重启后,容器的数据不会持久化(容器数据是保留内存中的),并且容器的
ip
也会发生变化。
【容器数据挂载 volums
】:实现容器数据持久化 ;
由于【compose
】工具只能 docker
单个节点配置部署容器应用,不能实现 docker
跨节点管理,因此 docker
官方团队实现了 【docker-swarm
】工具实现 docker
集群管理,下一篇幅继续讲解;