Docker 初心者が Docker の機能を体験してみるには、Apache httpd の Docker イメージを利用して操作をしてみると良いでしょう。 本稿では httpd イメージを利用して WEB サーバーを立ち上げ、WEB サイトをブラウザで表示するまでの一連の流れを解説して Docker を体験してみます。
httpd イメージ
Docker は Docker イメージ をもとに Docker コンテナ を作成・起動して、Docker イメージに含まれる機能を利用する仕組みです。 まずは利用したい機能を持つ Docker イメージを入手する必要があります。 Docker イメージは、インターネット上でイメージを公開するための Docker Hub というリポジトリから取得することができます。
WEB サーバーとして最も有名な Apache httpd だけを含んでいる httpd という Docker イメージも、公式の Docker Hub リポジトリで公開されています。 httpd イメージの Docker Hub ページはこちらです。 このイメージを利用して Docker コンテナを起動すれば、WEB サーバーを起動することができます。
httpd イメージのダウンロード
上で述べたように、まずは Docker イメージを持っておく必要があります。 現在ローカルで持っているイメージを確認するには docker images コマンドを実行します。 当たり前ではありますが、Docker をインストールしてすぐはイメージを1つも持っていませんので、次のコマンド結果のように、結果に何も表示されません。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
それでは httpd のイメージを取得してみましょう。 Docker Hub からイメージを取得するには、 docker pull コマンドを利用します。 docker pull コマンドの書式は次の通りです。
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
今回は最新の Apache httpd を含んだイメージを取得しますので、コマンドの引数に httpd:latest を指定します。 “httpd” がイメージの名前(NAME)で、”latest”がタグ名(TAG)です。 タグ名にはソフトウェアのバージョン番号を指定することが一般的ですが、最新版は “latest” という名前でも表されています。 httpd に指定できるタグは、タグの一覧ページで確認することができます。 また、コマンドでタグ名を省略した場合はデフォルトで “latest” を指定したことになります。 ここでは Apache httpd の最新版をインストールできれば良いのでコマンドは次のようになり、コマンドを実行すると httpd の Docker イメージのダウンロードが開始されます。
$ docker pull httpd
Using default tag: latest
latest: Pulling from library/httpd
cd0a524342ef: Pull complete
e01bb42cce87: Pull complete
6e7c7be0ea3d: Pull complete
403df65071ee: Pull complete
4795d7c9e991: Pull complete
d0d8d0f92d6a: Pull complete
196c9e8739e3: Pull complete
Digest: sha256:45feefe8aea3498417b6b98f63bbe7b51fb106ee6aa1cd0a4b0b38d3a4f36be1
Status: Downloaded newer image for httpd:latest
httpd イメージのダウンロードが完了して手持ちのイメージに追加されたことを確認するため、先ほどと同様に docker images コマンドを実行します。 すると、今度は次のように httpd イメージが追加されたことがわかります。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest ef0aca83ba5a 7 days ago 177 MB
これで Docker イメージの取得は完了です。 なお、取得したイメージを削除する場合は、docker rmi コマンドを実行します。 例えば docker rmi httpd のように実行します。
docker rmi [OPTIONS] IMAGE [IMAGE...]
httpd イメージからコンテナを作成・起動する
Docker イメージの取得ができたら、次は実際に動かしてみましょう。 Docker イメージから Docker コンテナを作成して、イメージに含まれる機能(アプリケーション)を動かすのです。 イメージからコンテナを作成して起動するには、docker run コマンドを実行します。 docker run コマンドの書式は次の通りです。
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
さっそく次の例のコマンドを実行して httpd コンテナを作成・起動してみましょう。 (コマンドのオプションについては、すぐに解説します)
$ docker run -d -p 8080:80 httpd
8e115ce032945a5031ee88146f8a401d54db03fe7a10967abac2869bbf4c5d01
docker run コマンドを実行すると、英数字のIDが表示されます。 これは作成されたコンテナのIDで、今後このコンテナを指定する場合にこのIDが必要になります。
docker run コマンドには様々なオプション(OPTIONS)がありますが、今回指定したオプションは -d と -p オプションです。 -d オプションは、コンテナの実行をバックグラウンドで行うオプションです。 このオプションを指定しなかった場合は、ターミナルのコマンド操作が Ctrl+C を実行するまでコンテナに奪われてしまいます。 ものは試しに -d オプションをつけずに実行してみても良いでしょう、実行後 Ctrl+C でコンテナの操作から抜けることができます。
-p オプションは、コンテナのポート番号とローカルのコンピュータのポート番号を紐づけるオプションです。 今回実行したコンテナは httpd の機能を持っていますので80番ポートで httpd サービスが開始されます。 ただしあくまでも80番ポートでの待ち受けを開始したのはコンテナであり、Docker を実行しているローカルマシンではありません。 そこでこの -p オプションでコンテナとローカルのポートを紐づけることで、あたかもローカルマシンで httpd サービスを提供しているかのような状況を作ることができます。 上の例では、ローカルマシンの8080番ポートをコンテナの80番ポートに紐づけています。
これで httpd コンテナの実行が完了しましたので、http://localhost:8080 にアクセスしてみてください。 するとおなじみの「It work!」の表示がされるはずです。
実行中のコンテナを確認する
本稿の説明に沿って操作をしている場合、今時点では上で起動した httpd のコンテナが実行中のはずです。 現在実行中の docker のコンテナを確認するために docker ps コマンドがあります。 docker ps コマンドを実行した例は次のとおりです。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8e115ce03294 httpd "httpd-foreground" 16 seconds ago Up 15 seconds 0.0.0.0:8080->80/tcp serene_babbage
この結果から、1つだけコンテナが実行中であることがわかります。 このコンテナプロセスが、httpd を動かしているのです。
コンテナの停止・起動
実行中のコンテナを一時的に停止したい場合、docker stop コマンドを利用します。 コマンドの引数として、コンテナのIDを指定する必要があります。
$ docker stop 8e115ce03294
8e115ce03294
コンテナを停止したら、また上と同様に docker ps コマンドを実行してみましょう。 今度は実行結果にコンテナが表示されなくなりました。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
停止させたコンテナも表示させたい場合は、docker ps コマンドに -a オプションをつけて実行します。 表示された結果の STATUS の欄に Exited と表示されている点に着目してください。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8e115ce03294 httpd "httpd-foreground" 12 minutes ago Exited (0) 2 minutes ago serene_babbage
この停止したコンテナを再度起動したい場合は、docker start コマンドにコンテナIDを指定して実行します。
$ docker start 8e115ce03294
8e115ce03294
起動後にまた docker ps コマンドを実行すれば、再度実行中であることがわかります。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8e115ce03294 httpd "httpd-foreground" 13 minutes ago Up 4 seconds 0.0.0.0:8080->80/tcp serene_babbage
自作のWEBサイトを表示する
さて、ここまでで Docker を利用して Apache httpd を実行できることはお分かり頂けたでしょう。 しかし一つ問題は、表示できた WEB サイトは Apache httpd デフォルトの「It work!」という画面だということです。 ここでは、もうひと頑張りして、自作の WEB サイトを表示できるようにしてみましょう。
HTMLの保存場所について
まずは自作した HTML ファイルの保存場所について考察します。 それには Docker コンテナの生存期間について考える必要があります。 そもそも Docker コンテナのような技術はポータビリティの考え方が重要で、「必要な時にコピーして持ってきて起動し、必要なくなったら破棄する」という考え方が根底にあります。 「破棄する」とはコンテナやサーバーごと削除してしまうことを指し、その破棄をする時にファイルのバックアップなどの煩わしい事を考える必要がないことも重要です。 よって、コンテナやサーバー内にバックアップしたいようなコンテンツを保存してしまうと面倒となってしまいます。
このような考え方から、いつ破棄されてしまうか分からないコンテナにはコンテンツやログなどの動的なファイルを保存せず、常時起動されていることが確約されているマシンにコンテンツや動的なファイルを保存するのが良いでしょう。
本稿の場合、起動した Docker コンテナに HTML を保存するのではなく、Docker を起動しているローカルマシン側に HTML を作成して、起動した Docker コンテナからそれを参照するようにします。 そうすることで、Docker コンテナは破棄されても、ローカルマシンにある HTML ファイルには影響がありません。
ボリュームのマウントオプション
docker run コマンドでコンテナを起動する際に、-v オプションを指定することでコンテナにローカルマシンのディレクトリをマウントすることができます。
docker run -v "マウントするディレクトリ:マウント先のパス" 〜
httpd イメージでは、Apache httpd の公開ディレクトリ(DocumentRoot)は、/usr/local/apache2/htdocs/ となっていますので、ボリュームのマウント先としてはそこになります。
自作WEBサイトの作成
ここではテスト用に、/tmp ディレクトリに mypage というディレクトリを作成して、そこに index.html を作成しましょう。
$ cd /tmp
$ mkdir mypage
$ cd mypage
$ echo "This is test page." > index.html
これでテスト用の HTML ファイル /tmp/mypage/index.html が作成されました。
コンテナの起動
それでは上で説明した通り、-v オプションをつけて docker run コマンドを実行してコンテナを起動します。
$ docker run -d -p 8080:80 -v "/tmp/mypage/:/usr/local/apache2/htdocs/" httpd
68d649200872241c68840370c5874d20daeb40a7f36d6c2f0a799b582f5f180a
コンテナの起動が完了したら、ブラウザから http://localhost:8080 にアクセスしてみましょう。 今度は「This is test page.」と書かれたページが表示されたのではないでしょうか。 ローカルのディレクトリがコンテナにマウントされたわけです。
まとめ
本稿の解説はこれで終わりです。 本稿では次のことについて解説しました。
- Docker イメージのダウンロード方法 (docker pull)
- Docker イメージの一覧の確認方法 (docker images)
- Docker コンテナの起動方法 (docker run)
- Docker コンテナの一覧の確認方法 (docker ps)
- Docker コンテナ起動時にボリュームをマウントする方法 (docker run -v)