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

タイガー!タイガー!じれったいぞー!(SE編)

AS400,WAS,GlassFish,Java,JavaEE,JSF等の開発における日々の気づきをまとめたブログ(備忘録)。

【Docker1.7】Nginxコンテナ生成+起動テスト

前回のブログで構築したVagrant(CentOS7.1)をホストOSにして、Nginxコンテナを生成・起動してみたいと思います。

tigertaizo.hatenablog.com

vagrantユーザをdockerグループに所属させる

vagrantをdockerグループに加えることで、vagrantユーザーがdockerコマンドを実行できるようになります。

$ sudo docker images
Get http:///var/run/docker.sock/v1.19/images/json: dial unix /var/run/docker.sock: no such file
 or directory. Are you trying to connect to a TLS-enabled daemon without TLS?
 
$ sudo groupadd docker
$ sudo usermod -g docker vagrant
$ sudo /bin/systemctl restart docker.service
 
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE

Docker HubからNginx(Offical) Dockerイメージを取得

  • Dockerイメージとは、OS環境とアプリケーションを含んだイメージで、これからDockerコンテナの上で仮想的に起動させるものになります。
  • Docker Hubとは、Dockerイメージを共有するためのWebサービス
  • まずは、DockerHubサービスにある、OfficalなNginxイメージを取得してみました(docker pullコマンドを使用)。
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE

$ sudo docker pull nginx
latest: Pulling from docker.io/nginx
e2a4fb18da48: Pull complete
58016a5acc80: Pull complete
657abfa43d82: Pull complete
dcb2fe003d16: Pull complete
c79a417d7c6f: Pull complete
abb90243122c: Pull complete
d6137c9e2964: Pull complete
85e566ddc7ef: Pull complete
69f100eb42b5: Pull complete
cd720b803060: Pull complete
7cc81e9a118a: Pull complete
5c82215b03d1: Pull complete
docker.io/nginx:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Digest: sha256:44e64351e39e67b07799a1ce448cef33aaa88daedbbb5f427fac4eeafe3e148f
Status: Downloaded newer image for docker.io/nginx:latest

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker.io/nginx     latest              5c82215b03d1        4 days ago          132.8 MB

なお、Dockerイメージの取得については、下記のサイトが参考になりました。

thinkit.co.jp

Case1: nginx基本起動

  • 次に、先に取得したnginxイメージをdokcerコンテナの上で起動させてみます。
  • 起動させるdockerコンテナは、名前を付けたほうがいいようなので、起動時に定義します(--name)。
  • オプションdを付けることで、コンテナをバックグランドで実行させます。
  • さらに、ホストOS側のポートと、Dockerコンテナ側のポート番号の紐づけが必要なため、オプションpで80番通しを結び付けます。
$ sudo docker run -d --name nginxTest -p 80:80 nginx
8782411bcb5a89d7429e39af6e44d48809ad5a4b9667bc45a2e1382187c5ee4f
Usage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning.

「Usage of loopback devices is~」という警告がでいますが、よくわかっていません(今回はスルー)。
WindowsPCからブラウザで、「http://192.168.33.10/」へアクセスすると、下記のとおり、nginxが起動できていることを確認できました!

f:id:no14141:20151018161848j:plain

Case2: nginx起動(設定ファイル、htmlドキュメント、ログをホスト側と共有する)

  • nginx基本起動では、自分で作成したhtmlを公開できないので、docker run実行時に、ホストOSとコンテナOSとでヴォリューム共有させます。

その前に、設定ファイル、htmlドキュメント、ログを格納するディレクトリをホストOS上に作成しておきます。さらに、Case1のDockerコンテナにあるファイルをホスト側にコピーさせました。

$ sudo mkdir /opt/nginxTest
$ sudo mkdir /opt/nginxTest/html
$ sudo mkdir /opt/nginxTest/conf
$ sudo mkdir /opt/nginxTest/logs

$ sudo docker cp nginxTest:/etc/nginx/nginx.conf /opt/nginxTest/conf/
$ sudo docker cp nginxTest:/usr/share/nginx/html/index.html /opt/nginxTest/html/
$ sudo docker cp nginxTest:/usr/share/nginx/html/50x.html /opt/nginxTest/html/

