實戰:dockerfile 最小實踐——koa 為例

山頭人漢波發表於2022-04-30

前言

最小實踐,意味著將鏈路打通,站在更高的層面看問題,問題就變得清晰,此文筆者將帶諸位實現一個最簡單的 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 檔案

新建一個 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_build

檢視映象是否有了

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

lrzsz上傳映象

解開此壓縮包(匯入)

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_push

另一種方法第六步:拉取映象

登入伺服器,並拉取映象

docker pull johanbo/koa_server:v1.0.0

docker_pull

注意:這裡需要打標籤,否則會預設拉取 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

相關文章