dockerfile:創建鏡像的方式,船艦自定義的鏡像
包括配置文件,掛載點,對外暴露的端口,設置環境變量
docker創建鏡像的方式
1、基于已有鏡像進行創建。
根據官方提供的鏡像源,創建鏡像,然后拉起容器,只能提供基礎的功能,擴展性的功能還是需要自定義(進入容器進入操作)
2、基于模板進行創建
3、dockerfile
聯合文件系統(UnionFS),docker鏡像的基礎
鏡像通過分層進行繼承,特性:一次同時可以加載多個文件系統,但是從外面來看,就是一個文件系統。
docker鏡像實際上就是由一層一層的文件系統組成,這種層級的文件系統就是UnionFS
每一層都是layers,每一層都包含文件系統的一部分,這些層次疊加在一起,最終形成的就是rootfs
bootfs:宿主機提供的內核和引導程序
rootfs:即使容器的操作系統,載dockerfile中,我們可以自己指定
rootfs是多個基礎鏡像和應用鏡像結合起來的只讀層,鏡像實際上就是一個只讀文件
容器基于鏡像實例,運行起來之后,容器變成可讀可寫層
在dockerfile當中每創建一個指定都是一個鏡像層
鏡像層會被緩存和復層
一旦有一層鏡像失敗,所有的鏡像層都會失敗,鏡像也不會創建。
一旦定義好了鏡像層是不可變的,你在某一層當中添加一個新的命令,但是下一層刪除了指令,鏡像中基于這個命令創建的文件依然存在,但是在容器中看不到
1、touch 123
dockerfile的核心:用戶的個性化定制docker的鏡像
dockerfile的結構:
1、基礎鏡像信息
2、維護者信息
3、鏡像的操作指令
4、容器啟動時,執行的命令
nginx定義好了容器執行的命令 /bin/bash,覆蓋了容器內的標準輸出
dockerfile的語法
FROM:就是指定基礎鏡像信息嗎,指定容器的操作系統。
MAINTAINER:指定維護者信息(可有可無)
RUN:在基礎的鏡像上執行的命令,每個run就是一層,分層越多鏡像越大
ENRYPOINT:設置容器運行時的默認命令(理解為容器內部運行的主程序)
CMD:指定容器運行時的默認命令(docker run 后面加了其他的命令,cmd的指令將會被覆蓋)
EXPOSE:暴露端口(指定容器的運行端口)
ENV:設置環境變量,環境變量可以被RUN命令使用(聲明容器運行需要的環境變量)
ADD:復制和解壓,解壓不支持.zip和.tar 只能解壓tar.gz tar.bz2,可以支持url地址解壓和復制
COPY:復制文件,不能解壓,而且只能復制本地文件,文件要和dockerfile在一個目錄(官方推薦復制用copy)
VOLUME:創建一個容器內的掛載點,既可以為宿主機掛載,也可以供容器掛載。
USER:設置運行鏡像時使用的用戶或者UID(可以不加)
WORKDIR:為后續指令設置的工作的目錄
ONBUILD:這個鏡像可以被其他鏡像引用,需要這個命令
ARG:傳參,用于創建容器時,傳遞參數。ENV用于容器運行時設置環境變量。
CMD和ENTRYPOINT的區別:
都是可以為作為容器啟動時的默認命令
區別:
1、CMD可以把參數傳給ENTRYPOINT
2、多個ENTRYPOINT和多個CMD只會運行最后一個(一個dockerfile當中只會有一個ENTRYPOINT和cmd)
3、ENTRYPOINT的指令不會被覆蓋,CMD的指令如果在docker run后面加上輸出會被覆蓋
4、ENTRYPOINT的指令在容器啟動時執行,都會成為容器的主進程,主進程負責接收信號,處理容器的聲明周期,主進程退出,容器也講終止運行
RUN命令的優化:
主要是減少鏡像的層數,把多個run命令寫在一塊。
&&符號:
RUN yum -y install nginx && make -j 4 && make install
前一個命令執行成功才會執行下一個命令。
可以使用;符號:
RUN yum -y install nginx ; make -j 4 ; make install
不管前一個命令是否成功,后面的命令都會執行
||符號
如果前一個命令執行失敗,才會執行下一個命令
反斜杠\:換行
RUN yum -y install nginx \
&& maker -j 4 \
&& make install
可讀性更高
copy和add之間區別
copy和add都可以把本地文件復制到鏡像中 但是官方推薦,如果是復制,使用copy
區別:add可以解壓,如果是一個壓縮問價,add在復制后會自動解壓(tar.gz和tar.bz2)可以支持URL下載源文件,只能支持下載但是不能解壓,通過URL拷貝的文件無法自動解壓
copy只能復制,而且只能是本地文件,不支持URL路徑
centos7構建一個apache的dockerfile(編譯安裝):
docker build -t nginx:wqb5 .
docker run -itd --name nginx8 -p 1212:80 nginx:wqb5
FROM centos:7 AS first
MAINTAINER "this is my apache <wqb>"
RUN yum -y install gcc gcc-gcc+ make pcre pcre-devel expat-devel perl
ADD apr-1.6.2.tar.gz /opt
ADD apr-util-1.6.0.tar.gz /opt
ADD httpd-2.4.29.tar.bz2 /opt
RUN mv /opt/apr-1.6.2 /opt/httpd-2.4.29/srclib/apr && mv /opt/apr-util-1.6.0 /opt/httpd-2.4.29/srclib/apr-util &&\
cd /opt/httpd-2.4.29 &&\ ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi &&\
make -j 4 && make install#二層構建:FROM centos:7COPY --from=first /usr/local/httpd /usr/local/httpdRUN yum -y install pcre pcre-devel expat-devel perlEXPOSE 80
CMD ["/usr/local/httpd/bin/apachectl","-D","FOREGROUND"]