Docker Compose マルチコンテナデプロイメントの実装

Docker Compose マルチコンテナデプロイメントの実装

1. WordPressの導入

ここでは、WordPress のデプロイメントを例に、Docker Compose を紹介します。WordPress のデプロイメントには、WordPress と MySQL のイメージが必要です。

1. 環境を整える

1. WordPressイメージを取得する

[root@docker-node1 /]# docker pull wordpress

2. MySQLイメージを取得する

[root@docker-node1 /]# docker pull mysql

3. ミラーリスト

[root@docker-node1 /]# docker イメージ ls
リポジトリ タグ イメージ ID 作成 サイズ
wordpress 最新 0947f14b932b 25時間前 540MB
mysql 最新 791b6e40940c 43 時間前 465MB

(II) イメージを実行する

1. MySQLイメージを実行する

root@docker-node1 /]# docker run -d --name mysql -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=wordpress mysql
b6e7a57a5fcec79f436d3f65240adf833340b4a9640e3b4f9282870078fb8e57

上記のコマンドでは、-v はストレージボリュームを指定し、MYSQL_ROOT_PASSWORD はデータベースのパスワードを設定し、MYSQL_DATABASE は作成されたデータベースの名前を指定します。詳細については、https://hub.docker.com/_/mysql を参照してください。

起動したコンテナを表示します。

[root@docker-node1 /]# docker ps
コンテナID イメージ コマンド 作成ステータス ポート名
b6e7a57a5fce mysql "docker-entrypoint.s…" 6 分前 6 分前にアップ 3306/tcp、33060/tcp mysql

2. WordPressイメージを起動する

[root@docker-node1 /]# docker run --name wordpress -e WORDPRESS_DB_HOST=mysql:3306 --link mysql -p 8080:80 -d wordpress
6cf0c0fc2ef332728a3ea2bf2dbee65299441b26751d5c64f0a66b329f2679f6

上記コマンドで、WORDPRESS_DB_HOST は接続先のデータベースで、指定しているのは先ほど作成した MySQL コンテナです。MySQL コンテナのデフォルトのユーザー名とパスワードが使用されるため、WORDPRESS_DB_USER や WORDPRESS_DB_PASSWORD のパスワードなどの環境情報はここでは入力しません。詳細については、https://hub.docker.com/_/wordpress を参照してください。

次にコンテナ情報を表示します。

[root@docker-node1 /]# docker ps
コンテナID イメージ コマンド 作成ステータス ポート名
6cf0c0fc2ef3 wordpress "docker-entrypoint.s…" 3 分前 3 分前にアップ 0.0.0.0:8080->80/tcp wordpress
b6e7a57a5fce mysql "docker-entrypoint.s…" 20 分前 20 分前にアップ 3306/tcp、33060/tcp mysql

これで両方のコンテナが起動し、ホストのポート 8080 にアクセスできるようになります。

Docker の作成

上記の展開から、次の問題がわかります。

  • 複数のコンテナを別々にプルし、1つずつデプロイする必要がある
  • 複数のコンテナを同時に管理する必要がある (起動、停止などを含む)

では、このような面倒なプロセスを必要としないバッチ処理に似た方法はあるのでしょうか?ここで Docker Compose の出番です。

1. Docker Compose の紹介

1. Docker Compose とは何ですか?

Docker Composeはツールです

このツールは、ymlファイルを通じてマルチコンテナアプリケーションを定義できます。

1 つのコマンドで、yml ファイルの定義に従って複数のコンテナを作成および管理できます。

2. docker-compose.yml ファイル

Docker Compose の非常に重要な部分は docker-compose.yml ファイルであり、このファイルには、サービス、ネットワーク、ボリュームという 3 つの非常に重要な概念が含まれています。

サービス

サービスはコンテナです。このコンテナは、Dockerhub のイメージから取得することも、ローカルの Dockerfile から作成されたイメージから取得することもできます。サービスの開始は、docker run の開始に似ています。docker run を使用する場合、ネットワークとボリュームのパラメータを指定できます。同様に、サービスのネットワークとボリュームも指定できます。

例えば:

サービス:
  デシベル:
    イメージ:postgres:9.4
    ボリューム:
      -"db-data:/var/lib/postgresql/data"
    ネットワーク:
      -後段

上記の yml ファイルは、次のコマンドと同等のサービスを定義します。

docker run -d --network back-tier -v db-data:/var/lib/postgresql/data postgres:9.4

ネットワーク

ネットワーク:
  バックティア:
    ドライバー:ブリッジ

上記の yml ファイルはネットワークを定義しており、これは次のコマンドと同等です。

docker ネットワーク作成 -d ブリッジ バックティア

ボリューム

ボリューム:
  dbデータ:

上記の yml ファイルはボリュームを定義しており、これは次のコマンドと同等です。

docker ボリューム作成 db-data

(II) Docker Compose環境の準備

Docker Cmpose はツールなのでインストールする必要があります。インストールの詳細については、https://docs.docker.com/compose/install/ を参照してください。

1. 実行ファイルをダウンロードする

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

2. 権限を設定する

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

3. バージョンを確認する

[root@docker-node1 ~]# docker-compose --version
docker-compose バージョン 1.24.1、ビルド 4667896

4. docker-composeの共通コマンド

[root@docker-node1 compose-wordpress]# docker-compose --help
Docker を使用してマルチコンテナ アプリケーションを定義および実行します。

使用法:
 docker-compose [-f <arg>...] [オプション] [コマンド] [引数...]
 docker-compose -h|--ヘルプ

オプション:
 -f, --file FILE 代替コンポーズファイルを指定する
               (デフォルト: docker-compose.yml)
 -p, --project-name NAME 別のプロジェクト名を指定します
               (デフォルト: ディレクトリ名)
 --verbose 詳細な出力を表示
 --log-level LEVEL ログレベルを設定する (DEBUG、INFO、WARNING、ERROR、CRITICAL)
 --no-ansi ANSI制御文字を印刷しない
 -v, --version バージョンを印刷して終了する
 -H, --host HOST 接続するデーモンソケット

 --tls TLS を使用する。--tlsverify によって暗黙的に指定される。
 --tlscacert CA_PATH この CA によってのみ署名された証明書を信頼します
 --tlscert CLIENT_CERT_PATH TLS証明書ファイルへのパス
 --tlskey TLS_KEY_PATH TLS キーファイルへのパス
 --tlsverify TLSを使用してリモートを検証する
 --skip-hostname-check デーモンのホスト名を
               クライアント証明書に指定された名前
 --project-directory PATH 代替作業ディレクトリを指定する
               (デフォルト: Compose ファイルのパス)
 --compatibility が設定されている場合、Compose はキーの変換を試みます
               v3ファイル内のSwarm以外の同等ファイル

コマンド:
 構築 サービスを構築または再構築する
 バンドル Compose ファイルから Docker バンドルを生成する
 config Composeファイルを検証して表示する
 作成 サービスを作成する
 コンテナ、ネットワーク、イメージ、ボリュームを停止して削除する
 イベント コンテナからリアルタイムイベントを受信する
 exec 実行中のコンテナでコマンドを実行する
 help コマンドのヘルプを取得する
 画像 画像一覧
 コンテナを強制終了する
 ログ コンテナからの出力を表示する
 一時停止 サービスを一時停止する
 port ポートバインディングのパブリックポートを印刷する
 ps コンテナを一覧表示する
 pull プルサービスイメージ
 プッシュサービスイメージ
 サービスを再起動する
 rm 停止したコンテナを削除する
 実行 1回限りのコマンドを実行する
 スケール サービスのコンテナ数を設定する
 開始 サービスを開始する
 停止 サービスを停止する
 実行中のプロセスを表示する
 一時停止を解除する サービスを一時停止解除する
 コンテナの作成と起動
 version Docker-Composeのバージョン情報を表示します

docker-compose を起動する

コンテナを作成し、ymlファイルを実行するためにサービスを開始するために使用されます

ドッカーの作成 -d

バックグラウンド実行コンテナサービス

docker-compose ps

実行中のコンテナを表示

docker-compose を停止する

実行中のコンテナサービスを停止する

docker-compose ダウン

コンテナ サービスを停止し、コンテナ、イメージ、ネットワーク、ボリュームを削除します。

docker-compose イメージ

docker-compose upで作成したコンテナサービスのイメージリストを表示する

docker-compose exec コンテナ(名前) bash

コンテナに入り、コンテナ内で操作を実行する

Docker Compose の動作

1. ワードプレス

docker-compose.ymlファイルを書き込む

version: '3' #docker-compose.yml バージョン services: #複数のコンテナ サービスの定義 wordpress: #wordpress コンテナ名 image: wordpress #イメージ ソース ports: #ポート マッピング - 8080:80
  environment: #環境変数 WORDPRESS_DB_HOST: mysql #接続するデータベースは、以下のmysqlコンテナの名前です WORDPRESS_DB_PASSWORD: root #データベースパスワード networks: #使用されるネットワークは、以下のネットワークで定義されているmy-bridgeです
   -私の橋

 mysql: #mysql コンテナ名image: mysql #mysql イメージcommand: --default-authentication-plugin=mysql_native_password #データベース パスワード暗号化の問題を解決environment: #環境変数MYSQL_ROOT_PASSWORD: root
   MYSQL_DATABASE: ワードプレス
  volumes: #以下のボリュームで定義されているストレージボリュームを定義します - mysql-data:/var/lib/mysql
  ネットワーク:
   -私の橋

ボリューム:
 mysqlデータ:

ネットワーク:
 私のブリッジ:
  ドライバー: ブリッジ

サービスでコンテナを起動する

[root@docker-node1 compose-wordpress]# ls
ドッカーの作成
[root@docker-node1 compose-wordpress]# docker-compose を起動します

docker-compose upでコンテナを起動します。このコマンドは、デフォルトで現在のディレクトリにあるdocker-compose.ymlファイルを実行します。完全なコマンドをdocker-compose -f docker-compose.yml upと書くこともできます。

2. フラスコウェブ

3つのファイルを作成します: app.py docker-compose.yml Dockerfile

[root@docker-node1 compose-flask]# ls
app.py docker-compose.yml Dockerファイル

app.pyファイルを書く

FlaskからFlaskをインポート
RedisからRedisをインポート
インポートOS

アプリ = Flask(__name__)
redis = Redis(ホスト=os.environ.get('REDIS_HOST'),ポート=6379)

@app.route('/')
デフハロー():
  「Hello World」を返す

__name__ == "__main__" の場合:
  app.run(ホスト=0.0.0.0、ポート=5000、デバッグ=True)

Dockerfileの作成

Python:2.7から
コピー ./app/
ワークディレクトリ /app/
pip install flask redisを実行します。
エクスポーズ5000
コマンド ["python","app.py"]

docker-compose.ymlファイルを書き込む

バージョン: "3"

サービス:

 レディス:
  画像: redis

 ウェブ:
  建てる:
   コンテクスト: 。
   dockerfile: Dockerファイル
  ポート:
   - 8080:5000
  環境:
   REDIS_HOST: レディス

コンテナサービスを開始する

[root@docker-node1 compose-flask]# docker-compose を起動します

アクセスサービス

4. 水平拡張と負荷分散

1. スケール

Flask アプリケーションのデプロイは、Docker Compose を通じて上記で完了しました。現在実行中のコンテナは次のとおりです。

[root@docker-node1 compose-flask]# docker-compose ps
    名前 コマンド 状態 ポート     
---------------------------------------------------------------------------------------
compose-flask_redis_1 docker-entrypoint.sh redis ... 6379/tcp を起動       
compose-flask_web_1 python app.py アップ 0.0.0.0:8080->5000/tcp

docker-compose --help コマンドを実行すると、スケール パラメータがあることがわかります。

[root@docker-node1 compose-flask]# docker-compose --help
  スケール サービスのコンテナ数を設定する

