jenkins+docker+node+mongo前端視角下的部署流程

#1.準(zhǔn)備工作

  • 我不會(huì)照搬文檔上官方的話術(shù),完全憑自己的理解寫(xiě),可能不規(guī)范,不喜歡請(qǐng)左上角
  • 你的服務(wù)器必須裝好了docker,怎么裝的自行研究
  • 你已經(jīng)部署好了jenkins并且和github建立了hook鏈接,怎么的請(qǐng)參考我之前的文章
  • 網(wǎng)上很多文章都寫(xiě)明了什么是dockerdocker api之類(lèi)的,建議閱讀掌握基本概念,但是我覺(jué)得他們說(shuō)的都太表面了,舉個(gè)栗子:
    1. Dockerfile文件: 這個(gè)文件是用來(lái)docker build -t (your image name) .,就是用來(lái)制作docker鏡像的,這是基礎(chǔ),建議放在項(xiàng)目根目錄
    2. docker-compose.yml: 是docker官方的docker-compose插件的構(gòu)建文件,用來(lái)生成多個(gè)相關(guān)聯(lián)的docker container容器的快捷方式,這里有很大的坑,后續(xù)討論,不用這個(gè)也可以,可以用docker run -----的建立方式,一個(gè)個(gè)的建立容器,同樣可以達(dá)到效果,并且兼容性(服務(wù)器環(huán)境或者jenkins環(huán)境)更佳,建議放在項(xiàng)目根目錄

#2.開(kāi)整

  • 我們首先采用docker-compose的方式:
  1. 因?yàn)轫?xiàng)目是個(gè)Koa服務(wù),所以你得明白koa是node的一個(gè)框架,那么自然你必須得想到項(xiàng)目是基于node的,docker容器可以理解為一個(gè)干凈的操作系統(tǒng),那么操作系統(tǒng)你想運(yùn)行node應(yīng)用是不是要安裝node呢,當(dāng)然是了,項(xiàng)目根目錄建立Dockerfile文件,如下:
#FROM是所有Dockerfile文件的必須,并且開(kāi)頭就要寫(xiě)明,意思是依賴(lài)的環(huán)境,我們的項(xiàng)目依賴(lài)node鏡像,所以要寫(xiě)node,10是版本號(hào)。
#不用管我好像沒(méi)有pull node image啊,沒(méi)關(guān)系這里寫(xiě)了,就會(huì)自動(dòng)幫你下載
FROM node:10
# Dockerfile的概念就是 build一個(gè)鏡像用的 什么依賴(lài)都在這里寫(xiě)
# 起注釋的作用
LABEL maintainer = "qsm <348867341@qq.com>"
# 創(chuàng)建容器中的工作目錄,容器是一個(gè)干凈的目錄什么都沒(méi)有,你想要放一個(gè)項(xiàng)目肯定要?jiǎng)?chuàng)建一些目錄
#為了簡(jiǎn)單,這里創(chuàng)了一個(gè)根目錄下面的app目錄, 每次構(gòu)建鏡像都刪除app目錄,其實(shí)沒(méi)必要因?yàn)槟忝看螛?gòu)建鏡像都是一個(gè)感覺(jué)的
RUN rm -rf /app
RUN mkdir /app
# 創(chuàng)建工作目錄就是容器內(nèi)部的目錄 必須指定
WORKDIR /app

# 安裝項(xiàng)目依賴(lài)  將當(dāng)前目錄所有文件拷貝到上面創(chuàng)建的容器工作目錄 忽略.dockerignore的文件 copy 和 add都會(huì)忽略
COPY . /app
# 安裝yarn 
#RUN curl -o- -L https://yarnpkg.com/install.sh | bash
#RUN $HOME/.yarn/bin/yarn install
RUN yarn
#RUN npm install
#RUN npm run build
#ENV PORT=4403 NODE_ENV=pro
# 該鏡像生產(chǎn)的容器內(nèi)的端口號(hào),相當(dāng)于后續(xù)docker run -p 8827: 9930的9930
EXPOSE 4403

#容器生成時(shí) 執(zhí)行 yarn run prd啟動(dòng)項(xiàng)目
CMD yarn run prd
  1. node服務(wù)的鏡像構(gòu)建文件寫(xiě)好了,下面就是生成容器了,項(xiàng)目根目錄新建docker-compose.yml文件,前提是你服務(wù)器安裝了docker-compose,怎么裝的請(qǐng)百度,如下:
#  寫(xiě)死就行  compose的版本 如果你的jenkins 支持docker componse 的話 用這個(gè)方法
version: '3.1'
services:
#services的名字 其他services需要關(guān)聯(lián)的時(shí)候有用
  database:
#node依賴(lài)的mongo鏡像,會(huì)自動(dòng)幫你下載
    image: mongo
#容器的名字,建議聲明
    container_name: xipasswordmongo
#總是重啟
    restart: always
    # 映射到宿主機(jī)的端口,宿主27018,容器內(nèi)27017(自己根據(jù)需要賦值)
    ports:
      - 27018:27017
#映射到宿主機(jī)的mongo目錄,當(dāng)你需要在宿主機(jī)也需要相應(yīng)文件的時(shí)候,比如志,
#你總不能每次都進(jìn)容器看吧,這樣掛載到宿主機(jī),會(huì)方便一些
#右邊的/data/db是Mongo鏡像默認(rèn)生成的工作目錄,你自定義的是:左邊的
    volumes:
      - /usr/local/mongo:/data/db
