撸了今年阿里、头条和美团的面试,我有一个重要发现.......>>>

环境准备,上一节中的flask-redis项目,将项目启动:

docker-compose up -d
Starting flask-redis_web_1   ... done
Starting flask-redis_redis_1 ... done

查看状态:

docker-compose psName                      Command               State           Ports
-------------------------------------------------------------------------------------
flask-redis_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp
flask-redis_web_1     python app.py                    Up      0.0.0.0:8080->5000/tcp

docker-compose scale

我们目前的docker-compose 中的service容器中各自只有一个,通过scale可以去扩展service。

docker-compose up --help--scale SERVICE=NUM        Scale SERVICE to NUM instances. Overrides the`scale` setting in the Compose file if present.

例如将web服务的数量变为三个:

docker-compose up --scale web=3 -d
WARNING: The "web" service specifies a port on the host. If multiple containers for this service are created on a single host, the port will clash.
Starting flask-redis_web_1 ...
Starting flask-redis_web_1 ... done
Creating flask-redis_web_2 ... error
Creating flask-redis_web_3 ... errorERROR: for flask-redis_web_2  Cannot start service web: driver failed programming external connectivity on endpoint flask-redis_web_2 (952f3eea8bdf14f0a94845fb6ef5039285f7ffe40620faca32f40643b802fa97): Bind for 0.0.0.0:8080 failed: port is already allocatedERROR: for flask-redis_web_3  Cannot start service web: driver failed programming external connectivity on endpoint flask-redis_web_3 (50c776deb73b272d04181a8ab385f27cc31689aeeed804436fd2b92836cf25b9): Bind for 0.0.0.0:8080 failed: port is already allocatedERROR: for web  Cannot start service web: driver failed programming external connectivity on endpoint flask-redis_web_2 (952f3eea8bdf14f0a94845fb6ef5039285f7ffe40620faca32f40643b802fa97): Bind for 0.0.0.0:8080 failed: port is already allocated
ERROR: Encountered errors while bringing up the project.

发现报错了,原因是接口已经被分配了。每个容器的端口都想绑定到8080上面,显然是不可能的。

将容器删除:

docker-compose down
Stopping flask-redis_web_1   ... done
Stopping flask-redis_redis_1 ... done
Removing flask-redis_web_3   ... done
Removing flask-redis_web_2   ... done
Removing flask-redis_web_1   ... done
Removing flask-redis_redis_1 ... done
Removing network flask-redis_default

将docker-compose.yml中端口绑定删除:

version: "3"services:redis:image: redisweb:build:context: .dockerfile: Dockerfileenvironment:REDIS_HOST: redis

执行命令docker-compose up --scale web=3 -d

docker-compose up --scale web=3 -d
Creating network "flask-redis_default" with the default driver
Creating flask-redis_web_1   ... done
Creating flask-redis_web_2   ... done
Creating flask-redis_web_3   ... done
Creating flask-redis_redis_1 ... done

可以成功执行。

docker-compose psName                      Command               State    Ports
-----------------------------------------------------------------------
flask-redis_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp
flask-redis_web_1     python app.py                    Up      5000/tcp
flask-redis_web_2     python app.py                    Up      5000/tcp
flask-redis_web_3     python app.py                    Up      5000/tcp

发现web端口并没有映射到主机的端口,全部是5000container端口。

想象一下假如有多个web服务,都会监听本地的5000端口,都会访问redis,那么我们就可以有一个负载均衡器,可以把访问量平均的分配到web服务,可以减轻单个服务的压力。如下图所示:

如果我们用这种方式来部署web服务的话,以后的扩展性是非常强的。例如我们开启10个web服务:

