什么是容器编排?
- 由于大量的应用容器化,部署和管理繁多的服务变得越来越困难且需要耗费大量的资源,而 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 --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不是一种标记语言)的递归缩写,是一个可读性高,用来表达数据序列化的格式。
- docker-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 集群管理,下一篇幅继续讲解;