Nginx

Docker 1.13“Swarm Mode”集群的 nginx 反向代理

  • September 2, 2017

我有一個在兩個節點上執行的現有 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 createdocker 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

引用自:https://serverfault.com/questions/871741