CentOS 7にDocker Composeをインストールして使用する方法

前書き

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

Dockerコミュニティは、http://www.fig.sh/ [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チームが管理する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-share-data-between-docker-containers [ファイルを共有]を簡単に実行できます。

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

前提条件

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

  • CentOS 7サーバー、sudo特権を持つ非ルートユーザーでセットアップ(https://www.digitalocean.com/community/tutorials/initial-server-setup-with-centos-7[CentOS 7での初期サーバーセットアップ]を参照)詳細については)

  • Dockerをインストールして使用する方法CentOS 7で

これらが準備できたら、あなたはそれをフォローする準備が整います。

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

最新リリースを入手するには、https://docs.docker.com/compose/install/ [Docker docs]のリードを取り、DockerのGitHubリポジトリのバイナリからDocker Composeをインストールします。

https://github.com/docker/compose/releases [現在のリリース]を確認し、必要に応じて、以下のコマンドで更新してください。

sudo curl -L "https://github.com/docker/compose/releases/download//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 , build 1110ad01

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

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

パブリック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」という名前のローカルイメージがない場合、Docker ComposeはDocker Hubパブリックリポジトリからそれを取得します。

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

イメージをプルした後、 `+ docker-compose +`はコンテナーを作成し、アタッチし、https://github.com/docker-library/hello-world/blob/85fd7ab65e079b08019032479a3f306964a28f4d/hello-world/Dockerfile [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コマンドの調査に進むことができます。

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

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 -a

コンテナが停止している場合、次の例に示すように、「+ State」は「+ Excited」としてリストされます。

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;         443/tcp, 80/tcp

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

docker-compose stop

場合によっては、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 +`コマンドを使用できます。

「Hello World」の例は実行後に終了するため、 `+ docker exec +`をテストするには、実行を継続するコンテナーを起動します。 このチュートリアルでは、Docker Hubのhttps://hub.docker.com/_/nginx/[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  /bin/bash

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

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

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

結論

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

「Hello World」の例はインストールを確認しましたが、単純な構成ではDocker Composeの主な利点の1つではありません-Dockerコンテナーのグループを同時に上下させることができます。 Docker Composeの実際の動作を確認するには、https://www.digitalocean.com/community/tutorials/how-to-secure-a-containerized-node-js-application-with-nginx-let-s-をご覧ください。 encrypt-and-docker-compose [コンテナ化されたNode.jsアプリケーションをNginx、Let暗号化、Docker Composeで保護する方法]およびhttps://www.digitalocean.com/community/tutorials/how-to-configure-a- docker-and-docker-compose-on-ubuntu-16-04による継続的統合テスト環境-[Ubuntu 16.04でのDockerおよびDocker Composeを使用した継続的統合テスト環境の設定方法]。 これらのチュートリアルはUbuntu 16.04および18.04向けですが、ステップはCentOS 7に適合させることができます。