問題
- Ubuntu上でDockerで立てたコンテナ内からホストOS(Ubuntu)へのアクセスは
host.docker.internal
でできるはずだが、できなかった。 - MacOS用のDockerDesktop環境では
host.docker.internal
でアクセスできた
解決法
1. docker-compose.yml
にextra_hosts
を追加
version: "3"
services:
api:
// 省略
extra_hosts:
- "host.docker.internal:host-gateway"
Ubuntuでufwの設定をする
- Dockerコンテナからホストに繋ぐには、firewallを設定する必要あり
ホストの4001番にアクセスしたい場合
sudo ufw allow proto tcp from 172.16.0.0/12 to any port 4001
- (*)
172.16.0.0/12
はDockerがデフォルトで使うIP
sudo ufw status
↓
To Action From
-- ------ ----
22/tcp DENY Anywhere
2222 ALLOW Anywhere
4001/tcp ALLOW 172.16.0.0/12
22/tcp (v6) DENY Anywhere (v6)
2222 (v6) ALLOW Anywhere (v6)
これでコンテナ内からアクセス成功
詳細、その他考慮事項
セキュリティ面での問題
1. portsよりもexposeが安全
- portsはiptablesを使ってファイアウォールを上書きして、そのポートが外部公開されてしまうため、ファイアウォール(ufw)の設定が意味ない
- exposeはコンテナ間通信だけに限定されるためファイアウォールを上書きしないので安全
version: "3"
services:
db:
container_name: postgres_db
// 省略
expose:
- 5432 // apiからのみアクセスするのでexposeを指定
api:
// 省略
ports:
- 3001:3001 // フロントエンドからアクセスするのでports指定が必要
depends_on:
- db
extra_hosts:
- "host.docker.internal:host-gateway"
2. /etc/default/docker
に以下のオプションを追加
- iptablesでポートを外部公開させないために以下のオプション追加が必要
DOCKER_OPTS="--iptables=false"
参考
https://ngzm.hateblo.jp/entry/2017/08/19/233934
https://qiita.com/jqtype/items/9574ef74868b73323939
https://qiita.com/satons/items/889b541626ca5351fd2e#ubuntu%E3%81%A7ufw%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%82%92%E3%81%99%E3%82%8B