Docker 1.13“Swarm Mode”集群的 nginx 反向代理
我有一個在兩個節點上執行的現有 docker swarm 集群,我想添加 nginx 以進行反向代理。我問這個問題是因為我面臨幾個我不知道如何解決的問題。
我的第一個問題是關於在 Swarm 中執行 nginx 並能夠使用它們的專有名稱訪問我的應用程序容器。首先,這是輸出
docker network ls
6897486e798b bridge bridge local 3c5b72414821 docker_gwbridge bridge local 6f762b23ff12 host host local uwy3qfuu4oos ingress overlay swarm 0e867cd5a3bf none null local
我是否需要創建另一個覆蓋網路並將 Nginx 設置為在該覆蓋網路中。我正在通過以下方式創建 nginx 服務:
docker service create rproxy -p 80:80 --mount type=volume,source=rproxy,target=/etc/nginx --mode=global nginx:alpine
使用此命令,在我的所有節點中都創建了 nginx,我可以使用瀏覽器訪問預設的 nginx“hello world”螢幕。
因為,我為 nginx 配置安裝了一個卷,所以我可以從
/var/lib/docker/volumes/rproxy/_data
. 所以,我進入/etc/nginx/conf.d
,刪除default
並創建了一個簡單的虛擬主機:server { listen 80; location / { proxy_pass http://myapp:80; } }
當我重新啟動 nginx 時,由於 nginx 錯誤,我的伺服器沒有啟動
Host "myapp" does not exist
。我知道,如果我從myapp
服務中公開任何埠,我將能夠使用以下方式進行代理:proxy_pass http://0.0.0.0:SOME_PORT;
我不公開任何埠,但想使用它們各自的服務名稱訪問我的容器。這可能嗎?如果是,我該怎麼做?
我的第二個問題是關於配置文件的儲存。有沒有辦法在 swarm中創建單個卷並從所有節點訪問該卷?我什至不介意卷是否儲存在集群管理器伺服器中,因為 nginx 將配置載入到記憶體中,這不會影響性能。
編輯:安裝時我沒有檢查 Docker 版本,認為 1.13 是最新的。Docker 版本 17.06.1-ce,建構 874a737
我是否需要創建另一個覆蓋網路並將 Nginx 設置為在該覆蓋網路中。
nginx 容器和您的目標應用程序需要在同一個 docker 網路上才能在容器之間進行通信。您可以將 nginx 容器添加到多個特定於應用程序的網路,或者您可以創建一個代理網路並將所有應用程序附加到該網路。通過該
docker run
命令,您可以連接到單個網路。對於多個網路的困難方式,您可以docker create
在docker network connect
執行docker start
. 最簡單的方法是使用 docker-compose.yml 文件,該文件自動執行這些步驟以將您的容器連接到多個網路。有沒有辦法在 swarm 中創建單個卷並從所有節點訪問該卷?我什至不介意卷是否儲存在集群管理器伺服器中,因為 nginx 將配置載入到記憶體中,這不會影響性能。
您可以創建一個連接到遠端 nfs 伺服器的捲。以下是使用遠端 nfs 共享的 docker 命令的一些範例:
# create a reusable volume $ docker volume create --driver local \ --opt type=nfs \ --opt o=addr=192.168.1.1,rw \ --opt device=:/path/to/dir \ foo # or from the docker run command $ docker run -it --rm \ --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,volume-opt=o=addr=192.168.1.1,volume-opt=device=:/host/path \ foo # or to create a service $ docker service create \ --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,volume-opt=o=addr=192.168.1.1,volume-opt=device=:/host/path \ foo