Docker進(jìn)階之構(gòu)建自定義鏡像實(shí)戰(zhàn)指南
一、什么是 Docker 鏡像?
Docker 鏡像可以看作是一個(gè)特殊的文件系統(tǒng),除了提供容器運(yùn)行時(shí)所需的程序、庫(kù)、資源、配置等文件外,還包含了一些為運(yùn)行時(shí)準(zhǔn)備的一些配置參數(shù)(如匿名卷、環(huán)境變量、用戶等)。鏡像不包含任何動(dòng)態(tài)數(shù)據(jù),其內(nèi)容在構(gòu)建之后也不會(huì)被改變。
鏡像是Docker容器的基石,容器是鏡像的運(yùn)行實(shí)例,有了鏡像才能啟動(dòng)容器。
二、自定義鏡像的好處?
從軟件版本管理角度講,Dockerfile本身是腳本文件,是可以版本化的。理論上使用Dockerfile,在任何時(shí)候任何機(jī)器上都可以重演鏡像制作過(guò)程制作出一模一樣的鏡像,這是非常有利于工程化的。
Dockerfile 可以快速幫助我們構(gòu)建自己的定制鏡像!
三、構(gòu)建自己的Centos
通過(guò)編寫 Dockerfile 文件來(lái)制作Centos 鏡像,并在官方提供的基礎(chǔ)上添加 vim、net-tools文件
新建 /home/dockerfile
cd /home mkdir dockerfile
進(jìn)入新建的dockerfile文件夾,并新建 mydockerfile-centos
# 基礎(chǔ)鏡像引入centos7 FROM centos:centos7 # 作者 MAINTAINER xiaowang<wanghuichen2003@163.com> #配置工作目錄 ENV MYPATH /usr/local WORKDIR $MYPATH #由于官方默認(rèn)提供的centos是壓縮版本,沒(méi)有vim以及一些其它的命令,只有基礎(chǔ)的命令,我們需要去下載安裝包 RUN yum -y install vim RUN yum -y install net-tools # 開放端口80 EXPOSE 80 # 輸出工作目錄 CMD echo $MYPATH CMD echo "--- end ---" # 以bin/bash啟動(dòng) CMD /bin/bash
查看編寫好的文件

編譯剛剛寫好的centos7
# 注意后面有一個(gè) . 代表當(dāng)前目錄 docker build -f mydockerfile-centos -t mycentos:0.1 .

等待編譯完成即可
完成后運(yùn)行鏡像
docker run -it mycentos:0.1

vim 文件
vim test pwd

查看ifconfig

查看鏡像歷史操作
docker history 2c2feb50d12c

四、RUN、CMD和ENTRYPOINT的區(qū)別
RUN命令與CMD命令的區(qū)別在哪里?
簡(jiǎn)單說(shuō),RUN命令在Image 文件的構(gòu)建階段執(zhí)行,執(zhí)行結(jié)果會(huì)打包進(jìn)入image文件,CMD命令則是在容器啟動(dòng)后執(zhí)行。另外,一個(gè)Dockerfile可以包含多個(gè)RUN命令,但只能由一個(gè)CMD命令
注意,指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否則它會(huì)覆蓋CMD命令。
CMD和ENTRYPOINT命令的區(qū)別
- CMD:指定容器啟動(dòng)的時(shí)候要運(yùn)行的命令,只有最后一個(gè)會(huì)生效
- ENRTYPOINT:指定容器啟動(dòng)的時(shí)候要運(yùn)行的命令,命令可以追加
CMD命令
# 進(jìn)入dockerfile 目錄,新建dockerfile-cmd-test文件 FROM centos:centos7 CMD ["ls", "-a"]

編譯并執(zhí)行文件
# 編譯文件 docker build -f dockerfile-cmd-test -t cmdtest . # 執(zhí)行文件 docker run f74776bf8b3c

追加命令查看全部文件目錄
docker run f74776bf8b3c -l

可以看到,cmd命令把上一個(gè)命令給替換了,由于 -l 不是命令,所以報(bào)錯(cuò)了,證明cmd命令會(huì)覆蓋前面的cmd命令,只執(zhí)行最后一個(gè)cmd命令
再次執(zhí)行查看全部文件目錄命令
docker run f74776bf8b3c ls -al

可以看到,上一個(gè) ls-a命令已被替換為ls -al命令!
ENTRYPOINT命令
回到 /home/dockerfile 目錄,新建文件測(cè)試ENTRYPOINT并寫入內(nèi)容
cd /home/dockerfile vim dockerfile-entrypoint # 寫入以下命令 FROM centos:centos7 ENTRYPOINT ["ls", "-a"]

