読者です 読者をやめる 読者になる 読者になる

とっしぃのTech Memo

PHPとかサーバとか他色々言語のメモ的な。あとはたまにガジェットとか。

boot2dockerのポートフォワードで一瞬ハマる

サーバ Linux boot2docker docker

ご無沙汰しております。 とっしぃです。

ホントにブログ続けられてる人ってすごいと思います。

こんな適当な、ぐぐればそこら中に転がってそうなネタでも 書かないことには続けられそうにないのでメモがてら書いておきます。

まぁDockerもboot2dockerもだいぶ今更感のあるネタではあるんですが、 今更感があるだけにちゃんと触ったことないのもどうかと思ってやりはじめたというのがきっかけです。

boot2dockerとは

とりあえず前提から。

  • macとかwindows上で、virtualboxVM使ってその上でDockerを動かすためのクライアント
    • 公式
    • 参考 qiita.com

Dockerとは

コンテナ技術による仮想環境ツール

VMみたいなサーバまるごと仮想化ではなく、コンテナという単位で動作するので色々サクサク。

Docker - Wikipedia

ちなみに言語は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でとかやろう。