聊聊如何通過docker-compose將node服務(wù)部署到多套環(huán)境中

如何通過docker-compose將node服務(wù)部署到多套環(huán)境?下面本篇文章就來給大家介紹一下docker-compose多環(huán)境部署node服務(wù)的方法,希望對大家有所幫助!

聊聊如何通過docker-compose將node服務(wù)部署到多套環(huán)境中

一般情況下,我們項(xiàng)目在開發(fā)完成之后,需要部署到多套環(huán)境,比如測試、沙箱、集成等等,那么如何通過docker-compose將node服務(wù)部署到多套環(huán)境呢?下面文章具體說下,有什么不對的地方歡迎大家評論。

本文中的項(xiàng)目用到的技術(shù)是Gitlab+Ansible+Docker自動化部署node服務(wù)(nest框架寫的),步驟如下:

  • 編寫docker-compose、docker-compose.prod.yml配置文件

  • 修改package.json

  • 遠(yuǎn)程服務(wù)器上創(chuàng)建兩個(gè)目錄,拉取node服務(wù)倉庫,切換到不同分支,分別表示測試、線上node服務(wù)

  • .gitlab-ci.yml文件編寫

  • ansible.yml文件編寫

  • 遠(yuǎn)程服務(wù)器node服務(wù)(測試/線上)目錄下執(zhí)行如下命令,執(zhí)行之后,通過docker ps -a查看容器是否正常啟動,如果是up狀態(tài)掛起,證明容器啟動成功了。docker logs -f 容器id查看容器日志

#?測試目錄?/opt/xxx/server-test/server docker-compose?up?-d  #?線上目錄?/opt/xxx/server-prod/server #?-f表示指定具體文件,默認(rèn)執(zhí)行的是docker-compose.yml文件 docker-compose?-f?docker-compose.prod.yml?up?-d

具體步驟

  • 編寫docker-compose、docker-compose.prod.yml配置文件

#?docker-compose.yml version:?'3.0' services:?#?服務(wù)列表 ??#?測試數(shù)據(jù)庫 ??mysql: ????image:?mysql ????container_name:?mysql_test ????restart:?always ????environment: ??????-?MYSQL_ROOT_PASSWORD=test_sql ??????-?NODE_ENV=development ????ports: ??????-?13306:3306 ????volumes: ??????-?服務(wù)器上對應(yīng)目錄:/var/lib/mysql ?????? ??#?測試node服務(wù) ??server:??#?node服務(wù) ????container_name:?server-test?#?容器名稱 ????image:?node:14.15.0 ????ports:??#?暴露的端口 ??????-?"7007:5088" ????environment:? ??????-?NODE_ENV=development ????volumes: ??????-?.:/data ????working_dir:?/data ????depends_on:?#?web服務(wù)依靠mysql要先等mysql啟動 ??????-?mysql ????restart:?on-failure:5?#?自動重啟,失敗的話重啟5次后停止 ????command:?yarn?start?#?覆蓋容器啟動后默認(rèn)執(zhí)行的命令
#?docker-compose.prod.yml version:?'3.0' services:?#?服務(wù)列表 ??#?線上數(shù)據(jù)庫 ??prod-mysql: ????image:?mysql ????container_name:?mysql_prod ????restart:?always ????environment: ??????-?MYSQL_ROOT_PASSWORD=prod_sql ??????-?NODE_ENV=production ????ports: ??????-?13307:3306 ????volumes: ??????-?服務(wù)器上對應(yīng)目錄:/var/lib/mysql  ??#?線上node服務(wù) ??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為開發(fā)或線上環(huán)境 ... "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", ????... ??}, ...
  • 遠(yuǎn)程服務(wù)器上創(chuàng)建兩個(gè)目錄,分別存放測試、線上node服務(wù)

#?測試(dev分支),git?clone?node服務(wù)地址,切換到dev分支 /opt/xxx/server-test/server  #?線上(master分支),git?clone?node服務(wù)地址,切換到master分支 /opt/xxx/server-prod/server
  • .gitlab-ci.yml文件編寫

#?CI變量說明說明 -?BRANCH、DEV_BRANCH是CI變量,分別對應(yīng)master、dev分支 -?DOCKER_CONTAINER、DEV_DOCKER_CONTAINER分別對應(yīng)線上、測試啟動的docker容器 -?ROOT_PATH、DEV_ROOT_PATH分別對應(yīng)遠(yuǎn)程服務(wù)器上線上、測試node服務(wù)存放路徑 -?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服務(wù)server目錄,切換分支,拉取最新代碼,docker容器重啟 -?name:?deploy ??hosts:?"{{?HOST?}}" ??become_user:?root ??become:?yes ??tasks:?#?任務(wù) ????-?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?}}"
  • 遠(yuǎn)程服務(wù)器node服務(wù)(測試/線上)目錄下執(zhí)行如下命令

