対象読者
- Linuxの基礎コマンドを少し知っている方
- 簡単にサーバーを構築したいインフラ技術者、開発者
httpdイメージを使ったWebサーバーを立てる
今回は、実際にApacheが入ったコンテナであるhttpdイメージを使って、Webサーバーを立てていきながら、Dockerの基本を習得しましょう。
コンテナの設計
ここでは下記の内容のコンテナを作ります。
1. イメージ名
Apache入りのイメージの名前は「httpd」です。ここではタグは省略し、最新版を扱うことにします。
2. ポートのマッピング
httpdコンテナは実行時にポート80で待ち受けるように構成されています(これはDocker Hubにあるドキュメントに記載されています)。そこでこのポートをマッピングする指定をします。
3. バインドマウント
httpdコンテナは/usr/local/apache2/htdocs/がドキュメントルートとして構成されています(これもDocker Hubのドキュメントに記載されています)。今回は、このディレクトリをDockerホストの「/tmp」にバインドマウントします(これは例です。実際には/home以下などに配置するのがよいでしょう)。つまり「/tmp」に置いたコンテンツがWebのコンテンツとして見えるようにしてみます。
4. コンテナの名前
「myapache」という名前にします。
5. サーバーとして使うコンテナ
このコンテナはApacheが動くのでサーバーとして使うコンテナとして起動します。
コンテナの作成と実行
コンテナを作成して実行するには、docker container runコマンドを使います。基本書式は、下記の通りです。
$ docker container run オプション イメージ名 実行したいコマンド
(略して「docker run ・・・」とも書けます)。
オプションのうち、ほとんどの場合、付けておいたほうがよいのが--nameオプションです。これは、コンテナに付ける名前を指定するオプションです。
$ docker container run --name コンテナ名 イメージ名 実行したいコマンド
必須ではありませんが、省略するとランダムな名前で付けられてわかりにくいので、多くは明示的に指定します(例外的に、コンテナを1回実行したらすぐに破棄してしまう「-rオプション」を指定する場合は、この限りではありません)。
なお、名前はすでにDockerホスト上に存在している他のコンテナと重複しない名前を指定しなければなりません。
「実行したいコマンド」は、コンテナによっては、既定のコマンドが指定されていることがあり、その場合は省略できます。実際サーバーとして実行する場合は、ほとんど既定のコマンドが指定されています。
コンテナがサーバーとして動くような場合
実際にdocker container runを実行する場合には、さまざまなオプションを指定しますが、中でもサーバーとして動くようなものの場合は、「-d」「-i」「-t」の3つのオプションを付けることがほとんどです。
$ docker container --name コンテナに付ける名前 -d -i -t run イメージ名 実行したいコマンド
1. -d
デタッチモードと呼ばれるモードで実行します。簡単に言うと、バックグラウンドで実行します。サーバーとして動くようなコンテナでは、この「-d」を指定しないと、コンテナが終了するまでプロンプトに戻ってこなくなってしまうので、これは指定必須です。
2. -iと-t
指定しなくてもよいですが、指定しておいたほうが無難です。この連載では説明しませんが、docker container activateというコマンドを使って、コンテナにターミナルを接続して操作するときに必要です。-iは「インタラクティブ」、-tは「疑似端末」の指定ですがその意味の詳細は割愛します。
ポートマッピングやマウント、環境変数の指定
ポートのマッピングやマウント、環境変数を設定するには、次のオプションを使います。どのオプションも複数個指定することもできます。
1. -p ホストのポート:コンテナのポート
ホストのポートとコンテナのポートを「:」(コロン)でつなげて指定することでマッピングします。
2. -v マウント先やボリューム名:コンテナのディレクトリ
-vオプション(または--volume)を使うと、コンテナのディレクトリを、特定のディレクトリやボリュームにマウントできます。バインドマウントするときは、マウント先として「/」から始まるパス名を指定します。そうではないときはボリュームが指定されたものとして扱われます。ボリュームがまだ作られていないときは、ボリュームが作られます。
3. -e 環境変数=値(または--env 環境変数=値)
-eオプション(または--env)を指定すると、環境変数の値を指定できます。
これらのオプションは、docker container runするとき(より正確にはdocker container createするとき)に指定するもので、コンテナの作成後に変更することはできません(変更したいときは、一度、コンテナからDockerイメージを作って待避し、そのDockerイメージから新しいコンテナを作ることで対処します)。
--mountオプション
マウントでは、-v(もしくは--volume)オプションで指定する以外に、--mountオプションで指定する方法もあります。違いは、次の2点です。
1. 書き方が違う
--mountオプションでは、次のように「src=」「dst=」などのようにして記述します。
【ボリュームマウントの場合】
--mount type=volume,src=ボリューム名,dst=コンテナのディレクトリ
【バインドマウントの場合】
--mount type=bind,src=Dockerホストのディレクトリ,dst=コンテナのディレクトリ
2. ボリュームが自動的に作成されない
ボリュームがない場合は、ボリュームが自動作成されず、エラーとなります。そのためボリューム名をスペルミスしたときに、既存のボリュームに割り当てるのではなくて新しく作られてしまうといった凡ミスを誘発しないようになりました。
挙動は同じなので、どちらを指定してもかまいません。最近では、--mountを使うことが推奨されています。
ボリュームの管理
ボリュームは、docker volumeコマンドで操作します。主なコマンドを表にまとめておきます。
コマンド | 意味 |
---|---|
create | ボリュームを作成する |
ls | 一覧取得 |
inspect | 詳細確認 |
rm | 削除 |
prune | コンテナと結び付けられていないのもの全削除 |
Apacheが入ったコンテナを実行してみる
実際にやってみます。httpdコンテナを起動するには、次のようにします。ここでは「myapache」という名前を付けました。-pオプションでポート番号を指定し、また-vオプションで、ドキュメントルートを/tmpに設定する指定もしています。
$ docker container run --name myapache -d -it -p 80:80 -v /tmp:/usr/local/apache2/htdocs httpd
実行に成功すると、もしイメージが手元になければ、Docker Hubからダウンロードされ、それからコンテナが作成されます(すでにダウンロード済み、つまり2回目以降の起動のときは、ダウンロードされません)。
起動の際には、次のような16進数の羅列が表示されます。これはコンテナIDと呼ばれる番号で、コンテナを識別するときに使います。
4e25eb1ffa42316261a5bede586184472ba57ac0133466794d916559cb217d3c
Docker for Desktopの場合は?
Docker for Desktopの場合も、起動方法は同じです。-vオプションのマウント先を、/tmpではなく、自分のドキュメントフォルダなどにmyexampleなどのフォルダを作っておき、そこを指定するとよいでしょう。
$C:\> docker container run --name myapache -d -it -p 80:80 -v C:\Users\yourname\Documents\myexample:/usr/local/apache2/htdocs httpd
起動の確認と停止、再開
作成したコンテナは、docker container psコマンド(またはdocker psやdocker container lsコマンド)で確認できます。
$ docker container ps
実際、先のようにhttpdコンテナを起動したときは、次のような結果となるはずです。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4e25eb1ffa42 httpd "httpd-foreground" About a minute ago Up About a minute 0.0.0.0:80->80/tcp myapache
「CONTAINER ID」というのがコンテナIDで、先ほど起動時に表示された値の先頭何文字かを示したものです。「NAMES」には--nameオプションで指定した名前が設定されていることがわかります。「STATUS」は稼働状況です。「Up」は稼働中であることを示します。そしてPORTSが、ポートの割り当て情報で、Dockerホストの80番が、このコンテナの80番に割り当てられていることがわかります。
なお、docker container psは、稼働中のコンテナしか表示しません。停止中のコンテナも含めて表示するには「-a」オプションを指定しますが、それについてあとで説明します。
実行の確認
この時点でもう、Webサーバーが動いています。「http://サーバー名/」(Docker for Desktopで動かしているなら、自分のPCでhttp://localhost/)と入力すれば、マウントした/tmpの内容が見えるはずです。例えば、/tmpに次の内容のindex.htmlを置けば、ブラウザが、このページを見ることができます。
【index.htmlの例(/usr/local/apache2/htdocsをバインドした先のディレクトリ。今回の流れでは/tmpに置く)】
<html> <body> <h1>Test Container</h1> </body> </html>