はじめに
こんにちは。孔子の80代目子孫兼技術5課の孔です。最近、仕事でActive Directoryとの死闘を続けた結果、チョットワカル程度までレベルアップすることができました。こんなに認証、認可って奥が深いものなのか…と感動している最近です。ADも一段落ついたので、今日はこちらDockerのブログを更新したいと思います!
先日までの内容を復習してみましょう。1回目のブログではDockerとは、イメージとは、そしてレイヤーとは何かについて説明しました。そして2回目のブログではリポジトリとDockerfile、そしてビルドについてお話ししましたね!今日は実際Dockerを使って前回と前々回お話しした内容をDockerを使って確認しつつ、Dockerでコンテナを実際どうやって作成するのかをみていきたいと思います。今までは理論的な話でしたが、今回は実際Dockerを触ってみましょう。主要なコマンドもいくつか紹介していきますので、今回登場するコマンドは覚えるといいと思います。
それでは、Let's move!!
Dockerコマンドの概要説明
Dockerのコマンドは”マネジメントコマンド”と”コマンド”に分かれています。以下はDockerのコマンドの一つの例となります。
docker container run -it -p 80:80 httpd
"docker"以降がコマンドの様式となります。Dockerのコマンド様式は、[docker "マネジメントコマンド" "コマンド" "オプション"]の形になります。具体的に説明すると、上記のコマンドはDockerの中で"containerに関するコマンド"となります。また、さらに"containerをrunするコマンド"となります。
第一コマンドの例は以下のようなものがあります。
- container:コンテナに関するコマンド。コンテナ起動、削除、停止、ログ確認などができます。
- image:イメージに関するコマンド。イメージ作成、ダウンロードなどができます。
- network:Dockerのネットワークを設定するコマンド。ネットワークを構築、コンテナをアタッチなどができます。
- volume:ボリュームに関するコマンド。コンテナ同士で参照できるマウントポイントに関する操作ができます。
このように、「マネジメントコマンド」を作ったことによってDockerはコマンドを効率的に管理しています。余談ですが、”docker container run”コマンドは"docker run"でも全く同じことができます。”docker run"はマネジメントコマンドを導入する前のコマンドとなります。両方使えますが、せっかくなので最近のやり方で覚えましょう。コマンドがマネジメントコマンド同士で整理されているので、こちらが将来的には使いやすいかと思います。
イメージがレイヤーの重なりであることを確認する
それでは、1回目のブログで紹介した「イメージがレイヤーの重なりである」ことをDockerを使って確認してみましょう。まずローカルにあるイメージを確認します。イメージ一覧を確認するコマンドは"docker image ls"となります。
kong@KongnoAir docker % docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE test2 latest 4221b6ada1b6 5 days ago 95.5MB test latest 98d48c9e8359 5 days ago 95.5MB httpd latest d4e60c8eb27a 9 days ago 166MB ubuntu latest 1d622ef86b13 4 weeks ago 73.9MB
前回作ったtestイメージが残ってますね。今回はhttpdだけ使いたいと思いますので、他のイメージは削除しましょう。イメージを削除するコマンドは"docker image rm [イメージID]"です。
kong@KongnoAir docker % docker image rm 42 98 1d Untagged: test2:latest Deleted: sha256:4221b6ada1b62f303391bb5641fcc005483fab3c15942a7f5714cd26a5e6fb96 <略>
このように、イメージIDは全部入力する必要はありません。被ってなければ最初の一文字だけ入力しても削除することができます。次に、イメージがレイヤーの重なりであることを確認するために中身をみてみましょう。イメージの中身を確認するコマンドは"docker image inspect [イメージID]"となります。
kong@KongnoAir docker % docker image inspect d4 [ { "Id": "sha256:d4e60c8eb27a1e2a9370e6d0120008433b3f543888d3fd8636a2426b3b8b37aa", "RepoTags": [ "httpd:latest" ], <中略> "RootFS": { "Type": "layers", "Layers": [ "sha256:ffc9b21953f4cd7956cdf532a5db04ff0a2daa7475ad796f1bad58cfbaf77a07", "sha256:2a3864bf0abad092e46d1b9af07579e060f0dc6647733777506966bfac4e5220", "sha256:4d7f420ed1cfe829b6594bccb9ae962b31d3f0b09f7241ff5f65b616eb64e506", "sha256:91cd4594943819b101aceaef3f5f96e3280784daf2d21b1e36bff90c2ee3373a", "sha256:50ed22113887f7c70a42a030e092e3643629da71c0b92d9f7dfae61a7b3cd64f" ] }, "Metadata": { "LastTagTime": "0001-01-01T00:00:00Z" } } ]
イメージの中身には、そのイメージをビルドする際に設定した様々な情報が入ってますので、ぜひ一度読んでみて大体どのような情報が乗っているのか読んでみてください。その中に、"Layers"というものがあり、sha256形式で発行された複数のIDがあるのを確認できます。こちらのものがhttpdイメージをビルドする際に使用されたレイヤーとなります。この5つのパーツを重ねるとhttpdイメージと全く同じイメージを作成することができる、とのことですね。
また、httpdが使用するこのレイヤーたちのなかで、もし一致するレイヤーが他のイメージをビルドする際に必要そうであれば、保存したレイヤーを共通のディスクから使用してイメージをビルドすることもできます。このようにレイヤーは管理され、使われています。
イメージからコンテナを作成してみよう
それでは、httpdコンテナを作成してみましょう。もしhttpdイメージがローカルにない方はリポジトリからダウンロードしてきてください。そろそろ慣れてきたのかと思いますが、イメージをダウンロードするのはimageのマネジメントコマンドを使います。コマンドはpullとなります。ですので、”docker image pull httpd”でイメージをダウンロードすることができます。
kong@KongnoAir docker % docker image pull httpd Using default tag: latest latest: Pulling from library/httpd afb6ec6fdc1c: Pull complete 5a6b409207a3: Pull complete 41e5e22239e2: Pull complete 9829f70a6a6b: Pull complete 3cd774fea202: Pull complete Digest: sha256:db9c3bca36edb5d961d70f83b13e65e552641e00a7eb80bf435cbe9912afcb1f Status: Downloaded newer image for httpd:latest docker.io/library/httpd:latest
コンテナのマネジメントコマンドはcontainerとなります。コンテナを作成するコマンドはrunになります。ですので、コンテナを作成するコマンドは"docker container run [イメージ名]"となります。コンテナを作成したら"docker container ls"を入力してみましょう。予想できるかと思いますが、現在起動中のコンテナをリストアップするコマンドとなります。
kong@KongnoAir docker % docker container run -d -p 8080:80 --name httpd_container httpd 4ffebef83b85fc46c1e4dcb8cc6f3c120b30268f8f2957d699b3c351e5e58ec7 kong@KongnoAir docker % docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4ffebef83b85 httpd "httpd-foreground" 38 seconds ago Up 37 seconds 0.0.0.0:80->80/tcp httpd_container
runコマンドに、よく使うオプションを追加してみました。"-d"はバックグラウンドでコンテナのプロセスを動かすオプションです。インタラクティブで操作したいときは"-it"オプションを入れます。"-p"はポートを指定しています。ローカルの8080番ポートと、コンテナの80番ポートをマッピングしています。1個目の番号がローカルポート、2個目の番号がコンテナのポートになります。"--name"はコンテナに名前をつけるオプションです。"docker container ls”コマンドを実行した結果の中に、”NAMES”という欄があるのを確認できるかと思います。こちらに登録される名前を指定します。次回また紹介しますが、Dockerのネットワークで名前解決するためにこの名前が使用されますので、名前を決めておくとコンテナを再度作成する際に、毎回コンテナ同士の通信の際にフォワード先を変えたりする必要がなくなるので運用が楽になります。
次に、コンテナが正常に動いているか確認してみましょう。ブラウザからlocalhost:8080を入力してみると、おなじみの”It works!”を確認できるかと思います。ちなみに、プロセスのログは"docker container logs [コンテナID or コンテナの名前]"で確認できます。ちゃんと訪問履歴が残ってますね。
kong@KongnoAir docker % docker container logs httpd_container AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message [Tue May 26 02:08:43.274214 2020] [mpm_event:notice] [pid 1:tid 140226650358912] AH00489: Apache/2.4.43 (Unix) configured -- resuming normal operations [Tue May 26 02:08:43.274676 2020] [core:notice] [pid 1:tid 140226650358912] AH00094: Command line: 'httpd -D FOREGROUND' 172.17.0.1 - - [26/May/2020:02:17:03 +0000] "GET / HTTP/1.1" 200 45 172.17.0.1 - - [26/May/2020:02:17:04 +0000] "GET /favicon.ico HTTP/1.1" 404 196
最後に、それぞれのコンテナがどれくらいリソースを使用しているのか、コンテナを運用するときは必ず確認しないといけないかと思います。それを確認するコマンドは"docker container stats"となります。現在起動中のプロセス一覧と、それぞれのプロセスがどれくらいリソースを使用しているのかを簡単に確認できますので、見てみてくださいね。
最後に
ざっくりDockerでコンテナを作成するまでの流れと、主要なコマンドについて見てみました。いかがでしょう、Dockerは結構コマンドが多いですが、マネジメントコマンドを導入したことによって直感性のあるコマンドになっていることを確認できたかと思います。従来のDockerコマンドだと、コンテナ一覧を確認するコマンドは"docker ps"、イメージの一覧を確認するコマンドは"docker images"だったんですね。それが"docker container ls"、"docker image ls"になり、よりどのようなコマンドなのかわかりやすくなってきたのではないかと思います。どちらでもできることは同じなので、「コマンドは短い方がいいよ!」と思う方は従来のコマンドを覚えるのもいいと思います。
次回は、Dockerのネットワークとボリュームについてみていきましょう!Dockerの少し踏み入った概念、特徴を取り扱いますので、今までの話を十分復習した上で読んでくださいね。それでは、お元気で!