boot2dockerのポートフォワードで一瞬ハマる
ご無沙汰しております。 とっしぃです。
ホントにブログ続けられてる人ってすごいと思います。
こんな適当な、ぐぐればそこら中に転がってそうなネタでも 書かないことには続けられそうにないのでメモがてら書いておきます。
まぁDockerもboot2dockerもだいぶ今更感のあるネタではあるんですが、 今更感があるだけにちゃんと触ったことないのもどうかと思ってやりはじめたというのがきっかけです。
boot2dockerとは
とりあえず前提から。
- macとかwindows上で、virtualboxのVM使ってその上でDockerを動かすためのクライアント
Dockerとは
コンテナ技術による仮想環境ツール。
VMみたいなサーバまるごと仮想化ではなく、コンテナという単位で動作するので色々サクサク。
ちなみに言語はgoで書かれてるらしい。
本題
ポートフォワーディングのこと
本題です。
このboot2dockerを使ってDockerのコンテナをローカルのmac上で構築、httpサーバを動かした時に、 いくらやってもローカルのmacからhttpでアクセスできない、と。
Dockerのポートの設定としては、
- Dockerfileに書く
EXPOSE 80 443
- docker runする時に-pオプションでホストとバインドする
$ docker run -p 8080:80 image_name
があるんですが、とりあえず上記設定をしてローカルのterminalから
$ curl localhost:8080
とやっても一向に取得できない(´・ω・`)
調べてみると、boot2dockerはVirtualBox上のVMで走ってるので、 VMのポートフォワード設定もしないといけないらしい。
なんかCLIからもいけるみたい。
$ VBoxManage controlvm "boot2docker-vm" natpf1 "nginx,tcp,127.0.0.1,8080,,80"
GUIコンソールから見てみても確かにできてるぽい。
もっかいチャレンジ。
.
.
.
取得できない(´・ω・`)
なんでやねん(´・ω・`)
ん?そういえばVM上でboot2dockerが走ってるってことは、
コンテナのポート -> VMのポート -> ローカルのポート
って3段階(2段階?)のポートフォワーディングかましてるってことか
つまり現状だと
コンテナ:80 -> VM:8080 -> ローカル:8080
になっちゃってるわけか。
さっきVirtualBoxでやった設定は、VM:80 -> ローカル:8080だから、
コンテナ:80 -> VM:80 -> ローカル:8080
にしないとダメってわけね。納得。
ということでdocker runのオプションを
docker run -p 80:80 image_name
にしてみたら見事に取得できた。
多分これがLinux上とかだと コンテナ:80 -> ローカル:8080 だけでいいんだろうな。
とりあえず解決したのでこれからDocker使ってAPIサーバとWebサーバとDBサーバ立てて フロントはReactでAPIはgoでとかやろう。