#1.準(zhǔn)備工作
- 我不會(huì)照搬文檔上官方的話術(shù),完全憑自己的理解寫(xiě),可能不規(guī)范,不喜歡請(qǐng)左上角
- 你的服務(wù)器必須裝好了
docker,怎么裝的自行研究 - 你已經(jīng)部署好了
jenkins并且和github建立了hook鏈接,怎么的請(qǐng)參考我之前的文章 - 網(wǎng)上很多文章都寫(xiě)明了什么是
docker和docker api之類(lèi)的,建議閱讀掌握基本概念,但是我覺(jué)得他們說(shuō)的都太表面了,舉個(gè)栗子:-
Dockerfile文件: 這個(gè)文件是用來(lái)docker build -t (your image name) .,就是用來(lái)制作docker鏡像的,這是基礎(chǔ),建議放在項(xiàng)目根目錄 -
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的方式:
- 因?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
-
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
- 運(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
- 如果不行,恭喜您 和我一樣, 服務(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ě)完了,告辭!