前回のブログで構築したVagrant(CentOS7.1)をホストOSにして、Nginxコンテナを生成・起動してみたいと思います。
- vagrantユーザをdockerグループに所属させる
- Docker HubからNginx(Offical) Dockerイメージを取得
- Case1: nginx基本起動
- Case2: nginx起動(設定ファイル、htmlドキュメント、ログをホスト側と共有する)
- Dockerコンテナの操作
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イメージの取得については、下記のサイトが参考になりました。
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が起動できていることを確認できました!
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からアクセス可能になります。
アクセスした後、ログファイルも念のため、確認しましたが、きちんとホスト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コンテナのタイムゾーンについて
上記を参考にさせてもらって、コンテナ生成時に、タイムゾーンをホスト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