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

2.1. 應(yīng)用代碼 (index.js)
console.log("你好,世界!")這是一個(gè)最簡(jiǎn)單的Node.js程序,輸出一句問(wèn)候語(yǔ)。
2.2. Docker鏡像定義文件 (Dockerfile)
讓我們解析一下這個(gè)Dockerfile:
- FROM node:14-alpine:指定基礎(chǔ)鏡像為Node.js 14的Alpine Linux版本,這是一個(gè)輕量級(jí)的Linux發(fā)行版
- COPY index.js /index.js:將本地的index.js文件復(fù)制到容器內(nèi)的根目錄
- CMD node /index.js:設(shè)置容器啟動(dòng)時(shí)默認(rèn)執(zhí)行的命令
3. 構(gòu)建Docker鏡像
有了Dockerfile,我們就可以創(chuàng)建自定義的Docker鏡像了。
3.1. 構(gòu)建命令
docker build -t hello-docker .
這個(gè)命令的含義是:
docker build:?jiǎn)?dòng)鏡像構(gòu)建過(guò)程-t hello-docker:為鏡像打上標(biāo)簽(名稱(chēng)),便于后續(xù)引用.:使用當(dāng)前目錄作為構(gòu)建上下文,Docker會(huì)查找當(dāng)前目錄下的Dockerfile
3.2. 構(gòu)建日志
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. 構(gòu)建過(guò)程解析
- Docker首先下載基礎(chǔ)鏡像
node:14-alpine(如果本地不存在) - 然后執(zhí)行COPY指令,將index.js文件復(fù)制到鏡像中
- 最后設(shè)置默認(rèn)的啟動(dòng)命令
- 構(gòu)建完成后,生成了一個(gè)ID為
be987f771365的新鏡像
這里Docker給出了一個(gè)有用的警告:建議使用JSON格式的CMD指令來(lái)避免信號(hào)處理問(wèn)題。雖然不影響當(dāng)前使用,但在生產(chǎn)環(huán)境中需要注意這一點(diǎn)。
4. 查看本地鏡像
構(gòu)建完成后,我們可以查看本地已有的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,相比基礎(chǔ)鏡像已經(jīng)很小了。同時(shí)可以看到系統(tǒng)中還有其他鏡像,比如經(jīng)典的hello-world測(cè)試鏡像。
5. 運(yùn)行容器
鏡像只是靜態(tài)的模板,要運(yùn)行應(yīng)用需要從鏡像創(chuàng)建容器:
docker run hello-docker
日志輸出:
PS E:\hello-world\hello-docker> docker run hello-docker 你好,世界!

執(zhí)行后,終端立即輸出了"你好,世界!"。這意味著:
- Docker從
hello-docker鏡像創(chuàng)建了一個(gè)新容器 - 容器內(nèi)執(zhí)行了
node /index.js命令 - Node.js解釋器執(zhí)行了我們的代碼,輸出結(jié)果到終端
- 程序執(zhí)行完畢,容器自動(dòng)停止
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

運(yùn)行docker ps查看當(dāng)前正在運(yùn)行的容器,發(fā)現(xiàn)沒(méi)有結(jié)果。這是因?yàn)槲覀兊膽?yīng)用執(zhí)行完就退出了,容器也隨之停止。
但使用docker ps -a查看所有容器(包括已停止的),可以看到剛剛運(yùn)行的容器:
- 狀態(tài)為"Exited (0)",表示正常退出
- 54秒前創(chuàng)建,52秒前退出
- 有一個(gè)隨機(jī)生成的名字"affectionate_burnell"
這就是容器與虛擬機(jī)的關(guān)鍵區(qū)別之一:容器是為了運(yùn)行特定進(jìn)程而存在的,當(dāng)進(jìn)程結(jié)束,容器的使命也就完成了。
7. 實(shí)踐總結(jié)
通過(guò)這個(gè)簡(jiǎn)單的實(shí)踐,我們完成了Docker的核心工作流:
- 編寫(xiě)應(yīng)用代碼 → 2. 定義Dockerfile → 3. 構(gòu)建鏡像 → 4. 運(yùn)行容器
在這個(gè)過(guò)程中,我們學(xué)到了幾個(gè)關(guān)鍵點(diǎn):
- 鏡像與容器的關(guān)系:鏡像是靜態(tài)的模板,容器是鏡像的運(yùn)行實(shí)例
- 分層構(gòu)建:Docker鏡像采用分層結(jié)構(gòu),每一條指令都會(huì)創(chuàng)建一個(gè)新的層
- 輕量級(jí)特性:容器隨內(nèi)部進(jìn)程的結(jié)束而停止,資源占用更高效
- 環(huán)境一致性:無(wú)論在哪里運(yùn)行,容器內(nèi)部環(huán)境都完全相同
到此這篇關(guān)于Docker容器化Node.js應(yīng)用教程的文章就介紹到這了,更多相關(guān)docker容器化node.js內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
docker中run命令30個(gè)常用參數(shù)詳解和示例
這篇文章主要給大家介紹了關(guān)于docker中run命令30個(gè)常用參數(shù)的相關(guān)資料,docker?run命令是Docker中最常用的命令之一,用于創(chuàng)建并啟動(dòng)一個(gè)新的容器實(shí)例,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01
docker容器時(shí)區(qū)錯(cuò)誤問(wèn)題
常出現(xiàn)docker中運(yùn)行的容器獲取到的時(shí)間與北京時(shí)間相差8小時(shí)的問(wèn)題,其實(shí)是因?yàn)槿萜鬟\(yùn)行的時(shí)區(qū)不正確。本文主要介紹了docker容器時(shí)區(qū)錯(cuò)誤問(wèn)題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
優(yōu)化Docker鏡像安全性的12個(gè)技巧總結(jié)
docker是虛擬化容器技術(shù),有三個(gè)主要概念,鏡像(類(lèi))、容器(對(duì)象)、倉(cāng)庫(kù),docker就是類(lèi)似VM虛擬機(jī)一樣的虛擬技術(shù),體積小,運(yùn)行速度快,下面這篇文章主要給大家介紹了關(guān)于優(yōu)化Docker鏡像安全性的12個(gè)技巧,需要的朋友可以參考下2022-03-03
Docker容器網(wǎng)絡(luò)基礎(chǔ)概述
這篇文章主要介紹了Docker容器網(wǎng)絡(luò)基礎(chǔ)概述,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
遠(yuǎn)程連接Docker上的Mysql失敗的分析與解決方案
這篇文章主要介紹了遠(yuǎn)程連接Docker上的Mysql失敗的分析與解決方案的相關(guān)資料,需要的朋友可以參考下2023-01-01
Docker輕松自建RustDesk服務(wù)器的實(shí)現(xiàn)步驟
本文介紹通過(guò)Docker和自動(dòng)化腳本在Linux服務(wù)器部署RustDesk的hbbs和hbbr組件,實(shí)現(xiàn)自建私有服務(wù)器以提升隱私、安全與靈活性,并提供客戶端配置及注意事項(xiàng),感興趣的可以了解一下2025-09-09
docker compose up 命令默認(rèn)配置文件自動(dòng)查找規(guī)則詳解
DockerCompose在沒(méi)有指定配置文件時(shí),會(huì)按照優(yōu)先級(jí)順序查找compose.yaml、compose.ymldocker-compose.yml等文件,官方推薦使用compose.yaml,本文給大家介紹docker compose up 命令默認(rèn)配置文件自動(dòng)查找規(guī)則詳解,感興趣的朋友跟隨小編一起看看吧2026-01-01

