docker-compose を通じてノード サービスを複数の環境にデプロイする方法について話しましょう
docker-compose を通じて node サービスを複数の環境にデプロイするにはどうすればよいですか?次の記事では、Docker-compose を使用して複数の環境に Node サービスをデプロイする方法を紹介します。
通常の状況では、プロジェクトを開発した後、テスト、サンドボックス、統合などの複数の環境にデプロイする必要があるため、Docker の使用方法-compose to ノードサービスを複数の環境にデプロイしてみてはいかがでしょうか?以下の記事で詳しく解説していますので、間違っている点があればコメントいただければ幸いです。
この記事のプロジェクトで使用されているテクノロジーは Gitlab Ansible Dockerノード サービスの自動デプロイメント (ネスト フレームワークによって記述) です。手順は次のとおりです。
docker-compose、docker-compose.prod.yml 構成ファイルを作成する
- #package.json を変更する #2 つのディレクトリを作成するリモート サーバー上で、ノード サービス ウェアハウスをプルし、それぞれテスト ノード サービスとオンライン ノード サービスを表す別のブランチに切り替えます
- #.gitlab-ci.yml ファイルの書き込み
#ansible.yml ファイルの書き込み
-
リモートサーバーノードサービス(test/online)ディレクトリで以下のコマンドを実行し、実行後コンテナが通過しているか確認します
docker ps -a 正常に起動し、起動状態でハングアップすればコンテナが正常に起動したことになります。 - docker logs -f コンテナ ID
コンテナ ログの表示
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'># 测试目录 /opt/xxx/server-test/server docker-compose up -d # 线上目录 /opt/xxx/server-prod/server # -f表示指定具体文件,默认执行的是docker-compose.yml文件 docker-compose -f docker-compose.prod.yml up -d</pre><div class="contentsignin">ログイン後にコピー</div></div>
具体的な手順
docker-compose、docker-compose の書き込み.prod.yml 構成ファイル
- #
# docker-compose.yml version: '3.0' services: # 服务列表 # 测试数据库 mysql: image: mysql container_name: mysql_test restart: always environment: - MYSQL_ROOT_PASSWORD=test_sql - NODE_ENV=development ports: - 13306:3306 volumes: - 服务器上对应目录:/var/lib/mysql # 测试node服务 server: # node服务 container_name: server-test # 容器名称 image: node:14.15.0 ports: # 暴露的端口 - "7007:5088" environment: - NODE_ENV=development volumes: - .:/data working_dir: /data depends_on: # web服务依靠mysql要先等mysql启动 - mysql restart: on-failure:5 # 自动重启,失败的话重启5次后停止 command: yarn start # 覆盖容器启动后默认执行的命令
ログイン後にコピー#package.json# docker-compose.prod.yml version: '3.0' services: # 服务列表 # 线上数据库 prod-mysql: image: mysql container_name: mysql_prod restart: always environment: - MYSQL_ROOT_PASSWORD=prod_sql - NODE_ENV=production ports: - 13307:3306 volumes: - 服务器上对应目录:/var/lib/mysql # 线上node服务 prod-server: container_name: server-prod image: node:14.15.0 ports: - "7077:5089" environment: - NODE_ENV=production volumes: - .:/data working_dir: /data depends_on: - prod-mysql restart: on-failure:5 command: yarn start:prod
ログイン後にコピー
# cross-env指定NODE_ENV为开发或线上环境 ... "scripts": { ... "build": "nest build", "start": "yarn && cross-env NODE_ENV=development nest start", "start:prod": "yarn && yarn build && cross-env NODE_ENV=production node dist/src/main", ... }, ...
- # で次の変更を加えます。 # #リモート サーバー上にテストとオンライン ノード サービスをそれぞれ保存する 2 つのディレクトリを作成します
# 测试(dev分支),git clone node服务地址,切换到dev分支 /opt/xxx/server-test/server # 线上(master分支),git clone node服务地址,切换到master分支 /opt/xxx/server-prod/server
- .gitlab-ci.yml ファイルの書き込み
# CI变量说明说明 - BRANCH、DEV_BRANCH是CI变量,分别对应master、dev分支 - DOCKER_CONTAINER、DEV_DOCKER_CONTAINER分别对应线上、测试启动的docker容器 - ROOT_PATH、DEV_ROOT_PATH分别对应远程服务器上线上、测试node服务存放路径 - CI_PROJECT_NAME表示gitlab上仓库名称 stages: - dev_deploy - master_deploy master_deploy: stage: master_deploy image: ansible镜像地址 script: - echo \"${HOST}\" ansible_ssh_user=\"${USER}\" ansible_ssh_pass=\"${PASS}\" ansible_ssh_host=\"${HOST}\" > hosts - echo ansible-playbook ansible.yaml -e hosts=${HOST} -i ./hosts - ansible-playbook ansible.yaml -e "HOST=${HOST} DEST_PATH=${ROOT_PATH}/${CI_PROJECT_NAME} DOCKER_CONTAINER_NAME=${DOCKER_CONTAINER} CUR_BRANCH=${BRANCH}" -i ./hosts - rm -f hosts only: - master tags: - k8s dev_deploy: stage: dev_deploy image: ansible镜像地址 script: - echo \"${HOST}\" ansible_ssh_user=\"${USER}\" ansible_ssh_pass=\"${PASS}\" ansible_ssh_host=\"${HOST}\" > hosts - echo ansible-playbook ansible.yaml -e hosts=${HOST} -i ./hosts - ansible-playbook ansible.yaml -e "HOST=${HOST} DEST_PATH=${DEV_ROOT_PATH}/${CI_PROJECT_NAME} DOCKER_CONTAINER_NAME=${DEV_DOCKER_CONTAINER} CUR_BRANCH=${DEV_BRANCH}" -i ./hosts - rm -f hosts only: - dev tags: - k8s
- ansible.yml ファイルの書き込み
# cd到node服务server目录,切换分支,拉取最新代码,docker容器重启 - name: deploy hosts: "{{ HOST }}" become_user: root become: yes tasks: # 任务 - name: git checkout branch command: git checkout "{{CUR_BRANCH}}" args: chdir: "{{ DEST_PATH }}" - name: git pull command: git pull args: chdir: "{{ DEST_PATH }}" - name: docker restart container command: docker restart "{{ DOCKER_CONTAINER_NAME }}" args: chdir: "{{ DEST_PATH }}"
- リモート サーバー ノード サービス (test/online) ディレクトリで実行次のコマンド #
# 测试目录 /opt/xxx/server-test/server docker-compose up -d # 线上目录 /opt/xxx/server-prod/server docker-compose -f docker-compose.prod.yml up -d
ログイン後にコピー が正常に開始されたら、次の図に示すように、
- を使用してコンテナーの起動ステータスを確認します。
- ##説明 :
テスト環境: ローカルの開発ブランチのコードが送信されるとき、または他のブランチが開発ブランチにマージされるとき, ノードは itlab CI と Ansible を通じて自動的にデプロイされます。リモート サーバーにサービスを提供し、対応するサーバーのリモート ディレクトリでブランチを切り替え、最新のコードをプルし、対応するテスト Docker コンテナを再起動します
#オンライン環境: ローカルのマスター ブランチ コードの送信または他のブランチのマージマスター ブランチに到達すると、ノード サービスが itlab CI および Ansible を通じてリモート サーバーに自動的にデプロイされ、対応するサーバーのリモート ディレクトリでブランチを切り替え、最新のコードを実行し、対応するオンライン Docker コンテナを再起動します
発生した問題
- 問題 1
: テスト下に node_modules ディレクトリと dist ディレクトリがありません/online リモート ノード サービス ディレクトリ。つまり、リモート サーバー上に以下に示すような 2 つのファイルが同時に存在しません。Docker コンテナー ログを確認し、次のエラーを報告します (
この問題を解決するのに長い時間がかかりました )
トラブルシューティング : 正常に起動したノードサービスコンテナと比較して、以下の点が発生していることがわかります。この2つのディレクトリ(distとnode_modules)が無い docker-compose.yml内のコマンド実行コマンド、つまりdocker-compose.ymlのコマンドに問題がないか確認してくださいyarn&&yarnstartに問題はありませんか?そこで、糸の操作をpackage.jsonに入れてみたところ、結果はうまくいきました。
解決策:# 修改前 # docker-compose.yml version: '3.0' services: ... server: ... command: yarn && yarn start # package.json "scripts": { ... "build": "nest build", "start": "cross-env NODE_ENV=development nest start", "start:prod": "cross-env NODE_ENV=production yarn build && node dist/src/main", ... }, # 修改后 # docker-compose.yml version: '3.0' services: ... server: ... command: yarn start # package.json 方案一: "scripts": { ... "build": "nest build", "start": "yarn && cross-env NODE_ENV=development nest start", "start:prod": "yarn && yarn build && cross-env NODE_ENV=production node dist/src/main", ... }, 方案二: "scripts": { ... "build": "nest build", "start": "cross-env NODE_ENV=development nest start", "prestart": "yarn", "start:prod": "yarn build && cross-env NODE_ENV=production node dist/src/main", "prestart:prod": "yarn", ... },
Note:
クロス環境の場所は、次の場所に配置できます。コマンドを実行する前に、このプロジェクトでは、これが先頭に配置されている場合、サーバーは、cross-env not found を報告します。最後に配置されている場合、環境変数は有効になりません。NODE_ENV は、unknown
と表示されます。スクリプト内の実行可能なコマンド
yarn &&yarn build &&cross-env NODE_ENV=production node dist/src/main# などの実行順序に注意してください。
#script in pre- ##質問 2
- : フロントエンドのオンライン ドメイン名のマッピングが有効になりません。nginx 構成ファイルのマッピング後オンライン ドメイン名にアクセスすると、ページが有効にならないことがわかります
: nginx テスト構成ファイルとオンライン構成ファイルを比較すると、次のことがわかりました。ドメイン名と API プロキシを除いて、ファイルの内容は同じですが、その理由は何でしょうか?最後に、オンライン nginx 設定ファイルのサフィックス名が間違っていることに気付き、xxx.confg と書かれていました。死ぬほど自分を殴りたい気分になりました。トラブルシューティング
解決策
: オンライン nginx を変更する構成ファイルは正しいサフィックスです。つまり、xxx.conf サフィックス
问题三:Gitlab CI执行异常,具体报错信息大概是报/server目录找不到
排查:在CI里面打印输出CI变量以及拼接出来的目录变量,查看是哪一步有问题,经排查发现都是正常的,唯一不同的一点是CI变量后面设置了环境变量
解决:尝试把环境变量改为All default,结果好了,记住,不要随意配置CI后面的环境变量,如果修改的话,对应的Gitlab里面也是对应需要映射的,环境变量位置如下图所示:
master_deploy: ... script: ... - echo ${ROOT_PATH} - echo ${CI_PROJECT_NAME} - echo ${ROOT_PATH}/${CI_PROJECT_NAME} - echo ${DOCKER_CONTAINER} - echo ${BRANCH} ... ...
本文到这就结束了,后面还会有一篇文件,讲全栈项目从开发到自动化部署整个过程(用到的技术栈是Vue + Nest + Typeorm + Mysql+ Gitlab CI + Ansible + Docker)。
推荐学习:《docker视频教程》、《nodejs 教程》
以上がdocker-compose を通じてノード サービスを複数の環境にデプロイする方法について話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









