# 進階應用

##### 存取 Container 網路

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

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

[![socat-forwarder.png](https://osslab.tw/uploads/images/gallery/2023-01/scaled-1680-/socat-forwarder.png)](https://osslab.tw/uploads/images/gallery/2023-01/socat-forwarder.png)

```bash
# 以 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 更新  


- [Updating Docker Containers With Zero Downtime (linuxhandbook.com)](https://linuxhandbook.com/update-docker-container-zero-downtime/)