云原生技術與應用-Docker高級管理--Dockerfile鏡像制作

目錄

一.Docker鏡像管理

? 1.Docker鏡像結構

? 2.Dockerfile介紹

二.Dockerfile實施

? 1.構建nginx容器

? 2.構建Tomcat容器

? 3.構建mysql容器

三.Dockerfile語法注意事項

? 1.指令書寫范圍

? 2.基礎鏡像選擇

? 3.文件操作注意

? 4.執行命令要點

? 5.環境變量和參數設置

? 6.緩存利用與清理


一.Docker鏡像管理

? ? ? Docker 鏡像除了是 Docker 的核心技術之外,也是應用發布的標準格式。一個完整的 Docker 鏡像可以支撐一個 Docker 容器的運行,在 Docker 的整個使用過程中,進入一個已經定型的容器之后,就可以在容器中進行操作,最常見的操作就是在容器中安裝應用服務。 如果要把已經安裝的服務進行遷移,就需要把環境以及搭建的服務生成新的鏡像。本案例將介紹如何創建 Docker 鏡像。

1.Docker鏡像結構

? ?鏡像不是一個單一的文件,而是有多層構成。可以通過 docker history 命令查看鏡像中各層內容及大小,每層對應著 Dockerfile 中的一條指令 。Docker 鏡像默認存儲在 /var/lib/docker/<storage-driver> 目錄中。容器其實是在鏡像的最上面加了一層讀寫層,在運行容器里做的任何文件改動,都會寫到這個讀寫層。如果刪除了容器,也就刪除了其最上面的讀寫層,文件改動也就丟失了。Docker 使用存儲驅動管理鏡像每層內容及可讀寫層的容器層。Docker 鏡像是分層的,下面這些知識點非常重要。

  • Dockerfile 中的每個指令都會創建一個新的鏡像層;

  • 鏡像層將被緩存和復用;

  • 當 Dockerfile 的指令修改了,復制的文件變化了,或者構建鏡像時指定的變量不同了,對應的鏡像層緩存就會失效;

  • 某一層的鏡像緩存失效,它之后的鏡像層緩存都會失效;

  • 鏡像層是不可變的,如果在某一層中添加一個文件,然后在下一層中刪除它,則鏡像中依然會包含該文件,只是這個文件在 Docker 容器中不可見了。

2.Dockerfile介紹

? ?Dockerfile 是一個用于構建 Docker 鏡像的文本文件,它由一系列指令和參數組成。通過 Dockerfile,可以自動化地創建自定義鏡像,無需手動干預每個步驟。

二.Dockerfile實施

1.構建nginx容器

(1)拉取centos鏡像

[root@localhost ~ ]# docker pull centos:7

(2)創建dockerfile工作目錄

[root@localhost ~ ]# mkdir /opt/nginx

?[root@localhost ~ ]# cd /opt/nginx

(3)創建dockerfile

?[root@localhost? nginx]# vim dockerfile

FROM centos:7

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 clean all

#RUN yum makecache

RUN yum -y install net-tools pcre-devel zlib-devel zlib gcc* make

ADD nginx-1.19.5.tar.gz /root

WORKDIR /root/nginx-1.19.5

RUN ./configure --prefix=/usr/local/nginx && make && make install

ADD nginx.conf /usr/local/nginx/conf/nginx.conf

EXPOSE 80

EXPOSE 443

#RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf

WORKDIR /root/nginx

ADD run.sh /run.sh

RUN chmod 775 /run.sh

CMD ["/run.sh"]

(4)編寫nginx啟動腳本

?[root@localhost? nginx]# vim run.sh

#!/bin/bash

/usr/local/nginx/sbin/nginx

(5)用dockerfile創建鏡像

??[root@localhost? nginx]# docker build -t mynginx .

(6)啟動容器

[root@localhost?~]# mkdir /nginx

[root@localhost~]# cp /opt/nginx/nginx.conf /nginx

[root@localhost nginx]# docker run -dit
-p 8083:80
-v /www/html:/web
-v /nginx/nginx.conf:/usr/local/nginx/conf/nginx.conf
--name nginx04
mynginx
/bin/bash -c /run.sh

[root@localhost?nginx]# echo "web test">/www/html/index.html

(7)訪問nginx網站

?http://192.168.10.101:8003

2.構建Tomcat容器

?(1)創建工作目錄

[root@localhost ~ ]# mkdir /opt/tomcat/

[root@localhost ~ ]# cd /opt/tomcat

(2)創建dockerfile文件

?[root@localhost tomcat ]# vim dockerfile

