Docker 容器编排(compose)

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 介绍 compose 安装和 yaml 文件编写,实现容器的批量编排。

什么是容器编排?

  • 由于大量的应用容器化,部署和管理繁多的服务变得越来越困难且需要耗费大量的资源,而 Docker Compose 正好能解决 Docker 单节点上以单引擎模式(Single-Engine Mode)进行多容器应用的部署和管理问题,这一过程就叫容器编排;
  • Docker Compose 并不是通过脚本和各种冗长的 docker 命令来将应用组件组织起来,而是通过一个【声明式的配置文件】描述整个应用,从而使用一条命令完成部署。
  • 容器编排有以下四个特征(批量操作):

    1. 容器同时启动;
    2. 容器同时关闭;
    3. 镜像和容器同时删除;
    4. 镜像和容器同时构建;

目前主流容器编排工具有哪些?

  1. docker-compose;
  2. docker-swarm;
  3. Kubernetes/k8s(当下行业标准);
  4. 其他工具自行查看资料;

docker-compose 简介

  • Compose 的前身是 Fig,Fig 被 Docker 收购之后正式更名为 ComposeCompose 向下兼容 Fig(Fig 是一个由 Orchard 公司开发的强有力的基于 DockerPython 工具,允许用户基于一个 YAML 文件定义多容器应用,从而可以使用 fig 命令行工具进行应用的部署,同时还可对应用的全生命周期进行管理);
  • Compose 是一个用于部署(定义和运行)多容器 Docker 应用的工具,只需要一个 Compose 的配置文件和一个简单的命令就可以创建并运行应用所需的所有容器;
  • 在配置文件中,所有容器通过【services】来定义,并使用【docker-compose 命令】启动或停止容器以及所有依赖容器;
  • 使用它时,首先编写定义多容器(多服务)应用的 YAML 文件,然后将其交由 docker-compose 命令处理,Docker Compose 就会基于 Docker 引擎 API 完成应用的部署和管理;

docker 操作镜像-容器流程

image.png

docker-compose 容器编排工作流程

image.png

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.html
  • docker-compose.yml 文件配置:

image.png

  1. 参考地址:https://docs.docker.com/compose/compose-file/
  2. 核心配置:
version 指定compose版本,最好是 3.0 以上版本,目前最新是 3.7 版本
services 配置容器[容器列表]
  nginx: #配置容器标识(唯一编号)
    image: #配置容器镜像
    ports: #配置容器映射端口号[数组]
    networks: #配置容器网络[数组]
networks 网络指定配置
  nginx-rmcore: #配置网络名称
    external: true #网络自定义
volumes 数据挂载配置
extensions 扩展配置

容器编排使用场景

  • 批量管理 docker 容器上面的镜像和容器化应用;

容器编排如何应用,目标同时操作 nginx.net core 构建的镜像?

  1. 准备 nginx 镜像;
  2. 准备 .net core 项目构建的镜像;
  3. docker-compose 工具;
  4. 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

    1. 在 【server】/【location】注释默认配置,编写【netcore】容器ip:port(暴露端口) =》http_proxy http://192.168.48.3:8081;
    2. 保存并推出 nginx.conf =》wq
  • 退出 ngixn 容器 =》exit
  • 查看当前目录列表 =》ls
  • 重启 componse =》docker-componse restart

容器间如何实现网络通信?

image.png

此时浏览器查看 nginx 容器可能访问无效(不会反向代理运行 netcore 容器),由于 docker 中的容器是相互隔离的,所以容器间是不能直接相互通信的,此时需要找一个中介(docker 容器 网络管理工具 =》network),linux shell 终端输入=》docker --help 显示的管理命令中会有一个 =》【network Manage networks】

  • 查看 docker 容器【网络管理命令】信息 =》docker network --help

