docker+webhooks持續(xù)集成

Docker

https://yeasy.gitbooks.io/docker_practice/introduction/what.html

概念

Docker是什么

  • 操作系統(tǒng)層面的虛擬化技術
  • 隔離的進程獨立于宿主和其他的隔離進程-容器
  • go語言開發(fā)
  • 基于Linux的高效送矩、敏捷、輕量級的容器(輕量虛擬)方案。
  • Build,Ship and Run Any App,Anywhere — 一次封裝掀淘,到處執(zhí)行躁锁。

特點

  • 高效的利用系統(tǒng)資源
  • 快速的啟動時間
  • 一致的運行環(huán)境
  • 持續(xù)交付和部署
  • 更輕松的遷移

核心概念

  • 鏡像
  • 容器
  • 倉庫

安裝docker

  1. apt升級
apt-get update
  1. 添加相關軟件包
apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
  1. 下載軟件包的合法性匀哄,需要添加軟件源的 GPG 密鑰
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
  1. source.list 中添加 Docker 軟件源
add-apt-repository \
"deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) \
stable"
  1. 安裝 Docker CE
apt-get update
apt-get install docker-ce
  1. 啟動 Docker CE
systemctl enable docker
systemctl start docker
  1. 建立 docker 用戶組(附加)
groupadd docker
usermod -aG docker $USER
  1. Helloworld測試
docker run hello-world
  1. 查看與刪除進程
// 查看進程
docker ps
// 查看全部進程(包括停止的進程)
docker ps -a
// 停止進程
docker stop 775bd130a7f2(CONTAINER ID 前三位即可)
// 刪除進程
docker rm CONTAINER ID 

添加鏡像加速

  1. 進入根目錄
  2. 進入etc/docker目錄
cd etc/docker
vi daemon.js
i
// 復制粘貼
{
"registry-mirrors": [
"https://dockerhub.azk8s.cn",
"https://reg-mirror.qiniu.com"
]
}
esc
:wq
  1. 重啟docker
sudo systemctl daemon-reload
sudo systemctl restart docker

Dockerfile定制鏡像

鏡像的定制實際上就是定制每一層所添加的配置窒篱、文件咆霜。如果我們可以把每一層修改、安裝轿塔、構建特愿、操作的
命令都寫入一個腳本,用這個腳本來構建勾缭、定制鏡像揍障,那么之前提及的無法重復的問題、鏡像構建透明性的
問題俩由、體積的問題就都會解決毒嫡。這個腳本就是 Dockerfile。

例:定制一個node.js鏡像

#Dockerfile
#制定node鏡像的版本
FROM node:10-alpine
#移動當前目錄下面的文件到app目錄下
ADD . /app/
#進入到app目錄下面幻梯,類似cd
WORKDIR /app
#安裝依賴
RUN npm install
#對外暴露的端口
EXPOSE 3000
#程序啟動腳本
CMD ["node", "app.js"]
# 定制鏡像
docker build -t mynode .
# 運行
docker run -p 3000:3000 -d mynode

