Docker コンテナのデプロイの試み - マルチコンテナ通信 (node+mongoDB+nginx)

Docker コンテナのデプロイの試み - マルチコンテナ通信 (node+mongoDB+nginx)

その理由は

モッカー プラットフォームを導入したかったので、友人の勧めで既成のプロジェクト api-mocker を選択しました。

プロジェクトはサーバーノード、クライアントvue、データベースmongoDBに分かれています。

直接デプロイしようとすると、node、mongo、nginx など多くの環境をインストールする必要があることがわかりました。非常に面倒でした。以前は docker を使用していたため、環境なしで docker を使用して直接デプロイできるかどうか疑問に思っていました。そこでこの試みがありました

マルチコンテナ通信

プロジェクトは3つの部分に分かれているため、3つのコンテナ(node、mongo、nginx)を構築する必要があります。

コンテナはどのように相互に通信するのでしょうか?

 # リンクコマンドを介して接続を確立します$ docker run --name <Name> -d -p <path1>:<path2> --link <containerName>:<alias> <containerName:tag/imageID>

- --link コンテナ接続命令
- < コンテナ名 > : < エイリアス >
- <接続されたコンテナ名> : <コンテナ アクセス エイリアス>
- 注意: エイリアスは、接続をアクティブに確立するコンテナ内でアクセスされ、接続されたコンテナによって使用されます。
- 次の手順でコンテナ内の接続状態を検出します
$ curl <エイリアス>

次に、展開を始めます

実装プロセス

1. mongoコンテナを構築する

2. ノードコンテナを構築し、mongoコンテナとの接続を確立する

3. nginxコンテナを構築し、ノードコンテナとの接続を確立する

mongoコンテナを構築する

まずはmongoイメージを取得しましょう

$ docker pull mongo:latest

それではこのイメージを実行してみましょう。

 $ docker イメージ
 リポジトリ タグ イメージ ID 作成 サイズ
 mongo 最新 05b3651ee24e 2週間前 382MB

--auth ディレクティブは、Mongo 接続 ID 検証をオンにします。ノードがコンテナー間で接続されているときに ID 検証が設定されていないため、検証がオンになります。サーバーは Mongo データベースに接続できません。

「」
nodejs.MongoError: [egg-mongoose]認証に失敗しました。
「」

コンテナを表示

$ docker ps -a
コンテナID イメージ コマンド 作成ステータス ポート名
0d440be90935 mongo "docker-entrypoint.s..." 14 時間前 14 時間前 0.0.0.0:27017->27017/tcp mock-mongo

mongoの認証を有効にしたので、mongoコンテナに入り、ノードが接続するときに使用するアカウントを設定する必要があります。

$ docker exec -it mock-mongo /bin/bash
$ mongo管理者
# マネージャーユーザーを作成する
$ db.createUser({ユーザー:"admin", パスワード:"admin", ロール:[{ロール:"admin", db:"admin"}]})
# アカウント認証 $ db.auth('admin','admin')

mongo データベースが実行されているので、ノード コンテナーを作成します。

ノードコンテナを構築し、mongoコンテナとの接続を確立する

ノードコンテナの構築を始める前に、まずmongoコンテナのエイリアス、ポート番号、ログインアカウントのパスワードを決める必要があります。

  • mongo コンテナのエイリアス:
  • db mongo ポート番号: 27017
  • アカウントパスワード:admin:admin

まずノードサーバーの設定を変更しましょう

ファイル構成 dockerfile/api-mocker/server/config/config.default.js mongo接続構成を変更します。dbは、事前に設定されたmock-mongoコンテナのエイリアスです。

 マングース: {
 URL: 'mongodb://admin:admin@db:27017/api-mock?authSource=admin'
 },

次に、イメージをビルドするためのDockerfileを作成します。

 # ベースイメージをFROM node:latestから指定
 
 # メンテナー MAINTAINER [email protected]
 
 # 作業ディレクトリ WORKDIR /www
 
 #ローカルファイルを解凍せずにコンテナにコピーする COPY api-mocker node-server/api-mocker
 
 エクスポーズ7001
 
 ワークディレクトリ /www/node-server/api-mocker/server
 
 npmインストールを実行
 
 ワークディレクトリ /www/node-server/api-mocker
 
 # コンテナの構築後に呼び出され、コンテナの起動時に呼び出されます CMD ["make", "prod_server"]

書き込んだDockerfileファイルを使用してイメージを構築します

 ビルドは -t で始まり、実行は 1.0.0 になります。