つまり、複数のアプリケーション コンテナーを有効にできます。

[root@docker-node1 compose-flask]# docker-compose up --scale web=3 -d

しかし、これは明らかに間違っています。なぜでしょうか? 3 つのコンテナのポート マッピングは同じであるため、残りの 2 つのアプリケーション コンテナは必然的にポート占有エラーを報告します。この時点で、docker-compose.yml ファイルを変更して、Web アプリケーションのポート構成を削除する必要があります。

バージョン: "3"

サービス:

 レディス:
  画像: redis

 ウェブ:
  建てる:
   コンテクスト: 。
   dockerfile: Dockerファイル
  ポート: #この項目を削除 - 8080:5000
  環境:
   REDIS_HOST: レディス

それでおしまい。

[root@docker-node1 compose-flask]# docker-compose up --scale web=3 -d
compose-flask_web_1 を再作成しています... 
compose-flask_web_1 を再作成しています...完了
compose-flask_web_2 を再作成しています...完了
compose-flask_web_3 を再作成しています...完了

コンテナを表示します:

[root@docker-node1 compose-flask]# docker ps
コンテナID イメージ コマンド 作成ステータス ポート名
d0ae3307eb9e compose-flask_web "python app.py" 51 秒前 46 秒前にアップ 5000/tcp compose-flask_web_1
67483b8decd3 compose-flask_web "python app.py" 52 秒前 47 秒前にアップ 5000/tcp compose-flask_web_2
741766d49902 compose-flask_web "python app.py" 52 秒前 47 秒前にアップ 5000/tcp compose-flask_web_3
be3800004658 redis "docker-entrypoint.s…" 5 時間前 6 分前 6379/tcp compose-flask_redis_1

しかし、ポートがマップされていないため、コンテナ内でしかアクセスできないのは明らかです。では、次に何をすればよいのでしょうか?

次に、HAProxy コンテナを使用してリクエストを受信し、ポートを介して別の Web サーバーに転送することで、次の問題を解決できます。

  • 外部からはアクセスできず、コンテナ内からのみアクセスできます
  • 負荷分散

2. 水平拡張と負荷分散

ファイル構造

[root@docker-node1 compose-flask]# ls
app.py docker-compose.yml Dockerファイル

app.pyを書く

FlaskからFlaskをインポート
RedisからRedisをインポート
インポートOS

アプリ = Flask(__name__)
redis = Redis(ホスト=os.environ.get('REDIS_HOST'),ポート=6379)

@app.route('/')
デフハロー():
  「Hello World」を返す

__name__ == "__main__" の場合:
  app.run(ホスト=0.0.0.0、ポート=80、デバッグ=True)

Dockerfileの作成

Python:2.7から
コピー ./app/
ワークディレクトリ /app/
pip install flask redisを実行します。
エクスポーズ80
コマンド ["python","app.py"]

docker-compose.ymlファイルを書き込む

バージョン: "3"

サービス:

 レディス:
  画像: redis

 ウェブ:
  建てる:
   コンテクスト: 。
   dockerfile: Dockerファイル
  環境:
   REDIS_HOST: レディス

 ポンド:
  イメージ: dockercloud/haproxy
  リンク:
   - ウェブ
  ポート:
   -8080:80
  ボリューム:
   - /var/run/docker.sock:/var/run/docker.sock

走る

[root@docker-node1 compose-flask]# docker-compose up -d
デフォルトドライバーでネットワーク「compose-flask_default」を作成しています
compose-flask_web_1 を作成しています...完了
compose-flask_redis_1 を作成しています...完了
compose-flask_lb_1 を作成しています...完了

3 つのコンテナが起動していることがわかります。

[root@docker-node1 compose-flask]# docker-compose ps
    名前 コマンド 状態 ポート        
---------------------------------------------------------------------------------------------------
compose-flask_lb_1 /sbin/tini --dockercloud- ... 1936/tcp、443/tcp がアップしました。        
                                 0.0.0.0:8080->80/tcp       
compose-flask_redis_1 docker-entrypoint.sh redis ... 6379/tcp を起動             
compose-flask_web_1 python app.py 5000/tcp まで

