谁说docker-compose不能水平扩展容器、服务多实例?
❝
虽说我已经从docker-compose走上了docker swarm的邪门歪道,目前被迫走在k8s这条康庄大道, 但是我还是喜欢docker-compose简洁有效的部署方式。
❞
曾其何时
docker-compose非常适合开发、测试、快速验证原型,这个小工具让单机部署容器变得简洁、高效。 正如我在《docker-compose,docker-stack前世今生》里面说的,所有人都认为docker-compose是单机部署多容器的瑞士军刀,没有docker stack由deploy配置节体现的生产特性(多实例、滚动部署、故障重启、负载均衡)。


最近我发现我错了:docker-compose还是具备服务多实例的能力的。
❝
在docker-compose -h中发现了一个scale参数,这是个啥?
docker-compose还能水平扩展,实现多容器?
docker-compose定义的容器映射的主机端口不会冲突吗?❞
号主精心分析,才找到一个完备的理论来支持scale参数的合理性。
在此文中,我们将演示一个示例,说明如何使用Docker Compose运行服务的多实例
version: "3"
services:
webapp:
image: "luksa/kubia"
depends_on:
- db
ports:
- "8080:8080" # 主机Port: 容器暴露Port
在此文件中,我们定义了一个webapp服务(nodejs程序在8080端口监听)
为webapp容器定义了端口映射:从容器8080端口映射到主机的8080端口,这样我们可以在主机上使用http://localhost:8080URL访问服务器。
Docker Compose --scale flag
当我们运行docker-compose up -h命令时, 其中--scale选项显示为服务指定多实例
--scale SERVICE=NUM Scale SERVICE to NUM instances. Overrides the
`scale` setting in the Compose file if present.
很显然,使用目前的DockerCompose配置运行docker-compose up --scale webapp=3
将导致failed: port is already allocated错误:
问题在于,我们试图运行webapp服务的三个实例,并将它们全部映射到主机同一端口,而「主机的8080端口只能绑定给一个容器」。
解决错误的一种方法是将Docker Compose文件中的端口映射更改为- "8080", 这会将容器的端口8080暴露给主机上的临时未分配端口。


这个操作延伸出另一个问题:在启动容器之前,我们将不知道用于访问服务的端口。
要列出端口映射,请在运行docker-compose up --scale webapp=3之后运行docker-compose ps来查看容器:
Name Command State Ports
-------------------------------------------------------------
test_webapp_1 node app.js Up 0.0.0.0:32828->8080/tcp
test_webapp_2 node app.js Up 0.0.0.0:32830->8080/tcp
test_webapp_3 node app.js Up 0.0.0.0:32829->8080/tcp
添加负载均衡器
为了能够在不知道特定容器的端口的情况下访问webapp服务,并使用负载均衡机制将请求分发到容器,我们需要在容器堆栈中添加负载均衡器。
在此示例中,我们将使用nginx作为负载均衡器:来完成对外接收、对内转发


