ホームページ  >  記事  >  運用・保守  >  docker-compose を通じてノード サービスを複数の環境にデプロイする方法について話しましょう

docker-compose を通じてノード サービスを複数の環境にデプロイする方法について話しましょう

青灯夜游
青灯夜游転載
2022-01-28 18:00:433877ブラウズ

docker-compose を通じて node サービスを複数の環境にデプロイするにはどうすればよいですか?次の記事では、Docker-compose を使用して複数の環境に Node サービスをデプロイする方法を紹介します。

docker-compose を通じてノード サービスを複数の環境にデプロイする方法について話しましょう

通常の状況では、プロジェクトを開発した後、テスト、サンドボックス、統合などの複数の環境にデプロイする必要があるため、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

    コンテナ ログの表示<pre class="brush:js;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>具体的な手順

docker-compose、docker-compose の書き込み.prod.yml 構成ファイル

  • #
    # docker-compose.yml
    version: &#39;3.0&#39;
    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 # 覆盖容器启动后默认执行的命令
    # docker-compose.prod.yml
    version: &#39;3.0&#39;
    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

    #package.json
#
# 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
  • が正常に開始されたら、次の図に示すように、
docker ps -a
    を使用してコンテナーの起動ステータスを確認します。
  • ##説明
  • :

テスト環境: ローカルの開発ブランチのコードが送信されるとき、または他のブランチが開発ブランチにマージされるとき, ノードは itlab CI と Ansible を通じて自動的にデプロイされます。リモート サーバーにサービスを提供し、対応するサーバーのリモート ディレクトリでブランチを切り替え、最新のコードをプルし、対応するテスト Docker コンテナを再起動します

docker-compose を通じてノード サービスを複数の環境にデプロイする方法について話しましょう#オンライン環境: ローカルのマスター ブランチ コードの送信または他のブランチのマージマスター ブランチに到達すると、ノード サービスが 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 を通じてノード サービスを複数の環境にデプロイする方法について話しましょう

# 修改前
# docker-compose.yml
version: &#39;3.0&#39;
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: &#39;3.0&#39;
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",
    ...
},

Notedocker-compose を通じてノード サービスを複数の環境にデプロイする方法について話しましょう:

クロス環境の場所は、次の場所に配置できます。コマンドを実行する前に、このプロジェクトでは、これが先頭に配置されている場合、サーバーは、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里面也是对应需要映射的,环境变量位置如下图所示:

    docker-compose を通じてノード サービスを複数の環境にデプロイする方法について話しましょう

    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 サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。