image.png

  • 方案:使用自定义方式桥接模式(DRIVER/bridge)接入网络,实现容器间相互通信
  1. 创建网络(默认 bridge,范围本地 local),桥接标识/名称为(netcore-nginx) =》docker network create netcore-nginx
  2. 查看当前 docker 节点网络目录列表 =》docker network ls 显示信息【NETWORK ID/网络id,NAME/网络名称,DRIVER/网络驱动模式,SCOPE/网络范围】
  3. 找到 docker-compose.yml 文件并切换到文件所在目录 =》ls
  4. 编辑 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 容器内部重启:

  1. 切换目录 =》cd ..
  2. 查看当前目录列表 =》ls
  3. 进入 sbin 目录 =》cd sbin
  4. 再次查看当前目录列表 =》ls 此时会看到 nginx
  5. 重启 nginx =》./nginx restart 或 重新加载 =》./nginx -s reload

此时再次浏览器查看,确保以上配置信息都对的前提下,通常情况都可以正常访问了 =》实现 nginx 反向代理 netcore

如何查看容器 netcore 网络 ip 地址?

查看 netcore 容器分层信息(安装配置详细信息)=》docker container inspect [container-name/id]

  1. =》查看【NetworkSettings】/【Networks】/【IPAddress】,文件配置展示的 IP 就是 netcoreip
  2. =》查看对外暴露的端口号【NetworkSettings】/【Ports】/【HostPort

查看 docker 所有容器信息 =》dockre container ls -a

  1. =》找到对应的 netcore 容器查看对外暴露的端口;
注意:在以上的配置过程中,容器重启后,容器的数据不会持久化(容器数据是保留内存中的),并且容器的 ip 也会发生变化。

【容器数据挂载 volums】:实现容器数据持久化 ;

由于【compose】工具只能 docker 单个节点配置部署容器应用,不能实现 docker 跨节点管理,因此 docker 官方团队实现了 【docker-swarm】工具实现 docker 集群管理,下一篇幅继续讲解;

相关实践学习
巧用云服务器ECS制作节日贺卡
本场景带您体验如何在一台CentOS 7操作系统的ECS实例上,通过搭建web服务器,上传源码到web容器,制作节日贺卡网页。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
8天前
|
运维 Cloud Native 虚拟化
一文吃透云原生 Docker 容器,建议收藏!
本文深入解析云原生Docker容器技术,涵盖容器与Docker的概念、优势、架构设计及应用场景等,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
一文吃透云原生 Docker 容器,建议收藏!
|
2天前
|
关系型数据库 MySQL Java
【Docker最新版教程】一文带你快速入门Docker常见用法,实现容器编排和自动化部署上线项目
Docker快速入门到项目部署,MySQL部署+Nginx部署+docker自定义镜像+docker网络+DockerCompose项目实战一文搞定!
|
7天前
|
持续交付 开发者 Docker
Docker容器化技术实战指南
Docker容器化技术实战指南
23 1
|
9天前
|
缓存 监控 开发者
掌握Docker容器化技术:提升开发效率的利器
在现代软件开发中,Docker容器化技术成为提升开发效率和应用部署灵活性的重要工具。本文介绍Docker的基本概念,并分享Dockerfile最佳实践、容器网络配置、环境变量和秘密管理、容器监控与日志管理、Docker Compose以及CI/CD集成等技巧,帮助开发者更高效地利用Docker。
|
10天前
|
监控 持续交付 Docker
Docker 容器化部署在微服务架构中的应用有哪些?
Docker 容器化部署在微服务架构中的应用有哪些?
|
10天前
|
监控 持续交付 Docker
Docker容器化部署在微服务架构中的应用
Docker容器化部署在微服务架构中的应用
|
10天前
|
安全 持续交付 Docker
微服务架构和 Docker 容器化部署的优点是什么?
微服务架构和 Docker 容器化部署的优点是什么?
|
1天前
|
开发者 Docker Python
从零开始:使用Docker容器化你的Python Web应用
从零开始:使用Docker容器化你的Python Web应用
8 1
|
6天前
|
Java Docker 微服务
利用Docker容器化部署Spring Boot应用
利用Docker容器化部署Spring Boot应用
31 0
|
10天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
42 2

相关产品

  • 容器服务Kubernetes版
  • 下一篇
    无影云桌面