nvm でノードを削除する方法: 1. 「nvm-setup.zip」をダウンロードして C ドライブにインストールします; 2. 「nvm -v」コマンドで環境変数を構成し、バージョン番号を確認します; 3. 「nvm」を使用しますinstall" コマンド ノードのインストール; 4. "nvm uninstall" コマンドでインストールしたノードを削除します。

ファイルのアップロードをどのように処理するか?次の記事では、Express を使用してノード プロジェクトでファイルのアップロードを処理する方法を紹介します。

この記事では、Node のプロセス管理ツール「pm2」について説明し、pm2 が必要な理由、pm2 のインストール方法と使用方法について説明します。皆様のお役に立てれば幸いです。

ピン張りのノードの詳細な説明とインストールガイドこの記事では、ピネットワークのエコシステムを詳細に紹介します - PIノードは、ピン系生態系における重要な役割であり、設置と構成の完全な手順を提供します。 Pinetworkブロックチェーンテストネットワークの発売後、PIノードは多くの先駆者の重要な部分になり、テストに積極的に参加し、今後のメインネットワークリリースの準備をしています。まだピン張りのものがわからない場合は、ピコインとは何かを参照してください。リストの価格はいくらですか? PIの使用、マイニング、セキュリティ分析。パインワークとは何ですか?ピン競技プロジェクトは2019年に開始され、独占的な暗号通貨PIコインを所有しています。このプロジェクトは、誰もが参加できるものを作成することを目指しています