画像を見てみましょう

 $ docker イメージ
 リポジトリ タグ イメージ ID 作成 サイズ
 mock-server 1.0.0 957ad2aa1f97 8分前 674MB
 mongo 最新 05b3651ee24e 2週間前 382MB

ここで重要なステップが始まります。mocker-server イメージを実行し、サーバーとデータベース間の接続を確立します。

次のようにコードをコピーします
$ docker run -d -i -t -p 7001:7001 --name mock-server1 --link mock-mongo:db mock-server:1.0.0 /bin/bash

現在実行中のコンテナを見てみましょう

 $ docker ps
 コンテナID イメージ コマンド 作成ステータス ポート名
 ee780b903c64 mock-server:1.0.0 "/bin/bash" 約 1 分前 11 秒前に起動 0.0.0.0:7001->7001/tcp mock-server
 0d440be90935 mongo "docker-entrypoint.s..." 16 時間前 16 時間前 0.0.0.0:27017->27017/tcp mock-mongo

ノードコンテナとmongoコンテナ間の接続状態を確認する

 $ docker exec -it モックサーバー /bin/bash
 $ カールデータベース

サーバーとデータベースの接続が確立されたので、クライアントのデプロイを開始します。

nginxコンテナを構築し、ノードコンテナとの接続を確立する

nginxを設定する前に、まずノードコンテナのエイリアス、nginxによって転送されるポート番号、nginxへのクライアントアクセス用のドメイン名とポート番号について合意する必要があります。

  • ノード サーバー エイリアス: ノード
  • ノードコンテナによってマップされたポート番号: 7001
  • nginx ドメイン名: 127.0.0.1
  • nginx ポート番号: 90

まずnginxイメージをプルしてコンテナを作成しましょう

$ docker pull nginx:最新
$ docker run -p 90:80 --link mock-node:node nginx:latest --name mock-nginx
# コンテナの接続ステータスを確認する $ docker exec -it mock-nginx /bin/bash
$env
# 次のデータが表示された場合、接続が成功したことを意味します NODE_PORT_7001_TCP=tcp://172.17.0.3:7001
NODE_PORT_7001_TCP_PORT=7001
1.9.4 より前のバージョン

では、実行中のコンテナを見てみましょう

$ docker ps
 コンテナID イメージ コマンド 作成ステータス ポート名
 09644025d148 nginx "nginx -g 'daemon of..." 5 時間前 5 時間前 0.0.0.0:90->80/tcp mock-nginx
 ee780b903c64 mock-server:1.0.0 "/bin/bash" 約 1 分前 11 秒前に起動 0.0.0.0:7001->7001/tcp mock-server
 0d440be90935 mongo "docker-entrypoint.s..." 24 時間前 24 時間前 0.0.0.0:27017->27017/tcp mock-mongo

フロントエンドを独立して展開するため、nginx の設定を変更する必要があります。nginx の設定を変更する方法はいくつかあります。

  • コンテナを作成するときは、-v コマンドを使用して設定ファイルをローカル ホストにマウントし、ローカルで変更した後、コンテナ内の nginx を再起動します。
  • 設定ファイルをローカルホストにコピーし、それを変更してコンテナ内の対応するファイルを置き換え、コンテナ内でnginxを再起動します。
  • ...

現在の動作環境は17版15インチMacBook Proで、マウントには特殊な設定が必要なので、2番目の方法を採用しました。

設定ファイルの変更

  • コンテナ内の設定ファイルパス: /etc/nginx/conf.d/default.conf
  • 設定ファイルをローカルコンピュータにコピーします
 $ docker cp mock-nginx:/etc/nginx/conf.d/default.conf ~/nginx/default.conf

nginx設定ファイルに次の設定を追加します

サーバー{
 場所 /mock-api/ {
  # node はコマンド サーバー コンテナーのエイリアスです proxy_pass http://node:7001/;
 }

 場所 /mock {
  自動インデックスオン;
  エイリアス /root/dist;
 }
}

コンテナ内の設定を上書きし、nginxを再起動します。

$ docker cp ~/nginx/default.conf モックnginx:/etc/nginx/conf.d/default.conf
# コンテナに入る$ docker exec -it mock-nginx /bin/bash
# nginx を再起動します。次のプロンプトが表示されたら、再起動が成功したことを意味します。$ nginx -s reload
2018/11/03 17:23:14 [通知] 68#68: シグナル処理が開始されました

いよいよ最後のエキサイティングなステップです

