首頁 > 軟體

docker中通過nginx+confd動態生成設定的解決方案

2022-03-06 10:00:57

當我們專案越來越多時手動去伺服器修改nginx設定是一件很麻煩而且可能出錯的事情。我們可以通過nginx+confd+設定中心實現一套方案避免出錯並減少繁瑣的流程。

首先直接上nginx+confd的dockerfile

FROM nginx:1.21.6
# 拷貝confd二進位制可執行檔案 https://github.com/kelseyhightower/confd/releases/tag/v0.16.0
COPY ./confd-0.16.0-linux-amd64 /usr/local/bin/confd
# 拷貝wait-for指令碼 https://github.com/Eficode/wait-for
COPY ./wait-for /
# 安裝nc支援wait-for指令碼
RUN apt-get update 
  && DEBIAN_FRONTEND=noninteractive apt-get install -y 
    net-tools 
  && apt-get clean 
  && rm -rf /var/lib/apt/lists/*
RUN apt-get update 
  && DEBIAN_FRONTEND=noninteractive apt-get install -y 
    netcat 
  && apt-get clean 
  && rm -rf /var/lib/apt/lists/*
# 建立組態檔目錄
RUN mkdir -p /etc/confd/conf.d 
# 給可執行許可權
&& chmod +x /usr/local/bin/confd 
&& chmod 777 /wait-for 
# 使用指令碼啟動多程序
&& echo "#!/bin/bash" >> start.sh 
&& echo "nohup /usr/local/bin/confd -config-file /etc/confd/conf/confd.toml &" >> start.sh 
&& echo "nginx -g 'daemon off;'" >> start.sh 
&& chmod 664 ./start.sh 
CMD ["bash", "start.sh"]

如果不想自己生成可以用:

https://hub.docker.com/repository/docker/lablelan/nginx-confd

這裡使用docker-compose來演示如何使用nginx+confd+etcd+etcdkeeper通過圖形化修改nginx設定

version: '2'
networks:
  app-tier:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.22.0.0/16
services:
  Etcd:
    image: 'bitnami/etcd:3.5.2'
    environment:
      - ALLOW_NONE_AUTHENTICATION=yes
      - ETCD_ADVERTISE_CLIENT_URLS=http://etcd:2379
    ports:
      - 2379:2379
      - 2380:2380
    networks:
      app-tier:
        ipv4_address: 172.22.0.2
  EtcdKeeper:
    image: 'deltaprojects/etcdkeeper:latest'
      - 8000:8080
        ipv4_address: 172.22.0.3
  Nginx:
    image: 'lablelan/nginx-confd'
    command: sh -c '/wait-for Etcd:2379 -- bash start.sh'
    depends_on: 
      - Etcd
    volumes:
      - "./confd.toml:/etc/confd/conf/confd.toml"
      - "./nginx.tmpl:/etc/confd/templates/nginx.tmpl"
      - "./myapp-nginx.toml:/etc/confd/conf.d/myapp-nginx.toml"
      - "./nginx.conf:/etc/nginx/nginx.conf"
      - "./conf.d:/etc/nginx/conf.d"
      - 80:80
        ipv4_address: 172.22.0.4

啟動後當通過etcdkeeper建立或更新/myapp/services/web/www/1會動態生成nginx設定(80埠轉發8080埠)並自動生效。這裡ip設定的是內網ip不使用127.0.0.1,因為服務並不跑在nginx容器上(注意www.lablelan.com我本地hosts設定成了127.0.0.1)

這裡埠8080跑的服務是一個簡單的demo服務(nodejs),需要的可以從gitee獲取

https://gitee.com/lablelan/amis-demo

設定完etcd後我們可以看到存取http://www.lablelan.com/select已經成功返回了

可能這樣並不能體現出這個方案的實用性,其實我們可以通過在業務程式碼通過將當前服務資訊註冊到etcd實現服務發現功能,這樣就可以動態地生成nginx設定從而避免手動修改nginx設定減少出錯。

到此這篇關於docker中通過nginx+confd動態生成設定的流程解析的文章就介紹到這了,更多相關docker動態生成設定內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com