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
- apt升級
apt-get update
- 添加相關軟件包
apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
- 下載軟件包的合法性匀哄,需要添加軟件源的 GPG 密鑰
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
- source.list 中添加 Docker 軟件源
add-apt-repository \
"deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) \
stable"
- 安裝 Docker CE
apt-get update
apt-get install docker-ce
- 啟動 Docker CE
systemctl enable docker
systemctl start docker
- 建立 docker 用戶組(附加)
groupadd docker
usermod -aG docker $USER
- Helloworld測試
docker run hello-world
- 查看與刪除進程
// 查看進程
docker ps
// 查看全部進程(包括停止的進程)
docker ps -a
// 停止進程
docker stop 775bd130a7f2(CONTAINER ID 前三位即可)
// 刪除進程
docker rm CONTAINER ID
添加鏡像加速
- 進入根目錄
- 進入etc/docker目錄
cd etc/docker
vi daemon.js
i
// 復制粘貼
{
"registry-mirrors": [
"https://dockerhub.azk8s.cn",
"https://reg-mirror.qiniu.com"
]
}
esc
:wq
- 重啟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基本指令
docker-compose的使用非常類似于docker命令的使用,但是需要注意的是大部分的compose命令都需要到docker-compose.yml文件所在的目錄下才能執(zhí)行逢防。
docker-compose up: 命令聚合每個容器的輸出叶沛,命令退出時,所有容器都將停止忘朝。
docker-compose up -d: 在后臺啟動容器并使它們保持運行灰署。
docker-compose logs -f: 查看該容器的啟動的日志打印(日志從頭打印)。
docker logs -f container_id: 查看某一容器的啟動的日志打印(日志從頭打印)局嘁。
docker logs -f --tail 數(shù)量詞 container_id: 查看某一容器的啟動的日志打印(查看最后n條日志打印)溉箕。 例:docker logs -f --tail 50 44b
docker-compose stop: 停止compose服務。
docker-compose restart: 重啟compose服務悦昵。
docker-compose kill: kill compose服務肴茄。
docker-compose ps:查看compose服務狀態(tài)。
docker-compose rm:刪除compose服務但指。
docker-compose.yml配置文件
https://blog.csdn.net/qq_36148847/article/details/79427878
compose集群 nginx + 后端(node)+ 數(shù)據(jù)庫 + vue
- 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;
}
}
- 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
- 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"]
- 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)
})
}
})