今回やりたいことは前回せっかく準備した環境をつかって、Docker経由でコンテナを操作してみる、です。
①Docker上でコンテナの簡単な操作をやってみる
②Webサーバ(nginx)を構築してみる
第3回 コンテナ操作をしてみます
まずそもそもDocker上でコンテナを操作した時にどんなことが起きるのかを整理してみます。
・コンテナの実態はイメージと呼ばれるもの
・イメージとは **コンテナに格納されるアプリケーションやアプリケーションの実行に必要な設定ファイル、実行環境、ミドルウェア、ライブラリなどをひとまとめにした、ファイル、設定情報のかたまり**
・Dockerのイメージ(仮想マシンでいうところのVMイメージ)は、Web上のDocker Hubで公開 https://hub.docker.com/を見ると、どんなイメージが公開されているか確認できる。
・そこからDockerイメージを取得してくれば、すでに必要なミドルウェアなどがインストールされた状態のDockerコンテナを起動でき、すぐに使用できる。
…なんかあまりに簡単そうに見えてるので余計怪しいです。
ではさっそく操作手順
①Docker上でコンテナの簡単な操作をやってみる
A, 公式に用意されているhello-worldのイメージを使い、Dockerのコンテナを動作させてみる
//Dockerを実行してみる
docker run hello-world
B, 裏側で動いた処理について補足
・hello-worldのDockerイメージの取得
*docker run hello-worldでは、ローカルにhello-worldのイメージが存在しない場合、Docker Hubからイメージの取得を行う処理が走る
・取得したイメージを元にコンテナの作成
・作成されたコンテナの起動
docker runコマンド自体はコンテナの生成と起動に使うコマンドみたいですが、今回はイメージがローカルにないため、イメージ取得の処理からスタートしているみたい。
C, 状態を確認できるコマンドをいくつか試してみる
・どのようなイメージがDocker Hubに登録されているかはdocker searchコマンドを使って調べる
// hello-worldイメージの検索
docker search hello-world
・表示されたイメージを取得する場合はdocker pullコマンド
// hello-worldイメージの取得
docker pull hello-world
②Webサーバ(nginx)を構築してみる
参考リンク
https://knowledge.sakura.ad.jp/13265/
https://qiita.com/k5n/items/2212b87feac5ebc33ecb
A, nginx のログを出力する nginx/log ディレクトリをホスト側に作成しておく
mkdir -p nginx/log
B, Dockerがインストールされた環境で以下を実行
docker run -d -p 8080:80 -v $(pwd)/nginx/log:/var/log/nginx --name webserver nginx
-p 80:80 はホスト側の8080番ポートをコンテナ側の80番ポートに転送するように指定。
-v (pwd)/nginx/log:/var/log/nginx はホストのディレクトリ($(pwd)/nginx/log)をコンテナのディレクトリ(/var/log/nginx)としてマウント。
ホスト側のディレクトリも絶対パスで指定する。
C, localhost接続で、Webサーバーにアクセスできることの確認。
//ブラウザのURL欄に入力
http://localhost:8080/
D, アクセスログも確認しておきます。
cat nginx/log/access.log
応用編(nginx)
①' プチ応用として、自分でコンテナをイメージ化して一通り起動や削除ができるようになっておく。
D, コンテナをイメージ化し、実行する
//コンテナをイメージ化 (commit)
test01@test01-virtual-machine:~$ docker commit 728e3e106318 nginx2
//commit してイメージ化したものから run
test01@test01-virtual-machine:~$ docker run -d -p 8080:80 -v $(pwd)/nginx2/log:/var/log/nginx2 --name webserver2 nginx2
//コンテナを停止 (stop)
test01@test01-virtual-machine:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bdfe1b9ed360 nginx2 "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 0.0.0.0:8080->80/tcp, [::]:8080->80/tcp webserver2
test01@test01-virtual-machine:~$ docker stop bdfe1b9ed360
bdfe1b9ed360
//コンテナを起動 (start), 実行中コンテナ一覧確認 (ps)
test01@test01-virtual-machine:~$ docker start bdfe1b9ed360
bdfe1b9ed360
test01@test01-virtual-machine:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bdfe1b9ed360 nginx2 "/docker-entrypoint.…" 3 minutes ago Up 2 seconds 0.0.0.0:8080->80/tcp, [::]:8080->80/tcp webserver2
E, コンテナを停止し、削除する
//コンテナを停止 (stop), 停止中も含めた全てのコンテナ一覧確認 (ps -a)
test01@test01-virtual-machine:~$ docker stop bdfe1b9ed360
bdfe1b9ed360
test01@test01-virtual-machine:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
//いらなくなったコンテナを削除 (rm)
test01@test01-virtual-machine:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bdfe1b9ed360 nginx2 "/docker-entrypoint.…" 4 minutes ago Exited (0) 24 seconds ago webserver2
728e3e106318 nginx "/docker-entrypoint.…" 35 minutes ago Exited (0) 10 minutes ago webserver
18c9beca4a89 hello-world "/hello" 50 minutes ago Exited (0) 50 minutes ago youthful_heisenberg
45fceaafa6b5 hello-world "/hello" About an hour ago Exited (0) About an hour ago gallant_mclean
test01@test01-virtual-machine:~$
test01@test01-virtual-machine:~$ docker rm bdfe1b9ed360
bdfe1b9ed360
test01@test01-virtual-machine:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
728e3e106318 nginx "/docker-entrypoint.…" 36 minutes ago Exited (0) 10 minutes ago webserver
18c9beca4a89 hello-world "/hello" 50 minutes ago Exited (0) 50 minutes ago youthful_heisenberg
45fceaafa6b5 hello-world "/hello" About an hour ago Exited (0) About an hour ago gallant_mclean
//いらなくなったイメージを削除 (rmi)
test01@test01-virtual-machine:~$ docker rmi -f hello-world
Untagged: hello-world:latest
Untagged: hello-world@sha256:d211f485f2dd1dee407a80973c8f129f00d54604d2c90732e8e320e5038a0348
Deleted: sha256:d2c94e258dcb3c5ac2798d32e1249e42ef01cba4841c2234249495f87264ac5a
//イメージが存在しないのでrunするとPullから始まる
test01@test01-virtual-machine:~$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1ec31eb5944: Already exists・・・
まとめ
ツールがインストール済みのDockerイメージはいろいろと公開されています。
例えば、postgresやPython,wordpress, さらにbitnamiのデータサイエンス系のイメージなどもDockerHubに公開されており、上記と同程度のコマンドで起動することができます。
そのためDockerを使えば、ちょっと気になったツールを上記のようにすぐ使用できるので、とても便利。
上記は一般に公開されているDockerイメージを使いましたが、自分でDockerイメージを作成することができます。
さらにそれを他の人にも取得してもらえば、簡単に同じ環境を作るような構築運用も可能みたいです。
参考リンク
https://qiita.com/takusan64/items/4d622ce1858c426719c7
https://qiita.com/k5n/items/2212b87feac5ebc33ecb