Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2021-07-17 - Docker for Linux で Guest(Docker Container) から Host(Linux) にアクセスする #150

Closed
kachick opened this issue Jul 17, 2021 · 1 comment

Comments

@kachick
Copy link
Owner

kachick commented Jul 17, 2021

TL;DR

  1. container 起動時に host-gateway を guest (container) 側の名前解決対象に追加する。
    • docker run なら --add-host=host.docker.internal:host-gateway を付ける
    • docker-compose run なら extra_hosts を付ける
      • extra_hosts:
          host.docker.internal: host-gateway
  2. その上で、 host (Linux) 側の受付対象IPを 0.0.0.0 にする。
    (127.0.0.1 では駄目。172.17.0.1 でも動く可能性は高いが、動かない可能性もあるらしい。)

参考資料

経緯 / History

  1. Docker for Mac がやたら重いので、 Windows + WSL2 に乗り換えるべきか?とも思ったのだけれど、それさえ除けば&ハードウェア的にはやはり Mac が好きなんだよなぁという思いが募った。 ref: 開発用端末に Mac を使っているのだが、Linux とか Windows + WSL2 に変えたほうが良いのだろうか? #7
  2. Mac で Docker を高速化する方法はぐぐると色んな試行錯誤が一杯出てくるが、一番後腐れなく解決出来るのは Mac の上に VM で Linux 走らせてその上で Docker を動かすという手法っぽかった。
  3. Vagrant が 近々 Ruby から Go に乗り換えるということなので、乗り換えた後に使ってみようかとは思っていた ref: 2.4 以降の Go に切り替わった Vagrant を試してみる #138
  4. しかし「それまで待てん!」となったので、今から Vagrant + VirtualBox + Linux(Ubuntu) 構成に再挑戦することにした。
  5. 事前準備的なところは「そうかー、最近の Ubuntu は apt とかじゃなくて snap とやらで入れるんだ・・・」「え、今って telnet じゃなくて nc(netcat) とかいうのが推奨なの?へーっ」みたいな発見は合ったけれど、まぁググりながらコマンド叩くだけで済んだ
  6. Mac から Container を叩くのは Vagrant の config.vm.network 'forwarded_port' 設定で済みそうだった。(実際には再起動とか面倒で VirtualBox から直接設定しちゃったけど)
  7. 問題は Container から Host に空けているポートを叩くところで、これは Docker for Mac だと docker.for.mac.localhost とかで済んでいたのだが、どうやら Linux ではこれに近い物がまだ採用されていないという事が分かった。
  8. ということであれこれ調べた結果、TL; DR の内容で解決したという感じだ。 Mac でも Windows でも host.docker.internal が最新の推奨らしく、Linux では手動でこの値を追加してやればどの環境でも同一 config というか env で使い回せるという話だと理解している。
  9. docker-compose.yml の services が大量な時に全部にこれを入れて回るの面倒なのでなんかできないか?と思ったけれど、 docker-compose の 起動オプションにこれを指定できる物が見当たらなかったのでそうなると YAML を2つに分けて extends だのなんだのするみたいな話になっちゃうようで、ちょっと大仰感はある。
  10. 実際 VirtualBox にして早くなったのかというと、滅茶苦茶早くなった。特に特別 rsync だのなんだの設定せずとも rspec のファイルローディングが 3倍以上になった。体感的にはさらにそれより爆速という感じもあって、これが何由来なのかは面倒で追求していない。
@kachick kachick closed this as completed Jul 17, 2021
@kachick kachick changed the title 2021-07-17 - Docker on Linux で Guest(Docker Container) から Host(Linux) にアクセスする 2021-07-17 - Docker for Linux で Guest(Docker Container) から Host(Linux) にアクセスする Jul 17, 2021
@kachick
Copy link
Owner Author

kachick commented Feb 21, 2024

WSL2 で docker 走らせるとこの方法だとうまくいかない。というか container からは特に指定しなくとも host.docker.internal が別の値で見えているので混乱する。確かこの issue 立てたときは mac から vagrant の VM 使ってた気がする・・・

で、 WSL2 からやる時には docker compose の変数展開で埋め込むと動いた。
この inject を direnv に投げるようにしたら便利だった。 nix shell との合わせも込で direnv は手放せないなー
docker/compose#2915
kachick/lishogi-dev@0828826

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant