nlq-dev-web-publish が 固定IP を向いていました。
- 旧:
tcp:172.19.0.7:5174 - 実際の web:
172.19.0.6:5174
そのため nginx は 127.0.0.1:5174 に投げても、その先の socat が古いIPへ転送して 502 になっていました。
現在の正常状態
これが正常です。
docker inspect nlq-dev-web-publish --format '{{json .Config.Cmd}}'
["tcp-listen:5174,fork,reuseaddr","tcp:172.19.0.6:5174"]
nginx はこのままでOKです。
location / {
proxy_pass http://127.0.0.1:5174/;
proxy_http_version 1.1; proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
次回 502 が出たときの確認コマンド
これを順番に貼れば十分です。
docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}'
docker inspect nlq-dev-web-publish --format '{{json .Config.Cmd}}'
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nlq-dev-web-1
docker logs --tail 50 nlq-dev-web-publish
docker logs --tail 50 nlq-dev-nginx
docker logs --tail 50 nlq-dev-web-1
見るポイントはこれです。
nlq-dev-web-publishのtcp:<IP>:5174nlq-dev-web-1の現在IP- この2つが一致しているか
復旧手順
一致していなければ、これで直せます。
WEB_IP=$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nlq-dev-web-1)
echo "$WEB_IP"docker rm -f nlq-dev-web-publish 2>/dev/null || truedocker run -d \
--name nlq-dev-web-publish \
--restart unless-stopped \
--network host \
alpine/socat \
tcp-listen:5174,fork,reuseaddr tcp:${WEB_IP}:5174docker restart nlq-dev-nginx
確認:
docker inspect nlq-dev-web-publish --format '{{json .Config.Cmd}}'
docker logs --tail 20 nlq-dev-web-publish
docker logs --tail 20 nlq-dev-nginx
毎回これをやらないための設定
いまの構成は 固定IP依存 なので、nlq-dev-web-1 が再起動してIPが変わるとまた起きます。
なので恒久対応はどちらかです。
方法A: 手順書として残す
一番簡単です。nlq-dev-web-1 を再起動したら、必ず nlq-dev-web-publish を作り直す。
方法B: スクリプト化する
これがおすすめです。
たとえば /opt/nlq-dev/scripts/recreate-web-publish.sh を作ります。
cat > /opt/nlq-dev/scripts/recreate-web-publish.sh <<'EOF'
#!/usr/bin/env bash
set -euWEB_IP=$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nlq-dev-web-1)echo "WEB_IP=${WEB_IP}"docker rm -f nlq-dev-web-publish 2>/dev/null || truedocker run -d \
--name nlq-dev-web-publish \
--restart unless-stopped \
--network host \
alpine/socat \
tcp-listen:5174,fork,reuseaddr tcp:${WEB_IP}:5174docker restart nlq-dev-nginxdocker inspect nlq-dev-web-publish --format '{{json .Config.Cmd}}'
EOFchmod +x /opt/nlq-dev/scripts/recreate-web-publish.sh
以後はこれだけです。
/opt/nlq-dev/scripts/recreate-web-publish.sh
さらによい恒久対応
本当は web-publish を 固定IPではなく名前ベース にしたいです。
ただ、今の構成だと host network の socat から bridge network 上の nlq-dev-web-1 名を直接引けないことが多いので、すぐ効くのは上のスクリプト化です。
今回のメモ
nlq-dev-nginxは127.0.0.1:5174を見る127.0.0.1:5174の実体はnlq-dev-web-publishnlq-dev-web-publishはalpine/socatnlq-dev-web-publishは compose 管理外nlq-dev-web-1再起動でIPが変わると、nlq-dev-web-publishが stale になる- stale になると 502
コメントを残す