Docker 容器编排(compose)

本文涉及的产品
容器镜像服务 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搭建和管理企业级网站应用
目录
相关文章
|
27天前
|
数据库 Docker 容器
docker容器为啥会开机自启动
通过配置适当的重启策略,Docker容器可以在主机系统重启后自动启动。这对于保持关键服务的高可用性和自动恢复能力非常有用。选择适合的重启策略(如 `always`或 `unless-stopped`),可以确保应用程序在各种情况下保持运行。理解并配置这些策略是确保Docker容器化应用可靠性的关键。
188 93
|
24天前
|
存储 Docker 容器
Docker-基础(数据卷、自定义镜像、Compose)
通过数据卷实现持久化存储,通过自定义镜像满足特定需求,通过Docker Compose方便地管理多容器应用
77 27
|
29天前
|
Ubuntu NoSQL Linux
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
129 6
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
|
25天前
|
存储 Docker 容器
Docker-基础(数据卷、自定义镜像、Compose)
通过数据卷实现持久化存储,通过自定义镜像满足特定需求,通过Docker Compose方便地管理多容器应用。掌握这些Docker基础概念和操作,可以显著提高开发和部署效率,确保应用程序的可移植性和可扩展性。
68 22
|
2月前
|
搜索推荐 安全 数据安全/隐私保护
7 个最能提高生产力的 Docker 容器
7 个最能提高生产力的 Docker 容器
150 35
|
28天前
|
数据库 Docker 容器
docker容器为啥会开机自启动
通过配置适当的重启策略,Docker容器可以在主机系统重启后自动启动。这对于保持关键服务的高可用性和自动恢复能力非常有用。选择适合的重启策略(如 `always`或 `unless-stopped`),可以确保应用程序在各种情况下保持运行。理解并配置这些策略是确保Docker容器化应用可靠性的关键。
53 17
|
2月前
|
Ubuntu Linux 开发工具
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包成标准化单元(容器),确保在任何支持 Docker 的操作系统上一致运行。容器共享主机内核,提供轻量级、高效的执行环境。本文介绍如何在 Ubuntu 上安装 Docker,并通过简单步骤验证安装成功。后续文章将探讨使用 Docker 部署开源项目。优雅草央千澈 源、安装 Docker 包、验证安装 - 适用场景:开发、测试、生产环境 通过以上步骤,您可以在 Ubuntu 系统上成功安装并运行 Docker,为后续的应用部署打下基础。
89 5
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
|
28天前
|
运维 Java 虚拟化
《docker基础篇:1.Docker简介》,包括Docker是什么、容器与虚拟机比较、能干嘛、去哪下
《docker基础篇:1.Docker简介》,包括Docker是什么、容器与虚拟机比较、能干嘛、去哪下
101 12
|
29天前
|
Kubernetes Linux 虚拟化
入门级容器技术解析:Docker和K8s的区别与关系
本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
117 11
|
2月前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
285 78

相关产品

  • 容器服务Kubernetes版