使用Dockerfile創(chuàng)建鏡像過程
實驗環(huán)境
安裝好Docker服務(wù)
一、容器鏡像分類
1、操作系統(tǒng)類
CentOS、Ubuntu
在dockerhub下載或自行制作
示例:把操作系統(tǒng)的文件系統(tǒng)打包生成鏡像
1)開啟最小化安裝的CentOS
2)打包制作CentOS鏡像
tar --numeric-owner --exclude=/proc --exclude=/sys -cvf centos7.tar /
- --numeric-owner:以數(shù)字形式保存文件的所有者和組信息,而不是名稱。這在跨系統(tǒng)打包時非常有用。
- --exclude=/proc:排除 /proc 目錄。/proc 是一個虛擬文件系統(tǒng),包含系統(tǒng)運行時的進程信息,不適合打包。
- --exclude=/sys:排除 /sys 目錄。/sys 是另一個虛擬文件系統(tǒng),包含內(nèi)核和設(shè)備的運行時信息,也不適合打包。
- -c:創(chuàng)建新的歸檔文件。
- -v:顯示詳細輸出,列出正在處理的文件。
- -f centos7.tar:指定歸檔文件名為 centos7.tar。
- /:指定要打包的根目錄
3)導(dǎo)入制作的鏡像
docker import centos7.tar centos7:v1
或
cat centos7.tar | docker import - centos7:v1 docker images
4)使用制作的鏡像開啟容器
docker run -it centos7:v1 /bin/bash
yum -y install httpd
啟動http服務(wù)
/usr/sbin/apachectl
ctrl+p+q
2、應(yīng)用類
Tomcat、Nginx、MySQL、Redis
下載、制作均可
為滿足不同環(huán)境需求,我們經(jīng)常自己制作
二、利用Dockerfile制作鏡像
1、Dockerfile介紹
Dockerfile是一種能夠被Docker程序解釋的腳本
Dockerfile由一條一條的指令組成,并且有自己的書寫格式和支持的命令,當(dāng)需要在容器鏡像中指定自己額外的需求時,只需在Dockerfile上添加或修改指令,然后通過docker build生成我們自定義的容器鏡像。
2、Dockerfile指令
(1)構(gòu)建類指令:用于構(gòu)建image
其指定的操作不會運行在image的容器上執(zhí)行
如:FROM、MAINTAINER、RUN、ENV、ADD、COPY
(2)設(shè)置類指令:用于設(shè)置image的屬性
其指定的操作將運行image的容器中執(zhí)行
如:CMD、ENTRYPOINT、USER、EXPOSE、WORKDIR、VOLUME
對應(yīng)指令說明:
- FROM 構(gòu)建新鏡像基于的基礎(chǔ)鏡像(必須為第一條指令)
- RUN 執(zhí)行命令,通常用于安裝軟件或運行腳本
- COPY 將文件或目錄從主機復(fù)制到鏡像中
- ADD 類似 COPY,但支持自動解壓 tar 文件和從 URL 下載文件
- ENV 設(shè)置環(huán)境變量
- USER 指定運行后續(xù)指令的用戶
- EXPOSE 聲明容器運行時監(jiān)聽的端口(容器內(nèi)打開的端口)
- WORKDIR 設(shè)置工作目錄,后續(xù)指令默認在該目錄下執(zhí)行
- CMD 指定容器啟動時默認執(zhí)行的命令(可以被 docker run 覆蓋)
- ENTRYPOINT 指定容器啟動時默認執(zhí)行的命令(不會被 docker run 覆蓋,但可以追加參數(shù))
3、Dockerfile指令的詳細解釋
(1)FROM
- FROM指令用于指定其后構(gòu)建新鏡像所使用的基礎(chǔ)鏡像。
- FROM指令必是Dockerfile文件中的首條命令。
- FROM指令指定的基礎(chǔ)image可以是官方遠程倉庫中的,也可以位于本地倉庫,優(yōu)先本地倉庫。
(2)RUN
RUN指令用于在構(gòu)建鏡像中執(zhí)行命令,有以下兩種格式:
shell格式
- 格式:RUN <命令>
- 例:RUN echo 'test' > /var/www/html/index.html
exec格式
- 格式:RUN ["可執(zhí)行文件", "參數(shù)1", "參數(shù)2"]
- 例:RUN ["/bin/bash", "-c", "echo test > /var/www/html/index.html"]
注意:
按優(yōu)化的角度來講,當(dāng)有多條要執(zhí)行的命令時,不要使用多條RUN,盡量使用&&符號與\符號連接成一行,因為多條RUN命令會讓鏡像建立多層
例如:
RUN yum install httpd httpd-devel -y RUN echo test > /var/www/html/index.html
可以改成
RUN yum install httpd httpd-devel -y && echo test > /var/www/html/index.html
或者改成
RUN yum install httpd httpd-devel -y \ && echo test > /var/www/html/index.html
(3)CMD
CMD不同于RUN,CMD用于指定在容器啟動時所要執(zhí)行的命令,而RUN用于指定鏡像構(gòu)建時所要執(zhí)行的命令。
格式有三種:
CMD ["executable","param1","param2"] CMD ["param1","param2"] CMD command param1 param2
每個Dockerfile只能有一條CMD命令,如果指定了多條命令,只有最后一條會被執(zhí)行;如果用戶啟動容器時候指定了運行的命令,則會覆蓋掉CMD指定的命令。
什么是啟動容器時指定運行的命令?
# docker run -d -p 80:80 鏡像名 運行的命令
(4)EXPOSE
EXPOSE指令用于指定容器在運行時監(jiān)聽的端口
- 格式:EXPOSE <port> [<port>...]
- 例:EXPOSE 80 3306 8080
上述運行的端口還需要使用docker run運行容器時通過-p參數(shù)映射到宿主機的端口。
(5)ENV
ENV指令用于指定一個環(huán)境變量。
- 格式:ENV <key> <value> 或者 ENV <key>=<value>
- 例:ENV JAVA_HOME /usr/local/jdkxxxx/
(6)ADD
ADD指令用于把宿主機上的文件拷貝到鏡像中。
- 格式:ADD <src> <dest>
- <src>可以是一個本地文件或本地壓縮文件,還可以是一個url,如果把<src>寫成一個url,那么ADD就類似于wget命令
- <dest>路徑的填寫可以是容器內(nèi)的絕對路徑,也可以是相對于工作目錄的相對路徑
(7)COPY
COPY指令與ADD指令類似,但COPY的源文件只能是本地文件或目錄
- 格式:COPY <src> <dest>
(8)ENTRYPOINT
ENTRYPOINT與CMD非常類似
相同點:
- 一個Dockerfile只寫一條,如果寫了多條,那么只有最后一條生效,都是容器啟動時才運行
不同點:
- 如果用戶啟動容器時候指定了運行的命令,ENTRYPOINT不會被運行的命令覆蓋,而CMD則會被覆蓋。
格式有兩種:
ENTRYPOINT ["executable", "param1", "param2"] ENTRYPOINT command param1 param2
(9)VOLUME
VOLUME指令用于把宿主機里的目錄與容器里的目錄映射指定掛載點,docker宿主機映射的目錄為自動生成的。
- 格式:VOLUME ["<mountpoint>"]
(10)USER
USER指令設(shè)置啟動容器的用戶,即程序用戶
像hadoop需要hadoop用戶操作;oracle需要oracle用戶操作,可以是用戶名或UID
如:
- USER daemon
- USER 1001
注意:
如果設(shè)置了容器以daemon用戶去運行,那么RUN,CMD和ENTRYPOINT都會以這個用戶去運行;鏡像構(gòu)建完成后,通過docker run運行容器時,可以通過-u參數(shù)來覆蓋指定的用戶
(11)WORKDIR
WORKDIR指令設(shè)置工作目錄,類似于cd命令,不建議使用RUN cd /root,建議使用WORKDIR
如:
- WORKDIR /root
4、Dockerfile基本構(gòu)成
- 基礎(chǔ)鏡像信息 FROM
- 維護者信息 MAINTAINER
- 鏡像操作指令 RUN
- 容器啟動時執(zhí)行指令 CMD
三、Dockerfile生成容器鏡像方法
1、使用Dockerfile生成容器鏡像步驟
- 第一步:創(chuàng)建一個文件夾(目錄)
- 第二步:在文件夾(目錄)中創(chuàng)建Dockerfile文件及其它文件
- 第三步:使用docker build命令構(gòu)建鏡像
- 第四步:使用構(gòu)建的鏡像啟動容器
2、使用Dockerfile生成Nginx容器鏡像
mkdir nginxdir cd nginxdir echo "nginx is running" > index.html
編寫Dockerfile文件
vim Dockerfile
添加:
FROM centos:7 MAINTAINER "lkk" RUN rm -rf /etc/yum.repos.d/* RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo RUN yum -y install wget RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo RUN yum -y install nginx ADD index.html /usr/share/nginx/html/ RUN echo "daemon off;" >> /etc/nginx/nginx.conf EXPOSE 80 CMD /usr/sbin/nginx
生成鏡像
docker build -t nginx:v1 .
3、使用Dockerfile生成容器鏡像優(yōu)化
(1)減少鏡像分層
Dockerfile中包含多種指令,如果涉及到部署最多使用的算是RUN命令了,使用RUN命令時,不建議每次安裝都使用一條單獨的RUN命令,可以把能夠合并安裝指令合并為一條,這樣就可以減少鏡像分層。
FROM centos:7 MAINTAINER lkk RUN rm -rf /etc/yum.repos.d/* RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo RUN yum -y install epel-release RUN yum -y install gcc gcc-c++ make libxml2 libxml2-devel wget RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz RUN tar zxf php-5.6.36.tar.gz RUN cd php-5.6.36 RUN ./configure --prefix=/usr/local/php RUN make -j 4 RUN make install
優(yōu)化如下:
mkdir /root/phpdir cd /root/phpdir
將php-5.6.27.tar.gz包上傳到/root/phpdir/
進入/root/phpdir目錄
vim Dockerfile
添加:
FROM centos:7 MAINTAINER lkk RUN rm -rf /etc/yum.repos.d/* && curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && yum -y install epel-release && yum -y install gcc gcc-c++ make libxml2 libxml2-devel wget ADD ./php-5.6.27.tar.gz / RUN cd /php-5.6.27 && ./configure --prefix=/usr/local/php && make -j 4 && make install
-j(表示 job 的數(shù)目)參數(shù)可以對項目在進行并行編譯。
make -j 4,讓make 最多允許 4 個編譯命令同時執(zhí)行,這樣可以更有效的利用 CPU 資源。在多核 CPU 上,適當(dāng)?shù)倪M行并行編譯還是可以明顯提高編譯速度的,但并行的任務(wù)不宜太多,一般是以 CPU 的核心數(shù)目的兩倍為宜
(2)清理無用數(shù)據(jù)
一次RUN形成新的一層,如果沒有在同一層刪除,無論文件是否最后刪除,都會帶到下一層,所以要在每一層清理對應(yīng)的殘留數(shù)據(jù),減小鏡像大小。
把生成容器鏡像過程中部署的應(yīng)用軟件包做刪除處理
vim Dockerfile
添加粗體部分內(nèi)容:
FROM centos:7 MAINTAINER lkk RUN rm -rf /etc/yum.repos.d/* && curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && yum -y install epel-release && yum -y install gcc gcc-c++ make libxml2 libxml2-devel wget && yum clean all && rm -rf /var/cache/yum/* ADD ./php-5.6.27.tar.gz / RUN cd /php-5.6.27 && ./configure --prefix=/usr/local/php && make -j 16 && make install && rm -rf /php*
生成鏡像
docker build -t php:v1 .
四、通過Dockerfile方式創(chuàng)建tomcat鏡像
1、創(chuàng)建目錄準(zhǔn)備相關(guān)文件
mkdir tomcatdir cd tomcatdir/ echo "tomcat test page" > index.html
上傳jdk-8u91-linux-x64.tar.gz包到tomcatdir目錄
2、編輯Dockerfile文件
vim Dockerfile
注意安裝版本(粗體部分)
添加:
FROM centos:7 MAINTAINER "lkk" ENV VERSION=9.0.99 ENV JAVA_HOME=/usr/local/jdk ENV TOMCAT_HOME=/usr/local/tomcat ENV PATH=$TOMCAT_HOME/bin:$JAVA_HOME/bin:$PATH ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo && \ yum -y install wget && \ wget https://dlcdn.apache.org/tomcat/tomcat-9/v${VERSION}/bin/apache-tomcat-${VERSION}.tar.gz --no-check-certificate && \ tar xf apache-tomcat-${VERSION}.tar.gz && \ mv apache-tomcat-${VERSION} /usr/local/tomcat && \ rm -rf apache-tomcat-${VERSION}.tar.gz /usr/local/tomcat/webapps/* && \ mkdir /usr/local/tomcat/webapps/ROOT ADD ./index.html /usr/local/tomcat/webapps/ROOT/ ADD ./jdk-8u91-linux-x64.tar.gz / RUN mv /jdk1.8.0_91/ /usr/local/jdk EXPOSE 8080 CMD ["/usr/local/tomcat/bin/catalina.sh","run"]
3、構(gòu)建鏡像
docker build -t tomcat:v1 .
4、創(chuàng)建并啟動容器
docker run -d -p 8080:8080 tomcat:v1
docker ps -a
curl 192.168.10.11:8080
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
iptables使用及docker的iptables規(guī)則
Docker在創(chuàng)建容器時,會自動添加一些iptables規(guī)則來實現(xiàn)網(wǎng)絡(luò)隔離和轉(zhuǎn)發(fā)等功能,本文主要介紹了iptables使用及docker的iptables規(guī)則,具有一定的參考價值,感興趣的可以了解一下2023-12-12詳解Docker 下開發(fā) hyperf 完整使用示例
這篇文章主要介紹了詳解Docker 下開發(fā) hyperf 完整使用示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01docker和docker-compose的版本對應(yīng)關(guān)系的實現(xiàn)
本文主要介紹了docker和docker-compose的版本對應(yīng)關(guān)系的實現(xiàn),兩者雖非強制綁定,但新版本docker-compose可能依賴更高版本Docker引擎的API,具有一定的參考價值,感興趣的可以了解一下2025-06-06Docker為網(wǎng)絡(luò)bridge模式指定容器ip的方法
Docker在創(chuàng)建容器時有四種網(wǎng)絡(luò)模式,bridge為默認不需要用--net去指定,其他三種模式需要在創(chuàng)建容器時使用--net去指定。那Docker為網(wǎng)絡(luò)bridge模式指定容器ip該如何實現(xiàn)呢?下面通過通過這篇文章一起看看吧,文中給出了詳細的示例代碼,有需要的可以參考借鑒。2016-11-11SQL?Server?簡介與?Docker?Compose?部署SQL?Server?容器
SQL?Server?是一個功能強大的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),適用于各種規(guī)模的應(yīng)用程序和數(shù)據(jù)存儲需求,在本文中,我將簡要介紹?SQL?Server?的基本概念,并詳細闡述如何使用?Docker?Compose?部署?SQL?Server?容器,感興趣的朋友跟隨小編一起看看吧2023-10-10