iie4bu@hostdocker:~/ddy/docker-compose-flask-redis$ docker-compose up --scale web=10 -d
WARNING: The Docker Engine you're using is running in swarm mode.Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node.To deploy your application across the swarm, use `docker stack deploy`.Creating network "docker-compose-flask-redis_default" with the default driver
Creating docker-compose-flask-redis_redis_1 ... done
Creating docker-compose-flask-redis_web_1   ... done
Creating docker-compose-flask-redis_web_2   ... done
Creating docker-compose-flask-redis_web_3   ... done
Creating docker-compose-flask-redis_web_4   ... done
Creating docker-compose-flask-redis_web_5   ... done
Creating docker-compose-flask-redis_web_6   ... done
Creating docker-compose-flask-redis_web_7   ... done
Creating docker-compose-flask-redis_web_8   ... done
Creating docker-compose-flask-redis_web_9   ... done
Creating docker-compose-flask-redis_web_10  ... done
iie4bu@hostdocker:~/ddy/docker-compose-flask-redis$ docker-compose psName                             Command               State    Ports
--------------------------------------------------------------------------------------
docker-compose-flask-redis_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp
docker-compose-flask-redis_web_1     python app.py                    Up      5000/tcp
docker-compose-flask-redis_web_10    python app.py                    Up      5000/tcp
docker-compose-flask-redis_web_2     python app.py                    Up      5000/tcp
docker-compose-flask-redis_web_3     python app.py                    Up      5000/tcp
docker-compose-flask-redis_web_4     python app.py                    Up      5000/tcp
docker-compose-flask-redis_web_5     python app.py                    Up      5000/tcp
docker-compose-flask-redis_web_6     python app.py                    Up      5000/tcp
docker-compose-flask-redis_web_7     python app.py                    Up      5000/tcp
docker-compose-flask-redis_web_8     python app.py                    Up      5000/tcp
docker-compose-flask-redis_web_9     python app.py                    Up      5000/tcp

我们为了演示真实的架构,使用HAproxy做负载均衡

将app.py的端口由5000改为80,app.py如下:

from flask import Flask
from redis import Redis
import os
import socketapp = Flask(__name__)
redis = Redis(host=os.environ.get('REDIS_HOST', '127.0.0.1'), port=6379)@app.route('/')
def hello():redis.incr('hits')return 'Hello Container World! I have been seen %s times and my hostname is %s.\n' % (redis.get('hits'),socket.gethostname())if __name__ == "__main__":app.run(host="0.0.0.0", port=80, debug=True)

Dockerfile的expose也改成80,内容如下:

FROM python:3.5
LABEL maintaner="vincent"
COPY . /app
WORKDIR /app
RUN pip install flask redis
EXPOSE 80
CMD [ "python", "app.py" ]

docker-compose.yml中添加haproxy,内容如下:

version: "3"services:redis:image: redisweb:build:context: .dockerfile: Dockerfileenvironment:REDIS_HOST: redislb:image: dockercloud/haproxylinks:- webports:- 8082:80volumes:- /var/run/docker.sock:/var/run/docker.sock

将上面的容器先docker-compose down,将容器删掉。

iie4bu@hostdocker:~/ddy/docker-compose-flask-redis-haproxy$ docker-compose up -d
WARNING: The Docker Engine you're using is running in swarm mode.Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node.To deploy your application across the swarm, use `docker stack deploy`.Removing docker-compose-flask-redis-haproxy_lb_1
docker-compose-flask-redis-haproxy_redis_1 is up-to-date
docker-compose-flask-redis-haproxy_web_1 is up-to-date
Recreating d2b87be02ede_docker-compose-flask-redis-haproxy_lb_1 ... done

查看状态:

iie4bu@hostdocker:~/ddy/docker-compose-flask-redis-haproxy$ docker-compose psName                                 Command               State                    Ports
-----------------------------------------------------------------------------------------------------------------------------
docker-compose-flask-redis-haproxy_lb_1      /sbin/tini -- dockercloud- ...   Up      1936/tcp, 443/tcp, 0.0.0.0:8082->80/tcp
docker-compose-flask-redis-haproxy_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp
docker-compose-flask-redis-haproxy_web_1     python app.py                    Up      80/tcp 