常用命令解釋:

  • FROM:
    格式為FROM image或FROM image:tag兜畸,并且Dockerfile中第一條指令必須是FROM指令,且在同一個Dockerfile中創(chuàng)建多個鏡像時礼旅,可以使用多個FROM指令
  • RUN:
    RUN命令膳叨,指定鏡像中運行的命令洽洁,包含兩種模式痘系。
    格式為RUN command或 RUN ["EXECUTABLE","PARAM1","PARAM2".....],前者在shell終端中運行命令饿自,/bin/sh -c command汰翠,例如:/bin/sh -c "echo hello"龄坪;后者使用exec執(zhí)行,指定其他運行終端使用RUN["/bin/bash","-c","echo hello"]
    每條RUN指令將當前的鏡像基礎上執(zhí)行指令复唤,并提交為新的鏡像健田,命令較長的時候可以使用\來換行。組合指令可以使用&&進行組合
  • ADD & COPY
    COPY和ADD命令佛纫,將目錄或文件復制鏡像中妓局,兩者區(qū)別是ADD包含了類似tar的解壓縮功能,如果只是目錄或文件復制呈宇,推薦使用COPY好爬。復制目錄時需要’/‘結尾,目錄不存在會自動創(chuàng)建甥啄。
    DOCKERFILECOPY <src> <dest>
    ADD <src> <dest>
    ++src表示來源地址存炮,可以是本地或網(wǎng)絡地址,如果是本地地址蜈漓,必須是鏡像的相對地址(dockerfile為參考路勁)穆桂。++
    ++dest表示將文件復制到鏡像目標地址,必須是絕對路徑融虽。++
  • WORKDIR
    格式: WORKDIR /path
    為后續(xù)的RUN CMD ENTRYPOINT指定配置工作目錄享完,可以使用多個WORKDIR指令,若后續(xù)指令用得是相對路徑有额,則會基于之前的命令指定路徑
  • CMD
    支持三種格式:
    CMD ["executable","param1","param2"]驼侠,使用exec執(zhí)行,這是推薦的方式谆吴。
    CMD command param1 param2 在/bin/sh中執(zhí)行倒源。
    CMD ["param1","param2"] 提供給ENTERYPOINT的默認參數(shù)。
    CMD用于指定容器啟動時執(zhí)行的命令句狼,每個Dockerfile只能有一個CMD命令笋熬,多個CMD命令只執(zhí)行最后一個。若容器啟動時指定了運行的命令腻菇,則會覆蓋掉CMD中指定的命令胳螟。

鏡像的查看與刪除

//查看鏡像
docker images
//刪除鏡像
docker rmi IMAGE ID

pm2

https://www.cnblogs.com/wangcp-2014/p/10874417.html

PM2是node進程管理工具,可以利用它來簡化很多node應用管理的繁瑣任務筹吐,如性能監(jiān)控糖耸、自動重啟、負載均衡等丘薛,而且使用非常簡單嘉竟。

安裝

全局安裝npm install -g pm2

常用指令

  • 啟動:pm2 start app.js --watch
    --watch:監(jiān)聽應用目錄的變化,一旦發(fā)生變化,自動重啟舍扰。如果要精確監(jiān)聽倦蚪、不見聽的目錄,最好通過配置文件边苹。
  • 重啟:pm2 restart app.js
  • 停止:pm2 stop app_name|app_id
    停止特定的應用陵且。可以先通過pm2 list獲取應用的名字(--name指定的)或者進程id个束。
  • 停止所有應用:pm2 stop all
  • 刪除:pm2 stop app_name|app_id
  • 刪除全部:pm2 stop all
  • 查看進程狀態(tài):pm2 list

配置文件

  • 配置文件里的設置項慕购,跟命令行參數(shù)基本是一一對應的。
  • 可以選擇yaml或者json文件茬底,就看個人洗好了脓钾。
  • json格式的配置文件,pm2當作普通的js文件來處理桩警,所以可以在里面添加注釋或者編寫代碼可训,這對于動態(tài)調(diào)整配置很有好處。
  • 如果啟動的時候指定了配置文件捶枢,那么命令行參數(shù)會被忽略握截。(個別參數(shù)除外,比如--env)
    推薦使用yml格式
// json例子
{
 
    "name" : "fis-receiver", // 應用名稱
     
    "script" : "./bin/www", // 實際啟動腳本
     
    "cwd" : "./", // 當前工作路徑
     
    "watch": [ // 監(jiān)控變化的目錄烂叔,一旦變化谨胞,自動重啟
     
        "bin",
     
        "routers"
     
    ],
     
    "ignore_watch" : [ // 從監(jiān)控目錄中排除
     
        "node_modules",
         
        "logs",
         
        "public"
     
    ],
     
    "watch_options": {
     
        "followSymlinks": false
     
    },
     
    "error_file" : "./logs/app-err.log", // 錯誤日志路徑
     
    "out_file" : "./logs/app-out.log", // 普通日志路徑
     
    "env": {
     
        "NODE_ENV": "production" // 環(huán)境參數(shù),當前指定為生產(chǎn)環(huán)境
     
    }
 
}

