欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何解決Docker-Compose內(nèi)置DNS負(fù)載均衡失效問(wèn)題

 更新時(shí)間:2025年05月30日 10:33:57   作者:morris131  
這篇文章主要介紹了如何解決Docker-Compose內(nèi)置DNS負(fù)載均衡失效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Docker Compose實(shí)現(xiàn)負(fù)載均衡

  • 還是對(duì)前面的例子docker-compose.yml稍微修改:
version: "3.8"

services:
  flask-demo:
    build:
        context: .
        dockerfile: Dockerfile
    image: flask-demo:latest
    environment:
      - REDIS_HOST=redis-server
      - REDIS_PASS=${REDIS_PASS}
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:5000"]
      interval: 30s
      timeout: 3s
      retries: 3
      start_period: 40s
    depends_on:
      - redis-server
    deploy:
      replicas: 3
    networks:
      - backend
      - frontend

  redis-server:
    image: redis:latest
    command: redis-server --requirepass ${REDIS_PASS}
    networks:
      - backend
  nginx:
    image: nginx:stable-alpine
    ports:
      - 8000:80
    depends_on:
      flask-demo:
        condition: service_healthy
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
      - ./log/nginx:/var/log/nginx
    networks:
      - frontend

networks:
  backend:
  frontend:

主要是修改flask-demo啟動(dòng)3個(gè)容器。

  • nginx.conf文件的內(nèi)容如下:
server {
  listen  80 default_server;
  location / {
    proxy_pass http://flask-demo:5000;
  }
}
  • 啟動(dòng)服務(wù):
$ docker-compose up -d
Creating network "app8_backend" with the default driver
Creating network "app8_frontend" with the default driver
Creating app8_redis-server_1 ... done
Creating app8_flask-demo_1   ... done
Creating app8_flask-demo_2   ... done
Creating app8_flask-demo_3   ... done
Creating app8_nginx_1        ... done

$ docker-compose ps
       Name                      Command                  State                      Ports
----------------------------------------------------------------------------------------------------------
app8_flask-demo_1     flask run -h 0.0.0.0             Up (healthy)   5000/tcp
app8_flask-demo_2     flask run -h 0.0.0.0             Up (healthy)   5000/tcp
app8_flask-demo_3     flask run -h 0.0.0.0             Up (healthy)   5000/tcp
app8_nginx_1          /docker-entrypoint.sh ngin ...   Up             0.0.0.0:8000->80/tcp,:::8000->80/tcp
app8_redis-server_1   docker-entrypoint.sh redis ...   Up             6379/tcp
  • 訪問(wèn)服務(wù):
$ curl localhost:8000
Hello Container World! I have been seen 4 times and my hostname is 448b5d70d3d8.

$ curl localhost:8000
Hello Container World! I have been seen 5 times and my hostname is 77b2a2314533.

$ curl localhost:8000
Hello Container World! I have been seen 9 times and my hostname is 4eee9c8d54f1.

從運(yùn)行結(jié)果可以發(fā)現(xiàn)我們可以根據(jù)service的名稱訪問(wèn)容器,Docker會(huì)使用內(nèi)置的DNS服務(wù)器將service的名稱解析成IP,如果service對(duì)應(yīng)的容器有多個(gè),nginx會(huì)進(jìn)行負(fù)載均衡。

Docker帶有一個(gè)內(nèi)置的DNS服務(wù)器。默認(rèn)情況下,可以通過(guò)127.0.0.11:53訪問(wèn)服務(wù)器。

這個(gè)DNS的IP可以通過(guò)進(jìn)入容器內(nèi)部查看/etc/resolv.conf獲得:

$ docker-compose exec nginx cat /etc/resolv.conf
nameserver 127.0.0.11
options ndots:0

負(fù)載均衡的實(shí)現(xiàn)

  • 在上面的例子中我們將flask-demo容器的個(gè)數(shù)提高到6個(gè):
