Dockerで知っておきたいこと
委細についてはDocker入門書を見ていただくことにして、Dockerで知っておきたいことを、ここでまとめておきます。
使うコマンドはdockerコマンドだけ
Dockerを利用するためのコマンドは、dockerコマンドしかありません。何を操作するのかは、引数で指定します。下記が基本書式です。
$ docker 対象 操作 オプション
対象は「コンテナ」「イメージ」など、さまざまなものがあります。主な対象は以下の通りです(抜粋)。
コマンド | 説明 |
---|---|
container | コンテナに対する操作 |
cp | DockerコンテナとDockerホスト間でファイルをコピーする。docker container cpと同じ |
create | Dockerイメージからコンテナを作成する(ただし実行しない)。docker container createと同じ |
exec | 実行中のコンテナ内でプログラムを実行する。docker container execと同じ |
image | Dockerイメージに対する操作をする |
ps | コンテナ一覧を表示する。docker container psと同じ |
pull | Docker Hubなどのリポジトリからイメージをダウンロードする。docker image pullと同じ |
run | Dockerイメージからコンテナを作成して実行する。必要に応じて、docker container pullでのダウンロードもする。docker container pull、docker container create、docker container startの一連の動作をひとまとめにしたもの |
search | Dockerイメージを検索する |
start | コンテナを開始する。docker container startと同じ |
stop | コンテナを停止する。docker container stopと同じ |
volume | ボリュームを操作する |
あとで説明しますが、例えばコンテナを実行するには「docker container run イメージ名」と入力します。ただし、この「docker 対象 操作 オプション」という統一された表記になったのは最近のことで、昔はそれぞれ別の表記がされていました。こうした理由から「docker container run イメージ名」は、「docker run イメージ名」のように古い書き方をしても動きます。
複数のコンテナを連動させるdocker-compose
Dockerを使うにはdockerコマンドを使うのが基本ですが、「docker-compose」というコマンドもしばしば使われます。これは複数のコンテナをまとめて実行するときに使うコマンドです。
docker-composeコマンドは、一種のユーティリティであり、dockerとは別にインストールします。docker-composeコマンドについては、この連載中で必要になったときに改めて説明します。
ネットワークとストレージ
Dockerを扱うときには、ネットワークとストレージについて知っておく必要があります。
ネットワーク
ここまでコンテナは独立しており、それぞれ別のIPアドレスが割り当てられると説明しました。つまり、コンテナの中で実行されるプログラムは、このコンテナのIPアドレスを通じて通信します。
既定では、DockerホストとこのIPアドレスとは結び付けられていないため、外界からの通信は一切できません。そのためコンテナと通信したいのであれば、ポートのマッピングをします(ネットワークに詳しい人向けに言えば、これはNATのポートフォワードを設定するのと同じです。実際、DockerのネットワークはNATによって構成されています)。
例えばコンテナの中でApacheを起動して、ポート80番で待ち受ける場合、Dockerホストのポート80番をこのコンテナのポート80番にマッピングする設定をします。そうすることで、外界からコンテナと通信できるようになります(ここでは例としてDockerホストとコンテナを同じポート番号にしましたが、同じである必要はありません)。
ストレージ
ストレージもコンテナごとに独立しています。例えばApacheのコンテナを動かす場合、そのコンテナの中には、http://サーバー名/でアクセスしたときのドキュメント(ドキュメントルート)のディレクトリがあるわけで、Webコンテンツを変更したいのなら、そのドキュメントルートを変更する必要があります。
コンテナ内のストレージを変更する1つ目の方法として、docker container cpコマンドを使う方法がまずあります。これはDockerホストとDockerコンテナ間でファイルコピーする手法です。
しかしそれ以外に、さらによい方法として、マウントという方法があります。マウントとは、コンテナ内の特定のディレクトリをコンテナ外のディスクと関連付ける方法です。
この方法なら、ファイルを変更するのに際してマウント先のデータを変更するだけで済みます。それだけでなく、コンテナを破棄しても、そのデータが残るというメリットもあります。
バインドマウントとボリュームマウント
マウントには、「バインドマウント」と「ボリュームマウント」の2種類があります。
バインドマウントは、前述の図の通り、Dockerホストの任意のディレクトリ(もしくはネットワークサーバーなど別のサーバーのディレクトリ)にマウントする方法です。
一方、ボリュームマウントは、Docker Engineが管理する「ボリューム」と呼ばれる領域に保存する方法です。バインドマウントの場合は、Dockerホスト上の物理的な位置を意識しなければならないのに対して、ボリュームマウントでは、ボリューム名を指定するだけで、どの場所に保存されるのかを意識しなくて済むという違いがあります(Docker Engineの実装上は/var以下にファイルとして作られます)。Dockerホストからファイルの中身を見たり編集したりする必要がない場合は(例えばデータベースのファイルなどは直接編集する必要はない上に、編集してはいけないはずです)、ボリュームマウントを使うことが推奨されています。
環境の設定
これは規則ではなくて慣例になるのですが、Docker Hubなどで提供されているほとんどのDockerイメージは、次の2通りの方法で環境設定できる構造をとっています。
1. 環境変数による設定
コンテナの起動時にオプションとして、環境変数を指定することで指定します。少量の設定によく使われます。
2. 設定ファイルのマウント
別途設定ファイルを用意しておき、前述のバインドマウントによって、そのファイルをコンテナ内の設定ファイルの場所にマウントすることで指定します。複雑な設定変更のときに、よく使われます。
どのような環境変数や設定ファイルがあるのかは、Dockerイメージごとに異なります。ドキュメント(Docker Hubの詳細ページなどで確認できます)に記載されています。
Dockerイメージを探す
Dockerイメージは、Docker Hubのサイトから見つけることが可能です。Webサイトには検索窓があるので、キーワードを入力して、Dockerイメージを検索できます。
オフィシャルイメージの判別
例えば「Apache」と入力して検索すると、いくつかのDockerイメージが見つかります。答えを言ってしまうと、Dockerでは、Apacheのイメージは「httpd」という名前で提供されています。
このときオフィシャルなイメージの場合は、検索結果に「OFFICIAL IMAGE」と表示されるので個人が作成したものではないことがわかります。なお、オフィシャルではないイメージの場合は、「個人名/イメージ名」のようになるため、イメージ名が「httpd」のように「個人名/」が付いていないことからも、オフィシャルのものであると判断できます。
オフィシャルなものであることにこだわる必要はありませんが、中には悪意あるDockerイメージが登録されている可能性もあるので、そこは自己責任で実行する必要があります。怪しいかどうかは、表示されている「ダウンロード数(Downloads)」や「スターの数(Stars)」なども参考になるでしょう。
バージョンの特定
イメージが見つかったら、それをクリックすると詳細な情報が表示されます。詳細情報には、簡単な使い方が記述されているので、一通り読むことをお勧めします。
ここで[Tags]のタブをクリックして、タグを確認しておきます。タグは、簡単に言うと、「リリースバージョン」のことです。多くのイメージでは、バージョンごとにタグが設定されており、「どのバージョンのものを使うか」を指定できるようになっています。
例えばhttpdイメージ(Apacheが入っているオフィシャルイメージ)の場合、「2.4.43」や「2.4」(バージョン2.4の最新版の意味)「2.4.43-alpine」(Alpineというディストリビューションを採用した軽量版)など、いくつかのタグが提供されていて、選ぶことができます。選ぶ場合は「httpd:2.4.43」のように、「:」(コロン)でつないで指定します。特殊なタグ名として、最新版を示す「latest」があります。「httpd」のようにタグを省略した場合は、このlatest版を示す(つまり「httpd」と「httpd:latest」は同義)として判定されます。
バージョンを特定すべきかどうかは、状況によります。本番環境で使うのであれば、思わぬバージョン違いによるトラブルを避けるため、特定したほうがよいでしょう。
開発環境で使うのであれば、常に最新版を使うために、タグ名を省略する(もしくはlatestを指定する)という使い方もありです。
dockerコマンドでイメージを検索する
ここではDocker Hubのサイトから検索していますが、dockerコマンドのsearchを使って検索することもできます。例えば、次のように「apache」を検索すると、Docker Hubで検索したのと同じ結果が表示されます。
$ docker search apache NAME DESCRIPTION STARS OFFICIAL AUTOMATED httpd The Apache HTTP Server Project 3118 [OK] tomcat Apache Tomcat is an open source implementati… 2792 [OK] cassandra Apache Cassandra is an open-source distribut… 1166 [OK] ・・・略・・・
コンテナの代表的な実行タイプ
コンテナは隔離された実行環境にすぎないので、さまざまな使い方が考えられます。とはいえ、ほとんどの場合次の2通りの実行タイプです。
1. コマンドを1回限り実行する
コンテナに含まれているコマンドを1回限り実行するタイプです。例えば、コンテナの中に「コンパイラ」や「TeX(コマンドベースの組版ソフト)」などが入っていて、それを実行するのが目的の場合、このタイプです。コンテナは、指定したコマンドを実行すると終了します。
2. 実行しっぱなしのサーバーとして実行する
コンテナに含まれているコマンドをずっと実行しっぱなしにし、サーバーとして実行するタイプです。コンテナでWebサーバーやデータベースサーバーなどを構成する場合は、このタイプです。コンテナは、指定したコマンドを実行したあと、ずっと実行しっぱなしになるため、バックグラウンドで実行する必要があります。
要は、実行しっぱなしか否かという違いですが、この違いによって起動方法が少し違うという点を意識しておいてください。具体的には、docker container runコマンドを実行するときに、「-d」オプションを指定するか否かが違います。詳細は、次回に説明します。
まとめ
第1回では、Dockerの仕組みと基礎知識を説明しました。次回は実際にApacheが入ったコンテナであるhttpdイメージを使って、Webサーバーを立てていきながら、Dockerの基本を習得しましょう。