Dockerにubuntuをインストール後、nginxを入れてサイトを表示したい。
5/1 自分の理解では、nginxのインストールは終わって、これでサイト表示されるはずなのに、localhostで表示できないから、ここまでをいったん整理。
docker pull ubuntu:16.04
でubuntuのイメージを引っ張ってきた。
docker images
まえに18.04もとってたので、とりあえずこれだけある。
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の結果… ちゃんとキテル。
apt install ufw
ufw allow 80
80番ポートを開放する。
apt install lsof
lsof -i:80
lsofコマンドで、どのポートが埋まっているか調べたかった。80番ポートはnginxがちゃんと使っているっぽい?
ここまでで、きっとブラウザから見れると思っていたのだけれど…
ubuntuはしっかり動いているようだし(STATUS Up ~minutes)
ローカルホストの8000と、ubuntuの80ポートも繋がってそうなのだけど…
なぜ…(´;ω;`)
→解決したー!!
参考となった記事は
https://qiita.com/amuyikam/items/ef3f8e8e25c557f68f6a
私の環境的に、WindowsのHomeなので(Proじゃない)、DockerはデフォルトのDockerじゃなくてDockerToolBoxなるもので動かしているんだけど、そこに原因があった。
DockerToolBoxだと、virtualボックス上でDockerが動いてるみたい。だから、ubuntuとDockerの間はちゃんと動いてたんだけど(ポートの8000と80のリンクは出来て、nginxもちゃんと動いてた)、ホストOSのローカルホストでアクセスするなら、間にvirtualboxがあるので、virtualBoxでもポートフォワーディング(こっちのポート~番で、そっちのポート何番にアクセスするよ~)という設定。
virtualboxの設定は、上にある通り。
こんな感じで、ホスト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のポートフォワードをって感じ。