定制node的Dockerfile鏡像配合pm2

// Dockerfile
FROM keymetrics/pm2:latest-alpine
WORKDIR /usr/src/app
ADD . /usr/src/app
RUN npm config set registry https://registry.npm.taobao.org/ && \  
    npm i
# RUN npm i
EXPOSE 3000
#pm2在docker中使用命令為pm2-docker
# CMD ["pm2-runtime", "start", "--json", "process.json"]
CMD ["pm2-runtime", "start",  "process.yml"]
// process.yml
apps:
  - script : server.js
    instances: 2
    watch  : true
    env    :
      NODE_ENV: production

docker-compose

Compose項目是 Docker 官方的開源項目蒜鸡,負責實現(xiàn)對 Docker 容器集群的快速編排胯努。

例:

#docker-compose.yml
version: '3.1'
services:
mongo:
    image: mongo
    restart: always
    ports:
        - 27017:27017
mongo-express:
    image: mongo-express
    restart: always
    ports:
        - 8000:8081

docker-compose基本指令

  1. docker-compose的使用非常類似于docker命令的使用,但是需要注意的是大部分的compose命令都需要到docker-compose.yml文件所在的目錄下才能執(zhí)行逢防。

  2. docker-compose up: 命令聚合每個容器的輸出叶沛,命令退出時,所有容器都將停止忘朝。

  3. docker-compose up -d: 在后臺啟動容器并使它們保持運行灰署。

  4. docker-compose logs -f: 查看該容器的啟動的日志打印(日志從頭打印)。

  5. docker logs -f container_id: 查看某一容器的啟動的日志打印(日志從頭打印)局嘁。

  6. docker logs -f --tail 數(shù)量詞 container_id: 查看某一容器的啟動的日志打印(查看最后n條日志打印)溉箕。 例:docker logs -f --tail 50 44b

  7. docker-compose stop: 停止compose服務。

  8. docker-compose restart: 重啟compose服務悦昵。

  9. docker-compose kill: kill compose服務肴茄。

  10. docker-compose ps:查看compose服務狀態(tài)。

  11. docker-compose rm:刪除compose服務但指。

docker-compose.yml配置文件

https://blog.csdn.net/qq_36148847/article/details/79427878

compose集群 nginx + 后端(node)+ 數(shù)據(jù)庫 + vue

  1. nginx(nginx/conf/docker.conf)
server {
    listen 80;
    location / {
        root /var/www/html;
        index index.html index.htm;
    }
    location ~ \.(gif|jpg|png)$ {
        root /static;
        index index.html index.htm;
    }
}
  1. node配置Dockerfile+pm2
    (backend/Dockerfile)
FROM keymetrics/pm2:latest-alpine
WORKDIR /usr/src/app
ADD . /usr/src/app
RUN npm config set registry https://registry.npm.taobao.org/ && \  
    npm i
# RUN npm i
EXPOSE 3000
#pm2在docker中使用命令為pm2-docker
# CMD ["pm2-runtime", "start", "--json", "process.json"]
CMD ["pm2-runtime", "start",  "process.yml"]

構建進項中忽略文件夾或文件的配置文件(backend/.dockerignore)

node_modules

(backend/process.yml)

apps:
  - script : server.js
    instances: 2
    watch  : true
    env    :
      NODE_ENV: production
  1. vue配置Dockerfile(web/Dockerfile)
FROM node:10-alpine
WORKDIR /usr/src/app
ADD . /usr/src/app
# Npm
RUN npm config set registry https://registry.npm.taobao.org/ &&  \
   npm i
#執(zhí)行構建
CMD ["npm", "run", "build"]


  1. compose(docker-compose.yml)