#?測試目錄?/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查看容器啟動情況,具體如下圖所示:

聊聊如何通過docker-compose將node服務(wù)部署到多套環(huán)境中

說明

  • 測試環(huán)境:本地dev分支代碼提交或其他分支合并到dev分支時(shí),會通過itlab CI、Ansible自動化部署node服務(wù)到遠(yuǎn)程服務(wù)器,在對應(yīng)服務(wù)器遠(yuǎn)程目錄下切換分支、拉取最新代碼、重啟對應(yīng)的測試docker容器

  • 線上環(huán)境:本地master分支代碼提交或其他分支合并到master分支時(shí),會通過itlab CI、Ansible自動化部署node服務(wù)到遠(yuǎn)程服務(wù)器,在對應(yīng)服務(wù)器遠(yuǎn)程目錄下切換分支、拉取最新代碼、重啟對應(yīng)的線上docker容器

遇到的問題

問題一:測試/線上遠(yuǎn)程node服務(wù)目錄下沒有node_modules目錄和dist目錄,即沒有下圖這兩個(gè)文件同時(shí)遠(yuǎn)程服務(wù)器器上查看docker容器日志報(bào)如下錯(cuò)誤(這個(gè)問題排查了好久才解決

聊聊如何通過docker-compose將node服務(wù)部署到多套環(huán)境中

聊聊如何通過docker-compose將node服務(wù)部署到多套環(huán)境中

排查: 發(fā)現(xiàn)和正常啟動的node服務(wù)容器對比來看,沒有這兩個(gè)目錄(dist和node_modules),排查是不是docker-compose.yml中command執(zhí)行命令有問題,即docker-compose.yml的command中yarn && yarn start是不是有問題,于是嘗試把yarn操作放在package.json中,結(jié)果好啦。

解決:

#?修改前 #?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", ????... },

注意

  • cross-env的位置,放在可執(zhí)行命令之前,在本項(xiàng)目中,放在最前面服務(wù)器上報(bào)cross-env not found, 放在最后面環(huán)境變量不生效,NODE_ENV顯示undefined

  • script中可執(zhí)行命令注意執(zhí)行順序,比如yarn && yarn build && cross-env NODE_ENV=production node dist/src/main

  • script中pre

問題2: 前端線上域名映射不生效,nginx配置文件映射線上域名之后,發(fā)現(xiàn)訪問線上域名時(shí),發(fā)現(xiàn)頁面沒有生效

排查:將nginx測試配置文件和線上配置文件對比,發(fā)現(xiàn)文件內(nèi)容除了域名和api代理,其余都是一樣,那到底是什么原因呢?最后發(fā)現(xiàn)竟然是線上nginx配置文件后綴名不對,寫的是xxx.confg,此處心里一萬個(gè)想打死自己

解決: 修改線上nginx配置文件為正確的后綴,即xxx.conf后綴

問題三:Gitlab CI執(zhí)行異常,具體報(bào)錯(cuò)信息大概是報(bào)/server目錄找不到

排查:在CI里面打印輸出CI變量以及拼接出來的目錄變量,查看是哪一步有問題,經(jīng)排查發(fā)現(xiàn)都是正常的,唯一不同的一點(diǎn)是CI變量后面設(shè)置了環(huán)境變量

解決:嘗試把環(huán)境變量改為All default,結(jié)果好了,記住,不要隨意配置CI后面的環(huán)境變量,如果修改的話,對應(yīng)的Gitlab里面也是對應(yīng)需要映射的,環(huán)境變量位置如下圖所示:

聊聊如何通過docker-compose將node服務(wù)部署到多套環(huán)境中

master_deploy: ??... ??script: ????... ????-?echo?${ROOT_PATH} ????-?echo?${CI_PROJECT_NAME} ????-?echo?${ROOT_PATH}/${CI_PROJECT_NAME} ????-?echo?${DOCKER_CONTAINER} ????-?echo?${BRANCH} ????... ?...

本文到這就結(jié)束了,后面還會有一篇文件,講全棧項(xiàng)目從開發(fā)到自動化部署整個(gè)過程(用到的技術(shù)棧是Vue + Nest + Typeorm + Mysql+ Gitlab CI + Ansible + Docker)。

推薦學(xué)習(xí):《node》、《node

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊13 分享