さらに、自分で作成したhtmlファイルをホスト側に設置しておきます。

  • /opt/nginxTest/html/test01.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>テスト1</title>
</head>
<body>
<h1>テスト1</h1>
<p>...from DockerTest2</p>
</body>
</html>

さあ、docker runで起動させます。ヴォリューム共有は、オプションvで。今回は、ポートも変更してみました!

$ sudo docker run -d --name nginxTest2 -v /opt/nginxTest/html:/usr/share/nginx/html -v /opt/nginxTest/conf/nginx.conf:/etc/nginx/nginx.conf -v /opt/nginxTest/logs:/var/log/nginx/ -p 8001:80 nginx

f2f8592d06d476fde93ad235d9fb13799a77734d31148e5893b89697cefadd7b
Usage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning.

いい感じです!  ホストOS側のディレクトリに新しいファイルを追加しても、ただちにdockerコンテナのnginxからアクセス可能になります。

f:id:no14141:20151018172239j:plain

アクセスした後、ログファイルも念のため、確認しましたが、きちんとホストOS側のファイルにログが吐き出されているようです!
(ただし、タイムスタンプが標準時間になっていますが・・・)

$ cat /opt/nginxTest/logs/access.log
192.168.33.1 - - [18/Oct/2015:09:24:40 +0000] "GET /test01.html HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0" "-"
192.168.33.1 - - [18/Oct/2015:09:32:46 +0000] "GET /test01.html HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0" "-"
192.168.33.1 - - [18/Oct/2015:09:33:41 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0" "-"
追記:Dockerコンテナのタイムゾーンについて

qiita.com

上記を参考にさせてもらって、コンテナ生成時に、タイムゾーンをホストOS側と共有させたところ、うまくいきました!

$ sudo docker run -d --name nginxTest2 \
 -v /opt/nginxTest/html:/usr/share/nginx/html \
 -v /opt/nginxTest/conf/nginx.conf:/etc/nginx/nginx.conf \
 -v /opt/nginxTest/logs:/var/log/nginx \
 -v /etc/localtime:/etc/localtime \
 -p 8001:80 nginx

Dockerコンテナの操作

  • 最後に、Dockerコンテナを管理するコマンドをまとめまて、今回は終わります。

起動中のDockerコンテナ確認(docker ps)

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                         NAMES
8782411bcb5a        nginx               "nginx -g 'daemon of   50 minutes ago      Up 50 minutes       0.0.0.0:80->80/tcp, 443/tcp   nginxTest

すべてのDockerコンテナ確認(docker ps -a)

$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                         NAMES
8782411bcb5a        nginx               "nginx -g 'daemon of   51 minutes ago      Up 51 minutes       443/tcp, 0.0.0.0:80->80/tcp   nginxTest

まだ、1つしか作っていませんでした。。。

Dockerコンテナ停止(docker stop)

  • コンテナを実行中から停止中にする命令です。
  • docker runコマンド実行時にしていたコンテナ名を指定すれば、楽チンですね。
  • ちなみにDockerコンテナを起動中のまま、ホストOSを再起動したら、コンテナは終了します(当然ですね!)。
$ sudo docker stop nginxTest
nginxTest

Dockerコンテナ開始(docker start)

  • 一度停止状態にしたコンテナを再度、開始する命令です。
  • ホストOS再起動後に、この命令を実行することになるのでしょう。
  • docker runで定義したオプションは、startオプションでは不要です(ポート番号やヴォリューム共有などの再定義は不要)。
$ sudo docker start nginxTest
nginxTest

Dockerコンテナ強制終了(docker kill)

  • 実行中のDockerコンテナを強制終了させる方法です。
  • docker stop で停止できない場合に使うのでしょうか。
$ sudo docker kill nginxTest
nginxTest

Dockerコンテナの削除(docker rm)

  • 不要なDockerコンテナを削除します。
  • ただし、DockerイメージやDockerfileがあれば、いつでもコンテナを生成できる状態にあるでしょう。
$ sudo docker rm nginxTest
nginxTest

$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES