docker compose の使い方の詳しい説明

docker compose の使い方の詳しい説明

Docker Compose の使用シナリオ

開発時には、アプリケーションが複数のサービスに依存することがよくあります。従来の docker run 方式では、複数のサービスを 1 つずつ起動し、対応するネットワークを構成する必要があり、プロセスが面倒で不便です。 Docker Compose は、複数のサービスの構造と依存関係をdocker-compose.ymlに記述し、 docker-composeコマンドを使用してサービス クラスター全体を起動およびシャットダウンすることを目的としています。

基本的なデモ

デモ関数は、Web サービスを公開する単純な Python プログラムです。このサービスは、現在のサービスがアクセスされた回数をカウントするために使用されます。時間の蓄積と保存はすべて Redis に基づいています。つまり、プログラム自体も、独自のサービスに加えて、Redis サービスに依存しています。詳細な手順は次のとおりです

ディレクトリを見つけて、その中にPythonファイルapp.pyを作成します。

インポート時間

Redisをインポートする
FlaskからFlaskをインポート

アプリ = Flask(__name__)
キャッシュ = redis.Redis(ホスト = 'redis'、ポート = 6379)

get_hit_count() を定義します:
 再試行 = 5
 真の場合:
  試す:
   cache.incr('hits') を返します
  redis.exceptions.ConnectionError を除き、exc として:
   再試行 == 0 の場合:
    昇給
   再試行 -= 1
   時間.睡眠(0.5)

@app.route('/')
デフハロー():
 カウント = get_hit_count()
 'Hello World! {} 回表示されました。\n' を返します。format(count)

同じフォルダにrequirements.txtファイルを作成します。

requirements.txt ファイルは、Python プログラムが使用する必要がある依存ライブラリを宣言するために使用されます。これは、Java の Maven pom ファイルに少し似ています。上記のコードで使用されているコンポーネントは、flask と redis です。 requirements.txtファイルの内容は

フラスコ
レディス

同じフォルダにDockerfileを作成します

Dockerfile は、プログラムを Docker イメージにビルドするために使用されます。一般的に、Dockerfile は、コードを実行するための基本的な環境、プログラムの起動コマンド、実行ポートなどを定義します。この例のDockerfileは次のようになります。

python:3.7-alpine より
WORKDIR /コード
環境変数 FLASK_APP=app.py
環境変数 FLASK_RUN_HOST=0.0.0.0
コピー requirements.txt requirements.txt
pip install -r requirements.txt を実行します。
エクスポーズ5000
コピー 。 。
CMD ["フラスコ", "実行"]

同じファイル内にdocker-compose.ymlファイルを作成します。

上記の手順を完了すると、Docker 形式でサービスを実行できるようになります。ただし、このサービスは Redis サービスに依存します。そこで、docker-compose.yml を通じてサービスの依存関係を整理します。内容は次のようになります。

バージョン: "3.8"
サービス:
 ウェブ:
 建てる: 。
 ポート:
  - 「5000:5000」
 レディス:
 画像: "redis:alpine"

このファイルは、 web と redis の 2 つのサービスを定義しますbuild:.は、現在のディレクトリに以前に定義された Dockerfile に基づいて、コードをイメージにビルドします。コンテナーとして起動すると、ポート 5000 が外部に公開され、現在のホストのポート 5000 にマップされます。

redis サービスは、既製のイメージredis:alpine直接使用します。ポートは指定されず、redis のデフォルト ポートが公開されます。

基本的な操作とメンテナンス

すべての docker-compose 関連コマンドは、docker-compose.yml が配置されているパスで実行する必要があります。

docker-compose.ymlに基づいてサービスを起動する

docker-compose.yml が配置されているディレクトリで、コマンドdocker-compose up使用します。ただし、コンソールが閉じられると、対応する Docker サービスも閉じられます。 docker-compose up -d使用すると、バックグラウンド デタッチ モードで実行できます。

docker-compose up は、compolse ファイル内のサービスとその依存関係を個別に起動することもできます。

作成サービスに対応するコンテナサービスリストを表示する

docker-compose ps

出力例

