LoginSignup
1
1

DockerコンテナからUbuntuのホストにhost.docker.internalでアクセスできない問題を解決した。

Last updated at Posted at 2024-05-19

問題

  • Ubuntu上でDockerで立てたコンテナ内からホストOS(Ubuntu)へのアクセスはhost.docker.internalでできるはずだが、できなかった。
  • MacOS用のDockerDesktop環境ではhost.docker.internalでアクセスできた

解決法

1. docker-compose.ymlextra_hostsを追加

version: "3"
services:
  api:
    // 省略
    extra_hosts:
      - "host.docker.internal:host-gateway"

Ubuntuでufwの設定をする

ホストの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

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1