虽说我已经从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不能水平扩展容器、服务多实例?的更多相关文章

  1. Docker Compose部署项目到容器-基于Tomcat和mysql的项目yml配置文件代码

    场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  2. 【转载】docker 应用之动态扩展容器空间大小

    docker 容器默认的空间是 10G, 如果想指定默认容器的大小(在启动容器的时候指定),可以在 docker 配置文件里通过 dm.basesize 参数指定,比如 docker -d --sto ...

  3. Docker Compose部署项目到容器-基于Tomcat和mysql的商城项目(附源码和sql下载)

    场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  4. 基于Docker Compose的.NET Core微服务持续发布

    是不是现在每个团队都需要上K8s才够潮流,不用K8s是不是就落伍了.今天,我就通过这篇文章来回答一下. 一.先给出我的看法和建议 我想说的是,对于很多的微小团队来说,可能都不是一定要上K8s,毕竟上K ...

  5. 使用Docker Compose编排Spring Cloud微服务

    文章目录 微服务构建实例 简化Compose的编写 编排高可用的Eureka Server 编排高可用Spring Cloud微服务集群及动态伸缩 微服务项目名称 项目微服务中的角色 microser ...

  6. Docker学习之搭建MySql容器服务

    描述 MySQL 5.6 SQL数据库服务器Docker镜像,此容器映像包含用于OpenShift的MySQL 5.6 SQL数据库服务器和一般用法.用户可以选择RHEL和基于CentOS的图像.然后 ...

  7. Docker学习笔记之使用 Docker Compose 管理容器

    0x00 概述 通过之前的介绍,我们已经基本掌握了构建.运行容器的方法,但这还远远不够,由于 Docker 采用轻量级容器的设计,每个容器一般只运行一个软件,而目前绝大多数应用系统都绝不是一个软件所能 ...

  8. 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 ...

  9. Docker | Compose创建mysql容器

    本文通过Docker Compose来创建mysql容器 在linux服务器上创建文件,用于管理容器 mkdir docker-mysql cd docker-mysql vim docker-com ...

  10. Docker 三剑客之 Docker Compose

    Docker Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排,开源地址:https://github.com/docker/compose Dock ...

随机推荐

  1. [转帖]Run Grafana behind a reverse proxy

    On this page Introduction Configure NGINX Configure HAProxy Configure IIS Configure Traefik Summary ...

  2. [转帖]time_zone 是怎么打爆你的MySQL的

    https://plantegg.github.io/2023/10/03/time_zone%E6%98%AF%E6%80%8E%E4%B9%88%E6%89%93%E7%88%86%E4%BD%A ...

  3. [转帖]《Linux性能优化实战》笔记(24)—— 动态追踪 DTrace

    使用 perf 对系统内核线程进行分析时,内核线程依然还在正常运行中,所以这种方法也被称为动态追踪技术.动态追踪技术通过探针机制来采集内核或者应用程序的运行信息,从而可以不用修改内核和应用程序的代码就 ...

  4. [转帖]【k8s】5、资源管理命令-声明式

    文章目录 一. yaml和json介绍 1.yuml语言介绍 2.k8s支持的文件格式 3.yaml和json的主要区别 二.声明式对象管理 1.命令式对象配置 2.声明式对象配置 3.声明式对象管理 ...

  5. ESXi6.5 登录后出现错误 必须 退出的解决办法

  6. 一种轻量分表方案-MyBatis拦截器分表实践

    背景 部门内有一些亿级别核心业务表增速非常快,增量日均100W,但线上业务只依赖近一周的数据.随着数据量的迅速增长,慢SQL频发,数据库性能下降,系统稳定性受到严重影响.本篇文章,将分享如何使用MyB ...

  7. 每日一库:cobra 简介

    当你需要为你的 Go 项目创建一个强大的命令行工具时,你可能会遇到许多挑战,比如如何定义命令.标志和参数,如何生成详细的帮助文档,如何支持子命令等等.为了解决这些问题,github.com/spf13 ...

  8. TienChin-课程管理-添加课程接口

    CourseController.java @PreAuthorize("hasPermission('tienchin:course:create')") @Log(title ...

  9. 【三】多智能体强化学习(MARL)近年研究概览 {Analysis of emergent behaviors(行为分析)_、Learning communication(通信学习)}

    相关文章: [一]最新多智能体强化学习方法[总结] [二]最新多智能体强化学习文章如何查阅{顶会:AAAI. ICML } [三]多智能体强化学习(MARL)近年研究概览 {Analysis of e ...

  10. 1.基于Label studio的训练数据标注指南:信息抽取(实体关系抽取)、文本分类等

    文本抽取任务Label Studio使用指南 1.基于Label studio的训练数据标注指南:信息抽取(实体关系抽取).文本分类等 2.基于Label studio的训练数据标注指南:(智能文档) ...