Docker 精通系列
- Docker 精通之入門
- Docker 精通之微服務
- Docker 精通之常用命令
- Docker 精通之 Dockerfile
1.基本說明
Dockfile 是一個用于編寫 docker 鏡像生成過程的文件,其有特定的語法。在一個文件夾中,如果有一個名字為 Dockfile 的文件,其內容滿足語法要求,在這個文件夾路徑下執行命令,就可以按照描述構建一個鏡像了。
docker build --tag name:tag .
# name是鏡像的名稱,tag是鏡像的版本或者是標簽號,不寫就是lastest。注意后面有一個空格和點。
dockerfile 簡單文件實例
FROM node:8.4COPY . /app
WORKDIR /app
RUN npm install --registry=https://registry.npm.taobao.org
EXPOSE 3000
CMD node demos/01.js
- FROM node:8.4:該 image 文件繼承官方的 node image,冒號表示標簽,這里標簽是8.4,即8.4版本的 node。
- COPY . /app:將當前目錄下的所有文件(除了.dockerignore排除的路徑),都拷貝進入 image 文件的/app目錄。
- WORKDIR /app:指定接下來的工作路徑為/app。
- RUN npm install:在/app目錄下,運行npm install命令安裝依賴。注意,安裝后所有的依賴,都將打包進入 image 文件。
- EXPOSE 3000:將容器 3000 端口暴露出來, 允許外部連接這個端口。
- CMD node demos/01.js:它表示容器啟動后自動執行node demos/01.js
RUN命令在 image 文件的構建階段執行,執行結果都會打包進入 image 文件;CMD命令則是在容器啟動后執行。另外,一個 Dockerfile 可以包含多個RUN命令,但是只能有一個CMD命令。
注意,指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否則它會覆蓋CMD命令。下面詳細介紹。
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命令使用,容器運行的時候這個變量也會保留。
定義環境變量的同時,可以引用已經定義的環境變量。在ENV指令中,可以直接引用如下環境變量:
- HOME,用戶主目錄
- HOSTNAME,默認容器的主機名
- PATH,
- TERM,默認xterm
ENV PATH /usr/local/bin:$PATH
ENV LANG C.UTF-8
ENV TERM xterm
ENV PYTHON_VERSION 3.5.3
ENV name1=ping name2=on_ip
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.Dockerfile例子
一個使用安裝包安裝的tomcat例子:
FROM centosMAINTAINER nobody?"xx@qq.com"
RUN mkdir -p /opt/jdk/
RUN mkdir -p /opt/tomcat/
ADD jdk1.7.0_79 /opt/jdk/
ADD tomcat? /opt/tomcat/
ENV CATALINA_HOME /opt/tomcat
ENV JAVA_HOME /opt/jdk
EXPOSE?8080
ENV PATH $PATH:$JAVA_HOME/bin
CMD ["/opt/tomcat/bin/catalina.sh","run"]