Skip to main content

進階應用

存取 Container 網路

有個 Container 服務只需要與同個 Docker Network 的其他 Container 做通訊,平常不需要對外開放通訊埠,只有在開發或 Debug 時才需要從外部存取這個 Container 的網路,但又不想每次都要重啟 container 來開啟關閉需要的 port。

使用一個 socat 的 forwarder container,將外部 port 導入內部目的 container 的 port。

socat-forwarder.png

# 以 Nginx Web 為例
$ docker run -d --name target nginx

$ TARGET_IP=$(
  docker inspect \
    -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \
    target
)

$ NETWORK=$(
  docker container inspect \
    -f '{{range $net,$v := .NetworkSettings.Networks}}{{printf "%s" $net}}{{end}}' \
    target
)

$ docker run -d \
  --publish ${HOST_PORT}:${TARGET_PORT} \
  --network ${NETWORK} \
  --name forwarder nixery.dev/socat \
    socat TCP-LISTEN:${TARGET_PORT},fork TCP-CONNECT:${TARGET_IP}:${TARGET_PORT}
    
$ curl localhost:${TARGET_PORT}
不停機做 Container 更新