$ docker-compose up -d --scale flask-demo=6
app8_redis-server_1 is up-to-date
Creating app8_flask-demo_4 ... done
Creating app8_flask-demo_5 ... done
Creating app8_flask-demo_6 ... done
app8_nginx_1 is up-to-date

$ docker-compose ps
       Name                      Command                  State                      Ports
----------------------------------------------------------------------------------------------------------
app8_flask-demo_1     flask run -h 0.0.0.0             Up (healthy)   5000/tcp
app8_flask-demo_2     flask run -h 0.0.0.0             Up (healthy)   5000/tcp
app8_flask-demo_3     flask run -h 0.0.0.0             Up (healthy)   5000/tcp
app8_flask-demo_4     flask run -h 0.0.0.0             Up (healthy)   5000/tcp
app8_flask-demo_5     flask run -h 0.0.0.0             Up (healthy)   5000/tcp
app8_flask-demo_6     flask run -h 0.0.0.0             Up (healthy)   5000/tcp
app8_nginx_1          /docker-entrypoint.sh ngin ...   Up             0.0.0.0:8000->80/tcp,:::8000->80/tcp
app8_redis-server_1   docker-entrypoint.sh redis ...   Up             6379/tcp

$ docker container ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS                    PORTS
 NAMES
6e1494379165   flask-demo:latest     "flask run -h 0.0.0.0"   53 seconds ago   Up 51 seconds (healthy)   5000/tcp
 app8_flask-demo_6
62733bdccdb8   flask-demo:latest     "flask run -h 0.0.0.0"   53 seconds ago   Up 51 seconds (healthy)   5000/tcp
 app8_flask-demo_5
77e74622fa4e   flask-demo:latest     "flask run -h 0.0.0.0"   53 seconds ago   Up 51 seconds (healthy)   5000/tcp
 app8_flask-demo_4
b67132189d90   nginx:stable-alpine   "/docker-entrypoint.…"   2 minutes ago    Up 2 minutes              0.0.0.0:8000->80/tcp, :::8000->80/tcp   app8_nginx_1
448b5d70d3d8   flask-demo:latest     "flask run -h 0.0.0.0"   2 minutes ago    Up 2 minutes (healthy)    5000/tcp
 app8_flask-demo_1
4eee9c8d54f1   flask-demo:latest     "flask run -h 0.0.0.0"   2 minutes ago    Up 2 minutes (healthy)    5000/tcp
 app8_flask-demo_2
77b2a2314533   flask-demo:latest     "flask run -h 0.0.0.0"   2 minutes ago    Up 2 minutes (healthy)    5000/tcp
 app8_flask-demo_3
215beaad114a   redis:latest          "docker-entrypoint.s…"   2 minutes ago    Up 2 minutes              6379/tcp
 app8_redis-server_1
  • 再次訪問(wèn)我們的服務(wù):
$ curl localhost:8000
Hello Container World! I have been seen 28 times and my hostname is 448b5d70d3d8.

$ curl localhost:8000
Hello Container World! I have been seen 29 times and my hostname is 77b2a2314533.

$ curl localhost:8000
Hello Container World! I have been seen 30 times and my hostname is 4eee9c8d54f1.

$ curl localhost:8000
Hello Container World! I have been seen 31 times and my hostname is 448b5d70d3d8.

$ curl localhost:8000
Hello Container World! I have been seen 32 times and my hostname is 77b2a2314533.

$ curl localhost:8000
Hello Container World! I have been seen 33 times and my hostname is 4eee9c8d54f1.

連續(xù)訪問(wèn)6次之后發(fā)現(xiàn)請(qǐng)求并沒有轉(zhuǎn)發(fā)到我們新啟動(dòng)的3個(gè)容器中,這是為什么呢?

負(fù)載均衡失效原因分析

  • 初步懷疑是DNS解析失效,我們進(jìn)入nginx容器查看DNS在解析flask-demo時(shí)解析出哪些IP:
