Dockerを使ってコンテナを触ってみよう:Dockerの使い方の基本

記事タイトルとURLをコピーする

はじめに

こんにちは。孔子の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の少し踏み入った概念、特徴を取り扱いますので、今までの話を十分復習した上で読んでくださいね。それでは、お元気で!