前書き

Dockerは優れたツールですが、その可能性を最大限に活用するには、アプリケーションの各コンポーネントを独自のコンテナで実行するのが最善です。 多数のコンポーネントを含む複雑なアプリケーションの場合、すべてのコンテナを一緒に起動およびシャットダウンするように調整すること(互いに話すことは言うまでもありません)は、すぐに扱いにくくなります。

Dockerコミュニティは、http://www.fig.sh/ [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チームが管理するhttps://hub.docker.com/[Docker Hub]を介して配布されます。 最も人気のあるオープンソースプロジェクトには、Dockerレジストリにアップロードされた対応するイメージがあり、これを使用してソフトウェアをデプロイできます。 可能な場合は、「公式」画像を取得することをお勧めします。これは、DockerチームがDockerのベストプラクティスに従うことが保証されているためです。

Dockerイメージ間の通信

デフォルトでは、Dockerコンテナはホストマシンから分離されています。つまり、デフォルトでは、ホストマシンはDockerコンテナ内のファイルシステムにアクセスできず、ネットワーク経由でホストシステムと通信する手段もありません。 言うまでもなく、これにより、既定ではDockerコンテナー内で実行されるイメージの構成と操作が困難になります。

Dockerには、これを回避するための3つの主要な方法があります。 最初の最も一般的な方法は、Dockerコンテナ内に設定される環境変数をDockerに指定させることです。 Dockerコンテナー内で実行されるコードは、起動時にこれらの環境変数の値を確認し、それらを使用して適切に構成します。

一般的に使用される別の方法はhttps://www.digitalocean.com/community/tutorials/how-to-work-with-docker-data-volumes-on-ubuntu-14-04[Docker data volume]です。 Dockerボリュームには、内部と共有の2種類があります。

内部ボリュームを指定するということは、特定のDockerコンテナーに指定するフォルダーの場合、コンテナーが削除されたときにデータが保持されることを意味します。 たとえば、ログファイルがハングしたことを確認したい場合は、内部の `+ / var / log +`ボリュームを指定できます。

共有ボリュームは、Dockerコンテナー内のフォルダーをホストマシン上のフォルダーにマップします。 これにより、Dockerコンテナとホストマシン間でファイルを簡単に共有できます。これについては、https://www.digitalocean.com/community/tutorials/how-to-work-with-docker-data-volumesで確認します-on-ubuntu-14-04 [Dockerデータボリュームの記事]。

Dockerコンテナーと通信する3番目の方法は、ネットワーク経由です。 Dockerでは、ポート転送だけでなく、 `+ links +`を介したさまざまなDockerコンテナー間の通信が可能で、Dockerコンテナー内からホストサーバー上のポートにポートを転送できます。 たとえば、WordPressコンテナとMariaDB Dockerコンテナが相互に通信できるようにするリンクを作成し、ユーザーが接続できるようにWordPressを外部に公開するためにポート転送することができます。

前提条件

この記事を読むには、次のものが必要です。

  • Ubuntu 14.04ドロップレット

  • sudo特権を持つ非ルートユーザー(https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-14-04[Ubuntu 14.04での初期サーバーセットアップ]は、このセットアップ方法を説明しています。 )

ステップ1-Dockerのインストール

まず、Dockerをまだインストールしていない場合はインストールします。 Dockerをインストールする最も簡単な方法は、インストールスクリプトをダウンロードしてインストールすることです(sudoパスワードの入力を求められます)。

wget -qO- https://get.docker.com/ | sh

上記のコマンドは、Dockerチームが作成した小さなインストールスクリプトをダウンロードして実行します。 サードパーティのスクリプトを信頼していない場合、またはスクリプトの動作に関する詳細が必要な場合は、https://www.digitalocean.com/community/tutorials/how-to-install-and-use-dockerの手順を確認してください。 -getting-started [DigitalOcean Docker tutorial]またはDocker独自のhttps://docs.docker.com/installation/ubuntulinux/ [インストールドキュメント]。

ユーザーが正しく設定されていない場合、Dockerを使用するのは面倒なので、次のコマンドでユーザーを `+ docker +`グループに追加します。

