- 本篇文件對應的程式碼:https://github.com/LiangJunro...
- Docker 系列文件:https://github.com/LiangJunro...
一、前文回顧
經過前文的講解,想必小夥伴們對 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 秒的時候,終端會列印:
這個 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
我們新增兩個檔案,分別是 .dockerignore
和 Dockerfile
,然後往裡面塞內容:
.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
建立容器(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
啟動容器(Container):
docker container start dd420fc4267ad3bdb9eadfdbf37d89e2592dbc9d030a501b96fe10b07ac565ff
docker container start
:啟動容器dd420fc4267ad3bdb9eadfdbf37d89e2592dbc9d030a501b96fe10b07ac565ff
:容器 ID,即docker ps -a
查詢到的CONTAINER ID
- 檢視容器(Container)執行情況:
docker ps -a
檢視容器(Container)的日誌:
docker logs -f dd420fc4267a
dd420fc4267a
:容器 ID,可通過docker ps -a
查詢到
進入容器(Container):
docker exec -it dd420fc4267a bash
dd420fc4267a
:容器 ID,可通過docker ps -a
查詢到
檢視
README.md
檔案:cat -n README.md
cat
:cat(英文全拼:concatenate)命令用於連線檔案並列印到標準輸出裝置上-n
:由 1 開始對所有輸出的行數編號
五、小結
通過上面的講解,想必小夥伴們大致瞭解了 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/ 處獲得。