前書き
Dockerは優れたツールですが、その可能性を最大限に活用するには、アプリケーションの各コンポーネントを独自のコンテナーで実行するのが最適です。 多数のコンポーネントを含む複雑なアプリケーションの場合、すべてのコンテナを一緒に起動およびシャットダウンするように調整すること(互いに話すことは言うまでもありません)は、すぐに扱いにくくなります。
Dockerコミュニティは、Figと呼ばれる一般的なソリューションを考案しました。これにより、単一のYAMLファイルを使用してすべてのDockerコンテナーと構成を調整できます。 これは非常に人気があったため、Dockerチームは最終的にFigソースに基づいて独自のバージョンを作成することにしました。 彼らはそれをDocker Composeと呼んだ。 つまり、Dockerコンテナのオーケストレーションプロセス(コンテナ内のリンクとボリュームの起動、シャットダウン、セットアップなど)の処理が非常に簡単になります。
この記事の終わりまでに、DockerおよびDocker Composeをインストールし、Docker Composeの動作の基本を理解できるようになります。
DockerおよびDocker Composeの概念
Docker Composeを使用するには、さまざまなDockerコンセプトの組み合わせを1つにまとめる必要があるため、始める前に、関連するさまざまなコンセプトを確認してみましょう。 ボリューム、リンク、ポート転送などのDockerの概念に既に精通している場合は、次のセクションに進んでください。
Dockerイメージ
各Dockerコンテナは、Dockerイメージのローカルインスタンスです。 Dockerイメージは、完全なLinuxインストールと考えることができます。 通常、最小インストールには、イメージの実行に必要な最小限のパッケージのみが含まれます。 これらのイメージはホストシステムのカーネルを使用しますが、Dockerコンテナー内で実行され、独自のファイルシステムしか表示されないため、CentOSなどのディストリビューションをUbuntuホスト(またはその逆)で実行することは完全に可能です。
ほとんどのDockerイメージは、Dockerチームによって管理されているDocker Hubを介して配布されます。 最も人気のあるオープンソースプロジェクトには、Dockerレジストリにアップロードされた対応するイメージがあり、これを使用してソフトウェアをデプロイできます。 可能な場合は、「公式」画像を取得することをお勧めします。これは、DockerチームがDockerのベストプラクティスに従うことが保証されているためです。
Dockerイメージ間の通信
デフォルトでは、Dockerコンテナはホストマシンから分離されています。つまり、デフォルトでは、ホストマシンはDockerコンテナ内のファイルシステムにアクセスできず、ネットワーク経由でホストシステムと通信する手段もありません。 言うまでもなく、これにより、既定ではDockerコンテナー内で実行されるイメージの構成と操作が困難になります。
Dockerには、これを回避するための3つの主要な方法があります。 最初の最も一般的な方法は、Dockerコンテナ内で設定される環境変数をDockerに指定させることです。 Dockerコンテナー内で実行されるコードは、起動時にこれらの環境変数の値を確認し、それらを使用して適切に構成します。
もう1つの一般的に使用される方法は、Docker data volumeです。 Dockerボリュームには、内部と共有の2種類があります。
内部ボリュームを指定するということは、特定のDockerコンテナーに指定するフォルダーの場合、コンテナーが削除されたときにデータが保持されることを意味します。 たとえば、ログファイルがハングしていることを確認したい場合は、内部/var/log
ボリュームを指定できます。
共有ボリュームは、Dockerコンテナー内のフォルダーをホストマシン上のフォルダーにマップします。 これにより、Dockerコンテナとホストマシン間でファイルを簡単に共有できます。これについては、Docker data volume articleで説明します。
Dockerコンテナーと通信する3番目の方法は、ネットワーク経由です。 Dockerを使用すると、links
を介した異なるDockerコンテナー間の通信、およびポート転送が可能になり、Dockerコンテナー内からホストサーバー上のポートにポートを転送できます。 たとえば、WordPressコンテナとMariaDB Dockerコンテナが相互に通信できるようにするリンクを作成し、ユーザーが接続できるようにWordPressを外部に公開するためにポート転送することができます。
前提条件
この記事を読むには、次のものが必要です。
-
Ubuntu 14.04ドロップレット
-
sudo権限を持つroot以外のユーザー(Initial Server Setup with Ubuntu 14.04は、これを設定する方法を説明しています)。
[[step-1 -—- installing-docker]] ==ステップ1—Dockerのインストール
まず、Dockerをまだインストールしていない場合はインストールします。 Dockerをインストールする最も簡単な方法は、インストールスクリプトをダウンロードしてインストールすることです(sudoパスワードの入力を求められます)。
wget -qO- https://get.docker.com/ | sh
上記のコマンドは、Dockerチームが作成した小さなインストールスクリプトをダウンロードして実行します。 サードパーティのスクリプトを信頼していない場合、またはスクリプトの実行内容の詳細が必要な場合は、DigitalOcean Docker tutorialまたはDocker独自のinstallation documentationの手順を確認してください。
ユーザーが正しく構成されていない場合、Dockerの操作は面倒なので、次のコマンドを使用してユーザーをdocker
グループに追加します。
sudo usermod -aG docker $(whoami)
サーバーからログアウトしてログインし、新しいグループを有効にします。
[.note]#Note: Dockerの使用方法の詳細については、How To Install and Use Docker: Getting Started。
のHow to Use Dockerセクションをお読みください。
[[step-2 -—- installing-docker-compose]] ==ステップ2— DockerComposeのインストール
Dockerがインストールされたので、Docker Composeをインストールしましょう。 まず、前提条件としてpython-pip
をインストールします。
sudo apt-get -y install python-pip
次に、Docker Composeをインストールできます。
sudo pip install docker-compose
[[step-3 -—- running-a-container-with-docker-compose]] ==ステップ3— DockerComposeを使用したコンテナーの実行
パブリックDockerレジストリであるDockerHubには、単純なHello Worldイメージが含まれています。 Docker Composeがインストールされたので、この非常に単純な例でテストしてみましょう。
最初に、YAMLファイル用のディレクトリを作成します。
mkdir hello-world
次に、ディレクトリに移動します。
cd hello-world
次に、お気に入りのテキストエディターを使用してYAMLファイルを作成します(nanoを使用します)。
nano docker-compose.yml
次の内容をファイルに入れ、ファイルを保存して、テキストエディターを終了します。
docker-compose.yml
my-test:
image: hello-world
最初の行は、コンテナ名の一部として使用されます。 2行目は、コンテナの作成に使用するイメージを指定します。 イメージは公式のDocker Hubリポジトリからダウンロードされます。
~/hello-world
ディレクトリにいる間に、次のコマンドを実行してコンテナを作成します。
docker-compose up
出力は次で始まる必要があります。
Output of docker-compose upCreating helloworld_my-test_1...
Attaching to helloworld_my-test_1
my-test_1 |
my-test_1 | Hello from Docker.
my-test_1 | This message shows that your installation appears to be working correctly.
my-test_1 |
次に、出力はDockerの動作を説明します。
-
DockerクライアントはDockerデーモンに連絡しました。
-
Dockerデーモンは、Dockerハブから「hello-world」イメージをプルしました。
-
Dockerデーモンは、そのイメージから新しいコンテナーを作成し、現在読み取り中の出力を生成する実行可能ファイルを実行します。
-
Dockerデーモンはその出力をDockerクライアントにストリーミングし、それが端末に送信されました。
プロセスが自動的に終了しない場合は、CTRL-C
を押します。
この単純なテストは、Docker Composeの主な利点の1つではありません。Dockerコンテナーのグループを同時に上下させることができます。 How To Install Wordpress and PhpMyAdmin with Docker Compose on Ubuntu 14.04の記事は、DockerComposeを使用して3つのコンテナーを1つのアプリケーショングループとして実行する方法を示しています。
[[ステップ-4-—learning-docker-compose-commands]] ==ステップ4—Docker作成コマンドの学習
docker-compose
ツールがサポートするコマンドを見てみましょう。
docker-compose
コマンドは、ディレクトリごとに機能します。 1台のマシンでDockerコンテナの複数のグループを実行できます。コンテナごとに1つのディレクトリを作成し、そのディレクトリ内のコンテナごとに1つのdocker-compose.yml
ファイルを作成します。
これまで、docker-compose up
を単独で実行し、CTRL-C
を使用してシャットダウンしてきました。 これにより、デバッグメッセージをターミナルウィンドウに表示できます。 ただし、これは理想的ではありません。本番環境で実行する場合は、docker-compose
をサービスのように動作させる必要があります。 これを行う簡単な方法の1つは、セッションをup
するときに-d
オプションを追加することです。
docker-compose up -d
docker-compose
はバックグラウンドにフォークします。
Dockerコンテナのグループ(停止中と現在実行中の両方)を表示するには、次のコマンドを使用します。
docker-compose ps
たとえば、次の例は、helloworld_my-test_1
コンテナが停止していることを示しています。
Output of `docker-compose ps` Name Command State Ports
-----------------------------------------------
helloworld_my-test_1 /hello Exit 0
実行中のコンテナは、Up
の状態を表示します。
Output of `docker-compose ps` Name Command State Ports
---------------------------------------------------------------
nginx_nginx_1 nginx -g daemon off; Up 443/tcp, 80/tcp
アプリケーショングループで実行中のすべてのDockerコンテナを停止するには、Dockerグループの起動に使用したdocker-compose.yml
ファイルと同じディレクトリで次のコマンドを発行します。
docker-compose stop
[.note]#Note:docker-compose kill
は、より強力にシャットダウンする必要がある場合にも使用できます。
#
場合によっては、Dockerコンテナは古い情報を内部ボリュームに保存します。 ゼロから開始する場合は、rm
コマンドを使用して、コンテナーグループを構成するすべてのコンテナーを完全に削除できます。
docker-compose rm
Dockerコンテナと.yml
ファイルを含むディレクトリ以外のディレクトリからこれらのコマンドのいずれかを実行しようとすると、文句が表示され、コンテナは表示されません。
Output from wrong directory Can't find a suitable configuration file in this directory or any parent. Are you in the right directory?
Supported filenames: docker-compose.yml, docker-compose.yaml, fig.yml, fig.yaml
[[step-5-—accessing-the-docker-container-filesystem-optional]] ==ステップ5— Docker Container Filesystemへのアクセス(オプション)
コンテナ内のコマンドプロンプトで作業する必要がある場合は、docker exec
コマンドを使用できます。
Hello World!の例は実行後に終了するため、実行を継続するコンテナーを開始して、docker exec
を使用してコンテナーのファイルシステムにアクセスできるようにする必要があります。 Docker HubのNginx imageを見てみましょう。
新しいディレクトリを作成し、そこに変更します:
mkdir ~/nginx && cd $_
新しいディレクトリにdocker-compose.yml
ファイルを作成します。
nano docker-compose.yml
そして、以下を貼り付けます:
~/nginx/docker-compose.yml
nginx:
image: nginx
ファイルを保存して終了します。 次のコマンドを使用して、バックグラウンドプロセスとしてNginxコンテナを起動するだけです。
docker-compose up -d
Nginxイメージがダウンロードされ、その後コンテナーがバックグラウンドで開始されます。
ここで、コンテナのCONTAINER ID
が必要です。 実行中のすべてのコンテナのリスト:
docker ps
次のようなものが表示されます。
Output of `docker ps`CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e90e12f70418 nginx "nginx -g 'daemon off" 6 minutes ago Up 5 minutes 80/tcp, 443/tcp nginx_nginx_1
[.note]#Note:docker ps
コマンドでリストされるのはrunningコンテナのみです。
#
このコンテナ内のファイルシステムに変更を加えたい場合は、そのID(この例ではe90e12f70418
)を取得し、docker exec
を使用してコンテナ内のシェルを開始します。
docker exec -it e90e12f70418 /bin/bash
-t
オプションは端末を開き、-i
オプションはそれをインタラクティブにします。 /bin/bash
オプションは、実行中のコンテナーに対してbashシェルを開きます。 必ずコンテナのIDを使用してください。
次のようなコンテナのbashプロンプトが表示されます。
root@e90e12f70418:/#
ここから、コマンドプロンプトから作業できます。 ただし、データボリュームの一部として保存されているディレクトリにいる場合を除き、コンテナを再起動するとすぐに変更が消えることに注意してください。 もう1つの注意点は、ほとんどのDockerイメージはごくわずかなLinuxインストールで作成されるため、使用するコマンドラインユーティリティとツールの一部が存在しない場合があることです。
結論
これで、Docker Composeの基本概念と、それをインストールして実行する方法について説明しました。 Docker Composeを使用してアプリケーションをデプロイする方法のより複雑な例については、Deploying Wordpress and PHPMyAdmin with Docker Compose on Ubuntu 14.04チュートリアルを確認してください。
docker-compose.yml
ファイルの構成オプションの完全なリストについては、Compose file referenceを参照してください。