在与docker-compose.yml文件相同的目录中创建以下nginx.conf文件,代理&转发请求
user nginx;
events {
worker_connections 1000;
}
http {
server {
listen 80;
location / {
proxy_pass http://webapp:8080;
}
}
}
这将配置nginx将请求从主机端口80转发到http://webapp:8080。然后将由Docker’s embedded DNS解决寻址:该DNS服务器使用轮询实现来根据服务名称解析DNS请求,并将其分发给Docker容器。
❝
由于nginx服务负责对外接收请求、对内转发,因此webapp服务可不直接对外暴露。实际上我们可以从Docker Compose文件中删除webapp端口映射配置,而仅将端口8080通知给链接的nginx服务。
❞
version: "3"
services:
webapp:
image: "luksa/kubia"
nginx:
image: nginx:latest
volumes:
- type: bind
source: /home/root/test/nginx.conf
target: /etc/nginx/nginx.conf
depends_on:
- webapp
ports:
- "80:80"
通过此配置,我们现在可以利用Docker Compose工具的scale水平扩展、实现服务多实例。 docker-compose up -d --scale webapp=3
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
05b024964274 luksa/kubia "node app.js" 15 minutes ago Up 15 minutes test_webapp_1
2fb56a22810a luksa/kubia "node app.js" 15 minutes ago Up 15 minutes test_webapp_3
84041c727b6e luksa/kubia "node app.js" 15 minutes ago Up 15 minutes test_webapp_2
3882beae8b56 nginx:latest "nginx -g 'daemon of…" 15 minutes ago Up 15 minutes 0.0.0.0:80->80/tcp test_nginx_1
总结输出
docker-compose利用Docker引擎内嵌DNS,提炼出水平扩展容器、服务多实例的能力(用一个代理就能应用这个能力)
Docker引擎内嵌DNS也是docker-compose利用服务名发现其他容器的关键
在需要测试具备水平扩展能力的web服务时,docker-compose up -d --scale 提供了一种快速、简便的途径。
以后谁再说docker-compose没有水平扩展容器、服务多实例的时候,就把这篇文章丢给他。
https://pspdfkit.com/blog/2018/how-to-use-docker-compose-to-run-multiple-instances-of-a-service-in-development/#
https://docs.docker.com/engine/userguide/networking/configure-dns/
谁说docker-compose不能水平扩展容器、服务多实例?的更多相关文章
- Docker Compose部署项目到容器-基于Tomcat和mysql的项目yml配置文件代码
场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...
- 【转载】docker 应用之动态扩展容器空间大小
docker 容器默认的空间是 10G, 如果想指定默认容器的大小(在启动容器的时候指定),可以在 docker 配置文件里通过 dm.basesize 参数指定,比如 docker -d --sto ...
- Docker Compose部署项目到容器-基于Tomcat和mysql的商城项目(附源码和sql下载)
场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...
- 基于Docker Compose的.NET Core微服务持续发布
是不是现在每个团队都需要上K8s才够潮流,不用K8s是不是就落伍了.今天,我就通过这篇文章来回答一下. 一.先给出我的看法和建议 我想说的是,对于很多的微小团队来说,可能都不是一定要上K8s,毕竟上K ...
- 使用Docker Compose编排Spring Cloud微服务
文章目录 微服务构建实例 简化Compose的编写 编排高可用的Eureka Server 编排高可用Spring Cloud微服务集群及动态伸缩 微服务项目名称 项目微服务中的角色 microser ...
- Docker学习之搭建MySql容器服务
描述 MySQL 5.6 SQL数据库服务器Docker镜像,此容器映像包含用于OpenShift的MySQL 5.6 SQL数据库服务器和一般用法.用户可以选择RHEL和基于CentOS的图像.然后 ...
- Docker学习笔记之使用 Docker Compose 管理容器
0x00 概述 通过之前的介绍,我们已经基本掌握了构建.运行容器的方法,但这还远远不够,由于 Docker 采用轻量级容器的设计,每个容器一般只运行一个软件,而目前绝大多数应用系统都绝不是一个软件所能 ...
- Docker Compose 容器编排 NET Core 6+MySQL 8+Nginx + Redis
环境: CentOS 8.5.2111Docker 20.10.10Docker-Compose 2.1.0 服务: db redis web nginx NET Core 6+MySQL 8+N ...
- Docker | Compose创建mysql容器
本文通过Docker Compose来创建mysql容器 在linux服务器上创建文件,用于管理容器 mkdir docker-mysql cd docker-mysql vim docker-com ...
- Docker 三剑客之 Docker Compose
Docker Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排,开源地址:https://github.com/docker/compose Dock ...
随机推荐
- [转帖]Oracle中为什么需要NCHAR
https://zhuanlan.zhihu.com/p/668402759 Oracle中已经有了char.varchar2等字符类型,为什么又弄出一个nchar.nvarchar2? Oracle ...
- 神通数据库的varchar和nvarchar的验证
神通数据库的varchar和nvarchar的验证 登录神通数据库 isql 注意 神通数据库的默认密码是 szoscar55 Welcome to isql 2.0.56 interactive t ...
- [转帖]iozone - 性能压力测试工具
<存储工具系列文章>主要介绍存储相关的测试和调试工具,包括不限于dd.fio.vdbench.iozone.iometer.cosbench等性能负载工具,及strace等调试工具. 1 ...
- Stress-ng 的简单学习
背景 想研究一下国产和不同架构,不通型号CPU的算力 也作为后续生产交付的基线准备. 学习各种不同工具进行简要测试. 安装 git clone https://github.com/ColinIanK ...
- prometheus告警规则分发服务
Prometheus告警规则分发服务,根据一致性哈希将规则分发到多个节点,使用多个goroutine处理应用告警,在服务增加时可以增加goroutine,服务减少时降低goroutine数目. 规则下 ...
- API架构风格对比:SOAP vs REST vs GraphQL vs RPC
API架构风格对比:SOAP vs REST vs GraphQL vs RPC 最近一段时间关于GraphQL的讨论很多,一些项目中也相继用到了这种风格,但使用是否合理,是否存在杀鸡用牛刀这样的问题 ...
- TypeScript中的元组 Tuple
元组类型 // 元组类型:表示一个已知元素数量和类型的数组,各元素的类型不必相同 let undata: [string, '男'| '女']; //已知数量是两个.类型分别是字符串和男或者女 und ...
- Windows10磁盘占用100%和内存占用高
前言 公司配备了两台电脑,两台电脑都是安装的win10系统,一台是磁盘占用高,另一台是内存可用低. 具体情况如下: 一台外网机 8g内存,安装win10 专业版,开机一天后经常出现内存不够用,但其实都 ...
- 爆了!Sealos 三天支持 1000 个帕鲁私服
Sealos 的帕鲁私服模板从第一天发布之后就起了 100 多个私服,第二天直接上到 500 多个,第三天直接上千,还在加速增长中.来讲讲我们只用一个晚上怎么做到上线一个专属可用区的,还有一些帕鲁实践 ...
- webpack与其常见loader加载器使用方式
webpack是什么 webpack是前端项目工程化的具体解决方案. 主要功能:提供了友好的前端模块化开发支持,支持代码压缩混淆(去除空格和注释,让文件体积更小),处理浏览器端JS的兼容性(将箭头函数 ...