現時点では Web アプリケーションは 1 つだけであり、リクエストを処理するために複数のアプリケーションを起動できることがわかります。

[root@docker-node1 compose-flask]# docker-compose up --scale web=5 -d
compose-flask_redis_1 は最新です
compose-flask_web_1 を開始しています...完了しました
compose-flask_web_2 を作成しています...完了
compose-flask_web_3 を作成しています...完了
compose-flask_web_4 を作成しています...完了
compose-flask_web_5 を作成しています...完了
compose-flask_lb_1 は最新です

ご覧のとおり、HAProxy からのリクエストを共有するために、Web アプリケーションに対して 5 つのコンテナーが直接起動されます。

Docker Compose マルチコンテナデプロイメントの実装に関するこの記事はこれで終わりです。Docker Compose マルチコンテナデプロイメントの詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Docker Compose によるマルチコンテナ サービスの迅速な展開の詳細な例
  • docker compose デプロイメントにおけるマスタースレーブレプリケーションの実装
  • Docker Compose を使用して ElasticSearch 構成プロセスを構築およびデプロイする

<<:  Vue テンプレートのコンパイルの詳細

>>:  MySQL スロークエリ関連パラメータの原理の分析

推薦する

HTML テーブル マークアップ チュートリアル (5): ライト ボーダー カラー属性 BORDERCOLORLIGHT

表では、左上の境界線の色を個別に定義したり、セルの右下の境界線の色を定義したりできます。これら 2 ...

HTML でフォントの色を設定する方法と、PS を使用して HTML で正確なフォントの色を取得する方法

1. HTMLフォントカラー設定HTML では、フォント タグを使用してフォント コンテンツの色を設...

CSS3 を使って本のページめくり効果を実現するサンプルコード

重要なポイント: 1. CSS3 3Dアニメーションをマスターする2. ページめくり後のページ内容の...

JavaScript でよく使われるいくつかの文字列メソッドの概要 (初心者必読)

JavaScriptでよく使われるいくつかの文字列メソッド文字列は読み取り専用データです。よく使用...

ubuntu14.04 に jdk1.8 をインストールするチュートリアル

1. jdkダウンロードアドレスをダウンロードする我下載的是jdk-8u221-linux-x64....

Linux の 5 ステップ ビルド カーネル ツリー

目次0. システムに付属するカーネルツリー1. 環境設定最初のステップステップ2 2. ソースコード...

Linux でリモート サーバー ファイルの状態を表示する方法

以下のように表示されます。 test コマンドはファイルが存在するかどうかを判断します。 ssh u...

ページングのどのページでMySQLのレコードをクエリするか

序文実際には、次のような問題に遭遇する可能性があります。特定のレコードの ID がわかっていて、その...

Vueの監視プロパティの詳細

目次1.watchは一般的なデータ(数値、文字列、ブール値)の変更を監視します。 1. 数値2. 文...

MySQLのロック機構に関する最も包括的な説明

目次序文グローバルロック完全なデータベース論理バックアップFTWRL と set global re...

MySQLクエリは、フィールドが数値とカンマではないことを指定します。

コアSQL文数字を含まない MySQL クエリ ステートメント: SELECT * FROM tes...

MySQL で指定した桁数の乱数を生成する方法と、バッチで乱数を生成する方法

1. まず、よく使われるMySQL関数をいくつか紹介しますRAND() は 0 から 1 (0<...

複数のパッケージソースから同時にパッケージをロードするようにnpmを設定する方法

目次1. ローカルストレージを構築する2. npmパッケージを作成し、プライベートリポジトリにアップ...

spring-boot と docker-java に基づいて Docker コンテナの動的な管理と監視を実装します [完全なソース コードのダウンロード付き]

Docker入門Docker はオープンソースのアプリケーション コンテナ エンジンです。従来の仮...

MySQL 完全折りたたみクエリ正規マッチングの詳細な説明

概要前の章では、クエリのフィルター条件について学習しました。MySQL では、like % ワイルド...