如何使用?Dockerfile?創(chuàng)建一個(gè)簡單容器
Dockerfile
Dockerfile 是用于指導(dǎo) docker 創(chuàng)建自定義 image 的一系列指令,是用于創(chuàng)建 image 的藍(lán)圖。
現(xiàn)在有一個(gè)簡單的 node 項(xiàng)目( 其中Dockerfile 是后面加的,初始項(xiàng)目沒有此文件):
要運(yùn)行此代碼,一般的做法是,先在本機(jī)安裝 node,然后在項(xiàng)目文件夾中先后運(yùn)行:
npm install
以及:
node server.js,
然后在瀏覽器 localhost 地址就可以看到app運(yùn)行界面。
寫一個(gè) Dockerfile
如果要改為在 container
中運(yùn)行此程序,那么首先需要有此 node app
的image
,要?jiǎng)?chuàng)建 image, 則需要寫一個(gè)Dockerfile:
# 將在 node image 基礎(chǔ)上創(chuàng)建此自定義的 image FROM node # Docker container 工作目錄 # 此指令告訴 Docker,余下的指令將在容器內(nèi)的 /app 文件夾內(nèi)執(zhí)行。 WORKDIR /app # 將當(dāng)前項(xiàng)目文件夾內(nèi)的所有文件及子文件全部copy 到 /app 文件夾中 # 因?yàn)橛猩弦粭l指令,這里改為 ?COPY . . 也可以 COPY . /app # 安裝 package.json 中的package,生成 node_modules 文件夾 RUN npm install # 容器內(nèi)的進(jìn)程將發(fā)布端口 80 # 可選,這條指令什么也不做,只起文檔作用,best practice EXPOSE 80 # 當(dāng)基于此 image 的容器啟動(dòng)后,命令 ?node server.js 將會(huì)執(zhí)行 CMD ["node", "server.js"]
上述Dockerfile總共6條指令,起作用的只有5條。
然后在終端執(zhí)行命令,此命令將生成此 node app 的 image:
docker build . ? ?
. 號(hào)是Dockerfile 文件所在的路徑,這里剛好是當(dāng)前路徑。
docker
容器是與外界獨(dú)立的進(jìn)程,具有自己的內(nèi)部網(wǎng)絡(luò),當(dāng)容器內(nèi)的 node 應(yīng)用程序在容器的端口 80 監(jiān)聽時(shí),容器不會(huì)將該端口發(fā)布到我們的本地機(jī)器。此外 Dockerfile 里的端口不起作用,因此必須在命令中使用 --publish 或者 -p 實(shí)現(xiàn)本機(jī)端口和運(yùn)行的容器端口的映射。
運(yùn)行基于此image的容器:
docker run --publish 3000:80 previously_generated_image_id
打開瀏覽器 localhost:3000
就可以查看運(yùn)行界面。
優(yōu)化 Dockerfile
image
只讀,如果修改了 source code,需要重新 build 一遍,其中的 npm install 特別費(fèi)時(shí)間,但此指令通常是不需要執(zhí)行的,因?yàn)樾略龅谌桨目赡苄赃h(yuǎn)低于修改代碼的可能性。
每次build image
時(shí),Docker 都會(huì)緩存每條指令執(zhí)行的結(jié)果。所以當(dāng)重新 build image 時(shí),如果不需要再次運(yùn)行指令,它將使用這些緩存的結(jié)果。 這被稱為基于層的架構(gòu)。
每條指令都代表 Dockerfile 中的一個(gè)層, image 是根據(jù)這些不同的指令簡單地從多個(gè)層構(gòu)建的。
將 RUN npm install 指令提前將能優(yōu)化image 的構(gòu)建:
FROM node WORKDIR /app COPY package.json /app? # 將此指令提前,通常都能利用前一次build 的結(jié)果, # 因此能極大節(jié)省重新 build image 所需要的時(shí)間。 RUN npm install COPY . /app # optional # 這條指令什么也不做,只起文檔作用,best practice EXPOSE 80 CMD ["node", "server.js"]
container shell
使用 -it 能獲得容器的 shell, i: interactive, t: tty :
docker run -it 46613ce05eae bash
然后就可以查看安裝到容器內(nèi)的 node 版本,以及 /app 內(nèi)的文件等等,使用 exit 命令退出。
root@ca432bda02aa:/app# node -v v18.0.0 ?? root@ca432bda02aa:/app# ls ? Dockerfile ?node_modules ?package-lock.json ?package.json ?public ?server.js root@ca432bda02aa:/app#
到此這篇關(guān)于如何使用 Dockerfile 創(chuàng)建一個(gè)簡單容器的文章就介紹到這了,更多相關(guān) Dockerfile 創(chuàng)建容器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
docker容器數(shù)據(jù)卷之具名掛載和匿名掛載問題
容器數(shù)據(jù)卷就是目錄的掛載,將我們的容器的目錄掛載到宿主機(jī)上,從而實(shí)現(xiàn)打通宿主機(jī)和容器之間的文件共享功能,這篇文章主要介紹了docker容器數(shù)據(jù)卷 - 具名掛載和匿名掛載問題,需要的朋友可以參考下2021-11-11Docker容器實(shí)現(xiàn)SSH遠(yuǎn)程直連
在某些特殊需求下,我們想ssh直接遠(yuǎn)程連接docker 容器,本文主要介紹了Docker容器實(shí)現(xiàn)SSH遠(yuǎn)程直連,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08解決Docker x509 insecure registry的問題
這篇文章主要介紹了解決Docker x509 insecure registry的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-03-03docker windows10 共享目錄掛載失敗的解決方案
這篇文章主要介紹了docker windows10 共享目錄掛載失敗的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-03-03docker-compose up -d和docker-compose up -
本文主要介紹了docker-compose up -d和docker-compose up --build的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07