docker-compsoe を使用してフロントエンドとバックエンドを分離したプロジェクトをデプロイする方法

docker-compsoe を使用してフロントエンドとバックエンドを分離したプロジェクトをデプロイする方法

事前に言っておく

Docker を使用すると非常にシンプルなデプロイメント環境を実現できることは誰もが知っています。これで、フロントエンドとバックエンドが分離されたプロジェクトができました。フロントエンドは Vue をベースに開発され、Webpakc を使用して dist フォルダーにパッケージ化されています。バックエンドは、API インターフェースを提供する Node.js サービスです。フロントエンドとバックエンドは分離されています。したがって、フロントエンド プロジェクト用のコンテナーとバックエンド プロジェクト用のコンテナーが必要です。その後、実稼働環境の場合は、クロスドメインの問題が発生します。フロントエンドのリクエストはバックエンドにリバースプロキシされる必要があります。最初に思いつくのは、Nginx を使用して proxy_pass を設定することです。はい、その通りです。そこで私たちはこれらのアイデアを思いつきました。 docker-compose でこれをどうやって行うのでしょうか?

始める

実際のところ、私は docker を理解し始めたばかりです。なので、わからないことがたくさんあります。例えば、Dockerでは、イメージを通じてコン​​テナが生成されるので、このコンテナは独立したシステムとみなすことができ、このシステムにも独自の独立したポートがあります。したがって、前の要件と同様に、フロントエンドが container1 のポート 80 を公開してそれをホスト マシンのポート 80 にマップし、バックエンドが container2 のポート 3000 を公開してそれをホスト マシンのポート 3000 にマップするとします。では、リクエストをリバース プロキシする場合、ホスト マシン経由で行うのでしょうか、それともコンテナー経由で行うのでしょうか?私は公式サイトの文書だけでなく、インターネット上の他の大物たちの記事も参考にして学びました。この要件はコンテナを通じて直接達成できることがわかりました。なぜ? docker-compose はすべてのコンテナを同じネットワーク下で構築するため、他のコンテナを検索する場合は、docker-compose でサービス名を検索するだけで済みます。 カタログを見てみましょう:

vueミュージック
 ├─ .git
 ├─ .gitignore
 ├─ ライセンス
 ├─ README.md
 ├─ babel.config.js
 ├─ ディストリクト
 ├─ docker-compose.yml
 ├─ ドキュメント
 ├─ nginx.conf
 ├─ package-lock.json
 ├─ package.json
 ├─ 公開
 ├─ サーバー
 ├─ 出典
 └─ vue.config.js

dist はフロントエンド プロジェクトであり、server はバックエンド プロジェクトです。 docker-compose.yml を見てみましょう:

バージョン: '3'
 サービス:
 music-web: フロントエンドプロジェクトの#サービス名
   container_name: 'music-web-container' #コンテナ名image: nginx #イメージを指定restart: always
   ポート:
   - 80:80
   ボリューム: 
   - ./nginx.conf:/etc/nginx/nginx.conf #nginx 設定をマウント - ./dist:/usr/share/nginx/html/ #プロジェクトをマウントdepends_on:
   - 音楽サーバー
 music-server: #バックエンドプロジェクトのサービス名
   コンテナ名: '音楽サーバーコンテナ'
   build: ./server #サーバーディレクトリのDockerfileに基づいてイメージをビルドします restart: always
   さらす:
   - 3000

ご覧のとおり、volumes プロパティを使用して、ホストの nginx.conf をコンテナ内の nginx 構成ファイルにマウントし、元の構成ファイルを上書きし、dist もコンテナにマウントします。フロントエンド プロジェクトのコンテナーを公開してホスト マシンのポート 80 にマップし、バックエンド プロジェクトのコンテナーをポート 3000 に公開します。では、リバース プロキシ要求はどこで実装するのでしょうか? nginx.conf を参照してください:

