前言
最小實踐,意味著將鏈路打通,站在更高的層面看問題,問題就變得清晰,此文筆者將帶諸位實現一個最簡單的 koa 服務,並將其部署至伺服器上。
先決知識:對docker 有一定的瞭解
實現思路
第一步:先啟動一個 koa 應用,
第二步:再生成一個 dockerfile ,並編寫它
第三步:基於 dockerfile 生成映象(docker build)
第四步:基於此映象生成(run)一個容器,檢查在本機上是否跑的通
第五步:如果通,就匯出此映象
第六步:xshell 連線伺服器上(假設伺服器上已安裝 docker),匯入此映象,通過此映象生成一容器
這就是最小實現
這裡還有一種實現方式:
在第五步時,把它釋出到遠端倉庫,第六步,從遠端拉取到映象,但缺點是,你的映象要公開(只有一個私有名額)
第一步:先啟動一個 koa 應用
新建一個 dockerfile_koa_demo 檔案,npm init -y 生成 package.json。下載 koa 包,新建 app.js
mkdir dockerfile_koa_demo
cd dockerfile_koa_demo
npm init -y
npm i koa --save
touch app.js
再編寫 app.js
const Koa = require('koa');
const app = new Koa();
app.use(async (ctx) => {
ctx.body = 'hello, docker';
});
app.listen(3010, () => {
console.log('3010埠已啟動');
});
修改 package.json 的 script
...
"scripts": {
"start": "nodemon app.js"
},
...
啟動指令碼
npm run start
看到如下圖所示:
瀏覽器訪問正常
第二步:寫個 Dockerfile 檔案
新建一個 Dockerfile 檔案
touch Dockerfile
編寫 Dockerfile
# base image
# FROM
FROM node
# 複製檔案到容器
ADD . /home/www
# 進入工作目錄
WORKDIR /home/www
# 安裝專案依賴包
RUN npm install --registry=https://registry.npm.taobao.org
# 暴露 埠
EXPOSE 3010
# 開始命令
CMD ["node", "./app.js"]
第二步寫完了
第三步:基於 dockerfile 生成映象
為了加快構建速度,我們先生成 .dockerignore
,並往裡寫上 node_modules
touch .dockerignore
在 .dockerignore
裡寫入 node_modules
,意思是說當你 docker build
的時候忽略 node_modules
檔案,加快構建速度
通過命令列生成映象,命名 johan/koa_server:v1.0.0
docker build . -t johan/koa_server:v1.0.0
# -t 就是給映象起名
效果如下圖所示:
檢視映象是否有了
docker images
第四步:基於此映象生成一容器
命令列生成一容器
docker run -d --name koa_server_container -p 3010:3010 johan/koa_server:v1.0.0
# -d 後臺執行
# --name 給容器起名字
# -p 本機埠隱射映象中的埠
檢視映象是否生成
docker ps -a
在瀏覽器中輸入http://localhost:3010/
,bingo
第五步:匯出此映象
docker save johan/koa_server:v1.0.0 > koa_server.tar
第六步:在伺服器上跑通
這裡我們假設伺服器上已經安裝了 docker 以及 lrzsz 包(本文具體不展開)
通過 xshell 連線伺服器,通過命令 rz 上傳 tar 包
rz
解開此壓縮包(匯入)
docker load < koa_server.tar
基於此容器生成容器
docker run -d --name koa_server_container -p 3010:3010 johan/koa_server:v1.0.0
並檢視跑通的容器
docker ps -a
在瀏覽器中輸入域名,bingo
以上就是一個 dockerfile
的最小實現,是不是很簡單。當然,你可以在第五步時將映象上傳至docker hub
,第六步從 dockerfile
拉取映象,再生成容器。如下
另一種方法第五步:上傳映象
命令列登入 dockerhub(首先要先註冊)
docker login
給映象命名
docker tag johan/koa_server:v1.0.0 johanbo/koa_server:v1.0.0
將映象上傳至 docker hub
docker push johanbo/koa_server:v1.0.0
另一種方法第六步:拉取映象
登入伺服器,並拉取映象
docker pull johanbo/koa_server:v1.0.0
注意:這裡需要打標籤,否則會預設拉取 latest
啟動容器
docker run -d --name koa_server_container -p 3010:3010 johan/koa_server:v1.0.0
在瀏覽器中輸入域名,bingo
注意:伺服器開發埠需要去雲服務商那裡開發相應埠(安全組配置規則)
後續
你可以在 dockerfile
裡配置你所需的環境變數,映象生成的容器是個 "mini 伺服器",怎麼倒騰都行,和整個伺服器沒有關係,所以你的應用不受環境影響。
在這裡說一個痛點:即使你解決了環境問題,但是 CICD 也是個問題,如何更快捷地整合呢?接下來的一節我會介紹下,docker 與 jenkins 的結合,通過 docker 生成 jenkins,jenkins 賦能 CICD