1.是什么?
dockerfile是用來構建鏡像的文本文件,是由一條條構建鏡像所需的指令和參數構成的腳本。
構建三步驟
- 編寫dockerfile文件
- docker build命令構建鏡像
- docker run依鏡像運行的容器實列
2.dockerfile構建過程解析
1)dockerfile內容的基礎知識
- 每條保留字指令都必須為大寫字母且后面要跟隨至少一個參數
- 指令按照從上到下,順序執行
- #表示注釋
- 每條指令都會創建一個新的鏡像層并對鏡像進行提交
2)Docker執行dockerfile的大致流程
docker從基礎鏡像運行一個容器
執行一條指令并對容器做出修改
執行類似docker commit的操作提交一個鏡像
docker在基于剛提交的鏡像運行一個新的容器
執行dockerfile中的一條指令直到所有指令都執行成功
3)總結
- Dockerfile,需要定義一個Dockerile,Dockerle定義了進程需要的一切東西。Dockerile涉及的內容包括執行代碼或者是文件、環境變量、依賴包、運行時環境、動態鏈接庫、操作系統的發行版、服務進程和內核進程(當應用進程需要和系統服務和內核進程打交道,這時需要考慮如何設計namespace的權限控制)等等:
- Docker鏡像,在用Dockerfile定義-個文件之后,docker build時會產生個Docker鏡像,當運行 Docker鏡像時會真正開始提供服務
- Docker容器,容器是直接提供服務的。
3.dockerfile常用的保留字指令
參考tomcat8的dockerfile入門:GitHub - docker-library/tomcat: Docker Official Image packaging for Apache Tomcat
- 1)FROM——基礎鏡像,當前新鏡像是基于哪個鏡像的,指定一個已經存在的鏡像作為模板,第一條必須是from。
- 2)MAINTAINER——鏡像維護者的名字和郵箱地址(這個鏡像是誰做的)
- 3)RUN——容器構建的時候需要運行的命令/兩種形式(shell格式、exec格式)/RUN是在docker build的時候運行
- 4)EXPORT——當前容器對外暴露的接口
- 5)WORKDIR——指定在創建容器后,終端默認登錄的進來的工作目錄,落腳點
- 6)USER——指定該鏡像以什么樣的用戶去執行,如果不指定,默認為root
- 7)ENV——設置配置過程中的環境變量,可以在后續的任何RUN指令使用,這就如同在命令前面指定了環境變量前綴一樣,也可以在其他指令中直接使用這些環境變量。
- 8)ADD——將宿主機目錄下的文件拷貝進鏡像且會自動處理url和解壓tar壓縮包
- 9)COPY——類似于ADD,拷貝文件和目錄到鏡像中。
- 10)VOLUME——相當于-v參數
- 11)CMD —
- 指定容器啟動之后要干的事情
- 注意
- dockerfile中可以多個cmd指令,但是只有一個生效,cmd會被docker run之后的參數替換
- 它和RUN命令的區別
- ENTPYPOINT
- 類似于cmd指令,但是ENTPYPOINT不會被docker run后面的指令覆蓋,而且這些指令行參數會被當做參數送給ENTPYPOINT指令指定的程序
實際操作1:
Centos7鏡像具備vim+ifconfig+jdk24
下面是我運行的centos的容器,可以發現沒有這些東西
編寫
首先要去下載一個jdk24包
上傳到我們的服務器上
1.編寫
[root@iZgw05jp5bgqy10yqsb1heZ myfile]# cat dockerfile
FROM centos
MAINTAINER yyyy@123.com
ENV MYPATH /usr/local
WORKDIR $MYPATH
#安裝vim編輯器
RUN yum -y install vim
#安裝ifconfig命令查看
RUM yum -y install net-tools
#安裝java及lib庫
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD是相對路徑jar,需要把jdk-24_linux-x64_bin.tar.gz添加到與dockerfile文件同一文件夾下
ADD jdk-24_linux-x64_bin.tar.gz /usr/local/java/
#配置java環境變量
ENV JAVA_HOME /usr/local/java/jdk-24_linux-x64_bin
ENV PATH $JAVA_HOME/bin:$PATH
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
EXPOSE 80
CMD echo $MYPATH
CMD echo "success---------------ok"
CMD /bin/bash
報錯了,這里是因為指令錯誤
報錯,這里是因為更新源的問題
這里我修改dockerfile文件,提前修改源的地址
#備份一下原來的源文件
RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
#換源
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
清理緩存并重新生成
RUN yum clean all
RUN yum makecache
再次報錯,原來是備份的地址出錯了,查看一下正確的地址
原來
重新修改了一下
#備份一下原來的源文件
RUN mv /etc/yum.repos.d/CentOS-Linux-BaseOS.repo /etc/yum.repos.d/CentOS-Base.repo.backup
#換源
RUN curl -o /etc/yum.repos.d/CentOS-Linux-BaseOS.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
清理緩存并重新生成
RUN yum clean all
RUN yum makecache
再次報錯
這里還是因為源的原因,所以我這里直接刪除所有舊的源
這里我用的centos8,與以往的centos7還源不同,
mv?/etc/yum.repos.d/CentOS-Linux-BaseOS.repo CentOS-Linux-BaseOS.repo.bak
mv?/etc/yum.repos.d/CentOS-Linux-AppStream.repo CentOS-Linux-AppStream.repo.bak
mv?/etc/yum.repos.d/CentOS-Linux-Extras.repo CentOS-Linux-Extras.repo.bak
后面實在沒找到問題,我重新搞了一個容器,實操換源
嘗試yum -y install vim
成功了
總結命令
#備份
mkdir /etc/yum.repos.d/repo.backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/repo.backup
下載阿里云的源
curl -o /etc/yum.repos.d/CentOS-Linux-BaseOS.repo http://mirrors.aliyun.com/repo/Centos-8.repo
上面那個錯誤是我忘記把中文注釋了
下面是成功建立新鏡像
docker images
可以看到構建成功
進去看有沒有java環境,發現沒有,我檢查發現,因為環境變量的路徑配錯了,修改為正確的環境變量就有了
什么是虛懸鏡像?
就是在構建或者刪除鏡像的時候出現一些錯誤,導致倉庫和標簽都是none
單獨查看虛懸鏡像
docker image ls -f dangling=true
刪除虛懸鏡像
docker image prune