Docker容器化Node.js應用操作教程
從零開始:用Docker容器化你的第一個Node.js應用
1. 引言
在現(xiàn)代軟件開發(fā)中,Docker已成為不可或缺的工具。它通過容器化技術,將應用及其依賴環(huán)境打包在一起,實現(xiàn)了“一次構建,處處運行”的夢想。今天,我將帶大家完成一個完整的Docker實踐:容器化一個簡單的Node.js應用,從編寫代碼到運行容器,一步步掌握Docker的核心操作。
2. 項目準備
首先,我們創(chuàng)建一個簡單的Node.js項目,僅包含兩個文件:

2.1. 應用代碼 (index.js)
console.log("你好,世界!")這是一個最簡單的Node.js程序,輸出一句問候語。
2.2. Docker鏡像定義文件 (Dockerfile)
讓我們解析一下這個Dockerfile:
- FROM node:14-alpine:指定基礎鏡像為Node.js 14的Alpine Linux版本,這是一個輕量級的Linux發(fā)行版
- COPY index.js /index.js:將本地的index.js文件復制到容器內的根目錄
- CMD node /index.js:設置容器啟動時默認執(zhí)行的命令
3. 構建Docker鏡像
有了Dockerfile,我們就可以創(chuàng)建自定義的Docker鏡像了。
3.1. 構建命令
docker build -t hello-docker .
這個命令的含義是:
docker build:啟動鏡像構建過程-t hello-docker:為鏡像打上標簽(名稱),便于后續(xù)引用.:使用當前目錄作為構建上下文,Docker會查找當前目錄下的Dockerfile
3.2. 構建日志
PS E:\hello-world\hello-docker> docker build -t hello-docker . [+] Building 369.5s (7/7) FINISHED docker:desktop-linux => [internal] load build definition from Dockerfile 0.1s => => transferring dockerfile: 103B 0.0s => [internal] load metadata for docker.io/library/node:14-alpine 263.8s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load build context 0.1s => => transferring context: 29B 0.0s => [1/2] FROM docker.io/library/node:14-alpine@sha256:434215b487a329c9e867202ff89e704d3a75e554822e07f3e0c0f9e606121b33 103.1s => => resolve docker.io/library/node:14-alpine@sha256:434215b487a329c9e867202ff89e704d3a75e554822e07f3e0c0f9e606121b33 0.1s => => sha256:434215b487a329c9e867202ff89e704d3a75e554822e07f3e0c0f9e606121b33 1.43kB / 1.43kB 0.0s => => sha256:4e84c956cd276af9ed14a8b2939a734364c2b0042485e90e1b97175e73dfd548 1.16kB / 1.16kB 0.0s => => sha256:0dac3dc27b1ad570e6c3a7f7cd29e88e7130ff0cad31b2ec5a0f222fbe971bdb 6.44kB / 6.44kB 0.0s => => sha256:0dac3dc27b1ad570e6c3a7f7cd29e88e7130ff0cad31b2ec5a0f222fbe971bdb 6.44kB / 6.44kB 0.0s => => sha256:f56be85fc22e46face30e2c3de3f7fe7c15f8fd7c4e5add29d7f64b87abdaa09 3.37MB / 3.37MB 63.4s => => sha256:8f665685b215c7daf9164545f1bbdd74d800af77d0d267db31fe0345c0c8fb8b 37.17MB / 37.17MB 90.6s => => sha256:e5fca6c395a62ec277102af9e5283f6edb43b3e4f20f798e3ce7e425be226ba6 2.37MB / 2.37MB 52.7s => => sha256:561cb69653d56a9725be56e02128e4e96fb434a8b4b4decf2bdeb479a225feaf 448B / 448B 95.7s => => extracting sha256:f56be85fc22e46face30e2c3de3f7fe7c15f8fd7c4e5add29d7f64b87abdaa09 0.6s => => extracting sha256:8f665685b215c7daf9164545f1bbdd74d800af77d0d267db31fe0345c0c8fb8b 11.2s => => extracting sha256:e5fca6c395a62ec277102af9e5283f6edb43b3e4f20f798e3ce7e425be226ba6 0.3s => => extracting sha256:561cb69653d56a9725be56e02128e4e96fb434a8b4b4decf2bdeb479a225feaf 0.0s => [2/2] COPY index.js /index.js 2.0s => exporting to image 0.2s => => exporting layers 0.1s => => writing image sha256:be987f77136525684c13002b3a8d43cc6cd4d62986f7997128b51946aad6d03c 0.0s => => naming to docker.io/library/hello-docker 0.0s View build details: docker-desktop://dashboard/build/desktop-linux/desktop-linux/pnwg2u6n5xocvatlj87a6v6fj 1 warning found (use docker --debug to expand): - JSONArgsRecommended: JSON arguments recommended for CMD to prevent unintended behavior related to OS signals (line 3)

