序章

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

Dockerコミュニティは、 Fig と呼ばれる人気のあるソリューションを考案しました。これにより、単一のYAMLファイルを使用してすべてのDockerコンテナーと構成を調整できます。 これは非常に人気があり、Dockerチームは最終的にFigソースに基づいて独自のバージョンを作成することを決定しました。 彼らはそれをDockerComposeと呼びました。 つまり、Dockerコンテナーのオーケストレーションプロセス(コンテナー内のリンクとボリュームの起動、シャットダウン、セットアップなど)の処理が非常に簡単になります。

この記事の終わりまでに、DockerとDocker Composeがインストールされ、DockerComposeがどのように機能するかについての基本的な理解が得られます。

DockerとDockerComposeの概念

Docker Composeを使用するには、さまざまなDockerの概念を1つに組み合わせる必要があるため、始める前に、関連するさまざまな概念を確認してみましょう。 ボリューム、リンク、ポートフォワーディングなどのDockerの概念に既に精通している場合は、先に進んで次のセクションに進んでください。

Dockerイメージ

各Dockerコンテナは、Dockerイメージのローカルインスタンスです。 Dockerイメージは完全なLinuxインストールと考えることができます。 通常、最小限のインストールには、イメージの実行に必要な最小限のパッケージのみが含まれます。 これらのイメージはホストシステムのカーネルを使用しますが、Dockerコンテナー内で実行され、独自のファイルシステムのみを表示するため、UbuntuホストでCentOSのようなディストリビューションを実行することは完全に可能です(またはその逆)。

ほとんどのDockerイメージは、Dockerチームによって管理されている DockerHubを介して配布されます。 最も人気のあるオープンソースプロジェクトでは、対応するイメージがDockerレジストリにアップロードされており、これを使用してソフトウェアをデプロイできます。 可能であれば、「公式」イメージを取得することをお勧めします。これは、DockerチームがDockerのベストプラクティスに従うことが保証されているためです。

Dockerイメージ間の通信

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

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

もう1つの一般的に使用される方法は、Dockerデータボリュームです。 Dockerボリュームには、内部と共有の2つの種類があります。

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

共有ボリュームは、Dockerコンテナー内のフォルダーをホストマシン上のフォルダーにマップします。 これにより、Dockerコンテナとホストマシン間でファイルを簡単に共有できます。これについては、Dockerデータボリュームの記事で説明します。

Dockerコンテナーと通信する3番目の方法は、ネットワークを介することです。 Dockerを使用すると、異なるDockerコンテナ間の通信が可能になります。 links、およびポートフォワーディングにより、Dockerコンテナ内からホストサーバー上のポートにポートを転送できます。 たとえば、WordPressコンテナとMariaDB Dockerコンテナが相互に通信できるようにするリンクを作成し、ポートフォワーディングを使用してWordPressを外部に公開し、ユーザーが接続できるようにすることができます。

前提条件

この記事をフォローするには、次のものが必要です。

  • Ubuntu14.04ドロップレット
  • sudo権限を持つroot以外のユーザー( Ubuntu 14.04 を使用した初期サーバーセットアップでは、これをセットアップする方法について説明しています。)

ステップ1—Dockerをインストールする

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

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

上記のコマンドは、Dockerチームによって作成された小さなインストールスクリプトをダウンロードして実行します。 サードパーティのスクリプトを信頼できない場合、またはスクリプトの実行内容の詳細が必要な場合は、DigitalOceanDockerチュートリアルまたはDocker独自のインストールドキュメントの手順を確認してください。

ユーザーが正しく構成されていない場合、Dockerの操作は面倒なので、ユーザーをに追加します。 docker 次のコマンドでグループ化します。

sudo usermod -aG docker $(whoami)

サーバーからログアウトしてログインし、新しいグループをアクティブ化します。

注: Dockerの使用方法の詳細については、 Dockerのインストールと使用方法:はじめにDockerの使用方法セクションをお読みください。

ステップ2—DockerComposeをインストールする

Dockerがインストールされたので、先に進んでDockerComposeをインストールしましょう。 まず、インストールします python-pip 前提条件として:

  1. sudo apt-get -y install python-pip

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

  1. sudo pip install docker-compose