# docker-compose ps
名前 コマンド 状態 ポート
----------------------------------------------------------------------------------------------
docker_compose_learn_redis_1 docker-entrypoint.sh redis ... 6379/tcp を起動
docker_compose_learn_web_1 フラスコ実行 0.0.0.0:5000->5000/tcp

サービス プレフィックスdocker_compose_learn現在のプロジェクトの名前です。プロジェクト名は、環境変数COMPOSE_PROJECT_NAMEで指定できます。指定しない場合、デフォルトのプロジェクト名は、Compose ファイルが配置されているフォルダーの名前になります。この例では、フォルダ名はdocker_compose_learnです。

もちろん、Compose 内の一連のサービスは、最終的に一連のコンテナを起動します。そのため、 docker containerコマンド ファミリを使用してそれらを管理することもできますが、面倒すぎます。

サービスコンテナを停止する

docker-compose.yml が配置されているパスで、 docker-compose stopコマンドを使用する必要があります。

サービスコンテナを停止し、対応するコンテナを削除します

docker-compose.yml が配置されているパスでコマンドを使用する必要があります。

docker-compose ダウン

サービスコンテナを停止し、対応するコンテナとボリュームデータを削除します。

docker-compose.yml が配置されているパスでコマンドを使用する必要があります。

docker-compose ダウン --volumes

このコマンドはマウントされたホスト オペレーティング システム ファイルを削除しません。

該当サービスへのログイン方法

Compose にログインして特定のサービスを実行するには、次のコマンドを使用します。

docker-compose exec ***サービス名*** bash

指定した作成ファイルを表示する方法

docker-compose -f docker-compose.yml -f docker-compose.admin.yml でbackup_dbを実行します。

docker-compose up と docker-compose run の違い

docker-compose up は、compose ファイルに基づいてすべてのサービスを開始し、ポートを外部に公開します。
docker-compose run では、起動する特定のサービスを指定する必要があります。たとえば、 docker-compose run web bash compolse ファイル内の web サービスとその依存サービスのみを起動し、docker-compose up によって起動されたサービス ポートとの競合を避けるためにポートを外部に公開しません。
docker-compose runは、サービスの場所の問題を一時的に開始するためにのみ使用されます。

いくつかの拡張知識ポイント

環境変数

docker-compose.yml の内容自体は変数プレースホルダーを使用でき、その特定の変数値は特定の環境変数で定義されるため、同じ docker-compose.yml ファイルでも環境によって実行動作が異なる場合があります。通常、依存サービスのイメージのタグ バージョンは環境ごとに異なる必要があります。

次に、docker-compose.ymlの対応するサービス構成でプレースホルダーを使用してタグを設定します。以下では${TAG}を使用してWebサービスのイメージタグを設定します。

ウェブ:
 画像: "webapp:${TAG}"

上記で指定した変数に加えて、設定可能な Docker 組み込み変数がいくつかあります。これらは、Docker または Docker Compose の実行動作を構成するために使用されます。これらの組み込み変数は

  • COMPOSE_API_バージョン
  • COMPOSE_CONVERT_WINDOWS_PATHS
  • 構成ファイル
  • 構文
  • 構文
  • プロジェクト名の作成
  • DOCKER_CERT_PATH
  • ホスト
  • TLS 検証

具体的な意味については、https://docs.docker.com/compose/reference/envvars/ を参照してください。

プレースホルダーTAG例にとると、変数の設定を説明する方法はいくつかあります。

docker-compose.ymlで実行

compolseファイルでは、 environment設定項目を通じて指定します。

ウェブ:
 画像: "webapp:${TAG}"
 環境:
 - タグ=dev

docker-compose コマンドを実行する前にシェル環境変数を設定する

$ エクスポート TAG=v2.0
$ docker-compose を起動します

env_fileによる設定

デフォルトでは、docker-compose up はコマンド実行パス内の .env ファイルを検索し、変数置換の値を見つけます。.env ファイルは、key=value の形式で構成されます。例えば

タグ=dev

環境変数の名前が .env でない場合、または現在のコマンド実行のパスにない場合は、 --env-fileパラメータを使用して明示的に読み込むことができます。