version: '3.1'
services:
    nginx:
    restart: always
    image: nginx
    ports:
        - 8091:80
    volumes:
        - ./nginx/conf.d/:/etc/nginx/conf.d
        - ./frontend/dist:/var/www/html/
        - ./static/:/static/
    app-pm2:
        container_name: app-pm2
        #構建容器
        build: ./backend
        ports:
            - "3000:3000"
    web:
        container_name: web
        #構建容器
        build: ./web
        volumes:
            - ./web/dist:/usr/src/app/dist
        depends_on:
            - app-pm2
    mongo:
        image: mongo
        restart: always
        ports:
            - 27017:27017
    mongo-express:
        image: mongo-express
        restart: always
        ports:
            - 8000:8081

Github WebHook實現(xiàn)CI持續(xù)集成

在服務器上開放一個接口寡痰,當github接收到push請求后抗楔,請求這個接口,接口響應到以后氓癌,執(zhí)行docker-compose

啟動node監(jiān)聽

const http = require('http')
const createHandler = require('github-webhook-handler')
// path和secret要和github的webhooks配置一致
const handler = createHandler({
    path:'/docker_deploy',
    secret:'myHashSecret'
})

const { spawn } = require('child_process')
function run_cmd(cmd, args, callback) {
    const child = spawn(cmd, args)
    let resp = ''
    child.stdout.on('data', function (buffer) {
        resp+=buffer.toString()
    })
    child.stdout.on('end', function () {
        callback(resp)
    })
}

http.createServer((req,res) => {
    handler(req,res,err => {
    res.statusCode = 404
res.end('no such location')
})
}).listen(7777, () => {
    console.log('Webhook listen at 7777')
})
handler.on('error',err => {
    console.error('Error',err.message)
})
handler.on('push',event => {
    console.log('Received * ',event.payload.ref)
// console.log('Received * ')
if (event.payload.ref === 'refs/heads/master') {
    console.log('Receive push')
    run_cmd('sh', ['./deploy-dev.sh'], function (text) {
        console.log(text)
    })
}
})

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谓谦,一起剝皮案震驚了整個濱河市贫橙,隨后出現(xiàn)的幾起案子贪婉,更是在濱河造成了極大的恐慌,老刑警劉巖卢肃,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疲迂,死亡現(xiàn)場離奇詭異,居然都是意外死亡莫湘,警方通過查閱死者的電腦和手機尤蒿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來幅垮,“玉大人腰池,你說我怎么就攤上這事∶γⅲ” “怎么了示弓?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長呵萨。 經(jīng)常有香客問我奏属,道長,這世上最難降的妖魔是什么潮峦? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任囱皿,我火速辦了婚禮,結果婚禮上忱嘹,老公的妹妹穿的比我還像新娘嘱腥。我一直安慰自己,他們只是感情好拘悦,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布爹橱。 她就那樣靜靜地躺著,像睡著了一般窄做。 火紅的嫁衣襯著肌膚如雪愧驱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天椭盏,我揣著相機與錄音组砚,去河邊找鬼。 笑死掏颊,一個胖子當著我的面吹牛糟红,可吹牛的內(nèi)容都是我干的艾帐。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼盆偿,長吁一口氣:“原來是場噩夢啊……” “哼柒爸!你這毒婦竟也來了?” 一聲冷哼從身側響起事扭,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤捎稚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后求橄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體今野,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年罐农,在試婚紗的時候發(fā)現(xiàn)自己被綠了条霜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡涵亏,死狀恐怖宰睡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情气筋,我是刑警寧澤拆内,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站裆悄,受9級特大地震影響矛纹,放射性物質發(fā)生泄漏。R本人自食惡果不足惜光稼,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一或南、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧艾君,春花似錦采够、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至虹茶,卻和暖如春逝薪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蝴罪。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工董济, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人要门。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓虏肾,卻偏偏與公主長得像廓啊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子封豪,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容