sudo usermod -aG docker $(whoami)

サーバーからログアウトしてログインし、新しいグループを有効にします。

ステップ2-Docker Composeのインストール

Dockerがインストールされたので、Docker Composeをインストールしましょう。 最初に、前提条件として `+ python-pip +`をインストールします。

sudo apt-get -y install python-pip

次に、Docker Composeをインストールできます。

sudo pip install docker-compose

ステップ3-Docker Composeでコンテナーを実行する

パブリックDockerレジストリであるDocker Hubには、単純な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の動作を説明します。

  1. DockerクライアントはDockerデーモンに連絡しました。

  2. Dockerデーモンは、Dockerハブから「hello-world」イメージをプルしました。

  3. Dockerデーモンは、そのイメージから新しいコンテナーを作成し、現在読み取り中の出力を生成する実行可能ファイルを実行します。

  4. Dockerデーモンはその出力をDockerクライアントにストリーミングし、それが端末に送信されました。

プロセスがそれ自体で終了しない場合は、 `+ CTRL-C +`を押します。

この簡単なテストは、Docker Composeの主な利点の1つではありません。Dockerコンテナーのグループを同時に上下させることができます。 Docker ComposeでWordpressとPhpMyAdminをインストールする方法Ubuntu 14.04の記事では、Docker Composeを使用して3つのコンテナを1つのアプリケーショングループとして実行する方法を示しています。

[[step-4– learning-docker-compose-commands]]
=== ステップ4-Doc Docker Composeコマンドの学習

`+ docker-compose +`ツールがサポートするコマンドを見ていきましょう。

`+ docker-compose `コマンドはディレクトリごとに機能します。 Dockerコンテナの複数のグループを1台のマシンで実行できます。コンテナごとに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     0

実行中のコンテナは、 `+ Up +`状態を表示します:

Output of `docker-compose ps`     Name              Command          State        Ports
---------------------------------------------------------------
nginx_nginx_1   nginx -g daemon off;         443/tcp, 80/tcp

アプリケーショングループで実行中のすべてのDockerコンテナを停止するには、Dockerグループの起動に使用される `+ docker-compose.yml +`ファイルと同じディレクトリで次のコマンドを発行します。

docker-compose stop

場合によっては、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-Doc Dockerコンテナファイルシステムへのアクセス(オプション)

コンテナ内のコマンドプロンプトで作業する必要がある場合は、 `+ docker exec +`コマンドを使用できます。

Hello World!_の例は実行後に終了するので、実行を継続するコンテナーを起動して、 `+ docker exec +`を使用してコンテナーのファイルシステムにアクセスできるようにする必要があります。 Docker Hubのhttps://hub.docker.com//nginx/[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

このコンテナ内のファイルシステムに変更を加えたい場合、そのID(この例では「+ e90e12f70418 」)を取得し、「 docker exec +」を使用してコンテナ内のシェルを起動します。

docker exec -it  /bin/bash

`+ -t `オプションはターミナルを開き、 ` -i `オプションはそれをインタラクティブにします。 ` / bin / bash +`オプションは、実行中のコンテナに対してbashシェルを開きます。 必ずコンテナのIDを使用してください。

次のようなコンテナのbashプロンプトが表示されます。

ここから、コマンドプロンプトから作業できます。 ただし、データボリュームの一部として保存されているディレクトリにいる場合を除き、コンテナを再起動するとすぐに変更が消えることに注意してください。 もう1つの注意点は、ほとんどのDockerイメージはごくわずかなLinuxインストールで作成されるため、使用するコマンドラインユーティリティとツールの一部が存在しない場合があることです。

結論

これで、Docker Composeの基本概念と、それをインストールして実行する方法について説明しました。 Docker ComposeでWordpressとPHPMyAdminをデプロイするUbuntu 14.04 Docker Composeでアプリケーションをデプロイする方法のより複雑な例のチュートリアル。

`+ docker-compose.yml +`ファイルの設定オプションの完全なリストについては、https://docs.docker.com/compose/compose-file/ [Compose file reference]を参照してください。