序章

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

Dockerコミュニティは、 Fig と呼ばれる人気のあるソリューションを考案しました。これにより、単一のYAMLファイルを使用してすべてのDockerコンテナーと構成を調整できます。 これは非常に人気があったため、DockerチームはFigソースに基づいて DockerComposeを作成することを決定しました。これは現在非推奨です。 Docker Composeを使用すると、ユーザーは、コンテナー内のリンクとボリュームの起動、シャットダウン、セットアップなど、Dockerコンテナーのプロセスを簡単に調整できます。

このチュートリアルでは、最新バージョンのDocker Composeをインストールして、マルチコンテナーアプリケーションの管理に役立て、ソフトウェアの基本的なコマンドについて説明します。

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

前提条件

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

  • CentOS 7サーバー、sudo権限を持つroot以外のユーザーでセットアップ(詳細については、 CentOS 7 での初期サーバーセットアップを参照)

  • CentOS7にDockerをインストールして使用する方法のステップ1とステップ2の手順でインストールされたDocker

これらが配置されると、フォローする準備が整います。

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

最新のリリースを入手するには、 Docker docs を主導し、DockerのGitHubリポジトリのバイナリからDockerComposeをインストールします。

現在のリリースを確認し、必要に応じて、以下のコマンドで更新してください。

  1. sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

次に、バイナリを実行可能にするためのアクセス許可を設定します。

  1. sudo chmod +x /usr/local/bin/docker-compose

次に、バージョンを確認して、インストールが成功したことを確認します。

  1. docker-compose --version

これにより、インストールしたバージョンが印刷されます。

Output
docker-compose version 1.23.2, build 1110ad01

Docker Composeがインストールされたので、「HelloWorld」の例を実行する準備が整いました。

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

パブリックDockerレジストリであるDockerHubには、デモンストレーションとテスト用の単純な「HelloWorld」イメージが含まれています。 これは、DockerComposeを使用してコンテナーを実行するために必要な最小限の構成を示しています。単一のイメージを呼び出すYAMLファイルです。

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

  1. mkdir hello-world

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

  1. cd hello-world

次に、お気に入りのテキストエディタを使用してYAMLファイルを作成します。 このチュートリアルではViを使用します。

  1. vi docker-compose.yml

iを押して挿入モードに入り、次の内容をファイルに入れます。

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

最初の行はコンテナ名の一部になります。 2行目は、コンテナの作成に使用するイメージを指定します。 コマンドdocker-compose upを実行すると、指定された名前hello-worldでローカルイメージが検索されます。

これが所定の位置にある状態で、ESCを押して挿入モードを終了します。 :xENTERの順に入力して、ファイルを保存して終了します。

システム上の画像を手動で確認するには、docker imagesコマンドを使用します。

  1. docker images

ローカル画像がまったくない場合は、列見出しのみが表示されます。

Output
REPOSITORY TAG IMAGE ID CREATED SIZE

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

  1. docker-compose up

コマンドを初めて実行するときに、hello-worldという名前のローカルイメージがない場合、DockerComposeはDockerHubパブリックリポジトリからコマンドをプルします。

Output
Pulling my-test (hello-world:)... latest: Pulling from library/hello-world 1b930d010525: Pull complete . . .

イメージをプルした後、docker-composeはコンテナーを作成し、接続して hello プログラムを実行します。これにより、インストールが機能しているように見えることが確認されます。

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

次に、それが行ったことの説明を出力します。

Output
. . . my-test_1 | To generate this message, Docker took the following steps: my-test_1 | 1. The Docker client contacted the Docker daemon. my-test_1 | 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. my-test_1 | (amd64) my-test_1 | 3. The Docker daemon created a new container from that image which runs the my-test_1 | executable that produces the output you are currently reading. my-test_1 | 4. The Docker daemon streamed that output to the Docker client, which sent it my-test_1 | to your terminal. . . .