FROM centos:7
ADD jdk-8u91-linux-x64.tar.gz /usr/local/
ENV JAVA_HOME /usr/local/jdk1.8.0_91
ENV JAVA_BIN /usr/local/jdk1.8.0_91
ENV JRE_HOME /usr/local/jdk1.8.0_91ENV PATH $PATH:/usr/local/jdk1.8.0_91/bin:/usr/local/jdk1.8.0_91/jre/bin
ENV CLASSPATH /usr/local/jdk1.8.0_91/jre/bin:/usr/local/jdk1.8.0_91/lib:/usr/local/jdk1.8.0_91/jre/lib/charsets.jar
ADD apache-tomcat-8.5.16.tar.gz /
RUN mv /apache-tomcat-8.5.16 /usr/local/tomcat
EXPOSE 8080
ADD run.sh /run.sh
RUN chmod 775 /run.sh
CMD ["/run.sh"]

?(3)創建啟動腳本

[root@localhost tomcat ]# vim run.sh

#!/bin/bash

export JAVA-OPTS ="-Xms2048m -Xmx4096m"

ulimit -n 65536

/usr/local/tomcat/bin/startup.sh

tailf /usr/local/tomcat/logs/catalina.out

(4)用dockerfile生成鏡像

?[root@localhost tomcat ]# docker build -t mytomcat .

(5)運行容器

??[root@localhost tomcat ]# docker run -d -i -p 8080:8080 --name tomcat01 mytomcat

(6)訪問tomcat網站

httpd://192.168.10.101:8080?

3.?構建mysql容器

(1)創建工作目錄

[root@localhost ~ ]# mkdir /opt/mysql

(2)創建dockerfile文件

?[root@localhost ~ ]# cd /opt/mysql

[root@localhost mysql?]# vim dockerfile

FROM centos:7

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 clean all

RUN yum -y install mariadb mariadb-server

RUN chown -R mysql:mysql /var/lib/mysql

ADD init.sh /init.sh

RUN chmod 775 /init.sh

RUN /init.sh

EXPOSE 3306

CMD ["mysqld_safe"]

(3)編寫mysql初始化腳本?

[root@localhost mysql?]# vim init.sh

#!/bin/bash

mysql_install_db --user=mysql

sleep 3

mysqld_safe &

sleep 3

mysqladmin -u "root" password "123456"

mysql -uroot -p123456 -e "grant all privileges on *.* to 'root'@'%' identified by '123456';"

mysql -uroot -p123456 -e "grant all privileges on *.* to 'root'@'localhost' identified by '123456';"

mysql -uroot -p123456 -e "flush privileges;"

(4)生成鏡像

?[root@localhost mysql?]# docker build -t mysql .

(5)創建容器

?[root@localhost mysql?]# docker run -tid -p 3306:3306 mysql

?[root@localhost mysql?]# dnf -y install mysql

??[root@localhost mysql?]# mysql -uroot -p123456 -h 192.168.10.101 -P 3306

?三.Dockerfile語法注意事項

1.指令書寫規范

(1)大小寫

? ? Dockerfile中的指令不區分大小寫,但建議使用大寫,以增強可讀性。

(2)順序

? ?指令的順序非常重要,因為Docker會換順序依次執行這些指令。合理安排指令順序有助于提高構建效率和鏡像的可維護性。

(3)注釋

? 可以使用#來添加注釋,這有助于解釋Dockerfile中各部分的作用,提高代碼的可讀性。