3.3. 構建過程解析
- Docker首先下載基礎鏡像
node:14-alpine(如果本地不存在) - 然后執(zhí)行COPY指令,將index.js文件復制到鏡像中
- 最后設置默認的啟動命令
- 構建完成后,生成了一個ID為
be987f771365的新鏡像
這里Docker給出了一個有用的警告:建議使用JSON格式的CMD指令來避免信號處理問題。雖然不影響當前使用,但在生產(chǎn)環(huán)境中需要注意這一點。
4. 查看本地鏡像
構建完成后,我們可以查看本地已有的Docker鏡像:
docker images
日志輸出:
PS E:\hello-world\hello-docker> docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-docker latest be987f771365 8 minutes ago 119MB hello-world latest 74cc54e27dc4 10 months ago 10.1kB hub.oepkgs.net/openeuler/nginx <none> 1d992e662bfc 13 months ago 747MB

輸出顯示我們剛剛創(chuàng)建的hello-docker鏡像大小為119MB,相比基礎鏡像已經(jīng)很小了。同時可以看到系統(tǒng)中還有其他鏡像,比如經(jīng)典的hello-world測試鏡像。
5. 運行容器
鏡像只是靜態(tài)的模板,要運行應用需要從鏡像創(chuàng)建容器:
docker run hello-docker
日志輸出:
PS E:\hello-world\hello-docker> docker run hello-docker 你好,世界!

執(zhí)行后,終端立即輸出了"你好,世界!"。這意味著:
- Docker從
hello-docker鏡像創(chuàng)建了一個新容器 - 容器內執(zhí)行了
node /index.js命令 - Node.js解釋器執(zhí)行了我們的代碼,輸出結果到終端
- 程序執(zhí)行完畢,容器自動停止
6. 查看容器
PS E:\hello-world\hello-docker> docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES PS E:\hello-world\hello-docker>
PS E:\hello-world\hello-docker> docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9fadd3ad3798 hello-docker "docker-entrypoint.s…" 54 seconds ago Exited (0) 52 seconds ago affectionate_burnell

運行docker ps查看當前正在運行的容器,發(fā)現(xiàn)沒有結果。這是因為我們的應用執(zhí)行完就退出了,容器也隨之停止。
但使用docker ps -a查看所有容器(包括已停止的),可以看到剛剛運行的容器:
- 狀態(tài)為"Exited (0)",表示正常退出
- 54秒前創(chuàng)建,52秒前退出
- 有一個隨機生成的名字"affectionate_burnell"
這就是容器與虛擬機的關鍵區(qū)別之一:容器是為了運行特定進程而存在的,當進程結束,容器的使命也就完成了。
7. 實踐總結
通過這個簡單的實踐,我們完成了Docker的核心工作流:
- 編寫應用代碼 → 2. 定義Dockerfile → 3. 構建鏡像 → 4. 運行容器
在這個過程中,我們學到了幾個關鍵點:
- 鏡像與容器的關系:鏡像是靜態(tài)的模板,容器是鏡像的運行實例
- 分層構建:Docker鏡像采用分層結構,每一條指令都會創(chuàng)建一個新的層
- 輕量級特性:容器隨內部進程的結束而停止,資源占用更高效
- 環(huán)境一致性:無論在哪里運行,容器內部環(huán)境都完全相同
到此這篇關于Docker容器化Node.js應用教程的文章就介紹到這了,更多相關docker容器化node.js內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解決docker拉取鏡像報錯:error pulling image configurat
在使用Docker拉取Kafka鏡像時可能會遇到"error pulling image configuration"的錯誤,這可以通過編輯Docker配置文件并重啟Docker服務來解決,具體步驟包括:1. 編輯Docker配置文件;2. 使用命令systemctl restart docker重啟Docker服務2024-11-11
docker compose自定義網(wǎng)絡實現(xiàn)固定容器ip地址
這篇文章主要介紹了docker compose自定義網(wǎng)絡實現(xiàn)固定容器ip地址,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-01-01
使用docker-compose連接到宿主機網(wǎng)絡
這篇文章主要介紹了使用docker-compose連接到宿主機網(wǎng)絡,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
docker部署firefox瀏覽器實現(xiàn)遠程訪問
在使用docker時,默認情況下只能在本地進行訪問,本文就來介紹一下docker部署firefox瀏覽器實現(xiàn)遠程訪問,具有一定的參考價值,感興趣的可以了解一下2024-01-01
docker連接spring boot和mysql容器方法介紹
這篇文章主要介紹了docker連接spring boot和mysql容器方法介紹,具有一定參考價值,需要的朋友可以了解下。2017-10-10

