DockerFile示例展示:
FROM adoptopenjdk/openjdk7:latest //獲取base image
RUN mkdir /opt/app //類似於執行 linux指令
COPY demo-docker.jar /opt/app/ //類似於linux copy指令
EXPOSE 8080 //對外端口
CMD ["java", "-jar", "/opt/apps/demo-docker.jar"] //執行命令 java -jar /opt/apps/demo-docker.jar
FROM
一般是Dockfile開頭的語法,他的作用是指定我們所新創建的container的base image
FROM scratch //表示我們從頭去創建container不依賴於base image
FROM adoptopenjdk/openjdk8:latest //表示從某個base image基礎上創建container
LABEL
給創建的鏡像添加標籤,比如作者信息,版本信息,描述信息等
LABEL maintainer = "作者姓名"
LABEL version = "版本信息"
LABEL description = "描述"
RUN
相當於執行命令,比如我們需要在鏡像中安裝一些軟件,那麼就需要使用RUN語法,但需要注意的是,由於每條RUN操作會在docker之中新建一個鏡像,所以我們儘量將一些命令合併成一條,在這裏我們可以使用反斜槓換行,使其閱讀美觀
RUN yum -y update && \
yum install -y net-tools ntpdate && \
mkdir -p /opt/nginx/{html,conf}
WORKDIR
類似於linux中的 cd 命令,在對目錄進行操作時,需要注意
- 儘量使用WORKDIR 不要使用 RUN cd
- 儘量使用絕對路徑
WORKDIR /opt/software //如果沒有會自動創建/opt/software目錄
WORKDIR apps //同上
RUN pwd //輸出內容是/opt/software/apps
ADD 和 COPY
ADD | COPY | |
---|---|---|
相同功能 | 將某文件複製到固定目錄下 | 將某文件複製到固定目錄下 |
不通功能 | 可以將tar文件解壓提取到固定目錄下 | 單純複製文件 |
示例 |
ADD demo /opt ADD demo.tar.gz /opt |
COPY demo /opt |
如果想添加遠程文件、目錄,可使用 RUN + curl/wget
ENV
爲當前容器設置環境變量時,可以使用ENV設置一個常量,如想安裝一個5.7的MYSQL時我們可以這樣做
ENV MYSQL_VERSION 5.7 //設置常量 MYSQL_VERSION值是5.7
RUN yum install -y mysql-server = "${MYSQL_VERSION}" //引用常量
CMD 和 ENTRYPOINT
dockerfile有兩種書寫格式,cmd和entrypoint在這兩種書寫格式中輸出的結果不通
- 第一種shell格式:
RUN yum install -y ntpdate
CMD echo "hello world"
ENTRYPOINT echo "hello world"
FROM centos7
ENV name hello-world
ENTRYPOINT echo "${name}" //輸出是hello-world
- 第二種exec格式:
RUN ["yum","install","-y","ntpdate"]
CMD ["/bin/echo","hello-world"]
ENTRYPOINT ["/bin/echo","hello-world"]
FROM centos7
ENV name hello-world
ENTRYPOINT ["bin/echo","${name}"] //輸出是${name}
兩種不同輸出的原因是因爲第一種Dockerfile是shell格式執行命令,默認就在linux的shell裏執行。第二種Dockerfile我們去執行的是 echo這個命令而不是在linux的shell下執行命令,因此輸出不一樣。
1)CMD
容器啓動時默認執行的命令,如果docker run指定了其他命令,CMD命令被忽略,例如:
FROM centos7
CMD echo "hello-world"
docker run [image] 輸出就是 hello-world
docker run [image] /bin/bash 默認進入了當前container
注:如果定義了多個CMD,只有最後一個CMD會被執行
2)ENTRYPOINT
讓容器以應用程序或者服務的形式運行
不會被忽略,一定會執行
最佳實踐是寫一個shell 腳本作爲 ENTRYPOINT
EXPOSE
功能爲暴漏容器運行時的監聽端口給外部
但是EXPOSE並不會使容器訪問主機的端口
如果想使容器與主機的端口有映射關係,必須在容器啓動的時候加上 -P 參數
VOLUME
可實現掛載功能,容器告訴Docker在主機上創建一個目錄(默認情況下是在/var/lib/docker),然後將其掛載到指定的路徑。
當刪除使用該Volume的容器時,Volume中的內容本身不會受到影響,它可以一直存在下去
FROM centos7 //將該鏡像的存儲內容掛載到宿主機data文件夾下,這樣即使刪除了該鏡像,再重新創建後,也不會影響數據
VOLUME /data
CMD echo "hello-world"
Dockerfile更多語法請參考docker doc文檔