1. 程式人生 > >Docker (一、dockerfile-node)

Docker (一、dockerfile-node)

bug dock star docke tag 只讀 本機 必須 實用

1.基本說明

  Dockfile是一個用於編寫docker鏡像生成過程的文件,其有特定的語法。在一個文件夾中,如果有一個名字為Dockfile的文件,其內容滿足語法要求,在這個文件夾路徑下執行命令:docker build --tag name:tag .,就可以按照描述構建一個鏡像了。name是鏡像的名稱,tag是鏡像的版本或者是標簽號,不寫就是lastest。註意後面有一個空格和點。

2.Dockfile語法

  Dockerfile的基本指令有十三個,分別是:FROM、MAINTAINER、RUN、CMD、EXPOSE、ENV、ADD、COPY、ENTRYPOINT、VOLUME、USER、WORKDIR、ONBUILD。下面對這些指令的用法一一說明。

2.1 FROM

  用法:FROM <image>

  說明:第一個指令必須是FROM了,其指定一個構建鏡像的基礎源鏡像,如果本地沒有就會從公共庫中拉取,沒有指定鏡像的標簽會使用默認的latest標簽,可以出現多次,如果需要在一個Dockerfile中構建多個鏡像。

2.2 MAINTAINER

  用法:MAINTAINER <name> <email>

  說明:描述鏡像的創建者,名稱和郵箱

2.3 RUN

  用法:RUN "command" "param1" "param2"

  說明:RUN命令是一個常用的命令,執行完成之後會成為一個新的鏡像,這裏也是指鏡像的分層構建。一句RUN就是一層,也相當於一個版本。這就是之前說的緩存的原理。我們知道docker是鏡像層是只讀的,所以你如果第一句安裝了軟件,用完在後面一句刪除是不可能的。所以這種情況要在一句RUN命令中完成,可以通過&符號連接多個RUN語句。RUN後面的必須是雙引號不能是單引號(沒引號貌似也不要緊),command是不會調用shell的,所以也不會繼承相應變量,要查看輸入RUN "sh" "-c" "echo" "$HOME",而不是RUN "echo" "$HOME"。

2.4 CMD

  用法:CMD command param1 param2

  說明:CMD在Dockerfile中只能出現一次,有多個,只有最後一個會有效。其作用是在啟動容器的時候提供一個默認的命令項。如果用戶執行docker run的時候提供了命令項,就會覆蓋掉這個命令。沒提供就會使用構建時的命令。

2.5 EXPOSE

  用法:EXPOSE <port> [<port>...]

  說明:告訴Docker服務器容器對外映射的容器端口號,在docker run -p的時候生效。

2.6 ENV

  用法:EVN <key> <value> 只能設置一個

     EVN <key>=<value>允許一次設置多個

  說明:設置容器的環境變量,可以讓其後面的RUN命令使用,容器運行的時候這個變量也會保留。

2.7 ADD

  用法:ADD <src> <dest>

  說明:復制本機文件或目錄或遠程文件,添加到指定的容器目錄,支持GO的正則模糊匹配。路徑是絕對路徑,不存在會自動創建。如果源是一個目錄,只會復制目錄下的內容,目錄本身不會復制。ADD命令會將復制的壓縮文件夾自動解壓,這也是與COPY命令最大的不同。

2.8 COPY

  用法:COPY <src> <dest>

  說明:COPY除了不能自動解壓,也不能復制網絡文件。其它功能和ADD相同。

2.9 ENTRYPOINT

  用法:ENTRYPOINT "command" "param1" "param2"

  說明:這個命令和CMD命令一樣,唯一的區別是不能被docker run命令的執行命令覆蓋,如果要覆蓋需要帶上選項--entrypoint,如果有多個選項,只有最後一個會生效。

2.10 VOLUME

  用法:VOLUME ["path"]

  說明:在主機上創建一個掛載,掛載到容器的指定路徑。docker run -v命令也能完成這個操作,而且更強大。這個命令不能指定主機的需要掛載到容器的文件夾路徑。但docker run -v可以,而且其還可以掛載數據容器。

2.11 USER

  用法:USER daemon

  說明:指定運行容器時的用戶名或UID,後續的RUN、CMD、ENTRYPOINT也會使用指定的用戶運行命令。

2.12 WORKDIR

  用法:WORKDIR path

  說明:為RUN、CMD、ENTRYPOINT指令配置工作目錄。可以使用多個WORKDIR指令,後續參數如果是相對路徑,則會基於之前的命令指定的路徑。如:WORKDIR /home  WORKDIR test 。最終的路徑就是/home/test。path路徑也可以是環境變量,比如有環境變量HOME=/home,WORKDIR $HOME/test也就是/home/test。

2.13 ONBUILD

  用法:ONBUILD [INSTRUCTION]

  說明:配置當前所創建的鏡像作為其它新創建鏡像的基礎鏡像時,所執行的操作指令。意思就是,這個鏡像創建後,如果其它鏡像以這個鏡像為基礎,會先執行這個鏡像的ONBUILD命令。

3、實用例子

安裝nodejs

首先編寫nodejs 的dockerfile

#基礎鏡像,這裏選擇的這個node 是因為build之後占用空間沒有那麽大
FROM node:9.2.1-alpine
# 指定制作我們的鏡像的聯系人信息(鏡像創建者)
MAINTAINER xiaojiu

# 將根目錄下的文件都copy到container(運行此鏡像的容器)文件系統的app文件夾下
# cd到app文件夾下
WORKDIR /app
#復制package文件到工作目錄
COPY package*.json ./
# 安裝項目依賴包
RUN npm install
#復制項目到工作目錄中
COPY . .  
         
# 容器對外暴露的端口號
EXPOSE 8889
# 容器啟動時執行的命令,類似npm run start
CMD npm start 

忽略文件 .dockerignore 跟你的dockerfile 在同一目錄

node_modules
npm-debug.log

構建鏡像

docker build -t node:1.0 .

利用該鏡像啟動容器

docker run -p 80:80 node:1.0 -d

官方文檔 https://nodejs.org/en/docs/guides/nodejs-docker-webapp/

Docker (一、dockerfile-node)