谁说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 ...
随机推荐
- [转帖]使用 TiDB 读取 TiFlash
https://docs.pingcap.com/zh/tidb/stable/use-tidb-to-read-tiflash 本文档介绍如何使用 TiDB 读取 TiFlash 副本. TiDB ...
- [转帖]Linux—微服务启停shell脚本编写模板
https://www.jianshu.com/p/1e1080a39dc5 run.sh #!/bin/bash if [ -s java.pid ] then echo "重复启动,退出 ...
- [转帖]Unixbench的使用(综合性能测试、2D测试)和问题解决(跑不出多线程分数,调不出窗口,报错等)
一.Unixbench简介 Unixbench一个基于系统的基准测试工具,不单纯是CPU 内存 或者磁盘测试工具.测试结果不仅仅取决于硬件,也取决于系统.开发库.甚至是编译器.Unixbench是一个 ...
- ESXi规避ESXiArgs勒索软件的简单方法
摘要 今天查看深信服科技的公众号 发现有一个ESXiArgs 的勒索软件. 感觉对公司存在一定的风险.但是感觉操作手册有点简单. 这里想着写全面一点. 作为操作手册使用. 并且深信服仅是解决了在运行, ...
- Springboot 数据库连接池大小简单总结
最近在进行性能压测, 想验证一下产品的极限性能, 在使用openpower 2路22核(SMT4)176线程 512G内存的服务器上面进行性能压测 压测进行到1000并发或者是2000并发时性能有一定 ...
- css中也可以使用变量了?
前言 大家都听说过变量,我们学习的任何语言都有变量的存在. css中是否也存在变量呢? 也许很多小伙伴也是通过less,scss中来使用css变量 其实在css中也是有变量的,今天我们也来学习一下. ...
- echarts去除坐标轴上的x和y轴
通过 show:false控制手否显示 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- vue报错:'XX' is defined but never used no-unused-vars
参考地址:http://www.gold404.cn/info/87 导致这个报错的原因就是eslint校验, 就是你当初在vue创建脚手架的时候选择了eslint校验: 后面你绝对会碰到这样的报错, ...
- 4.5 Windows驱动开发:内核中实现进程数据转储
多数ARK反内核工具中都存在驱动级别的内存转存功能,该功能可以将应用层中运行进程的内存镜像转存到特定目录下,内存转存功能在应对加壳程序的分析尤为重要,当进程在内存中解码后,我们可以很容易的将内存镜像导 ...
- 19.6 Boost Asio 文本压缩传输
Base64是一种二进制到文本的编码方案,用于将二进制数据转换为ASCII字符串格式.它通过将二进制数据流转换为一系列64个字符来工作,这些字符都可以安全地传输到设计用于处理文本数据的系统中. 如下代 ...