ガチの備忘録なので、外部からのアクセスを100%遮断できるかどうかについては保証しません
また、個人の見解を含みます
この記事はwindows11環境のdocker desktopを対象とします。
Linuxでは、ローカルipの指定はうまく動作しない可能性があります。
また、docker desktop for win、4.48.0ではバグによりdnsの例は動作しません。
Docker はデフォルトで iptables を用いてブリッジネットワークやポート公開に必要なルールを自動作成します(DOCKER、DOCKER-USER 等)。そのため何も設定しなければホストの任意インターフェース(0.0.0.0)でポートを公開することがあり、ルーターで外向きのポートフォワーディングや UPnP が有効になっていると外部から到達可能になることがあります。
そのため、dockerを同じネットワークでしか使わない場合は、自分のローカルipアドレスを指定しましょう。
この指定はホストがそのIPを持っている場合に限り、接続先として192.168.0.31を指定した場合でのみアクセスできるようになります。外部からのアクセスは未検証です。
もじ自分のコンピューターのみ(= ループバック)アクセス可能にするなら、127.0.0.1を指定しましょう
ネットでは192.168*を指定している記事は記憶の限りでは見当たりませんでした。
また、数字をハードコードせず .env にまとめておくと、環境ごとに衝突を避けつつ安全に運用できます。
.envでの置換がうまくいっているか確認するには、
docker-compose config
を使用します。
.env の設定例
# .env
LOCAL_IP=192.168.0.31 # 自分のPCのローカルIP
DNSMASQ_PORT=53 # 公開したいポート番号
docker-compose
services:
dnsmasq:
container_name: dnsmasq
image: strm/dnsmasq
restart: always
ports:
- "${LOCAL_IP}:${DNSMASQ_PORT}:53/udp"
cap_add:
- NET_ADMIN
- NET_RAW
command: ["--no-daemon", "--address=/example.net/${LOCAL_IP}"]
効果
- 127.0.0.1を指定した場合は、pythonサーバーに127.0.0.1経由でのみアクセスでき、192.168.0.31経由ではアクセスできません。
- 192.168.0.31を指定した場合、pythonサーバーには192.168.0.31経由(ルーター経由)でのみアクセスでき、 127.0.0.1経由ではアクセスできません。