iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 3
0
自我挑戰組

自我學習Docker的30天奇幻旅程系列 第 3

Day3 開始體驗Docker吧(二)

昨天成功建立了第一個container image,今天就來接續著建立出來的教學文件實作吧。

建立自己的image

首先先下載位於教學文件Our Application頁上的todo-list範例。

Dockerfile

接下來就是要撰寫運行Docker的靈魂人物 ── Dockerfile
依照官方提供的寫法如下

FROM node:12-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
  • FROM 表示執行的環境,還可以設定ubuntu等。
  • WORKDIR 為image設置的工作目錄。
  • COPY
    格式: COPY <host路徑> <目標路徑>
    表示從host複製檔案至container的系統下。
  • RUN 會在當前image的頂端的new layer執行,再來才會創建image,通常用來安裝套件,如上則是代表要使用yarn下載package.json對映的套件。
  • CMD CMD的主要目的是為執行中的container提供默認指令。在dockerfile中只會生效最後一個CMD指令。如上則是代表要使用node.js執行src/index.js。

建置並運行

如果只是要建置APP玩玩,基本上撰寫完dockerfile就完成大部分拉。
接下來便可以執行以下兩個命令建置container image並執行

docker build -t getting-started .
docker run -dp 3000:3000 getting-started

-t 代表為建立的image命名getting-started的tag,如果不使用就會自動產生隨機值。

在指令跑完之後就能打開http://localhost:3000 查看建立的APP拉。

更新image

接下來可能會想問說,如果修改後的程式該怎麼更新至image呢?
是直接執行建置跟運行的指令就可以了嗎? 馬上來試試看吧
執行之後卻發現印出了錯誤!是怎麼回事呢?

docker.exe: Error response from daemon: driver r failed programming external connectivity on endpoint gracious_johnson (db545d677ed4b1e336a876ae9c905833bbb4b201cfa09a70314d4e3c66d9396435): Bind for 0.0.0.0:3000 failed: port is aly ready allocated.

總之呢就是,因為要運行的位置已經有image了所以無法運行。
Docker不會幫你刪掉舊有的image (Docker: 自己去刪拉

停止/刪除image

因此我們馬上來學習如何停止並刪除現有的image。
要停止/刪除現有得image需要先執行以下命令,用來查看image的container-id。

docker ps --all

--all 代表會列出所有啟用及停用的image

沒意外的話會類似於下方顯示的結果,找到剛剛建置得getting-start的container-id

再來就是停止並移除image

docker stop <container-id>
docker rm <container-id>

移除完image之後再執行

docker run -dp 3000:3000 getting-started

修改過的程式就運行在contrainer上了。

明天接著學習如何將image使用的數據永久的保存,使用Container Volumes並搭配Bind Mounts。


上一篇
Day2 開始體驗Docker吧(一)
下一篇
Day4 了解Volumes及Bind Mounts
系列文
自我學習Docker的30天奇幻旅程24

尚未有邦友留言

立即登入留言