虽说我已经从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:- dbports:- "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:latestvolumes:- type: bindsource: /home/root/test/nginx.conftarget: /etc/nginx/nginx.confdepends_on:- webappports:- "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管理多个容器

    使用Docker Compose管理多个容器 Docker Compose是一个用来定义和运行复杂应用的Docker工具.使用Compose,你可以在一个文件中定义一个多容器应用,然后使用一条命令来启 ...

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

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

  3. Docker Compose运行MySQL、Redis服务

    Docker Compose运行MySQL.Redis服务 前言:通过容器来统一管理开发中使用到的依赖,顺便学习docker-compose 1.docker-compose.yml 文件说明 2.d ...

  4. 通过Docker Swarm,Docker Compose和Consul扩展到无限(第3/4部分)–蓝绿色部署,自动化和自愈过程...

    本系列分为以下文章. 品尝即将发生的事情 手动部署服务 蓝绿色部署,自动化和自我修复程序 扩展个人服务 在上一篇文章中,我们手动部署了服务的第一个版本以及一个单独的Mongo DB容器实例. 两者都( ...

  5. 使用Docker Swarm,Docker Compose和Consul扩展到无限(第3/4部分)–蓝绿色部署,自动化和自我修复过程...

    本系列分为以下文章. 品尝即将发生的事情 手动部署服务 蓝绿色部署,自动化和自我修复程序 扩展个人服务 在上一篇文章中,我们手动部署了服务的第一个版本以及一个单独的Mongo DB容器实例. 两者都( ...

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

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

  7. Docker Compose 1.18.0 之服务编排详解

    一个使用Docker容器的应用,通常由多个容器组成.使用Docker Compose,不再需要使用shell脚本来启动容器.在配置文件中,所有的容器通过services来定义,然后使用docker-c ...

  8. 【Spring Cloud 基础设施搭建系列】Spring Cloud Demo项目 使用Docker Compose编排Spring Cloud微服务

    文章目录 Docker Compose快速人门 入门示例 使用Docker Comose编排Spring Cloud微服务 使用Maven插件读取Dockerfile进行构建 使用Maven插件构建D ...

  9. Docker compose 容器编排

    1. 概述 问题:如果要使用 Docker 运行 LNMP 架构,那么 Nginx.MySQL.PHP. Linux三个服务运行在一个容器里,还是运行在多个容器里呢? 答案是都可以. 你可以分别放在三 ...

最新文章

  1. 2016.1.20 dubbo启动之后机器ip有问题
  2. 4场直播,哈工大、亚马逊等大咖为你带来机器学习与知识图谱的内容盛宴
  3. SpringBoot + Mybatis + Druid + PageHelper 实现多数据源并分页
  4. 树的宽度 递归法和非递归法
  5. linux性能优化--cpu篇
  6. mysql-表完整性约束
  7. linux mysql 运行状态_Linux中使用mysqladmin extended-status配合Linux命令查看MySQL运行状态...
  8. Linux怎么取消ftp的匿名访问功能
  9. 实数历史无穷小能否带领我们直接走向今日科学之辉煌?
  10. 如何安装mysql5.7.2_CentOS 7.2 安装MySQL 5.7
  11. 程序员恭喜了!10月起逼自己拿下这个证,年薪68万起!
  12. 解析极限编程--Kent Beck, Cynthia Andres读后感
  13. Java Web第三弹---Tomcat
  14. java 项目启动后页面乱码_java生成的Html打开后展示乱码
  15. 【解决报错】failed to obtain JDBC Connection
  16. Java线程状态中BLOCKED和WAITING有什么区别?
  17. npm --save-dev 和 --save的区别
  18. Pycharm 自制翻译扩展
  19. Dobot magician + realsense D435i 手眼标定(外参)
  20. Nvidia Summer Camp Day34 个人心得

热门文章

  1. Apache并发处理模块
  2. 【Android笔记】如何创建列表视图3
  3. airdrop 是 蓝牙吗_您可以在Windows PC或Android手机上使用AirDrop吗?
  4. 转整型_SPI转can芯片CSM300详解、Linux驱动移植调试笔记
  5. 前端技术周刊 2018-12-03:DOM
  6. 10.31T4 HAOI2010最长公共子序列 计数+容斥原理
  7. 修复删除/var/lib/dpkg目录后,无法使用apt-get命令问题
  8. css3-13 如何改变文本框的轮廓颜色
  9. 数据结构笔记--栈的总结及java数组实现简单栈结构
  10. SCVMM 2012 R2运维管理九之:添加非信任的Hyper-v主机和群集