Docker學(xué)習(xí)之Dockerfile

Dockerfile基本結(jié)構(gòu)

Dockerfile是一個編寫docker鏡像的腳本文件,其中包含了若干條描述構(gòu)建鏡像的細節(jié)的docker指令,使用Dockerfile可以允許用戶創(chuàng)建自定義的docker鏡像.
Dockerfile由一行行的命令語句組成,并且支持以#開頭的的注釋行,一般由以下四部分組成:
1.基礎(chǔ)鏡像
使用FROM指令來設(shè)置基礎(chǔ)鏡像,FROM指令有固定的格式為FROM <鏡像名>:<標(biāo)簽名>,若鏡像為latest版本則tag可以省略,否則必須指定版本號,如FROM java:8
2.維護者信息
格式為MAINTAINER<name>,指定維護者信息.
3.鏡像操作指令

  • ADD
    格式為ADD <src><dest>,該命令將復(fù)制宿主機的路徑下的文件到容器的目標(biāo)路徑下,宿主機的路徑可以為相對路徑,容器的目標(biāo)路徑必須為絕對路徑.使用ADD指令將自動解壓來源路徑中的壓縮包.
  • COPY
    格式為COPY <src><dest>,與ADD功能類似,COPY指令沒有自動解壓的功能.
  • USER
    用于設(shè)置運行RUN指令的用戶,格式為USER 用戶名.
  • RUN
    執(zhí)行命令的指令,格式為RUN <command> 或者RUN ["executable", "param1", "param2"].
    前者將在 shell 終端中運行命令,即 /bin/sh -c; 后者則使用exec執(zhí)行.指定使用其它終端可以通過第二種方式實現(xiàn),例如RUN ["/bin/bash", "-c", "echo hello"].每條RUN指令將在當(dāng)前鏡像基礎(chǔ)上執(zhí)行指定命令,并提交為新的鏡像.當(dāng)命令較長時可以使用\來換行.
  • ENV
    用于設(shè)置環(huán)境變量,格式為ENV <key><value>
  • EXPOSE
    聲明運行時容器暴露的端口,格式為EXPOSE <port>.
  • WORKDIR
    設(shè)置進入容器時的工作目錄,格式為WORKDIR /path/to/workdir
  • VOLUME
    指定可被掛載的數(shù)據(jù)卷,用于目錄映射.格式為VOLUME /path/data.
  • ONBUILD
    設(shè)置構(gòu)建時需自動執(zhí)行的指令.

4.容器啟動時執(zhí)行指令

  • CMD
    支持三種格式
    CMD ["executable","param1","param2"]使用exec執(zhí)行,推薦方式.
    CMD command param1 param2在/bin/sh中執(zhí)行,提供給需要交互的應(yīng)用.
    CMD ["param1","param2"]提供給ENTRYPOINT的默認參數(shù).
    指定啟動容器時執(zhí)行的命令,每個Dockerfile只能有一條CMD命令.如果指定了多條命令,只有最后一條會被執(zhí)行.
    如果用戶啟動容器時候指定了運行的命令,則會覆蓋掉CMD指定的命令.

  • ENTRYPOINT
    兩種格式
    ENTRYPOINT ["executable", "param1", "param2"]
    ENTRYPOINT command param1 param2(shell中執(zhí)行).
    配置容器啟動后執(zhí)行的命令,并且不可被docker run提供的參數(shù)覆蓋.
    每個 Dockerfile中只能有一個ENTRYPOINT,當(dāng)指定多個時,只有最后一個起效.

使用Dockerfile構(gòu)建鏡像

前面已經(jīng)了解了Dockerfile的基本結(jié)構(gòu)了,下面基于Dockerfile我們來構(gòu)建一個java鏡像.
先在宿主機上創(chuàng)建個目錄存放要構(gòu)建的jdk源文件包.

mkdir /usr/local/docker/software
cp jdk-8u181-linux-x64.tar.gz /usr/local/docker/software

創(chuàng)建空白的Dockerfile文本文件,注意Dockerfile要與放到容器中的文件存儲在同一目錄下即/usr/local/docker/software,接下來開始編寫Dockerfile指令:

FROM centos:latest #設(shè)置基礎(chǔ)鏡像centos
MAINTAINER "william.zhang"<952408421@qq.com> #設(shè)置維護者信息
ADD jdk-8u181-linux-x64.tar.gz /opt#復(fù)制文件到容器的opt目錄下并自動解壓
RUN ln -s /opt/jdk1.8.0_181 /opt/jdk#執(zhí)行指令建立符號鏈接用于快速訪問jdk目錄
#設(shè)置JDK環(huán)境變量
ENV JAVA_HOME /opt/jdk
ENV PATH $JAVA_HOME/bin:$PATH
#設(shè)置容器啟動時輸出JDK版本
CMD java -version

然后使用docker build命令來讀取Dockerfile文件,并構(gòu)建鏡像.


image.png

我們使用了-t選項來制定鏡像的名稱,并讀取當(dāng)前目錄中的Dockerfile文件.
接著使用docker images可以查看已構(gòu)建好的所有鏡像了.

[root@bogon software]# docker images
REPOSITORY                            TAG                 IMAGE ID            CREATED             SIZE
192.168.56.101:5000/hello/hello-api   1.0.0               c1cefec5b8a8        23 hours ago        673MB
nginx                                 latest              c82521676580        4 days ago          109MB
registry                              latest              b2b03e9146e1        3 weeks ago         33.3MB
java                                  8                   d23bdf5b1b1b        18 months ago       643MB

最后我們還可以使用docker tag來修改鏡像的倉庫名與標(biāo)簽名:

docker tag d23bdf5b1b1b java:8
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容