11.Dockerfile簡介

1.是什么?

dockerfile是用來構建鏡像的文本文件,是由一條條構建鏡像所需的指令和參數構成的腳本。

構建三步驟

  1. 編寫dockerfile文件
  2. docker build命令構建鏡像
  3. docker run依鏡像運行的容器實列

2.dockerfile構建過程解析

1)dockerfile內容的基礎知識

  1. 每條保留字指令都必須為大寫字母且后面要跟隨至少一個參數
  2. 指令按照從上到下,順序執行
  3. #表示注釋
  4. 每條指令都會創建一個新的鏡像層并對鏡像進行提交

2)Docker執行dockerfile的大致流程

docker從基礎鏡像運行一個容器

執行一條指令并對容器做出修改

執行類似docker commit的操作提交一個鏡像

docker在基于剛提交的鏡像運行一個新的容器

執行dockerfile中的一條指令直到所有指令都執行成功

3)總結

  1. Dockerfile,需要定義一個Dockerile,Dockerle定義了進程需要的一切東西。Dockerile涉及的內容包括執行代碼或者是文件、環境變量、依賴包、運行時環境、動態鏈接庫、操作系統的發行版、服務進程和內核進程(當應用進程需要和系統服務和內核進程打交道,這時需要考慮如何設計namespace的權限控制)等等:
  2. Docker鏡像,在用Dockerfile定義-個文件之后,docker build時會產生個Docker鏡像,當運行 Docker鏡像時會真正開始提供服務
  3. Docker容器,容器是直接提供服務的。

3.dockerfile常用的保留字指令

參考tomcat8的dockerfile入門:GitHub - docker-library/tomcat: Docker Official Image packaging for Apache Tomcat

  1. 1)FROM——基礎鏡像,當前新鏡像是基于哪個鏡像的,指定一個已經存在的鏡像作為模板,第一條必須是from。
  2. 2)MAINTAINER——鏡像維護者的名字和郵箱地址(這個鏡像是誰做的)
  3. 3)RUN——容器構建的時候需要運行的命令/兩種形式(shell格式、exec格式)/RUN是在docker build的時候運行
  4. 4)EXPORT——當前容器對外暴露的接口
  5. 5)WORKDIR——指定在創建容器后,終端默認登錄的進來的工作目錄,落腳點
  6. 6)USER——指定該鏡像以什么樣的用戶去執行,如果不指定,默認為root
  7. 7)ENV——設置配置過程中的環境變量,可以在后續的任何RUN指令使用,這就如同在命令前面指定了環境變量前綴一樣,也可以在其他指令中直接使用這些環境變量。
  8. 8)ADD——將宿主機目錄下的文件拷貝進鏡像且會自動處理url和解壓tar壓縮包
  9. 9)COPY——類似于ADD,拷貝文件和目錄到鏡像中。
  10. 10)VOLUME——相當于-v參數
  11. 11)CMD —
    1. 指定容器啟動之后要干的事情
    2. 注意
      1. dockerfile中可以多個cmd指令,但是只有一個生效,cmd會被docker run之后的參數替換
    3. 它和RUN命令的區別

  1. ENTPYPOINT
    1. 類似于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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90822.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90822.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90822.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C# 接口(interface 定義接口的關鍵字)

目錄 使用接口案例 接口繼承 練習 定義一個接口,在語法中與定義一個抽象類是沒有區別的,但是不允許提供接口中任意成員的實現方式,一般接口只會包含方法 、索引器和事件的聲明, 不允許聲明成員的修飾符, public都不…

5190 - 提高:DFS序和歐拉序:樹上操作(區域修改1)

題目傳送門 時間限制 : 2 秒 內存限制 : 256 MB 有一棵點數為 N 的樹,以點 1 為根,且樹點有邊權。然后有 M 個 操作,分為三種: 操作 1 :把某個節點 x 的點權增加 a 。 操作 2 :把某個節點 x 為根的子樹中…

【Oracle】數據泵

ORACLE數據庫 數據泵 核心參數全解析 ORACLE expdp 命令使用詳解 1.ATTACH[schema_name.]job_name Schema_name 用于指定方案名,job_name 用于指定導出作業名.注意,如果使用 ATTACH 選項,在命令行除了連接字符串和 ATTACH 選項外,不能指定任何其他選項,示例如下: expdp hr/hr A…

機器學習的算法有哪些?

🌟 歡迎來到AI奇妙世界! 🌟 親愛的開發者朋友們,大家好!👋 我是人工智能領域的探索者與分享者,很高興在CSDN與你們相遇!🎉 在這里,我將持續輸出AI前沿技術、實…

【計算機網絡】OSI七層模型

