天天看點

【雲原生-Docker】docker鏡像制作、上傳、dockerfile指令解析

場景

  • 在實際業務場景中,需要制作多個不同版本進行鏡像使用,如maven版本、JDK、openJDK不同使用等,是以需要做多個針對不同版本做不同的鏡像。
  • 這裡記錄一下之前devops用的openJDK版本、某些部門需要用orcle JDK、特此需要做不同的鏡像,鏡像内包含centos、maven、jdk。

鏡像制作

基礎鏡像

  • 基礎鏡像拉去,如centos、alpine等
  • docker pull centos:7

jdk、maven

  • 拉取centos基礎鏡像,把jdk、maven鏡像制作進基礎鏡像中,在使用centos:7作為基礎鏡像,配置jdk版本及maven版本,當拉取鏡像時可以直接使用,在devops使用過程中,可以直接run進行啟動使用。
  • dockerfile
FROM centos:7
MAINTAINER [email protected].net

WORKDIR /usr/bin/jdk
WORKDIR /usr/bin/mvn
COPY apache-maven-3.8.6 /usr/bin/mvn
COPY jdk1.8.0_202 /usr/bin/jdk

ENV token punctuation">.UTF-8
ENV JAVA_HOME=/usr/bin/jdk
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV MAVEN_HOME=/usr/bin/mvn
ENV PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH
           
  • 然後下載下傳maven、JDK版本在Dockerfile同級目錄下,并配置Maven配置檔案資訊,如拉取倉庫位址等
  • 在同級目錄存在檔案夾 apache-maven-3.8.6、jdk1.8.0_202
  • 基于進行可以根據要求選擇,如果還有其他指令執行或者需要加入某些環境變量配置,可以參考後面的指令解析

建構鏡像

  • 執行指令
【雲原生-Docker】docker鏡像制作、上傳、dockerfile指令解析

推送遠端

docker push 鏡像位址:版本
           

指令解析

  • 官方參考
  • https://docs.docker.com/engine/reference/builder/

FROM

  • 指定基礎鏡像,必須為第一個指令
格式:
  FROM <image>
  FROM <image>:<tag>
  FROM <image>@<digest>
示例:  
	FROM centos:7
注:
   tag或digest是可選的,如果不使用這兩個值時,會使用latest版本的基礎鏡像
           

RUN

  • 建構鏡像時執行的指令
RUN用于在建構鏡像時執行指令,其有以下兩種指令執行方式:
shell執行
格式:
    RUN <command>
exec執行
格式:
    RUN ["executable", "param1", "param2"]
示例:
    RUN apk update
    RUN ["/etc/execfile", "arg1", "arg1"]
注:RUN指令建立的中間鏡像會被緩存,并會在下次建構中使用。如果不想使用這些緩存鏡像,
可以在建構時指定--no-cache參數,如:docker build --no-cache
           

ADD

  • 将本地檔案添加到容器中,tar類型檔案會自動解壓(網絡壓縮資源不會被解壓),可以通路網絡資源,類似wget
格式:
    ADD <src>... <dest>
    ADD ["<src>",... "<dest>"] 用于支援包含空格的路徑
示例:
    ADD hom* /mydir/          # 添加所有以"hom"開頭的檔案
    ADD hom?.txt /mydir/      # ? 替代一個單字元,例如:"home.txt"
    ADD test relativeDir/     # 添加 "test" 到 `WORKDIR`/relativeDir/
    ADD test /absoluteDir/    # 添加 "test" 到 /absoluteDir/
           

COPY

  • 類似ADD,但是是不會自動解壓檔案,也不能通路網絡資源

CMD

  • 建構鏡像後調用,也就是在容器啟動時才進行調用。
格式:
    CMD ["executable","param1","param2"] (執行可執行檔案,優先)
    CMD ["param1","param2"] (設定了ENTRYPOINT,則直接調用ENTRYPOINT添加參數)
    CMD command param1 param2 (執行shell内部指令)
示例:
    CMD echo "This is a test." | wc -l
    CMD ["/usr/bin/wc","--help"]

注:CMD不同于RUN,CMD用于指定在容器啟動時所要執行的指令,而RUN用于指定鏡像建構時所要執行的指令。
           

ENTRYPOINT

  • 配置容器,使其可執行化。
格式:
    ENTRYPOINT ["executable", "param1", "param2"] (可執行檔案, 優先)
    ENTRYPOINT command param1 param2 (shell内部指令)
示例:
    FROM centos:7
    ENTRYPOINT ["ls", "/usr/local"]
    CMD ["/usr/local/tomcat"]
  之後,docker run 傳遞的參數,都會先覆寫cmd,然後由cmd 傳遞給entrypoint ,做到靈活應用