Nodejs実行可能ファイルをpkgでパッケージ化するにはどうすればよいですか?次の記事では、pkg を使用して Node プロジェクトを実行可能ファイルにパッケージ化する方法を紹介します。

「node-gyp.js」が「Node.js」のバージョンと一致しないため、npm node gyp が失敗します。解決策は次のとおりです: 1. 「npm cache clean -f」を使用してノード キャッシュをクリアします; 2. 「npm install -」を使用します。 g n" n モジュールをインストールします。 3. 「n v12.21.0」コマンドを使用して、「node v12.21.0」バージョンをインストールします。

シングルサインオンシステムとは何ですか? Nodejsを使用して実装するにはどうすればよいですか?次の記事ではnodeを使ってシングルサインオンシステムを実現する方法を紹介しますので、参考になれば幸いです。

認証は、Web アプリケーションの最も重要な部分の 1 つです。このチュートリアルでは、トークンベースの認証システムと、それが従来のログイン システムとどのように異なるかについて説明します。このチュートリアルを終えると、Angular と Node.js で書かれた完全に動作するデモが表示されます。従来の認証システム トークンベースの認証システムに進む前に、従来の認証システムを見てみましょう。ユーザーはログイン フォームにユーザー名とパスワードを入力し、[ログイン] をクリックします。リクエストを行った後、データベースにクエリを実行してバックエンドでユーザーを認証します。リクエストが有効な場合、データベースから取得したユーザー情報を使用してセッションが作成され、セッション情報が応答ヘッダーで返され、セッション ID がブラウザに保存されます。対象となるアプリケーションへのアクセスを提供します。
