SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

最短で使うDocker入門

Docker入門~Apacheコンテナを起動しよう

最短で使うDocker入門 第2回

  • X ポスト
  • このエントリーをはてなブックマークに追加

コンテナのメンテナンス

 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コンテナで簡単に構築する方法を説明していきます。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
最短で使うDocker入門連載記事一覧

もっと読む

この記事の著者

大澤 文孝(オオサワ フミタカ)

テクニカル・ライター、プログラマ/システムエンジニア。情報セキュリティスペシャリスト、ネットワークスペシャリスト。入門書からプログラミングの専門書まで幅広く執筆。   主な著作として、「Amazon Web Services 基礎からのネットワーク&サーバー構築(共著)」(...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/12831 2020/12/04 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング