Dockerにubuntuをインストール後、nginxを入れてサイトを表示したい。

5/1 自分の理解では、nginxのインストールは終わって、これでサイト表示されるはずなのに、localhostで表示できないから、ここまでをいったん整理。

docker pull ubuntu:16.04
でubuntuのイメージを引っ張ってきた。

docker images
まえに18.04もとってたので、とりあえずこれだけある。

画像1

docker run -it -p 8000:80 --name main --cap-add=NET_ADMIN ubuntu:16.04 /bin/bash
ドッカーを走らせる。ポートはドッカ―の8000ポートとubuntuの80ポートを紐づけているつもり。--cap-add=NET_ADMINはこれまでの経験上、後でufwとうコマンドを使って、ubuntuのポートをあけようとした際に権限で怒られたので、--cap-add=NET_ADMINをつけて、runする。

apt-get update
apt-get install nginx

まずはubuntuをアップデートして、nginxをインストール。

nginx(もしくはservice nginx start)
でしっかりとnginxは起動。

apt install curl
curl localhost

curlっていうコマンドを使いたいので、いったんインストール。curl localhostの結果… ちゃんとキテル。

画像2

apt install ufw
ufw allow 80

80番ポートを開放する。

画像3

apt install lsof
lsof -i:80

lsofコマンドで、どのポートが埋まっているか調べたかった。80番ポートはnginxがちゃんと使っているっぽい?

画像4

ここまでで、きっとブラウザから見れると思っていたのだけれど…

http://localhost:8000/

画像5

ubuntuはしっかり動いているようだし(STATUS Up ~minutes)

画像6

ローカルホストの8000と、ubuntuの80ポートも繋がってそうなのだけど…

画像7

なぜ…(´;ω;`)

→解決したー!!
参考となった記事は

https://qiita.com/amuyikam/items/ef3f8e8e25c557f68f6a


私の環境的に、WindowsのHomeなので(Proじゃない)、DockerはデフォルトのDockerじゃなくてDockerToolBoxなるもので動かしているんだけど、そこに原因があった。

画像9

DockerToolBoxだと、virtualボックス上でDockerが動いてるみたい。だから、ubuntuとDockerの間はちゃんと動いてたんだけど(ポートの8000と80のリンクは出来て、nginxもちゃんと動いてた)、ホストOSのローカルホストでアクセスするなら、間にvirtualboxがあるので、virtualBoxでもポートフォワーディング(こっちのポート~番で、そっちのポート何番にアクセスするよ~)という設定。

virtualboxの設定は、上にある通り。

画像9

こんな感じで、ホストOS側の8081ポートでアクセス(http://localhost:8081/)すると、それはゲストポートDocker側の8000ポートを見ることになる。Dockerの8000ポートは、仮想LinuxOS(ubuntuさん)の80ポートに繋がることになって、80ポートを使用してるWebサーバ(nginxさん)に繋がる。という仕組み。

これで、http://localhost:8081/にて、接続できました!

後は、docker cp /Users/hiros/web/hello.html main:/var/www/html/hello.htmlのコマンドで、hello.htmlファイルを、ubuntuの指定のフォルダに転送してばっちり!http://localhost:8081/hello.htmlを確認できましたとさ。

※ubuntuのどこにhtmlファイルを置けばいいかは、事前に調べてた。
$ grep "root" -r /etc/nginx/ | grep "html"

↓少し認識が違ってたので修正↓
VirtualBox上にまず何らかのLinuxが入ってて、その上にDockerが入ってる。

だから実際には
ホストOS → VirtualBox上のLinux → Docker上のLinux
となっているわけ。

例えばIPをこう振られてたとすると
ホストOS(192.168.10.1)
VirtualBox上のLinux(192.168.99.100)
Docker上のLinux(172.16.10.1)

Dockerの-pオプションでポート指定したことによって
VirtualBox上のLinux(192.168.99.100:8000) → Docker上のLinux(172.16.10.1:80)
でフォワードされるという設定がされる。

でもホストOSからだと、VirtualBox上のLinuxは別OSだから、自身のポートにはまだマッピングされていない。
だから192.168.99.100:8000にアクセスしたときにだけ、Dockerの80につながると。

そこで、今度はホストOSとVirtualBox上のLinuxのポートフォワードをって感じ。





いいなと思ったら応援しよう!