$ docker-compose exec nginx sh
/ # apk update
fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.14/community/x86_64/APKINDEX.tar.gz
v3.14.10-47-g7553b19fe26 [https://dl-cdn.alpinelinux.org/alpine/v3.14/main]
v3.14.10-42-gd8ce7b89082 [https://dl-cdn.alpinelinux.org/alpine/v3.14/community]
OK: 14983 distinct packages available

/ # apk add bind-tools
(1/11) Installing fstrm (0.6.1-r0)
(2/11) Installing krb5-conf (1.0-r2)
(3/11) Installing libcom_err (1.46.2-r1)
(4/11) Installing keyutils-libs (1.6.3-r0)
(5/11) Installing libverto (0.3.2-r0)
(6/11) Installing krb5-libs (1.18.5-r0)
(7/11) Installing json-c (0.15-r1)
(8/11) Installing protobuf-c (1.3.3-r6)
(9/11) Installing libuv (1.41.0-r0)
(10/11) Installing bind-libs (9.16.39-r0)
(11/11) Installing bind-tools (9.16.39-r0)
Executing busybox-1.33.1-r6.trigger
OK: 31 MiB in 53 packages
/ # dig flask-demo

; <<>> DiG 9.16.39 <<>> flask-demo
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55582
;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;flask-demo.                    IN      A

;; ANSWER SECTION:
flask-demo.             600     IN      A       192.168.96.7
flask-demo.             600     IN      A       192.168.96.2
flask-demo.             600     IN      A       192.168.96.3
flask-demo.             600     IN      A       192.168.96.4
flask-demo.             600     IN      A       192.168.96.8
flask-demo.             600     IN      A       192.168.96.6

;; Query time: 0 msec
;; SERVER: 127.0.0.11#53(127.0.0.11)
;; WHEN: Tue Oct 10 08:45:53 UTC 2023
;; MSG SIZE  rcvd: 184
  • 發(fā)現(xiàn)DNS解析出了6個(gè)IP,然后我們?cè)趎ginx容器中訪問(wèn)flask-demo
/ # curl flask-demo:5000
Hello Container World! I have been seen 281 times and my hostname is 77e74622fa4e.

/ # curl flask-demo:5000
Hello Container World! I have been seen 282 times and my hostname is 4eee9c8d54f1.

/ # curl flask-demo:5000
Hello Container World! I have been seen 283 times and my hostname is 62733bdccdb8.

/ # curl flask-demo:5000
Hello Container World! I have been seen 284 times and my hostname is 448b5d70d3d8.

/ # curl flask-demo:5000
Hello Container World! I have been seen 285 times and my hostname is 6e1494379165.

/ # curl flask-demo:5000
Hello Container World! I have been seen 289 times and my hostname is 77b2a2314533.

在nginx容器內(nèi)訪問(wèn)就能訪問(wèn)到6個(gè)節(jié)點(diǎn),那就說(shuō)明nginx容器中DNS的解析沒有問(wèn)題,問(wèn)題出在Nginx服務(wù)上。

Nginx在啟動(dòng)的時(shí)候會(huì)將代理服務(wù)器域名解析的ip地址緩存起來(lái),后續(xù)不會(huì)再更新這個(gè)緩存,除非重啟。

  • 我們可以給nginx的緩存設(shè)置一個(gè)失效事件來(lái)解決這個(gè)問(wèn)題,nginx.conf配置修改如下:
server {
  listen  80 default_server;
  location / {
    resolver 127.0.0.11 valid=1s; #設(shè)置dns服務(wù)器,緩存時(shí)間改為1s
    set $backend http://web:5000
    proxy_pass $backend;
  }
}
  • 然后再讓nginx重新加載配置,再訪問(wèn)服務(wù),發(fā)現(xiàn)已經(jīng)生效了:
$ docker-compose exec nginx nginx -s reload

$ curl localhost:8000
Hello Container World! I have been seen 414 times and my hostname is 77b2a2314533.

$ curl localhost:8000
Hello Container World! I have been seen 415 times and my hostname is 448b5d70d3d8.

$ curl localhost:8000
Hello Container World! I have been seen 417 times and my hostname is 4eee9c8d54f1.

$ curl localhost:8000
Hello Container World! I have been seen 420 times and my hostname is 77e74622fa4e.

$ curl localhost:8000
Hello Container World! I have been seen 421 times and my hostname is 6e1494379165.

$ curl localhost:8000
Hello Container World! I have been seen 422 times and my hostname is 62733bdccdb8.

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Docker安裝MS?SQL?Server并使用Navicat遠(yuǎn)程連接的操作方法

    Docker安裝MS?SQL?Server并使用Navicat遠(yuǎn)程連接的操作方法

    SQL?Server支持廣泛的應(yīng)用程序開發(fā)接口(API),包括T-SQL、ADO.NET、ODBC、OLE?DB等,并支持多種操作系統(tǒng),包括Windows、Linux和Docker等,這篇文章主要介紹了Docker安裝MS?SQL?Server并使用Navicat遠(yuǎn)程連接,需要的朋友可以參考下
    2023-06-06
  • 使用docker搭建kong集群操作

    使用docker搭建kong集群操作

    這篇文章主要介紹了使用docker搭建kong集群操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • docker下修改mysql配置文件的方法

    docker下修改mysql配置文件的方法

    這篇文章主要介紹了docker下修改mysql配置文件的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-06-06
  • 詳解使用 Docker 構(gòu)建 LNMP 環(huán)境

    詳解使用 Docker 構(gòu)建 LNMP 環(huán)境

    本篇文章主要介紹了使用 Docker 構(gòu)建 LNMP 環(huán)境,詳細(xì)的介紹了配置LNMP 環(huán)境的步驟。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • 使用Docker部署Python Flask應(yīng)用的完整教程

    使用Docker部署Python Flask應(yīng)用的完整教程

    Docker是一種開源的容器化平臺(tái),可以將應(yīng)用程序及其依賴項(xiàng)打包成一個(gè)獨(dú)立的容器,實(shí)現(xiàn)快速部署和跨平臺(tái)運(yùn)行,本文將詳細(xì)介紹如何使用Docker來(lái)部署Python Flask應(yīng)用程序,幫助開發(fā)者更高效地構(gòu)建和部署應(yīng)用,需要的朋友可以參考下
    2024-06-06
  • 詳解Docker如何在前端項(xiàng)目動(dòng)態(tài)插入并使用變量

    詳解Docker如何在前端項(xiàng)目動(dòng)態(tài)插入并使用變量

    這篇文章主要為大家詳細(xì)介紹如何在Docker前端鏡像中設(shè)置變量以及使用變量的方法,文中的示例代碼講解詳細(xì),有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • ubuntu22通過(guò)docker安裝wechat啟動(dòng)后無(wú)界面的問(wèn)題及解決方法

    ubuntu22通過(guò)docker安裝wechat啟動(dòng)后無(wú)界面的問(wèn)題及解決方法

    這篇文章主要介紹了ubuntu22通過(guò)docker安裝wechat啟動(dòng)后無(wú)界面的解決方法,通過(guò)微信創(chuàng)建腳本發(fā)現(xiàn)一系列問(wèn)題,最終在小編的努力下順利解決,下面把解決過(guò)程分享給大家,需要的朋友可以參考下
    2022-07-07
  • Docker Compose部署及基礎(chǔ)使用詳解

    Docker Compose部署及基礎(chǔ)使用詳解

    這篇文章主要介紹了Docker Compose部署及基礎(chǔ)使用詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • docker進(jìn)行RocketMq集群部署方式

    docker進(jìn)行RocketMq集群部署方式

    這篇文章主要介紹了docker進(jìn)行RocketMq集群部署方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • docker容器源碼部署httpd用存儲(chǔ)卷部署網(wǎng)站(推薦)

    docker容器源碼部署httpd用存儲(chǔ)卷部署網(wǎng)站(推薦)

    這篇文章主要介紹了docker容器源碼部署httpd用存儲(chǔ)卷部署網(wǎng)站,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12

最新評(píng)論