ステップ3—DockerComposeを使用してコンテナーを実行する

パブリックDockerレジストリであるDockerHubには、単純な HelloWorldイメージが含まれています。 Docker Composeがインストールされたので、この非常に単純な例でテストしてみましょう。

まず、YAMLファイル用のディレクトリを作成します。

  1. mkdir hello-world

次に、ディレクトリに移動します。

  1. cd hello-world

次に、お気に入りのテキストエディタを使用してYAMLファイルを作成します(nanoを使用します)。

  1. nano docker-compose.yml

次の内容をファイルに入れ、ファイルを保存して、テキストエディタを終了します。

docker-compose.yml
my-test:
  image: hello-world

最初の行は、コンテナ名の一部として使用されます。 2行目は、コンテナの作成に使用するイメージを指定します。 イメージは公式のDockerHubリポジトリからダウンロードされます。

まだ中に ~/hello-world ディレクトリで、次のコマンドを実行してコンテナを作成します。

  1. docker-compose up

出力は次のように始まります。

Output of docker-compose up
Creating 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デーモンは、DockerHubから「hello-world」イメージをプルしました。
  3. Dockerデーモンは、そのイメージから、現在読み取っている出力を生成する実行可能ファイルを実行する新しいコンテナーを作成しました。
  4. Dockerデーモンはその出力をDockerクライアントにストリーミングし、Dockerクライアントはそれをターミナルに送信しました。

プロセスが自動的に終了しない場合は、を押します CTRL-C.

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

ステップ4—Docker作成コマンドの学習

コマンドを調べてみましょう docker-compose ツールサポート。

The docker-compose コマンドはディレクトリごとに機能します。 1台のマシンでDockerコンテナの複数のグループを実行できます。コンテナごとに1つのディレクトリを作成し、1つのディレクトリを作成するだけです。 docker-compose.yml ディレクトリ内の各コンテナのファイル。

これまで実行してきました docker-compose up 私たち自身で使用しています CTRL-C それをシャットダウンします。 これにより、デバッグメッセージをターミナルウィンドウに表示できます。 ただし、これは理想的ではありません。本番環境で実行する場合は、 docker-compose サービスのように振る舞います。 これを行う簡単な方法の1つは、 -d あなたがするときのオプション up あなたのセッション:

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-compose.yml Dockerグループの起動に使用されるファイル:

docker-compose stop

注: 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

ステップ5— Docker Container Filesystemへのアクセス(オプション)

コンテナ内でコマンドプロンプトを操作する必要がある場合は、 docker exec 指図。

Hello World!の例は実行後に終了するため、実行を継続するコンテナーを開始して、使用できるようにする必要があります。 docker exec コンテナのファイルシステムにアクセスします。 DockerHubのNginxイメージを見てみましょう。

そのための新しいディレクトリを作成し、それに変更します。

  1. mkdir ~/nginx && cd $_

作成する docker-compose.yml 新しいディレクトリのファイル:

  1. nano docker-compose.yml

次のように貼り付けます。

〜/ nginx / docker-compose.yml
nginx:
  image: nginx

ファイルを保存して終了します。 次のコマンドを使用して、バックグラウンドプロセスとしてNginxコンテナを開始する必要があります。

  1. docker-compose up -d

Nginxイメージがダウンロードされ、コンテナーがバックグラウンドで開始されます。

今、私たちは必要です CONTAINER ID コンテナ用。 実行中のすべてのコンテナのリスト:

  1. 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

注: runningコンテナーのみがリストされます。 docker ps 指図。

このコンテナ内のファイルシステムに変更を加えたい場合は、そのIDを取得します(この例では e90e12f70418)および使用 docker exec コンテナ内でシェルを開始するには:

  1. docker exec -it e90e12f70418 /bin/bash

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

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

root@e90e12f70418:/#

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

結論

これで、Docker Composeの基本的な概念と、DockerComposeをインストールして実行する方法について説明しました。 Docker Composeを使用してアプリケーションをデプロイする方法のより複雑な例については、 Ubuntu14.04でのDockerComposeを使用したWordpressとPHPMyAdminのデプロイのチュートリアルを確認してください。

の構成オプションの完全なリストについては、 docker-compose.yml ファイルはファイルリファレンスの作成を参照してください。