dockerfile創建鏡像:創建自定義鏡像。
包擴配置文件的創建,掛載點,對外暴露的端口。設置環境變量。
docker鏡像的方式:
1、基于官方源進行創建
根據官方提供的鏡像源,創建鏡像,然后拉起容器。是一個白板,只能提供基礎的功能,擴展性的功能還是需要自定義(進入容器進行操)
2、基于模板進行創建
3、dockerfile
聯合文件系統(UnionFS),docker的基礎。鏡像通過分成來進行集成,特性:一次同時加載多個文件系統,但是從外面來看,就是一個文件系統。
docker鏡像實際上由一層一層的文件系統組成,這種層級的文件系統就是UnionFS。
每一層都是layers,每一層都包含文件系統的一部分,這些層次疊加在一起,最終形成的就是rootfs。
docker原理
bootfs:宿主機提供的內核和引導程序
roosfs:就是容器的操作系統,在dockerfile中,我們可以自己指定。
rootfs是多個基礎鏡像和應用鏡像結合起來的只讀層。鏡像實際上就是一個只讀文件
容器基于鏡像實力,運行起來后容器可變成可讀可寫層。
docker報錯
在dockerfile當中每創建一個指定都是一格鏡像,鏡像層被緩存和復用
1-6層
1-4 4失敗
再次執行1-4直接完成,繼續運行5-6
一旦有一層鏡像失敗,那么所有的鏡像層都會失敗。鏡像也不會創建
鏡像層是不可變的,在某一次添加一個新的命令,在下一次刪除指令,鏡像中基于這個命令創建的文件依然存在,但在容器中不可見。
總結以上描述核心:用戶個性化定制docker的鏡像
dockerfile的結構:
1、基礎鏡像信息
2、維護者信息
3、鏡像的操作指令
4、容器啟動時,執行的命令。
docker logs 沒日志原因?????????
nginx:定義好了容器執行的命令 /bin/bash,覆蓋了容器內的標準輸出。
dockerfile語法:
類型名 | 說明 |
FROM | 指定基礎鏡像的信息,指定容器的操作系統。 |
MAINTAINER | 指定維護者信息(可有可無) |
RUN | 在基礎鏡像上執行的命令,每個run就是一層,分層越多,鏡像就越大。 |
ENTRYPOINT | 設置容器運行時的命令(容器內部運行的主程序) |
CMD | 可以指定容器運行時的默認命令(docker run /bin/bash后面加了其他的命令,cmd指令將會被覆蓋) |
EXPOSE | 暴露端口(指定容器的運行端口) |
ENV | 設置環境變量,環境變量可以被run命令使用(聲明容器運行需要的環境變量) |
ADD | 復制,解壓。解壓不支持.zip和.tlr,tar.gz tar.bz2 支持url的地址解壓和復制(解壓) |
COPY | 復制文件,不能解壓,而且只能復制本地文件。文件要和dockerfile在一個目錄.。(官方推薦) |
VOLUME | 創建一個容器內的掛載點,既可以為宿主機掛載,也可以供容器掛載。 |
USER | 設置運行鏡像時使用的用戶或者UID(可以不加) |
WORKDIR | 未后續指令設置的工作目錄。 |
ONBUILD | 這個鏡像可以被其他鏡像引用,需要這個命令。 |
ARG | 傳參,用于創建容器時,傳遞參數。ENV用于容器運行時設置環境變量。 |
CMD和ENTRYPOINT的區別
?cmd可以把參數傳給ENTRYPOINT的默認命令。 |
有多個entrypoint和多個cmd,只會運行最后一個(一個dockerfile當中只會有一個entrypoint和cmd) |
?ENTRYPOINT指令不會被覆蓋,CMD的指令如果在docker run的后面加上輸出,會被覆蓋。 |
ENTRYPOINT和CMD的指令在容器啟動時執行,都會成為容器的主進程。主進程負責接受信號,處理容器的生命周期,主進程退出,容器也將終止運行。 |
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 || make -j 4
如果前面的命令執行失敗,才會執行后面的操作
\:換行
RUN yum-y install nginx \?
&& make -j 4 \?
&& make install可讀寫更高
copy和add區別
copy和add都可以把本地文件復制到鏡像中,官方推薦復制用copy
add:可以解壓,add可以在復制文件之后會自動解壓,可以支持URL下載源文件,支持下載,但是不能解壓。通過URL拷貝的文件無法自動解壓。
copy:只能復制,不能解壓,而且只能是本地文件,不支持URL路徑
centos7 構建一個apache的dockerfile(編譯安裝):
所需的包放在與Dockerfile文件同一個目錄下
vim DockerfileFROM centos:7
MAINTAINER "this is my apache <LYW>"
RUN yum -y install gcc gcc-c++ 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
EXPOSE 80
CMD ["/usr/local/httpd/bin/apachectl","-D","FOREGROUND"]
創建啟動容器
docker run -itd --name 容器 鏡像名:標簽例
docker run -itd --name test1 apache1:centos
centos7 構建一個apache的dockerfile(編譯安裝):
FROM centos:7
MAINTAINER "this is my nginx <LYW>"
RUN yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel
ADD nginx-1.22.0.tar.gz /opt
RUN useradd -M -s /sbin/nologin nginx &&\
cd /opt/nginx-1.22.0 &&\
mkdir -p /usr/local/nginx/run/ &&\
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module &&\
chown -R nginx.nginx /usr/local/nginx &&\
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/ &&\
make -j 4 && make install
EXPOSE 80
RUN
CMD ["/usr/local/nginx/sbin","-g","daemon off;"]
創建啟動容器
docker run -itd --name nginx1 nginx:centos
操作中遇到的問題
1、yum安裝出錯
解決方法:重啟docker
systemctl restart docker.service
2、報錯:RUN中&&\與下一個命令一起
解決方案:將下一條命令run單寫
??? ? ??