相关文章推荐
粗眉毛的牛排  ·  Docker:安裝適用於 Linux 上的 ...·  1 月前    · 
微笑的香烟  ·  罗技lua宏 编程教学 while for ...·  5 月前    · 
怕老婆的海豚  ·  select2组件内的按钮点击事件未能触发·  1 年前    · 
求醉的冲锋衣  ·  Node.js调用cmd输出中文乱码_js ...·  1 年前    · 
善良的牙膏  ·  Docker Selenium(1) ...·  1 年前    · 
买醉的硬币  ·  ubuntu 22 ...·  1 年前    · 
Code  ›  谁说docker-compose不能水平扩展容器、服务多实例?开发者社区
docker-compose 容器技术 容器
https://cloud.tencent.com/developer/article/1615277
宽容的水煮肉
1 年前
作者头像
有态度的马甲
0 篇文章

谁说docker-compose不能水平扩展容器、服务多实例?

前往专栏
腾讯云
备案 控制台
开发者社区
学习
实践
活动
专区
工具
TVP
文章/答案/技术大牛
写文章
社区首页 > 专栏 > 精益码农 > 正文

谁说docker-compose不能水平扩展容器、服务多实例?

发布 于 2020-04-16 15:06:09
2.7K 0
举报

❝虽说我已经从 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:
    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
 
推荐文章
粗眉毛的牛排  ·  Docker:安裝適用於 Linux 上的 SQL Server 的容器 - SQL Server | Microsoft Learn
1 月前
微笑的香烟  ·  罗技lua宏 编程教学 while for 循环 鼠标移动_教学
5 月前
怕老婆的海豚  ·  select2组件内的按钮点击事件未能触发
1 年前
求醉的冲锋衣  ·  Node.js调用cmd输出中文乱码_js 执行命令 stdout 乱码 中文 windows-CSDN博客
1 年前
善良的牙膏  ·  Docker Selenium(1) 搭建服務及chrome 使用 firefox_51CTO博客_docker安装chrome
1 年前
买醉的硬币  ·  ubuntu 22 systemd-resolve command not found-掘金
1 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号