Dockerコンテナーは、コマンドがアクティブである間のみ実行されるため、helloの実行が終了すると、コンテナーは停止します。 したがって、アクティブなプロセスを見ると、列ヘッダーは表示されますが、hello-worldコンテナーは実行されていないため、リストされません。

  1. docker ps
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

-aフラグを使用して、アクティブなコンテナーだけでなく、すべてのコンテナーを表示します。

  1. docker ps -a
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 50a99a0beebd hello-world "/hello" 3 minutes ago Exited (0) 3 minutes ago hello-world_my-test_1

コンテナーの実行をテストしたので、基本的なDockerComposeコマンドのいくつかの調査に進むことができます。

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

Docker Composeの使用を開始するために、このセクションでは、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 -a

コンテナが停止すると、次の例に示すように、StateExitedとしてリストされます。

Output
Name Command State Ports ------------------------------------------------ hello-world_my-test_1 /hello Exit 0

実行中のコンテナにはUpと表示されます。

Output
Name Command State Ports --------------------------------------------------------------- nginx_nginx_1 nginx -g daemon off; Up 443/tcp, 80/tcp

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

docker-compose stop

ノート: docker-compose kill is also available if you need to shut things down more forcefully.

場合によっては、Dockerコンテナは古い情報を内部ボリュームに保存します。 最初からやり直したい場合は、rmコマンドを使用して、コンテナグループを構成するすべてのコンテナを完全に削除できます。

docker-compose rm 

Dockerコンテナと.ymlファイルを含むディレクトリ以外のディレクトリからこれらのコマンドのいずれかを実行しようとすると、エラーが返されます。

Output
ERROR: 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

このセクションでは、DockerComposeを使用してコンテナーを操作する方法の基本について説明しました。 コンテナーをより細かく制御する必要がある場合は、Dockerコンテナーのファイルシステムにアクセスし、コンテナー内のコマンドプロンプトから作業できます。このプロセスについては、次のセクションで説明します。

ステップ4—Dockerコンテナファイルシステムへのアクセス

コンテナ内のコマンドプロンプトを操作してそのファイルシステムにアクセスするには、docker execコマンドを使用できます。

「HelloWorld」の例は実行後に終了するため、docker execをテストするには、実行を継続するコンテナーを開始します。 このチュートリアルでは、DockerHubのNginxイメージを使用します。

nginxという名前の新しいディレクトリを作成し、そのディレクトリに移動します。

  1. mkdir ~/nginx
  2. cd ~/nginx

次に、新しいディレクトリにdocker-compose.ymlファイルを作成し、テキストエディタで開きます。

  1. vi docker-compose.yml

次に、ファイルに次の行を追加します。

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

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

  1. docker-compose up -d

Docker ComposeはNginxイメージをダウンロードし、コンテナーはバックグラウンドで起動します。

次に、コンテナ用のCONTAINER IDが必要になります。 次のコマンドで実行されているすべてのコンテナーをリストします。

  1. docker ps

次のようなものが表示されます。

Output of `docker ps`
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b86b6699714c nginx "nginx -g 'daemon of…" 20 seconds ago Up 19 seconds 80/tcp nginx_nginx_1

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

  1. docker exec -it b86b6699714c /bin/bash

-tオプションは端末を開き、-iオプションは端末をインタラクティブにします。 /bin/bashは、実行中のコンテナーに対してbashシェルを開きます。

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

root@b86b6699714c:/#

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

結論

これで、Docker Composeがインストールされ、「Hello World」の例を実行してインストールをテストし、いくつかの基本的なコマンドを調べました。

「HelloWorld」の例ではインストールが確認されましたが、単純な構成では、DockerComposeの主な利点の1つは示されていません。Dockerコンテナーのグループを同時に上下させることができます。 Docker Composeの実際の機能を確認するには、コンテナ化されたNode.jsアプリケーションをNginx、Let’s Encrypt、DockerComposeで保護する方法Dockerで継続的インテグレーションテスト環境を構成する方法を確認してください。およびDockerCompose(Ubuntu 16.04 )。 これらのチュートリアルはUbuntu16.04および18.04を対象としていますが、手順はCentOS7に適合させることができます。