#創(chuàng)建一個(gè)容器內(nèi)的網(wǎng)絡(luò)橋接,可以很方便的容器互聯(lián),比如node鏈接mongo,不需要寫(xiě)公網(wǎng)Ip了
#可以直接寫(xiě)mongods://(your container name):(容器內(nèi)端口號(hào))
   networks:
      - webapp-network
  web:
    # 你docker build 的鏡像名(就是dockerfile 運(yùn)行 build 生成的那個(gè)鏡像)  因?yàn)殓R像依賴(lài)的node鏡像所有包含了 node了環(huán)境
    image: "qsmben/xitupassword"
    # 指定一個(gè)別名
    container_name: xipasswordkoa
    restart: always
    #保持一致 前面是你的宿主機(jī)目錄 /app在docker里面創(chuàng)建的工作目錄  注意:mac下掛在文件 僅僅支持 /Users /Volumes /tmp
    #volumes:
     #- /usr/local/nodefile/node/password:/app
    #links: 
    # - database
    # 依賴(lài)上面的數(shù)據(jù)庫(kù)
    links:
     - database
    depends_on:
     - database
      #我在js里面手動(dòng)寫(xiě)了
    #environment: 
    #  - NODE_ENV=pro 
    # 4403是 dockerfile暴露出來(lái)的端口  盡量和Node的端口全部保持一致 避免混亂
    ports:
      - 4403:4403
    networks:
      - webapp-network
#創(chuàng)建鏈接橋
networks:
  webapp-network:
    driver: bridge
  1. 運(yùn)行docker-compose up -d, 不出意外會(huì)新建兩個(gè)容器, docker ps -a查看:
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                    PORTS                                NAMES
bc64dfdba38e        qsmben/xitupassword   "docker-entrypoint..."   3 hours ago         Up 3 hours                0.0.0.0:4403->4403/tcp               xipasswordkoa
0687206883aa        docker.io/mongo       "docker-entrypoint..."   17 hours ago        Up 17 hours               0.0.0.0:27018->27017/tcp             xipasswordmongo
  1. 如果不行,恭喜您 和我一樣, 服務(wù)器無(wú)論如何都裝不上docker-compose,我也谷歌過(guò)各種方法沒(méi)啥用,遂放棄這種方法,采用官網(wǎng)的run方法。
  • docker run 方法, 直接貼代碼和上面的都是對(duì)應(yīng)的,很容易理解:
#創(chuàng)建容器內(nèi)的網(wǎng)絡(luò)橋接    
  docker network create -d bridge xituNet

   # mongo 容器
   docker run \
   -d \
   --name xipasswordmongo \
   -u root \
   -p 27018:27017 \
   -v /usr/local/mongo:/data/db \
   --network xituNet \
   docker.io/mongo

# node服務(wù) 容器 依賴(lài)mongo
 docker run \
   -d \
   -it \
   --rm \
  --name xipasswordkoa \
   -u root \
   -p 4403:4403 \
   --link xipasswordmongo \
   --network xituNet \
   qsmben/xitupassword

#3.jenkins配置

  • 上面連各種構(gòu)建容器的方法,到底在哪運(yùn)行比較合適呢,如果你采用jenkins 持續(xù)構(gòu)建那肯定寫(xiě)在jenkins構(gòu)建服務(wù)里比較合適,在jenkins的構(gòu)建欄目選擇執(zhí)行shell,然后填入 配置如下:
whoami 
echo '開(kāi)始項(xiàng)目構(gòu)建命令'
echo $PATH
node -v
npm -v
echo '當(dāng)前分支'
git branch -a

echo '拉代碼'
git config -l
git pull origin master

echo 'docker image'
docker image ls 
echo 'docker container'
docker ps -a


echo 'build docker image'

echo '停止之前的docker容器和刪除'
#/usr/local/bin/docker-compose down
docker stop xipasswordkoa 
docker rm xipasswordkoa
docker rmi qsmben/xitupassword
docker build -t qsmben/xitupassword .
echo '構(gòu)建compose'

docker run \
  -d \
  -it \
  --rm \
 --name xipasswordkoa \
  -u root \
  -p 4403:4403 \
  --link xipasswordmongo \
  --network xituNet \
  qsmben/xitupassword

#ln -sf /usr/local/bin/docker-compose /usr/bin/docker-compose
#chmod 0755 /usr/local/bin/docker-compose
#docker-compose up -d
#docker-compose up -d

echo '容器運(yùn)行列表'
docker ps -a
echo '鏡像列表'
docker image ls
  • 上面的注釋基本告訴了啥意思,還是那句話如果docker-compose沒(méi)問(wèn)題采用docker-compose,不行的話就跟我一樣用docker run好了, 我這里只每次git提交 構(gòu)建koa的node應(yīng)用,因?yàn)?code>mongo的容器基本不需要變動(dòng)的,又不是業(yè)務(wù)代碼,所以你在服務(wù)器內(nèi)手動(dòng)構(gòu)建一次就好了。
  • 如果不遇到不懂的api或者對(duì)docker不明白,強(qiáng)烈建議看docker中文文檔
  • 寫(xiě)完了,告辭!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容