OSI七層模型為什么需要OSI七層模型?OSI七層模型具體是什么?Layer7:應用層(Application Layer)Layer6:表示層(Presentation Layer)Layer5:會話層(Session Laye…

RS485轉Profinet網關配置指南:高效啟動JRT激光測距傳感器測量模式

RS485轉Profinet網關配置指南:高效啟動JRT激光測距傳感器測量模式RS485轉Profinet網關:讓JRT激光測距傳感器高效開啟測量模式在工業自動化場景中,設備間的高效通信是實現精準控制的關鍵。RS485轉Profinet網關作為連接傳統RS485設備與現代Prof…

「日拱一碼」040 機器學習-不同模型可解釋方法

目錄 K最近鄰(KNN) - 基于距離的模型 決策邊界可視化 查看特定樣本的最近鄰 ?隨機森林(RF) - 樹模型 feature_importances_ SHAP值分析 可視化單棵樹 多層感知器(MLP) - 神經網絡 部分依賴圖 LIME解釋器 權重可視化 支持向量回歸(SVR) - 核方法 支持向量可視化 部…

編程與數學 03-002 計算機網絡 09_傳輸層功能

編程與數學 03-002 計算機網絡 09_傳輸層功能一、傳輸層的作用(一)進程間通信(二)提供可靠傳輸(三)復用與分用二、TCP協議(一)TCP的連接建立與釋放(二)TCP的可…

14. Web服務器-Nginx-工作原理

文章目錄前言一、簡介二、工作原理1. 多進程架構2. 事件驅動模型3. 模塊化設計三、工作流程1. 啟動階段2. 等待連接3. 請求處理階段4. 響應構造與輸出5. 連接關閉前言 Nginx? Nginx(發音為“Engine-X”)是一款高性能的開源Web服務器軟件,同…

AP-0316:集 USB 即插即用、智能降噪于一體的多功能 AI 聲卡,重新定義清晰語音交互

AP-0316突發噪音和抗風噪測試還在為語音設備的噪音刺耳、連接復雜、功放適配麻煩而頭疼?AP-0316 多功能 AI 降噪消回音 USB 聲卡來了 —— 以 “USB 即插即用 自帶功放 智能降噪 場景適配” 四大核心優勢,將專業級語音處理技術變得簡單易用&#xff0…

Baumer工業相機堡盟工業相機如何通過YoloV8深度學習模型實現衛星圖像識別(C#代碼,UI界面版)

Baumer工業相機堡盟工業相機如何通過YoloV8深度學習模型實現衛星圖像識別(C#代碼,UI界面版)工業相機使用YoloV8模型實現水下魚類識別工業相機通過YoloV8模型實現衛星圖像識別的技術背景在相機SDK中獲取圖像轉換圖像的代碼分析工業相機圖像轉換…

某d的評論爬蟲學習

本教程僅用于技術研究,請確保遵守目標網站的服務條款。實際使用前應獲得官方授權,避免高頻請求影響服務器,否則可能承擔法律責任。此腳本僅攔截公開評論接口,不涉及用戶私密數據。請勿修改代碼監聽其他請求。分享一下爬某抖評論的…

SQLite 注入:理解與防御

SQLite 注入:理解與防御 引言 隨著互聯網技術的飛速發展,數據庫已成為各類應用程序的核心組成部分。SQLite 作為一款輕量級的關系型數據庫,廣泛應用于移動應用、桌面應用及嵌入式系統。然而,SQLite 數據庫也面臨著安全挑戰&#x…

Java中List集合對象去重及按屬性去重

請直接移步原文Java中List集合對象去重及按屬性去重的8種方法 只記錄自己喜歡的幾種方法 對象元素整體去重的2種方法按照對象屬性去重的4種方法 預備數據 public class ListRmDuplicate {private List<String> list;private List<Player> playerList;BeforeEac…

ADAS測試:如何用自動化手段提升VV效率

當前&#xff0c;ADAS 技術正在快速發展&#xff0c;從智能巡航控制到自動緊急制動等功能已逐漸成為汽車的標配。在不斷提升駕駛輔助能力的同時&#xff0c;系統的可靠性也受到前所未有的重視。為了確保這些關鍵系統在各種工況下都能正常運行&#xff0c;驗證與確認&#xff08…

互信息:理論框架、跨學科應用與前沿進展

1. 起源與核心定義 互信息&#xff08;Mutual Information, MI&#xff09;由克勞德香農&#xff08;Claude Shannon&#xff09; 在1948年開創性論文《A Mathematical Theory of Communication》中首次提出&#xff0c;該論文奠定了現代信息論的基礎。互信息用于量化兩個隨機…

C++模板元編程從入門到精通

之前面試被問到什么是模板元編程&#xff0c;給我問懵了…… 一、什么是模板元編程&#xff08;TMP&#xff09; 模板元編程&#xff08;Template Metaprogramming, TMP&#xff09;是一種利用C模板在編譯期執行計算和代碼生成的編程范式。它本質上是“編寫程序的程序”&#…

探秘CommonJS:Node.js模塊化核心解析

CommonJS 是 JavaScript 的模塊化規范&#xff0c;主要應用于 服務器端環境&#xff08;尤其是 Node.js&#xff09;&#xff0c;其核心目標是解決代碼組織、依賴管理和作用域隔離問題 。以下是其核心要點&#xff1a;&#x1f527; 一、核心特性同步加載 模塊通過 require() 同…

Windows 10 遠程桌面(RDP)防暴力破解BAT腳本

0x01 設置5次失敗后鎖定賬戶30分鐘 secpol.msc # 導航到: 安全設置 > 賬戶策略 > 賬戶鎖定策略 0x02 復制保存到 BlockFailedRDP.ps1 <# .DESCRIPTION 此腳本分析Windows安全日志中的RDP登錄失敗事件(ID 4625)&#xff0c; 統計每個IP的失敗次數&#xff0…

Chukonu 閱讀筆記

Chukonu&#xff1a;一個將原生計算引擎集成到 Spark 中的全功能高性能大數據框架 摘要 Apache Spark 是一種廣泛部署的大數據分析框架&#xff0c;它提供了諸如彈性、負載均衡和豐富的生態系統等吸引人的特性。然而&#xff0c;其性能仍有很大的改進空間。盡管用原生編程語言編…