测试访问:

iie4bu@hostdocker:~/ddy/docker-compose-flask-redis-haproxy$ curl 127.0.0.1:8082
Hello Container World! I have been seen b'1' times and my hostname is 9603ec0f2527.

测试通过。

接下来测试使用多个web服务:

先将之前的docker-compose down。

启动三个web服务:

iie4bu@hostdocker:~/ddy/docker-compose-flask-redis-haproxy$ docker-compose up --scale web=3 -d
WARNING: The Docker Engine you're using is running in swarm mode.Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node.To deploy your application across the swarm, use `docker stack deploy`.Creating network "docker-compose-flask-redis-haproxy_default" with the default driver
Creating docker-compose-flask-redis-haproxy_web_1   ... done
Creating docker-compose-flask-redis-haproxy_web_2   ... done
Creating docker-compose-flask-redis-haproxy_web_3   ... done
Creating docker-compose-flask-redis-haproxy_redis_1 ... done
Creating docker-compose-flask-redis-haproxy_lb_1    ... done
iie4bu@hostdocker:~/ddy/docker-compose-flask-redis-haproxy$ docker-compose psName                                 Command               State                    Ports
-----------------------------------------------------------------------------------------------------------------------------
docker-compose-flask-redis-haproxy_lb_1      /sbin/tini -- dockercloud- ...   Up      1936/tcp, 443/tcp, 0.0.0.0:8082->80/tcp
docker-compose-flask-redis-haproxy_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp
docker-compose-flask-redis-haproxy_web_1     python app.py                    Up      80/tcp
docker-compose-flask-redis-haproxy_web_2     python app.py                    Up      80/tcp
docker-compose-flask-redis-haproxy_web_3     python app.py                    Up      80/tcp

依次访问我们的HAproxy:

iie4bu@hostdocker:~/ddy/docker-compose-flask-redis-haproxy$ curl 127.0.0.1:8082
Hello Container World! I have been seen b'1' times and my hostname is 9a2d714aadad.
iie4bu@hostdocker:~/ddy/docker-compose-flask-redis-haproxy$ curl 127.0.0.1:8082
Hello Container World! I have been seen b'2' times and my hostname is eda311882f3f.
iie4bu@hostdocker:~/ddy/docker-compose-flask-redis-haproxy$ curl 127.0.0.1:8082
Hello Container World! I have been seen b'3' times and my hostname is 43f69f733c5e.
iie4bu@hostdocker:~/ddy/docker-compose-flask-redis-haproxy$ curl 127.0.0.1:8082
Hello Container World! I have been seen b'4' times and my hostname is 9a2d714aadad.
iie4bu@hostdocker:~/ddy/docker-compose-flask-redis-haproxy$ curl 127.0.0.1:8082
Hello Container World! I have been seen b'5' times and my hostname is eda311882f3f.
iie4bu@hostdocker:~/ddy/docker-compose-flask-redis-haproxy$ curl 127.0.0.1:8082
Hello Container World! I have been seen b'6' times and my hostname is 43f69f733c5e.

发现是轮询我们的web服务,haproxy会转发请求到三个web服务上。

我们目前的扩展是单机环境下的scale,无论将service扩展到多少,只能限制在单机环境下。但是一台服务器的资源是有限的,那么如何扩展多台服务器?那么就是需要使用swarm技术了。

