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 をインストールして初期パスワードを変更する方法

ブログ    

推薦する

非ルートユーザーを使用してDockerコンテナでスクリプト操作を実行する

アプリケーションをコンテナ化した後、Docker コンテナを起動すると、デフォルトで root ユー...

Navicat 8でMySQL用のデータベースを作成する方法

ウェブサイトを開発する場合、データを保存するためにデータベースを使用する必要があることがよくあります...

HTML でテーブルを分割および結合する (colspan、rowspan)

このコードは水平マージを示しています。 <!DOCTYPE html PUBLIC "...

Vueはルールを使用してフォームフィールドの検証を実装します

Vue でフォーム フィールドを記述および検証する方法は多数あります。このブログでは、より一般的に使...

NodeJS は画像テキスト分割を実現します

この記事では、画像テキストセグメンテーションを実装するためのNodeJSの具体的なコードを参考までに...

H5ゲームをnginxサーバーにデプロイする方法の詳細な説明

自己学習型ゲーム開発の道において、最も充実した瞬間は、自分でミニゲームを作り、友達と共有して試しにプ...

Nginx プロセス管理とリロードの原則の詳細な説明

プロセス構造図Nginx はマルチプロセス構造です。マルチプロセス構造は、次のような Nginx の...

初心者がHTMLタグを学ぶ(1)

初心者は、いくつかの HTML タグを理解することで HTML を学習できます。この入門書は、初心者...

MySQL 5.7.23 のインストールと設定方法のグラフィックチュートリアル

この記事では、参考として MySQL 5.7.23 のインストール チュートリアルを記録します。 1...

面接では、select...for update がテーブルをロックするのか、それとも行をロックするのか尋ねられました。

目次確認する:例の検証と組み合わせるselect クエリ ステートメントはロックされませんが、sel...

CSS3 列を使用したカード ウォーターフォール レイアウトを実装するためのサンプル コード

この記事では、カード ウォーターフォール レイアウトを実現するための CSS3 列のサンプル コード...

効率を向上できる Linux コマンドエイリアス 10 個のまとめ

序文Linux 環境で作業するエンジニアは、これらの面倒な命令とパラメータのコマンドラインにきっと驚...

スネークゲームを作るための Pygame コード

目次使用されるPygame関数スクリーンの作成ヘビの作成ヘビを動かすゲームオーバーの処理食事を増やす...

Webフロントエンド開発CSS関連チームコラボレーション

フロントエンド開発部門は成長し、スタッフも増加し、技術も向上しています。 CSSer はフロントエン...

マークアップ言語 - フレーズ要素

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