Docker Part 3 - Docker で nginx を構築する
docker-machine コマンドの使用方法・流れ で、docker vm の作成までは出来るようになったので、今回 docker vm に nginx container を立ち上げたいと思う。ここからが環境構築の本番。はやく MEAN とか LAMP 環境を構築したい思うが、急がば回れです。
以前、何度か Docker入門 (全11回) で docker に入門しましたが、その後挫折。 入門して nginx を構築を出来たはいいが、 MEAN とか LAMP の開発環境を構築するのがすごく困難な感じがして。docker コマンド たくさんあるし、複数 container のリンクとか、データの永続化とか、ググればググるほど手強いぞ docker ってなってた・・・。
が、時が経過した今、楽になってますよ。情報も増えてるし、何より docker-compose (複数コンテナの構築)が便利だった。それでは nginx を構築!!
ただし、以下を読むより動画 Docker入門 (全11回) で学ぶほうが分かりやすい。
Step1 docker vm の作成(復習)
とりあえず docker vm を作成・利用する。忘れた方は、こちらでdocker-machine コマンドの使用方法・流れ
$ docker-machine create --driver virtualbox mynginx
$ eval "$(docker-machine env mynginx)"
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM
mynginx * virtualbox Running tcp://192.168.99.100:2376
これで上記の vm にたいして docker コマンドを発行できので、叩いてみる。コンテナがないので何も表示されない。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 参考)eval で vm を指定しなかった場合
$ docker ps
Get http:///var/run/docker.sock/v1.20/containers/json: dial unix /var/run/docker.sock: no such file or directory.
* Are you trying to connect to a TLS-enabled daemon without TLS?
* Is your docker daemon up and running?
Step1.5 簡単な全体イメージ
以下で使用する用語の全体イメージは以下のような感じである。
Dockerfile から Image を作成、Image から Container を立ち上げる
Step2 Dockerfile の作成
Dockerfile ( Image 作成の手順書)を作成する。dir 構成は以下の通り。
mynginx/
└── Dockerfile
Dockerfile は以下の通り。
# Docker file
FROM nginx:latest # イメージの指定
MAINTAINER mizuki-y<mizuki-y@syati.info> # 作成者の情報
上記で手順書と書いたが、2行しかない手順書である。 ただ単に、Image にOfficial Repository nginxを利用しますと記述しただけ。 RUN、CMD とか他にも命令はあるが、今回はシンプルに。いますぐ知りたい!!という場合は、以下を参考に。
Step3 Image の作成
Dockerfile から Image を 作成するため build コマンドを実施する。
# build コマンドのヘルプ見てみる
$ docker build --help
Usage: docker build [OPTIONS] PATH | URL | -
Build a new image from the source code at PATH
## 多いので省略して、今回利用するものだけ
-t, --tag= Repository name (and optionally a tag) for the image
# いろいろありますが、とりあえず OPTIONS -t (名前付け)だけ覚えればいいでしょう。PATH には Dockerfile パスを。
$ docker build -t syati:nginx .
Step4 Image の確認
作成した Image を確認するため images コマンドを実施する。 Step2 で FROM しか指定していないので何も変わっていない(SIZE 同じ)が Dockerfile から Image を作成できている。
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
syati nginx a232c3216f20 9 seconds ago 132.9 MB
nginx latest 0b354d33906d 10 days ago 132.9 MB # ベースとなったイメージ
# 参考) -t オプションつけないと <none> になる
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
<none> <none> dd06038a778d 10 minutes ago 132.9 MB
nginx latest 0b354d33906d 10 days ago 132.9 MB
Step5 Container を立ち上げる
作成した Image から Container を立ち上げるために run コマンドを実施する
# run コマンドのヘルプ見てみる
$ docker run --help
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Run a command in a new container
## 多いので省略して、今回利用するものだけ
-d, --detach=false Run container in background and print container ID
-i, --interactive=false Keep STDIN open even if not attached
-P, --publish-all=false Publish all exposed ports to random ports
-p, --publish=[] Publish a container's port(s) to the host
# コンテナを立ち上げる
$ docker run -P -d syati:nginx
5c70e0b84c91dc04d56fab9b9967765716008bfcb4d1fe102ba34d305994541b
## -P は コンテナで開いているポートと docker vm のポートをランダムにリンクする(以下の PORTS を見るとわかる)
## -d は コンテナをバックグラウンドで実行する(バックグラウンドで実行しないと次のコマンド打てなくなるから大事)
# ps コマンドで 動作を確認する
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5c70e0b84c91 syati:nginx "nginx -g 'daemon off" 46 seconds ago Up 45 seconds 0.0.0.0:32771->80/tcp, 0.0.0.0:32770->443/tcp trusting_lumiere
# 参考) -P でランダムなポートでリンクされても困っちゃうという場合は、以下のとおり -p を使って指定してあげる
$ docker run -p 8000:80 -d syati:nginx
2ac58799de9cfdceb02abf2b6050761801641b93c820097048cb46a9c0be3e6a
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2ac58799de9c syati:nginx "nginx -g 'daemon off" 3 seconds ago Up 3 seconds 443/tcp, 0.0.0.0:8000->80/tcp backstabbing_einstein
Dockerfile のことを少しでも知っていたら、以下の点を疑問に思うかもしれない。
- Dockerfile に CMD を記述していないのに、 COMMAND に nginx -g って・・。
- Dockerfile に EXPOSE を記述していないのに、 PORTSに 80 443 って・・。
これは利用イメージが Official Repository nginx この Dockerfile を利用して作成されているためである。
Step6 nginx のデフォルトページを見る
Step1 で docker vm の ip を確認してポートを付与してあげる。 -p オプションでポートをした場合で考えると以下にアクセスすれば Welcome to nginx! が見れるはず
http://192.168.99.100:8000
その他
container の中身を確認する
$ docker run -t -i syati:nginx /bin/bash
# -t -i オプションは以下の通り
$ docker run --help
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Run a command in a new container
-i, --interactive=false Keep STDIN open even if not attached
-t, --tty=false Allocate a pseudo-TTY