コンテナのメンテナンス
Apacheの起動という意味では、もうこれで終わりです。このようにコンテナを使ったApacheの起動はとても簡単です。もう、yumとかapt-getとかを実行して、それから起動スクリプトを設定して......といったようなことは必要ないのです。覚えておかなければならないことは「docker container run」、これだけです。とはいえ、停止や再開などDockerコンテナのメンテナンスをしなければならないこともあるので、最後にメンテナンスについて簡単に補足しておきます。
コンテナの停止
何らかの事情で、コンテナを停止したいときは、docker container stopを使います。引数には「コンテナ名」もしくは「コンテナIDの先頭何文字か」を指定します。これはdocker container stopに限ったことではなく、対象のコンテナを指定する場合は毎回この指定方法をとります。
次の通りにすればmyapacheという名前を付けたコンテナが停止します。
$ docker stop myapache
docker container psで確認すると、もう表示されません。
$ docker conttainer ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
「-a」オプションを指定すると、停止中のものも含めてすべて表示されます。STATUSが「Exited」であり、停止中であることがわかります。停止中の場合は、もちろん、「http://サーバー名/」でアクセスしても、無応答です。
$ docker container ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4e25eb1ffa42 httpd "httpd-foreground" 13 minutes ago Exited (0) About a minute ago myapache
コンテナの再開
docker container startでコンテナを再開できます。
$ docker container start myapache
このあと、再度確認すると、「Up」となっていることがわかります。
$ docker container ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4e25eb1ffa42 httpd "httpd-foreground" 15 minutes ago Up 7 seconds 0.0.0.0:80->80/tcp myapache
コンテナ内での操作
コンテナの中に入り込んでファイルを確認したりコマンドを実行したりすることもあるでしょう。そのときは、docker container execコマンドを使います。このコマンドは、実行中のコンテナについてのみ有効です(実行していないときは、docker container startコマンドまたはdocker container runコマンドを使います)。
docker container execコマンドは、コンテナの内部で任意のプログラムを実行するコマンドです。コマンドとして/bin/bashなどのシェルを指定することで、コンテナに入り込んで操作できるようになります。このときオプションとして「-it」を指定する(もしくは「-i」「-t」とわけてもよい)ようにします。これはキーボードや画面をコンテナと結び付けるために必要なオプションです。
$ docker container exec -it myapache /bin/bash
するとコンテナ内でシェルが起動し、プロンプトが表示されます。ここで任意のコマンドを入力すれば、そのコマンドはコンテナの内部で実行されます(4e25・・・というのはコンテナIDです)。
root@4e25eb1ffa42:/usr/local/apache2#
操作が終わったら「exit」と入力すると、Dockerホストに戻れます。「exti」と入力して戻ってください。
Ctrl+P、Ctrl+Qで切り替える
コンテナの内部で操作しているときは、Ctrl+P、Ctrl+Qを順に押すと、一時的にコンテナの内部から出てDockerホストに戻れます。もう一度コンテナにつなぎたいときは、docker container attache コンテナ名(またはコンテナIDの先頭一部)と入力すると、コンテナ内の作業を再開できます。
vimなどのエディタがない
コンテナはファイルサイズを抑えるため、必要ないソフトは含まれていません。例えばhttpdコンテナの場合、エディタのvimなども含まれていません。
もしそうしたものが必要であれば、コンテナに入ったあと、追加でインストールしてください。httpdコンテナはDebianをベースに作られているので(GitHubにあるソースファイル「https://github.com/docker-library/httpd/blob/master/2.4/Dockerfile」の先頭の「FROM」のところで確認できます)、apt-getなどを使って必要に応じて追加でインストールすれば、さまざまなソフトをコンテナ内で使えるようになります。
ログの表示
コンテナは慣例的に標準出力にログを書き出すように構成されています。標準出力に構成されたログは、docker container logsで表示できます。httpdコンテナの場合、アクセスログが表示されます。
$ docker container logs myapache AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. 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.2. Set the 'ServerName' directive globally to suppress this message [Wed Aug 05 09:01:24.931686 2020] [mpm_event:notice] [pid 1:tid 140652267885696] AH00489: Apache/2.4.43 (Unix) configured -- resuming normal operations [Wed Aug 05 09:01:24.931884 2020] [core:notice] [pid 1:tid 140652267885696] AH00094: Command line: 'httpd -D FOREGROUND' 172.17.0.1 - - [05/Aug/2020:09:06:42 +0000] "GET / HTTP/1.1" 200 59 172.17.0.1 - - [05/Aug/2020:09:06:42 +0000] "GET /favicon.ico HTTP/1.1" 404 196 172.17.0.1 - - [05/Aug/2020:09:07:34 +0000] "-" 408 - [Wed Aug 05 09:13:27.802453 2020] [mpm_event:notice] [pid 1:tid 140652267885696] AH00492: caught SIGWINCH, shutting down gracefully AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. 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.2. Set the 'ServerName' directive globally to suppress this message [Wed Aug 05 09:16:54.495131 2020] [mpm_event:notice] [pid 1:tid 140605578335360] AH00489: Apache/2.4.43 (Unix) configured -- resuming normal operations [Wed Aug 05 09:16:54.495924 2020] [core:notice] [pid 1:tid 140605578335360] AH00094: Command line: 'httpd -D FOREGROUND'
コンテナやイメージの破棄
コンテナやイメージを破棄するには、次の通りにします。
コンテナの破棄
コンテナを破棄するには、docker container rmを使います。ただし、停止中でなければなりません。次のようにすれば、myapacheを削除できます。
なお、コンテナを削除すれば、その中身のディスクも破棄される点に注意してください。冒頭で説明したように、コンテナは独立したディスクを持っており、それが丸ごと削除されるからです。
ただし、当然ながらマウントされている場合、マウント先が削除されてしまうことはありません。つまり今回の例では、/tmpが削除されてしまうことはありません。
$ docker container stop myapache $ docker container rm myapache
削除すれば、docker container ps -aしても何も表示されません。やり直したいなら、docker runから始めることになります。
イメージの削除
docker runしたときにダウンロードしたイメージは、保存されています。いくつもDockerイメージを試しているとどんどんディスクが圧迫されるので、適時削除しておくとよいでしょう。自分の環境にダウンロード済みのイメージ一覧は、docker image lsで確認できます。
$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE httpd latest 9d2a0c6e5b57 13 days ago 166MB
削除するには、docker image rmを使います。引数には「REPOSITORY」に書かれているリポジトリ名と「TAG」に書かれているタグを「:」(コロン)でつないだものを指定します。ただし「latest」のときは、タグは省略できます。
$ docker image rm httpd Untagged: httpd:latest Untagged: httpd@sha256:2a9ae199b5efc3e818cdb41c790638fc043ffe1aba6bc61ada28ab6356d044c6 Deleted: sha256:9d2a0c6e5b5714303c7b72793311d155b1652d270a785c25b88197069ba78734 Deleted: sha256:d501b5ad5ac59deebf3d002fda60014429d851340ee8f80dfe745e525aaba281 Deleted: sha256:c0ffe105e5d8c201ddc0fa3aa0d75d1f77c88632a5dabe196b1fb837ac83dd73 Deleted: sha256:58da7575a150b2378511246c3d1091d24319d25db05319a07bcda674d089e3a1 Deleted: sha256:5e73f7688a03b2696608629be23d77a75183cc9ac2a5b622b513a8df5ee04573 Deleted: sha256:95ef25a3204339de1edf47feaa00f60b5ac157a498964790c58c921494ce7ffd
未使用のものを全部削除する
一つひとつ削除するのが面倒なときは、「docker container prune」「docker image prune」を使うこともできます。前者は停止中の全コンテナを削除する、後者は現在使っていない全コンテナイメージを削除するという意味です。
まとめ
第2回では、Apacheコンテナの起動を説明しました。Dockerの基本操作が入ったので少し長かったですが、結局Dockerコンテナを起動するには、docker runの使い方を理解するだけです。Apacheを起動する場合、今回やったのは次のコマンドを実行しただけです。-これだけで、ApacheのWebサーバーが起動します。
$ docker container run --name myapache -d -it -p 80:80 -v /tmp:/usr/local/apache2/htdocs httpd
本番運用でこれ以上、もし何かをやらなければならないとしたら、-vオプションのマウント先を調整するぐらいではないでしょうか。このようにDockerを使えば、いとも簡単にサーバーを構築できます。次回以降は、ファイルサーバーやWebメールソフト、ブログサーバーなど、さまざまな実用便利サーバーをDockerコンテナで簡単に構築する方法を説明していきます。