docker-compose --env-file ./config/.env.dev を起動します

構成ファイル内で直接、読み込むenv_fileを指定します

バージョン: '3'
サービス:
 API:
 画像: 'node:6-alpine'
 環境変数:
  ./Docker/api/api.env を参照してください。
 環境:
  - NODE_ENV=本番

上記の変数値設定は高から低の順に優先順位が付けられます

最終的な有効な環境変数を表示する

最終的に有効な環境変数がわからない場合は、次のコマンドを使用して確認できます。

docker-compose で Web 環境を実行する

プロジェクト名の設定

Compose に対応するサービスのグループには共通のプロジェクト名があり、これは Compose サービスのコンテナ名プレフィックスとネットワークプレフィックスに反映されます。
プロジェクト名は、環境変数COMPOSE_PROJECT_NAMEで指定できます。指定しない場合、デフォルトのプロジェクト名は、Compose ファイルが配置されているフォルダーの名前になります。

ネットワーク

デフォルトネットワーク

デフォルトでは、Compose 内の複数のサービスが default と呼ばれるネットワークに参加します。これらのサービスはデフォルトのネットワークで相互接続されています。デフォルト ネットワークの完全な名前の前には、作成ファイルが配置されているフォルダーの名前が付けられます。たとえば、フォルダーは hello_world の compose です。 1 セットのサービスに対応するネットワーク名は hello_world_default です。 このグループのサービスは、構成ファイル内の 2 番目のポート グループを使用してこのネットワーク内で通信します。

バージョン: "3"
サービス:
 ウェブ:
 建てる: 。
 ポート:
  - 「8000:8000」
 デシベル:
 画像: postgres
 ポート:
  - 「8001:5432」

たとえば、上記の構成では、hello_world_default ネットワークで、Web サービスはポート 8000 を使用して、ポート 5432 の db サービスと通信します。最初のグループのポート 8000 と 8001 は、ホストが Web サービスと DB サービスにアクセスするために使用するポートです。

デフォルトネットワークの独立した構成

デフォルトのネットワーク設定を変更したい場合は、次のようにデフォルトのネットワークドライバーを変更するなど、コンポーズファイルのネットワーク項目を通じて個別に変更できます。

ネットワーク:
 デフォルト:
 # カスタムドライバーを使用する
 ドライバー: カスタムドライバー 1

デフォルト以外のネットワークの設定と使用

複数のネットワークを定義して使用する

バージョン: "3"
サービス:

 プロキシ:
 ビルド: ./proxy
 ネットワーク:
  -フロントエンド
 アプリ:
 ビルド: ./app
 ネットワーク:
  -フロントエンド
  - バックエンド
 デシベル:
 画像: postgres
 ネットワーク:
  - バックエンド

ネットワーク:
 フロントエンド:
 # カスタムドライバーを使用する
 ドライバー: カスタムドライバー 1
 バックエンド:
 # 特別なオプションを取るカスタムドライバーを使用する
 ドライバー: カスタムドライバー2
 ドライバーオプション:
  : "1"
  バー: "2"

上記の構成では、フロントエンドとバックエンドの 2 つのネットワークが定義されています。アプリは両方のネットワークにアクセスでき、プロキシ サービスはフロントエンド ネットワークにのみアクセスでき、DB はバックエンド ネットワークにのみアクセスできます。

複数のサービスの実行順序

Compose 内の複数のサービスには依存関係がある場合があります。たとえば、Web サービスは db サービスに依存しています。最初に db サービスを開始し、次に Web サービスを開始することを想定しています。この起動順序は、composeファイルでdepends_onを使用して指定することもできます。

バージョン: "2"
サービス:
 ウェブ:
 建てる: 。
 ポート:
  - 「80:8000」
 依存:
  - 「デシベル」
 コマンド: ["./wait-for-it.sh", "db:5432", "--", "python", "app.py"]
 デシベル:
 画像: postgres

Docker Composeのインストール

Docker の Mac 版と Windows 版の両方に、デフォルトで Docker Compose が付属しています。 Linux版のみ別途インストールする必要がある

