場景
- 在實際業務場景中,需要制作多個不同版本進行鏡像使用,如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
- 基于進行可以根據要求選擇,如果還有其他指令執行或者需要加入某些環境變量配置,可以參考後面的指令解析
建構鏡像
- 執行指令
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL0EjY4QTZ3IWOilTOjFGM4QWY2QjZxMzYkNjN1kzM1Q2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
推送遠端
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 .
一圖彙總
其他資訊
源碼編譯制作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"]