Dockerfile基本結構
Dockerfile是一個編寫docker鏡像的腳本文件,其中包含了若干條描述構建鏡像的細節(jié)的docker指令,使用Dockerfile可以允許用戶創(chuàng)建自定義的docker鏡像.
Dockerfile由一行行的命令語句組成,并且支持以#開頭的的注釋行,一般由以下四部分組成:
1.基礎鏡像
使用FROM指令來設置基礎鏡像,FROM指令有固定的格式為FROM <鏡像名>:<標簽名>,若鏡像為latest版本則tag可以省略,否則必須指定版本號,如FROM java:8
2.維護者信息
格式為MAINTAINER<name>,指定維護者信息.
3.鏡像操作指令
- ADD
格式為ADD <src><dest>,該命令將復制宿主機的路徑下的文件到容器的目標路徑下,宿主機的路徑可以為相對路徑,容器的目標路徑必須為絕對路徑.使用ADD指令將自動解壓來源路徑中的壓縮包. - COPY
格式為COPY <src><dest>,與ADD功能類似,COPY指令沒有自動解壓的功能. - USER
用于設置運行RUN指令的用戶,格式為USER 用戶名. - RUN
執(zhí)行命令的指令,格式為RUN <command> 或者RUN ["executable", "param1", "param2"].
前者將在 shell 終端中運行命令,即 /bin/sh -c; 后者則使用exec執(zhí)行.指定使用其它終端可以通過第二種方式實現,例如RUN ["/bin/bash", "-c", "echo hello"].每條RUN指令將在當前鏡像基礎上執(zhí)行指定命令,并提交為新的鏡像.當命令較長時可以使用\來換行. - ENV
用于設置環(huán)境變量,格式為ENV <key><value> - EXPOSE
聲明運行時容器暴露的端口,格式為EXPOSE <port>. - WORKDIR
設置進入容器時的工作目錄,格式為WORKDIR /path/to/workdir - VOLUME
指定可被掛載的數據卷,用于目錄映射.格式為VOLUME /path/data. - ONBUILD
設置構建時需自動執(zhí)行的指令.
4.容器啟動時執(zhí)行指令
CMD
支持三種格式
CMD ["executable","param1","param2"]使用exec執(zhí)行,推薦方式.
CMD command param1 param2在/bin/sh中執(zhí)行,提供給需要交互的應用.
CMD ["param1","param2"]提供給ENTRYPOINT的默認參數.
指定啟動容器時執(zhí)行的命令,每個Dockerfile只能有一條CMD命令.如果指定了多條命令,只有最后一條會被執(zhí)行.
如果用戶啟動容器時候指定了運行的命令,則會覆蓋掉CMD指定的命令.ENTRYPOINT
兩種格式
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2(shell中執(zhí)行).
配置容器啟動后執(zhí)行的命令,并且不可被docker run提供的參數覆蓋.
每個 Dockerfile中只能有一個ENTRYPOINT,當指定多個時,只有最后一個起效.
使用Dockerfile構建鏡像
前面已經了解了Dockerfile的基本結構了,下面基于Dockerfile我們來構建一個java鏡像.
先在宿主機上創(chuàng)建個目錄存放要構建的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 #設置基礎鏡像centos
MAINTAINER "william.zhang"<952408421@qq.com> #設置維護者信息
ADD jdk-8u181-linux-x64.tar.gz /opt#復制文件到容器的opt目錄下并自動解壓
RUN ln -s /opt/jdk1.8.0_181 /opt/jdk#執(zhí)行指令建立符號鏈接用于快速訪問jdk目錄
#設置JDK環(huán)境變量
ENV JAVA_HOME /opt/jdk
ENV PATH $JAVA_HOME/bin:$PATH
#設置容器啟動時輸出JDK版本
CMD java -version
然后使用docker build命令來讀取Dockerfile文件,并構建鏡像.
我們使用了-t選項來制定鏡像的名稱,并讀取當前目錄中的Dockerfile文件.
接著使用docker images可以查看已構建好的所有鏡像了.
[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來修改鏡像的倉庫名與標簽名:
docker tag d23bdf5b1b1b java:8