編譯文件并執(zhí)行容器
# 編譯文件 docker build -f dockerfile-entrypoint # 執(zhí)行容器 docker run 29891c9ff3c9

在啟動(dòng)時(shí)追加命令
docker run 29891c9ff3c9 -l

可以看到直接追加了命令
五、【實(shí)戰(zhàn)】Dockerfile制作tomcat鏡像
下載JDK、Tomcat文件
jdk:http://chabaoo.cn/softs/698365.html
Tomcat:http://chabaoo.cn/softs/537911.html
使用Filezilla將文件上傳至 /home/xiaowang目錄下
上傳成功后查看文件

編寫文件
編寫dockerfile文件,文件名使用官方命名:Dockerfile,build的時(shí)候會(huì)默認(rèn)尋找當(dāng)前目錄下的文件,不需要 -f 參數(shù)指定
vim Dockerfile # 寫入以下文件 FROM centos:centos7 MAINTAINER ethan<wanghuichen2003@163.com> COPY readme.txt /usr/local/readme.txt ADD jdk-8u311-linux-x64.tar.gz /usr/local ADD apache-tomcat-9.0.62.tar.gz /usr/local/ RUN yum -y install vim ENV MYPATH /usr/local WORKDIR $MYPATH ENV JAVA_HOME /usr/local/jdk1.8.0_311 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib.tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.62 ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.62 ENVPATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 8080 CMD /usr/local/apache-tomcat-9.0.62/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.62/bin/logs/catalina.out

構(gòu)建鏡像
編譯鏡像文件
docker build -t diytomcat:1.0

啟動(dòng)鏡像
編譯完成后啟動(dòng)鏡像
# 啟動(dòng)容器,外部端口3355映射內(nèi)部容器8080 重命名容器名稱,掛載鏡像 docker run -d -p 3355:8080 --name diytomcat -v /home/dockerfile/xiaowang/test:/usr/local/apache-tomcat-9.0.62/webapps/test diytomcat:1.0

測(cè)試訪問(wèn)
訪問(wèn)外網(wǎng)ip地址+3355端口出現(xiàn)tomcat界面

在tomcat目錄下新建html文件
由于內(nèi)部容器和外部進(jìn)行了掛載,所以修改外部?jī)?nèi)容,內(nèi)部容器也會(huì)更新
我們進(jìn)入目錄,新建html文件對(duì)外訪問(wèn)時(shí)展示此頁(yè)面
cd /home/dockerfile/xiaowang/test vim test.html
寫入以下內(nèi)容
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>Title</title>
</head>
<body>
<h1>簡(jiǎn)單的HTML頁(yè)面</h1>
<p>Hello World!</p>
</body>
</html>
瀏覽器后綴+test路徑訪問(wèn)

ok,至此tomcat鏡像制作完畢
小結(jié)
以上就是【Bug 終結(jié)者】對(duì) 【云原生】Docker 進(jìn)階 – 構(gòu)建自定義鏡像實(shí)戰(zhàn) 自定義我們的Docker鏡像可利于我們的快速開發(fā),提高開發(fā)的效率,可謂是開發(fā)利器!
到此這篇關(guān)于Docker進(jìn)階之構(gòu)建自定義鏡像實(shí)戰(zhàn)的文章就介紹到這了,更多相關(guān)Docker構(gòu)建自定義鏡像內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MacOS使用Docker創(chuàng)建MySQL主從數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了MacOS使用Docker創(chuàng)建MySQL主從數(shù)據(jù)庫(kù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12
在Ubuntu 16.04上用Docker Swarm和DigitalOcean創(chuàng)建一個(gè)Docker容器集群的方法
這篇文章主要介紹了在Ubuntu 16.04上用Docker Swarm和DigitalOcean創(chuàng)建一個(gè)Docker容器集群的方法,需要的的朋友參考下吧2017-01-01
最新IDEA快速實(shí)現(xiàn)Docker鏡像部署運(yùn)行的過(guò)程詳解
這篇文章主要介紹了最新IDEA快速實(shí)現(xiàn)Docker鏡像部署運(yùn)行的過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
docker通過(guò)Dockerfile構(gòu)建mysql鏡像的方法
這篇文章主要介紹了docker通過(guò)Dockerfile構(gòu)建mysql鏡像,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
詳解通過(guò)Docker搭建Mysql容器+Tomcat容器連接環(huán)境
本篇文章主要介紹了通過(guò)Docker搭建Mysql容器+Tomcat容器連接環(huán)境,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01