#ユーザーnobody;
 ワーカープロセス 1;
 イベント {
   ワーカー接続 1024;
 }
 http {
   mime.types を含めます。
   デフォルトタイプ アプリケーション/オクテットストリーム;
   ファイル送信オン;
   #tcp_nopush オン;
   #キープアライブタイムアウト 0;
   キープアライブタイムアウト65;
   #gzip オン;
   gzip オン;
   gzip_min_length 5k;
   gzip_バッファ 4 16k;
   #gzip_http_バージョン1.0;
   gzip_comp_レベル 3;
   gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
   gzip_vary オン;
   サーバー{
     聞く 80;
     サーバー名 www.xieyezi.com;
     #音楽アプリプロジェクトの場所 / {
     index index.html index.htm; #属性を追加します。 
     root /usr/share/nginx/html; #サイトディレクトリ}
     # ミュージックアプリプロジェクト設定プロキシ転送場所 /api/ {
     proxy_pass http://music-server:3000/;
     }
     エラーページ 500 502 503 504 /50x.html;
     場所 = /50x.html {
       ルート /usr/share/nginx/html;
     }
   }
 }

上記で proxy_pass http://music-server:3000/; を確認できます。 Music-server は、バックエンド プロジェクトのサービス名です。サービス名を使用してコンテナーを検索し、リバース プロキシを実現します。

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

以下もご興味があるかもしれません:
  • DockerはMariaDBのサブライブラリとサブテーブル、および読み書き分離機能を実装します

<<:  MySQL が InnoDB テーブルが独立したテーブルスペースか共有テーブルスペースかを判断する方法の詳細な説明

>>:  MySQLのSQLモードの特徴のまとめ

推薦する

CSS で雨滴アニメーション効果を実装するサンプルコード

ガラス窓今日実現するのは雨滴効果です。ただし、雨滴効果を実現する前に、まずは曇りガラス効果を作成しま...

Dockerコンテナはルーティングを介して直接通信し、ネットワーク通信を実現します。

概要Docker 自体の現在のデフォルト ネットワークについては、単一ホスト上の異なる Docker...

Linux カーネル デバイス ドライバー Linux カーネル 基本メモの概要

1. Linuxカーネルドライバモジュールの仕組み静的ロードでは、ドライバモジュールをカーネルにコン...

フロントエンドJavaScriptのクラス

目次1. クラス1.1 コンストラクタ() 1.2 ゲッターとセッター1.3 これ1.4 静的プロパ...

MySQLデータベースのマスタースレーブレプリケーションと読み取り書き込み分離に関する詳細なチュートリアル

目次序文1. MySQL マスタースレーブレプリケーション1. サポートされているレプリケーションの...

LINUX での IPTABLES ファイアウォールの基本的な使用方法のチュートリアル

序文パブリック IP を持つ本番 VPS の場合、必要なポートのみが開かれ、IP とポートを制御する...

Dockerオーバーレイはホスト間のコンテナ相互通信を実現します

目次1. Dockerの設定2. レジストリとネットワークを作成する3. コンテナを起動する環境説明...

vue-resource インターセプターの使用に関する詳細な説明

序文インターセプター最近のフロントエンド フレームワークでは、インターセプターは基本的に非常に基本的...

Linux ドメイン ネーム サービス DNS 設定方法

DNSとはDNS の正式名称は Domain Name System で、ドメイン名解決システムを意...

モバイルデバイスにおける適応レイアウトの問題に関する簡単な説明 (レスポンシブ、rem/em、Js ダイナミクス)

3G の普及により、携帯電話を使ってインターネットにアクセスする人が増えています。モバイル デバイ...

JavaScript にはすでに Object があるのに、なぜ Map が必要なのでしょうか?

目次1. オブジェクトをマップとして扱わない1. 未定義のプロパティはプロトタイプチェーンを通じてア...

Element-ui NavMenuサブメニューを使用して再帰的に生成する場合のエラーの詳細な説明

ナビゲーションバーのサブメニューを再帰的に生成すると、メニューは正常に生成できるが、マウスをホバーす...

Linux で Xfce デスクトップ環境を使用すべき 8 つの理由

いくつかの理由(好奇心も含む)から、数週間前に Linux デスクトップとして Xfce を使い始め...

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

この記事では、MySQL 5.7.24のインストールと設定のチュートリアルを参考までに紹介します。具...

JavaScript ベースのシンプルな計算機の実装

この記事では、参考までに、簡単な計算機を実装するためのJavaScriptの具体的なコードを紹介しま...