日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

从零开始学习docker(十三)Docker Compose--scale

發(fā)布時(shí)間:2024/9/16 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从零开始学习docker(十三)Docker Compose--scale 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

擼了今年阿里、頭條和美團(tuán)的面試,我有一個(gè)重要發(fā)現(xiàn).......>>>

環(huán)境準(zhǔn)備,上一節(jié)中的flask-redis項(xiàng)目,將項(xiàng)目啟動(dòng):

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

查看狀態(tài):

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容器中各自只有一個(gè),通過scale可以去擴(kuò)展service。

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

例如將web服務(wù)的數(shù)量變?yōu)槿齻€(gè):

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.

發(fā)現(xiàn)報(bào)錯(cuò)了,原因是接口已經(jīng)被分配了。每個(gè)容器的端口都想綁定到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

執(zhí)行命令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

可以成功執(zhí)行。

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

發(fā)現(xiàn)web端口并沒有映射到主機(jī)的端口,全部是5000container端口。

想象一下假如有多個(gè)web服務(wù),都會(huì)監(jiān)聽本地的5000端口,都會(huì)訪問redis,那么我們就可以有一個(gè)負(fù)載均衡器,可以把訪問量平均的分配到web服務(wù),可以減輕單個(gè)服務(wù)的壓力。如下圖所示:

如果我們用這種方式來部署web服務(wù)的話,以后的擴(kuò)展性是非常強(qiáng)的。例如我們開啟10個(gè)web服務(wù):

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

我們?yōu)榱搜菔菊鎸?shí)的架構(gòu),使用HAproxy做負(fù)載均衡

將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,內(nèi)容如下:

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,內(nèi)容如下:

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

查看狀態(tài):

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.

測試通過。

接下來測試使用多個(gè)web服務(wù):

先將之前的docker-compose down。

啟動(dòng)三個(gè)web服務(wù):

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.

發(fā)現(xiàn)是輪詢我們的web服務(wù),haproxy會(huì)轉(zhuǎn)發(fā)請(qǐng)求到三個(gè)web服務(wù)上。

我們目前的擴(kuò)展是單機(jī)環(huán)境下的scale,無論將service擴(kuò)展到多少,只能限制在單機(jī)環(huán)境下。但是一臺(tái)服務(wù)器的資源是有限的,那么如何擴(kuò)展多臺(tái)服務(wù)器?那么就是需要使用swarm技術(shù)了。

?

總結(jié)

以上是生活随笔為你收集整理的从零开始学习docker(十三)Docker Compose--scale的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。