从零开始学习docker(十三)Docker Compose--scale相关推荐

  1. [297]从零开始学习Docker

    这篇文章是我学习 Docker 的记录,大部分内容摘抄自 <<Docker - 从入门到实践>> 一书,并非本人原创. 学习过程中整理成适合我自己的笔记,其中也包含了我自己的实 ...

  2. 从零开始学习docker(八)多台机器通信

    撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 在上一节中,我们介绍了在同一个机器里面同一个docker里面不同的容器如何进行通信的.这一节我们介绍如何在不同的 ...

  3. 从零开始学习docker(零)简单介绍Dockerfile

    如果不使用docker,面临的问题有: 部署非常慢 成本非常高 资源浪费 难于迁移和扩展 可能会被限定硬件厂商 虚拟化技术的优点: 虚拟化技术出现以后,一个物理机可以部署多个App,每个App独立运行 ...

  4. 物联网架构成长之路(24)-Docker练习之Compose容器编排

    0.前言 一开始学的之后,是想一步到位直接上Kubernetes(K8s)的,后面没想到,好像有点复杂,有些概念不是很懂.因此学习东西还是要循序渐进,慢慢来.先了解单机编排技术Docker Compo ...

  5. Docker学习五:Docker 数据管理

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  6. Docker学习四:Docker 网络

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  7. Docker学习一:Docker简介与安装

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  8. docker三剑客之 Docker Machine Docker Compose Docker Swarm

    Docker 三剑客 一.docker machine 1.Docker Machine 简介 2.Docker Machine实践 二.docker-compose 1.docker-compose ...

  9. Docker容器之compose容器集群的快速编排

    Docker容器之compose容器集群的快速编排 前言 一.Docker-compose简介 二.YAML文件格式及编写注意事项 (1)YAML文件格式 (2)YAML格式的注意事项 (3)YAML ...

  10. Docker学习第一课 -- docker简介和和学习路线

    Docker是一个用于开发,交付和运行应用程序的开放平台.Docker使您能够将应用程序与基础架构分开,从而可以快速交付软件.借助Docker,您可以以与管理应用程序相同的方式来管理基础架构.通过利用 ...

最新文章

  1. vue -- 动态加载组件 (tap 栏效果)
  2. day36 fullstack gevent模块 IO阻塞和非阻塞 IO多路复用 异步IO介绍 其他的补充
  3. python词频统计之《哈姆雷特》_哈姆雷特词频统计,Hamlet
  4. 关于项目文档管理,现在开始就别揪心了!DOClever让你的项目文档纵享丝滑!
  5. 辅助脚本使用教程手册
  6. 最好用的免费搜题软件,一键聚合搜题!中小学、大学都支持
  7. CNN-ResNet
  8. 根据指定的经纬度查询半径为5km的地点
  9. Twitter、Google背后的“卖水人”,力盟科技也来港股分一杯羹?
  10. 用Python生成马赛克画
  11. 高通平台开发系列讲解(USB篇)DWC3控制USB速率
  12. 陈老师排课12A排早晚自习课、假期补课表的方法
  13. 【ES源码分析】强制合并分段(_forcemerge API)源码分析
  14. Jitpack使用指南:maven-publish如虎,jitpack如翼 【安卓Java组件化模块化】【更多gradle技巧】
  15. HDU 2886 Lou 1 Zhuang
  16. 数据结c语言约瑟夫环实验报告,数据结构约瑟夫环实验报告.doc
  17. 特征交互新路线|阿里 Co-action Network论文解读
  18. 蓝桥杯 交换瓶子 Java实现
  19. Axure rp 8中继器基础使用
  20. 如何15分钟快速入门LaTeX公式?

热门文章

  1. 网站如何启用SSL安全证书?IIS7启用新建Https:/
  2. 面试题及答案_NET
  3. BPSK信号matlab,BPSK信号调制解调与MATLAB仿真.docx
  4. 如何用C语言编写PHP扩展的详解
  5. Vue的axios与ajax的区别:axios是对ajax的封装
  6. python local variable_python学习笔记 - local, global and free variable
  7. 转盘抽奖(主要:概率和JQ)
  8. PHP大文件上传问题
  9. 底部居中_中文编程:安卓的底部菜单设计
  10. java核心标签库,16.JSTL标签库(我的JavaEE笔记)