注:
 ENTRYPOINT與CMD非常類似,不同的是通過docker run執行的指令不會覆寫ENTRYPOINT,
 而docker run指令中指定的任何參數,都會被當做參數再次傳遞給CMD。
 Dockerfile中隻允許有一個ENTRYPOINT指令,多指定時會覆寫前面的設定,
 而隻執行最後的ENTRYPOINT指令。
 通常情況下,	ENTRYPOINT 與CMD一起使用,ENTRYPOINT 寫預設指令,當需要參數時候 使用CMD傳參
           

LABEL

  • 用于為鏡像添加中繼資料
格式:
    LABEL <key>=<value> <key>=<value> <key>=<value> ...
示例:
  LABEL version="1.0" description="ssd硬碟" by="rundreamsFly"
注:
  使用LABEL指定中繼資料時,一條LABEL指定可以指定一或多條中繼資料,指定多條中繼資料時不同中繼資料
  之間通過空格分隔。推薦将所有的中繼資料通過一條LABEL指令指定,以免生成過多的中間鏡像。
           

ENV

  • 設定環境變量
格式:
    ENV <key> <value>  #<key>之後的所有内容均會被視為其<value>的組成部分,是以,一次隻能設定一個變量
    ENV <key>=<value> ...  #可以設定多個變量,每個變量為一個"<key>=<value>"的鍵值對,
    如果<key>中包含空格,可以使用\來進行轉義,也可以通過""來進行标示;另外,反斜線也可以用于續行
示例:
    ENV myName Iversion
    ENV myCat=demos
           

EXPOSE

  • 指定于外界互動的端口
格式:
    EXPOSE <port> [<port>...]
示例:
    EXPOSE 80 443
    EXPOSE 8080    
    EXPOSE 11211/tcp 11214/udp
注:  
EXPOSE并不會讓容器的端口通路到主機。要使其可通路,
需要在docker run運作容器時通過-p來釋出這些端口,或通過-P參數來釋出EXPOSE導出的所有端口

如果沒有暴露端口,後期也可以通過-p 8080:80方式映射端口,但是不能通過-P形式映射
           

VOLUME

  • 指定持久化目錄(指定此目錄可以被挂載出去)
格式:
    VOLUME ["/path/to/to"]
示例:
    VOLUME ["/data"]
    VOLUME ["/var/www", "/var/log/apache2", "/etc/apache/user"
注:一個卷可以存在于一個或多個容器的指定目錄,該目錄可以繞過聯合檔案系統,并具有以下功能:
	卷可以容器間共享和重用
	容器并不一定要和其它容器共享卷
	修改卷後會立即生效
	對卷的修改不會對鏡像産生影響
	卷會一直存在,直到沒有任何容器在使用它
           

WORKDIR

  • 工作目錄,類似于cd指令
格式:
    WORKDIR /path/to/workdir
示例:
    WORKDIR /a  (這時工作目錄為/a)
    WORKDIR b  (這時工作目錄為/a/b)
    WORKDIR c  (這時工作目錄為/a/b/c)
注: 
  通過WORKDIR設定工作目錄後,Dockerfile中其後的指令RUN、CMD、ENTRYPOINT、ADD、COPY
  等指令都會在該目錄下執行。在使用docker run運作容器時,可以通過-w參數覆寫建構時所設定的工作目錄。
           

ARG

  • 相當于建構鏡像時可以在外部為裡面傳參
格式:
    ARG <name>[=<default value>]
示例:
    ARG site
    ARG build_user=www
           
From centos:7
ARG parameter
VOLUME /usr/share/nginx
RUN yum -y install $parameter
EXPOSE 80 443
CMD nginx -g "daemon off;"

# 可以這如下這樣靈活傳參
docker build --build-arg=parameter=net-tools -t nginx:1.14 . 
           

一圖彙總

【雲原生-Docker】docker鏡像制作、上傳、dockerfile指令解析

其他資訊

源碼編譯制作nginx鏡像

# This my first nginx Dockerfile
# Version 1.0

# Base images 基礎鏡像
FROM centos

#MAINTAINER 維護者資訊
MAINTAINER bertwu 

#ENV 設定環境變量
ENV PATH /usr/local/nginx/sbin:$PATH

#ADD  檔案放在目前目錄下,拷過去會自動解壓
ADD nginx-1.8.0.tar.gz /usr/local/  
ADD epel-release-latest-7.noarch.rpm /usr/local/  

#RUN 執行以下指令 
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www

#WORKDIR 相當于cd
WORKDIR /usr/local/nginx-1.8.0 

RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install

RUN echo "daemon off;" >> /etc/nginx.conf

#EXPOSE 映射端口
EXPOSE 80

#CMD 運作以下指令
CMD ["nginx"]