フロントエンドプロジェクトで要求されたネットワークドメイン名を変更し、パッケージ化してアップロードします。

//api-mocker/クライアント/設定 
// module.exports > ビルド > serverRoot

モジュール.エクスポート = {
 建てる: {
  サーバールート: '127.0.0.1:90/mock-api'
 }
}

パッケージ化されたdistファイルをnginx設定の/root/distディレクトリにアップロードします。

 $ docker cp ~/Sites/api-mocker/client/dist mock-nginx:/root

> もちろん、nginxコンテナ構築はdockfileファイルを書くことでも実現できます。ここでは詳しく説明しません。設定ファイルをマウントしてローカルホストにログ出力します。興味があれば自分で試してみてください。コードをコピー

テスト

エキサイティングな設定はすべて完了しました。次はテストしてみましょう。

フロントエンドプロジェクトにアクセスします: http://127.0.0.1:90/mock フロントエンドプロジェクトが正常にデプロイされたことを示す次のインターフェースが表示されます。

アカウントを登録しようとすると、成功のプロンプトが表示されます。これは、プロジェクト全体が正常にデプロイされたことを意味します。

この時点で、デプロイメントは完了し、インターフェースをモックしてプロジェクトを記述することができます。花を散らしてください~~~

要約する

初めて記事を書いて、初めてこのように展開するのは大変でした。自分の考えを整理したので、少しでもお役に立てれば幸いです。

最後に、私がよく使用する独自の docker コマンドと、このプロジェクトで使用する設定ファイルを添付します。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Docker はクラスター MongoDB 実装手順を構築します
  • Dockerを使用して最新バージョンのMongoDBをインストールする方法
  • docker で mongodb データベースを使用する方法の詳細説明 (LAN でのアクセス)
  • Docker ベースで MongoDB への許可アクセスを実装する方法
  • DockerでMongoDBコンテナをデプロイする方法

<<:  React Stateの状態とライフサイクルの実装方法

>>:  Centos7.3 で mysql5.7.18 をインストールして初期パスワードを変更する方法

推薦する

TypeScript を使用して Vue3 で axios をカプセル化する詳細な例

この axios パッケージは、vue3 デモで使用されます。便宜上、element-plus は ...

MySQL グラフィカル管理ツール Navicat のインストール手順

目次序文1. 全員にインストールパッケージを用意する2. Navicatをインストールし、Navic...

CSS ブラウザ互換性の問題に対する 4 つの解決策

フロントエンドは、技術が急速に進化するだけでなく、知っておくべき事柄が多すぎるという理由で大変な仕事...

MySQL で珍しい文字を挿入できないときの対処方法 (文字列値が正しくない)

最近、ビジネス側から、一部のユーザー情報の挿入に失敗し、エラー メッセージが「不正な文字列値:&qu...

繰り返し送信、繰り返し更新、バックオフ防止に関する問題と解決策の分析

1つ。序文<br />この種の質問は、どの専門掲示板でも見かけます。Google で検索...

図を使ってWeb2.0とは何かを説明する

最近はWeb2.0という言葉をよく耳にしますが、Web2.0とは何でしょうか? Web 1.0 とど...

Nginx ログのカスタマイズとログ バッファの有効化の詳細な説明

序文ウェブサイトのアクセス元をカウントしたい場合は、PHP を使用して情報を取得してデータベースに記...

MySQL 5.7.23 バージョンのインストールチュートリアルと設定方法

MySQL を自分でインストールするのに 3 時間かかりました。チュートリアルはたくさんあるにもかか...

Idea は、Web プロジェクトを開始するように Tomcat を設定します。グラフィック チュートリアル

tomcatの設定1. 実行構成をクリック 2. tomcat localを選択 3. tomcat...

HTML マークアップ言語 - テーブルタグ

123WORDPRESS.COM HTML チュートリアル セクションに戻るには、ここをクリックして...

jQuery は呼吸カルーセルを実装します

この記事では、ブレッシングカルーセルを実装するためのjQueryの具体的なコードを参考までに共有しま...

Linux での sshd サービスとサービス管理コマンドの詳細な説明

sshd SSH は Secure Shell の略で、アプリケーション層のセキュリティ プロトコル...

ReactHooks バッチ更新状態とルートパラメータの取得例の分析

目次1. 一括更新の方法コンソール出力2. フックがルーティングパラメータを取得する方法実行効果1....

ベースリンクタグの使用の紹介ベース

<br />リンクをクリックすると、ポップアップ表示される Web ページ アドレスは ...

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

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