Nginx

無法使用 podman 在兩個 rootfull 容器之間進行通信

  • April 29, 2020

我有兩個 nginx 容器正在執行。

一個正在偵聽埠 80,另一個正在偵聽 8080。

這是我執行它們的方式:

sudo podman run --rm \
-t \
-p 8080:80 \
--publish-all \
--name nginx-two \
-v ./html2/:/usr/share/nginx/html \
-v ./html2/conf/default.conf:/etc/nginx/conf.d/default.conf \
-d nginx

第二:

sudo podman run --rm -t -p 80:80 --name nginx -v ./html/:/usr/share/nginx/html -v ./html/conf/conf.d:/etc/nginx/conf.d -d nginx

NGiNX 配置:

location / {
   proxy_pass http://10.88.0.37:8080;
}

我也試過:

location / {
   proxy_pass http://127.0.0.1:8080;
}

此配置由--name=nginx容器使用。

這是我得到的錯誤:

2020/01/26 15:33:05 [error] 8#8: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 10.88.0.1, server: , request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8080/", host: "localhost"
10.88.0.1 - - [26/Jan/2020:15:33:05 +0000] "GET / HTTP/1.1" 502 157 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0" "-"

有沒有辦法讓這些容器相互通信?

我也嘗試使用--pod. 但後來得到這個錯誤:

Error: cannot set port bindings on an existing container network namespace

您不應該使用--publish-all,因為 podman-run 的手冊頁表明這會將所有公開的埠發佈到主機介面的隨機埠。因此,該-p選項就足夠了。

創建一個兩個容器都可以使用的專用網路可以幫助您解決問題,然後您可以使用該命令的--network=network-id選項來引用它。run

使用 pod 時,埠映射應該在 pod 本身上定義,而不是在該 pod 內的容器上:

podman pod create --name mypod -p 80:80

由於埠 80 衝突,無法在具有兩個 nginx 實例的單個 pod 中執行。(它使用映像的公開埠)

Red Hat 發表了很好的解釋:https ://www.redhat.com/sysadmin/container-networking-podman

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