Docker 系列 - 03 - 入門 & Node 服務

jsliang發表於2022-03-10

一、前文回顧

經過前文的講解,想必小夥伴們對 Docker 的一些相關詞語有所瞭解,這裡我們們小小回歸一下:

  • 宿主機:你的電腦對應的系統機子
  • Dockfile:一份檔案,可以用來建立映象
  • 映象:類似光碟,可以用來建立容器,相當於安裝作業系統時需要用到的 ISO 檔案
  • 容器:輕量級虛擬技術,相當於通過 IOS 檔案創造的一個系統
一千個哈姆雷特,每個人看法不同,歡迎吐槽

二、一個 Node.js Demo

那麼,既然要將 Node.js 塞到 Docker 上,我們就要有一個 Node 服務,所以 jsliang 拿了自己寫的一個基礎 Node.js + TypeScript 的服務。

它的目錄結構如下:

docker-node
> src
.eslintrc.js
.gitignore
package-lock.json
package.json
README.md
tsconfig.json

啟動這個 Demo 只需要 2 步:

  • 安裝包:npm i
  • 啟動服務:npm run robot

等到每分鐘的第 0 秒的時候,終端會列印:

Docker-demo-07.jpg

這個 Demo 簡單來說,就是通過 commander.js,執行 npm run robot 時,走命令 ts-node ./src/index.ts robot

然後 /src/index.ts 中的任務,主要是:

// ……程式碼省略
console.log('你好,已進入程式'); // 列印
schedule.scheduleJob('0 * * * * *', () => { // 設定定時任務
  const { year, month, day, hour, minute, second } = getDateDetail(new Date());
  console.log(`${year}/${month}/${day} ${hour}:${minute}:${second}`);
});
// ……程式碼省略

即列印一行文字,然後在每分鐘的第 0 秒列印 年/月/日 時:分:秒

感興趣的小夥伴可以停下來先看下 Demo,不感興趣的可以繼續往下看。

三、改造 Node.js 服務,新增 Docker 必備檔案

下面我們看看如何將這個 Node.js 服務塞到 Docker 裡面。

  • 目標在 Docker 中構建 Node.js 環境且啟動服務
docker-node
> src
+ .dockerignore
.eslintrc.js
.gitignore
+ Dockerfile
package-lock.json
package.json
README.md
tsconfig.json

我們新增兩個檔案,分別是 .dockerignoreDockerfile,然後往裡面塞內容:

.dockerignore
node_modules
.dockerignore
Dockerfile
*-debug.log
*-error.log
.git
.hg
.svn
.vscode

.dockerignore 就像 .gitignore 一樣,起到忽略檔案/資料夾的作用,所以 Docker 在執行 Dockerfile 的時候,會選擇性忽略裡面對應的檔案/資料夾。

Dockerfile
# 本映象拷貝自 Node v14 版本
FROM node:14

# 指定執行 CMD 的目錄,即先 cd 到該目錄上
WORKDIR /usr/src/app

# 拷貝宿主機(當前執行終端的位置)的檔案到容器中的 app 目錄中
COPY . .

# 安裝 npm 包
RUN npm install

# 對外暴露本映象的 80 埠
EXPOSE 80

# 啟動 Node 服務
CMD ["npm", "run", "robot"];

Dockerfile 會告訴 Docker:你只需要這樣,然後這樣,然後再這樣……

詳細的我就不哆嗦了,上面的註釋寫得很清楚了。

那麼接下來我們只需要 Show 下操作,狂敲指令即可!

四、Docker 部署 Node.js 服務

  • 建立映象(Image):docker image build ./ -t docker-node:1.0.0

    • docker image build:建立映象
    • ./:基於當前目錄
    • -t:為容器重新分配一個偽輸入終端,通常與 -i 同時使用
    • docker-node:1.0.0:對應的映象名稱和 TAG

Docker-demo-08.png

  • 建立容器(Container):docker container create -p 3333:80 docker-node:1.0.0

    • docker container create:建立容器
    • -p 3333:80:埠,3333:80宿主機:容器
    • docker-node:1.0.0:對應的映象及其 TAG

Docker-demo-09.png

  • 啟動容器(Container):docker container start dd420fc4267ad3bdb9eadfdbf37d89e2592dbc9d030a501b96fe10b07ac565ff

    • docker container start:啟動容器
    • dd420fc4267ad3bdb9eadfdbf37d89e2592dbc9d030a501b96fe10b07ac565ff:容器 ID,即 docker ps -a 查詢到的 CONTAINER ID

Docker-demo-10.png

  • 檢視容器(Container)執行情況:docker ps -a

Docker-demo-11.png

  • 檢視容器(Container)的日誌:docker logs -f dd420fc4267a

    • dd420fc4267a:容器 ID,可通過 docker ps -a 查詢到

Docker-demo-12.png

  • 進入容器(Container):docker exec -it dd420fc4267a bash

    • dd420fc4267a:容器 ID,可通過 docker ps -a 查詢到
  • 檢視 README.md 檔案:cat -n README.md

    • cat:cat(英文全拼:concatenate)命令用於連線檔案並列印到標準輸出裝置上
    • -n:由 1 開始對所有輸出的行數編號

Docker-demo-13.png

五、小結

通過上面的講解,想必小夥伴們大致瞭解了 Docker 的一些指令,下篇我們會講解 Docker 中新人必備的 指令 和如何做 Hosts 隔離,且修改容器裡面的時間。

敬請期待:05 - 解疑 & Docker 指令


不折騰的前端,和鹹魚有什麼區別!

覺得文章不錯的小夥伴歡迎點贊/點 Star。

如果小夥伴需要聯絡 jsliang

個人聯絡方式存放在 Github 首頁,歡迎一起折騰~

爭取打造自己成為一個充滿探索欲,喜歡折騰,樂於擴充套件自己知識面的終身學習橫槓程式設計師。

jsliang 的文件庫由 樑峻榮 採用 知識共享 署名-非商業性使用-相同方式共享 4.0 國際 許可協議 進行許可。<br/>基於 https://github.com/LiangJunrong/document-library 上的作品創作。<br/>本許可協議授權之外的使用許可權可以從 https://creativecommons.org/licenses/by-nc-sa/2.5/cn/ 處獲得。

相關文章