2.基礎鏡像選擇
(1) 穩定性與安全性
? 選擇穩定、官方且維護良好的基礎鏡像,這樣能保證鏡像的安全性和可靠性。例如,官方的 ubuntu、alpine 等鏡像都有較好的維護和更新機制。
(2) 鏡像大小
? 如果對鏡像大小有嚴格要求,可選擇輕量級的基礎鏡像,如 alpine 鏡像,它體積小巧,適合構建資源占用少的容器。
3.文件操作注意
(1) COPY 與 ADD 的區別
? COPY 僅用于簡單的文件和目錄復制,語法清晰,性能較好,推薦優先使用。
? ADD 除復制功能外,還支持從 URL 下載文件和自動解壓縮文件,但功能復雜可能帶來安全風險和不可預測性,所以僅在確實需要這些額外功能時使用。
(3) 文件路徑
? 使用相對路徑時要確保路徑在構建上下文中是正確的。構建上下文是指執行 docker build 命令時指定的目錄,只有該目錄下的文件和子目錄才能被復制到鏡像中。
4.執行命令要點
(1) RUN 命令優化
? 盡量將多個相關的命令合并成一個 RUN 指令,減少鏡像的層數,從而減小鏡像體積。例如,使用 && 連接多個命令。
(2) 清理臨時文件和緩存
? 要及時清理臨時文件和緩存,避免將不必要的文件包含在鏡像中。如上述示例中使用 rm -rf /var/lib/apt/lists/* 清理 APT 緩存。
(3) CMD 與 ENTRYPOINT 指令
? CMD 為容器提供默認執行命令,ENTRYPOINT 配置容器啟動時執行的命令。當容器能被使用時,CMD 指令作為 ENTRYPOINT 的默認參數。
5.環境變量和參數設置
(1) ENV 與 ARG 的區別:
? ?ENV 設置的環境變量在容器運行時持續存在,可被容器內的應用程序使用,定義的參數還能在鏡像構建過程有效,用于構建時的參數。
(4) 安全性
? 避免在 ENV 或 ARG 中設置敏感信息(如密碼、密鑰等),若確實需要,可以在運行容器時通過環境變量傳遞。
(5) 網絡和端口聲明
? 使用 EXPOSE 指令 - 只聲明容器暴露的端口,不會進行實際的端口映射。在使用 docker run -p 選項時,會把容器中 EXPOSE 聲明進行端口映射。
6.緩存利用與清理
(1) 緩存機制
? Docker 構建鏡像時會利用緩存,若某條指令的內容未發生變化,會直接使用之前緩存的結果,加快構建速度;因此,將不常變動的指令放前面,可充分利用緩存。
(2) 緩存清理
? ?當需要強制重新構建鏡像、不使用緩存時,可使用 docker build --no-cache 命令。

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

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

相關文章

澎湃系統webview加載h5彈窗顯示異常

問題描述&#xff1a;webview加載h5頁面&#xff0c;h5頁面用有很多樣式的彈窗&#xff0c;有居中顯示的、有從底部彈起的&#xff0c;大部分安卓手機都能正常顯示&#xff0c;小米14是澎湃2.0系統&#xff0c;彈窗可以出來、但是被壓扁了、顯示不全。解決方案&#xff1a;?聲…

Java連接Emqx實現訂閱發布消息

一&#xff1a;前提 安裝了Emqx開源版、MQTTX客戶端 二&#xff1a;訂閱發布實現步驟 1.引入依賴 <!--MQTT客戶端--> <dependency><groupId>org.eclipse.paho</groupId><artifactId>org.eclipse.paho.client.mqttv3</artifactId><v…

ReactNative【實戰系列教程】我的小紅書 7 -- 消息(含彈窗菜單,右上角角標,空白頁等)

最終效果彈窗菜單 點擊右上角群聊按鈕后&#xff0c;彈窗菜單無消息代碼實現app/(tabs)/message.tsx import icon_no_collection from "/assets/icons/icon_no_collection.webp"; import FloatMenu, {FloatMenuRef, } from "/modules/message/components/FloatM…

Jenkins詳細教程 - 從入門到精通

目錄 1. 什么是Jenkins 1.1 簡單理解 1.2 技術定義 1.3 核心特點 2. 為什么需要Jenkins 2.1 傳統開發的痛點 手工發布的問題 真實場景舉例 2.2 Jenkins的解決方案 自動化CI/CD流程 3. 核心概念解析 3.1 Job(任務) Job示例 3.2 Build(構建) 3.3 Pipeline(流水…

bash 判斷 /opt/wslibs-cuda11.8 是否為軟連接, 如果是,獲取連接目的目錄并自動創建

以下是實現該功能的 Bash 腳本&#xff1a; bash #!/bin/bash LINK_PATH“/opt/wslibs-cuda11.8” 檢查是否為軟鏈接 if [ -L "KaTeX parse error: Expected EOF, got # at position 24: …H" ]; then#? 獲取軟鏈接的絕對目標路徑…(readlink -f “$LINK_PATH”) # …

【性能測試】jmeter+Linux環境部署和分布式壓測,一篇打通...

目錄&#xff1a;導讀 前言一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結&#xff08;尾部小驚喜&#xff09; 前言 1、linux獲取動態…

Java 17 新特性筆記

Java 17 是一個 長期支持版本&#xff08;LTS&#xff09;&#xff0c;于 2021 年 9 月發布&#xff0c;是繼 Java 11 之后的重要里程碑。它整合了 Java 12~16 的眾多特性&#xff0c;并引入新的語言增強、JDK API 改進、性能優化和安全增強。 Java 17 版本信息 發布時間&…

WWDC 25 風云再起:SwiftUI 7 Charts 心法從 2D 到 3D 的華麗蛻變

概述 在 iOS 開發這個波譎云詭的江湖中&#xff0c;SwiftUI 可謂是一位后起之秀&#xff0c;以其簡潔明快的招式迅速在 UI 框架領域中嶄露頭角。 而其中的 Charts 框架&#xff0c;更是如同江湖中的 “數據可視化寶典”那樣&#xff0c;讓各位禿頭少俠們能夠輕松將復雜的數據轉…

Vue+Element Plus 中按回車刷新頁面問題排查與解決

VueElement Plus 中按回車刷新頁面問題排查與解決原因分析解決方案方法一&#xff1a;阻止默認行為 submit.prevent方法二&#xff1a;只監聽回車并觸發搜索最終推薦寫法如下&#xff1a;在使用 Vue 3 Element Plus 開發后臺系統時&#xff0c;我們常常會通過 搭配 實現搜索功…

x86匯編語言入門基礎(三)匯編指令篇3 位移運算

位移運算指令&#xff1a;SHL邏輯移位&#xff0c;SAR算術移位&#xff0c; ROR循環右移 1. SHL 邏輯移位 Shift Left, SHL代表向左移位&#xff0c;SHR代表向右移位 指令格式&#xff1a;shl op1, op2 目的操作數 op1&#xff1a;寄存器/內存地址源操作數 op2&#xff1a;寄…

Java-69 深入淺出 RPC 單體架構 垂直架構 分布式架構 微服務架構

點一下關注吧&#xff01;&#xff01;&#xff01;非常感謝&#xff01;&#xff01;持續更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持續更新中&#xff01;&#xff08;長期更新&#xff09; AI煉丹日志-29 - 字節跳動 DeerFlow 深度研究框斜體樣式架 私有…

Android 如何阻止應用自升級

問題背景 1.打開PlayStore,然后登陸賬戶 2.退出應用過幾分鐘后,應用會自動更新到新版本 3.再次打開應用,問題即可復現 一聯網進入playStore應用并且登錄谷歌賬號,退出幾分鐘,在進入,發現應用版本號更新了,應用進行了自我升級,關鍵是升級之后谷歌商店就用不了了,就…

Docker-構建鏡像并實現LNMP架構

一、搭建LNMP基礎配置1、制作Nginx鏡像制作dockerfilevim dockerfileFROM centos:7 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 clean all RUN yum makecache RUN yum -y install z…

Python之--基本知識

基本輸出語法結構: print(輸出內容)print()函數完整的語法格出: print (value,...,sep,end\n,fileNone)只有字符串可以用連接基本輸入語法結構: xinput(提示文字’)注意事項: 無論輸入的數據是什么 x 的數據類型都是字符串類型示例&#xff1a;name input("Enter your na…

VS CodeC51 單片機開發環境搭建

文章目錄前言1.安裝插件2.創建EIDE項目&#xff08;51單片機&#xff09;3.配置工具鏈&#xff08;第一次使用需要配置&#xff09;4.編譯與下載5.項目文件簡介與串口調試工具6.推薦插件7.打包模板與導出模板8.51單片機串口無法識別問題前言 需要安裝keil c51版本需要配置好C/…

國密算法(SM2/SM3/SM4)

文章目錄國密算法&#xff08;SM2/SM3/SM4&#xff09;詳解&#xff1a;從性能對比到Java手機號安全處理實戰一、 國密核心算法簡介二、 性能深度對比三、 Java實戰&#xff1a;手機號的安全處理方案一&#xff1a;使用SM3哈希存儲&#xff08;推薦用于驗證場景&#xff09;方案…

從前端轉go開發的學習路線

從前端開發轉向 Go&#xff08;Golang&#xff09;后端開發&#xff0c;是一個非常可行也很實用的方向&#xff0c;特別是在做 高性能微服務、分布式系統、云原生&#xff08;如Kubernetes&#xff09; 等方面。以下是一份適合你&#xff08;有多年開發經驗的前端開發者&#x…

node或瀏覽器上傳文件到阿里云OSS

阿里云配置 進入阿里云OSS Bucket 列表的某個 Bucket 倉庫下&#xff0c;點擊訪問控制 RAM 創建用戶 勾上 創建 AccessKey ID 和 AccessKey Secret 復制 AccessKey 信息 用文檔保存 創建角色 選擇云賬號 復制 ARN 用文檔保存&#xff0c;然后 新增權限 搜索 oss 選擇 AliyunOSS…

26考研物理復試面試常見問答問題匯總,物理專業保研推免夏令營面試問題匯總,物理本科知識專業面試最全攻略!

還在為物理考研復試面試發愁&#xff1f;還在為物理招聘的專業面試抓狂&#xff1f;還在為即將到來的物理夏令營面試不知從何下手、翻遍了厚厚的教材卻抓不住重點&#xff1f;別慌&#xff0c;接下來我會從「考研的物理復試經歷」「物理面試攻略」「物理面試基礎問答題匯總很全…

(5)機器學習小白入門 YOLOv:數據需求與圖像不足應對策略

(1)機器學習小白入門YOLOv &#xff1a;從概念到實踐 (2)機器學習小白入門 YOLOv&#xff1a;從模塊優化到工程部署 (3)機器學習小白入門 YOLOv&#xff1a; 解鎖圖片分類新技能 (4)機器學習小白入門YOLOv &#xff1a;圖片標注實操手冊 (5)機器學習小白入門 YOLOv&#xff1a;…