docker compose と docker stack の類似点と相違点

  • docker composeの主な目的は、同じマシン上で複数のサービスを開始および管理することです。
  • Docker スタックは主に、複数のマシン上で複数のサービスを開始および管理するために使用されます。
  • docker compose と docker stack はどちらも docker-compose.yml ファイルを使用できます。双方とも、自分達にとって効果的でない構成を自動的に無視します。
  • Docker Compose サービスはビルドを使用して動的に構築できますが、Docker Stack サービスはイメージに基づいてのみ構築できます。

参考文献

詳しくはこちら:
詳しくはこちら
https://stackoverflow.com/questions/43099408/whats-the-difference-between-a-stack-file-and-a-compose-file
https://nickjanetakis.com/blog/docker-tip-23-docker-compose-vs-docker-stack
https://vsupalov.com/difference-docker-compose-and-docker-stack/
https://stackoverflow.com/questions/33066528/should-i-use-docker-compose-up-or-run

docker compose の使い方に関する記事はこれで終わりです。docker compose の使い方に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • DockerとDocker-Composeの使用例
  • Docker は固定コンテナ IP アドレスを実現するためにカスタム ネットワークを作成します。
  • Docker-compose を使用して ELK クラスターを構築する方法
  • Spring環境を構成するためのDocker-composeの手順
  • Docker Compose ネットワーク設定の説明

<<:  Vueはコンピュータカメラを呼び出して写真機能を実現します

>>:  MySQL 8.0.15 で MGR シングル マスターと複数スレーブを構成する方法

推薦する

jQuery タグセレクターの適用例の詳細な説明

この記事では、jQueryタグセレクターアプリケーションの具体的なコードを例として紹介します。具体的...

mysql mycat ミドルウェアの簡単な紹介

1. mycatとはエンタープライズアプリケーション開発のための完全にオープンソースの大規模データベ...

Linux ncコマンドの概要

NC のフルネームは Netcat (Network Knife) で、作成者は Hobbit &a...

MySQLクエリのパフォーマンスを分析する方法

目次スロークエリの基礎: データ取得の最適化データベースから不要なデータが要求されていないか確認する...

MySQLで数千万のテストデータを素早く作成する方法

述べる:この記事で扱うデータ量は 100 万です。数千万のデータが必要な場合は、量を増やすだけで済み...

Vue で Baidu Map を呼び出して経度と緯度を取得する

プロジェクトでは、現在地の緯度経度を取得したり、場所を検索して緯度経度情報を取得したりする必要があり...

MySQLカスタム関数の原理と使用法の分析

この記事では、例を使用して MySQL カスタム関数の原理と使用方法を説明します。ご参考までに、詳細...

node.js で EventEmitter をカスタマイズする方法

目次序文1. 何ですか2. Node.jsでEventEmitterを使用する方法3. 実施プロセス...

@Font-face の基本的な使い方と、すべてのブラウザと互換性を持たせる方法

@Font-face 基本紹介: @font-face は、Web ページにカスタム フォントを表示...

パスワードログインなしでCentOS7にxshellリモートログインするアイデアを詳しく解説

まず、全体的な考え方についてお話しします。 1. パスワードを使用してCentOSシステムにログイン...

CentOS7 インストール Zabbix 4.0 チュートリアル (イラストとテキスト)

SeLinuxを無効にするsetenforce 0永久に閉店: vi /etc/selinux/c...

スクラッチ宝くじの例を実現する JavaScript キャンバス

この記事では、スクラッチ効果を実現するためのJavaScriptキャンバスの具体的なコードを参考まで...

数百万のデータに対して MySQL クエリを最適化する 4 つの方法

目次1. 時間が経つにつれて限界が遅くなる理由2. 百万データシミュレーション1. 従業員テーブルと...

FTP、FTPS、SFTPの違いについて簡単に説明します

目次FTP、FTPS、SFTP の概要FTP FTPS FTPサーバーFTPソフトウェアのアクティブ...

CSSオーバーフローメカニズムについての簡単な説明

CSS オーバーフローのメカニズムを詳細に学ぶ必要があるのはなぜですか?実際の開発プロセスでは、コン...