前書き
Dockerは、ソフトウェアコンテナ内のLinuxアプリケーションのデプロイを自動化するための優れたツールですが、その可能性を最大限に活用するには、アプリケーションの各コンポーネントを独自のコンテナで実行するのが最善です。 多数のコンポーネントを含む複雑なアプリケーションの場合、すべてのコンテナを一緒に起動およびシャットダウンするように調整すること(互いに話すことは言うまでもありません)は、すぐに扱いにくくなります。
Dockerコミュニティは、Figと呼ばれる一般的なソリューションを考案しました。これにより、単一のYAMLファイルを使用してすべてのDockerコンテナーと構成を調整できます。 これは非常に人気があったため、DockerチームはFigソースに基づいてDocker Composeを作成することを決定しましたが、現在は非推奨です。 Docker Composeを使用すると、ユーザーは、コンテナ内のリンクとボリュームの起動、シャットダウン、セットアップなど、Dockerコンテナのプロセスを簡単に調整できます。
このチュートリアルでは、マルチコンテナアプリケーションの管理に役立つ最新バージョンの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コンテナとホストマシンの間で簡単にshare filesを実行できます。
Dockerコンテナーと通信する3番目の方法は、ネットワーク経由です。 Dockerを使用すると、links
を介した異なるDockerコンテナー間の通信、およびポート転送が可能になり、Dockerコンテナー内からホストサーバー上のポートにポートを転送できます。 たとえば、WordPressコンテナとMariaDB Dockerコンテナが相互に通信できるようにするリンクを作成し、ポート転送を使用してWordPressを外部に公開して、ユーザーが接続できるようにすることができます。
前提条件
この記事を読むには、次のものが必要です。
-
CentOS 7サーバー、sudo権限を持つroot以外のユーザーでセットアップ(詳細はInitial Server Setup on CentOS 7を参照)
-
How To Install and Use Docker on CentOS 7のステップ1とステップ2の手順でインストールされたDocker
これらが準備できたら、あなたはそれをフォローする準備が整います。
[[step-1 -—- installing-docker-compose]] ==ステップ1— DockerComposeのインストール
最新のリリースを入手するには、Docker docsをリードして、DockerのGitHubリポジトリのバイナリからDockerComposeをインストールします。
current releaseを確認し、必要に応じて、以下のコマンドで更新します。
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
次に、バイナリ実行可能ファイルを作成する権限を設定します。
sudo chmod +x /usr/local/bin/docker-compose
次に、バージョンを確認して、インストールが成功したことを確認します。
docker-compose --version
これにより、インストールしたバージョンが出力されます。
Outputdocker-compose version 1.23.2, build 1110ad01
Docker Composeがインストールされたので、「Hello World」の例を実行する準備ができました。
[[step-2 -—- running-a-container-with-docker-compose]] ==ステップ2— DockerComposeを使用したコンテナーの実行
パブリックDockerレジストリであるDocker Hubには、デモとテスト用のシンプルな「Hello World」イメージが含まれています。 これは、Docker Composeを使用してコンテナーを実行するために必要な最小構成を示しています。単一のイメージを呼び出すYAMLファイルです。
最初に、YAMLファイル用のディレクトリを作成します。
mkdir hello-world
次に、ディレクトリに移動します。
cd hello-world
次に、お気に入りのテキストエディターを使用してYAMLファイルを作成します。 このチュートリアルではViを使用します。
vi docker-compose.yml
i
を押して挿入モードに入り、次の内容をファイルに入れます。
docker-compose.yml
my-test:
image: hello-world
最初の行はコンテナ名の一部になります。 2行目は、コンテナの作成に使用するイメージを指定します。 コマンドdocker-compose up
を実行すると、指定された名前hello-world
でローカルイメージが検索されます。
これを配置したら、ESC
を押して挿入モードを終了します。 :x
、次にENTER
と入力して、ファイルを保存して終了します。
システム上の画像を手動で確認するには、docker images
コマンドを使用します。
docker images
ローカル画像がまったくない場合、列見出しのみが表示されます:
OutputREPOSITORY TAG IMAGE ID CREATED SIZE
ここで、~/hello-world
ディレクトリにいる間に、次のコマンドを実行してコンテナを作成します。
docker-compose up
コマンドを初めて実行するときに、hello-world
という名前のローカルイメージがない場合、DockerComposeはDockerHubパブリックリポジトリからコマンドをプルします。
OutputPulling 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
コンテナーは実行されていないため、リストされません。
docker ps
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
-a
フラグを使用して、アクティブなコンテナーだけでなく、すべてのコンテナーを表示します。
docker ps -a
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
50a99a0beebd hello-world "/hello" 3 minutes ago Exited (0) 3 minutes ago hello-world_my-test_1
コンテナーの実行をテストしたので、基本的なDocker Composeコマンドのいくつかの調査に進むことができます。
[[ステップ-3-—learning-docker-compose-commands]] ==ステップ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
コンテナが停止すると、次の例に示すように、State
はExited
としてリストされます。
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
[.note]#Note:docker-compose kill
は、より強力にシャットダウンする必要がある場合にも使用できます。
#
場合によっては、Dockerコンテナは古い情報を内部ボリュームに保存します。 ゼロから開始する場合は、rm
コマンドを使用して、コンテナーグループを構成するすべてのコンテナーを完全に削除できます。
docker-compose rm
Dockerコンテナと.yml
ファイルを含むディレクトリ以外のディレクトリからこれらのコマンドのいずれかを実行しようとすると、エラーが返されます。
OutputERROR:
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
このセクションでは、Docker Composeでコンテナーを操作する方法の基本について説明しました。 コンテナをより詳細に制御する必要がある場合は、Dockerコンテナのファイルシステムにアクセスし、コンテナ内のコマンドプロンプトから作業を行うことができます。このプロセスについては次のセクションで説明します。
[[step-4-—accessing-the-docker-container-filesystem]] ==ステップ4—Dockerコンテナファイルシステムへのアクセス
コンテナ内のコマンドプロンプトで作業し、そのファイルシステムにアクセスするには、docker exec
コマンドを使用できます。
「HelloWorld」の例は実行後に終了するため、docker exec
をテストするには、実行を継続するコンテナーを開始します。 このチュートリアルでは、Docker HubのNginx imageを使用します。
nginx
という名前の新しいディレクトリを作成し、そのディレクトリに移動します。
mkdir ~/nginx
cd ~/nginx
次に、新しいディレクトリにdocker-compose.yml
ファイルを作成し、テキストエディタで開きます。
vi docker-compose.yml
次に、ファイルに次の行を追加します。
~/nginx/docker-compose.yml
nginx:
image: nginx
ファイルを保存して終了します。 次のコマンドを使用して、バックグラウンドプロセスとしてNginxコンテナーを開始します。
docker-compose up -d
Docker ComposeはNginxイメージをダウンロードし、コンテナーはバックグラウンドで起動します。
ここで、コンテナのCONTAINER ID
が必要になります。 次のコマンドを使用して、実行中のすべてのコンテナーをリストします。
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
を使用してコンテナ内のシェルを開始します。
docker exec -it b86b6699714c /bin/bash
-t
オプションは端末を開き、-i
オプションはそれをインタラクティブにします。 /bin/bash
は、実行中のコンテナーに対してbashシェルを開きます。
次のようなコンテナのbashプロンプトが表示されます。
root@b86b6699714c:/#
ここから、コンテナ内のコマンドプロンプトから作業できます。 ただし、データボリュームの一部として保存されているディレクトリにいる場合を除き、コンテナを再起動するとすぐに変更が消えることに注意してください。 また、ほとんどのDockerイメージはごく最小限のLinuxインストールで作成されるため、使用するコマンドラインユーティリティとツールの一部が存在しない場合があることを忘れないでください。
結論
これでDocker Composeをインストールし、「Hello World」の例を実行してインストールをテストし、いくつかの基本的なコマンドを調べました。
「Hello World」の例はインストールを確認しましたが、単純な構成ではDocker Composeの主な利点の1つではありません。Dockerコンテナーのグループを同時に上下させることができます。 Docker Composeの動作を確認するには、How To Secure a Containerized Node.js Application with Nginx, Let’s Encrypt, and Docker ComposeとHow To Configure a Continuous Integration Testing Environment with Docker and Docker Compose on Ubuntu 16.04を確認してください。 これらのチュートリアルはUbuntu 16.04および18.04向けですが、ステップはCentOS 7に適合させることができます。