[Docker精進篇] Docker鏡像構建和實踐 (三)

前言:

Docker鏡像構建的作用是將應用程序及其依賴打包到一個可移植、自包含的鏡像中,以便在不同環境中快速、可靠地部署和運行應用程序。

在這里插入圖片描述

文章目錄

  • Docker鏡像構建
    • 1??是什么?
    • 2??為什么?
    • 3??鏡像構建
      • 一、用現有容器構建新鏡像
      • 二、Dockerfile構建鏡像
    • 4??總結

這篇文章是我的筆記,旨在帶您快速入門上手docker,更加深入學習docker知識

Docker鏡像構建

做事三步走:是什么,為什么,怎么辦 我們一步一步來進行分析

磨刀不誤砍柴工,讓我們一步一步去分析和深入。😉

1??是什么?

Docker鏡像構建提供了一種強大且靈活的方式來打包、部署和管理應用程序。通過實現環境一致性、快速部署、版本控制、資源隔離和易維護性等優點,它大大簡化了應用程序的交付和運維過程,提高了開發和運維的效率,并促進了應用程序的可移植性和可靠性。

在這里插入圖片描述

2??為什么?

相信大家能從往期文章學到挺多docker的相關知識,在看了上面的相關介紹,應該很清楚的知道鏡像構建的好處和優點,下面我簡單匯總總結一下:

  1. 環境一致性和可移植性: Docker鏡像構建允許將應用程序及其所有依賴項打包到一個獨立的、可移植的單元中。這意味著可以在不同的環境中運行相同的鏡像,無需擔心由于環境差異而導致的不兼容問題。無論是開發、測試還是生產環境, 可以使用相同的鏡像保持環境一致性,確保應用程序在不同環境中的行為一致。

  2. 快速部署和擴展: Docker鏡像構建使部署應用程序變得非常簡單和快速。一旦構建好鏡像,可以將其部署到任何支持Docker的主機上,無需繁瑣的依賴項安裝和配置過程。此外,由于鏡像具有輕量級的特性,可以快速地復制和部署多個容器實例,從而輕松地進行應用程序的水平擴展。

  3. 版本控制和可重復性: Docker鏡像構建可以與版本控制系統(如Git)集成,將構建過程納入代碼管理。通過在代碼庫中包含Dockerfile,可以確保每個構建步驟都是可追溯和可重復的。這樣一來,可以輕松地管理和維護應用程序的不同版本,以及構建和發布過程的變更。

  4. 資源隔離和安全性: Docker容器提供了一種輕量級的虛擬化方式,能夠實現資源隔離并增強應用程序的安全性。鏡像構建過程允許您明確定義應用程序的依賴項和運行時環境,從而減少了應用程序與宿主機之間的耦合。這種隔離性可以防止應用程序對主機環境的干擾,同時減少了系統故障和依賴沖突的風險。

  5. 易于維護和更新: 通過Docker鏡像構建,您可以輕松地更新和維護應用程序。一旦構建了鏡像,您可以對其進行版本控制和標記,以便追蹤和管理不同版本的應用程序。當需要進行更新或修復時,只需構建一個新的鏡像,然后將其部署到運行中的容器上即可。這種更新過程通常非常簡單和可靠,減少了應用程序維護的工作量和風險。

3??鏡像構建

鏡像構建有兩種方式,一種是使用現有容器去構建新鏡像,一種是通過dockerfile去構建新的鏡像。

在這里插入圖片描述

一、用現有容器構建新鏡像

首先我們先來了解docker鏡像構建命令:

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

下面我們來一步一步講解:

  • OPTIONS:可選參數,用于配置創建鏡像的各種選項。

    • -a, --author: 設置新鏡像的作者信息。
    • -c, --change: 應用指定的 Dockerfile 指令。
    • -m, --message: 設置新鏡像的提交消息。
    • -p, --pause: 在創建過程中暫停容器。

例子:
創建一個新鏡像,并設置作者信息為 “John Doe”。

	docker commit -a "John Doe" container_id repository:tag

創建一個新鏡像,并在構建過程中應用指定的 Dockerfile 指令,例如設置一個名為 DEBUG 的環境變量

	docker commit -c "ENV DEBUG=true" container_id repository:tag

創建一個新鏡像,并設置提交消息為 “Added new dependencies”。

	docker commit -m "Added new dependencies" container_id repository:tag

暫停容器的運行狀態,并將其轉換為一個新的可運行鏡像

	docker commit -p container_id repository:tag

docker commit 命令時,一般使用 Dockerfile 來定義和構建鏡像,以便更好地管理和復現構建過程。

二、Dockerfile構建鏡像

Dockerfile 是一個用來構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需的指令和說明
在這里插入圖片描述
首先我們先看示例:

# 指明構建的新鏡像是來自于 centos:7 基礎鏡像
FROM centos:7
# 通過鏡像標簽聲明了作者信息
LABEL maintainer="mszlu.com"
# 設置工作目錄
WORKDIR /usr/local
# 新鏡像構建成功以后創建指定目錄
RUN mkdir -p /usr/local/java && mkdir -p /usr/local/tomcat
# 拷貝文件到鏡像中并解壓
ADD jdk-11.0.8_linux-x64_bin.tar.gz /usr/local/java
ADD apache-tomcat-9.0.59.tar.gz /usr/local/tomcat
# 暴露容器運行時的 8080 監聽端口給外部
EXPOSE 8080
# 設置容器內 JAVA_HOME 環境變量
ENV JAVA_HOME /usr/local/java/jdk-11.0.8/
ENV PATH $PATH:$JAVA_HOME/bin
# 啟動容器時啟動 tomcat
CMD ["/usr/local/tomcat/apache-tomcat-9.0.59/bin/catalina.sh", "run"]

內容很長,不用擔心,我們一步一步去分析:
命令:代碼在上,翻譯在下,通過幾個實例讓你進一步了解相關命令使用

FROM <image>:<tag>

指明構建的新鏡像是來自于哪個基礎鏡像,如果沒有選擇 tag,那么默認值為 latest。

MAINTAINER <name>

指明鏡像維護者及其聯系方式(一般是郵箱地址)。官方說明已過時,推薦使用 LABEL。

LABEL maintainer="mszlu.com"

功能是為鏡像指定標簽。也可以使用 LABEL 來指定鏡像作者

RUN mkdir -p /usr/local/java

構建鏡像時運行的 Shell 命令,比如構建的新鏡像中我們想在 /usr/local 目錄下創建一個 java 目錄。

ADD jdk-11.0.6_linux-x64_bin.tar.gz /usr/local/java

拷貝文件或目錄到鏡像中。將本地的jdk拷貝到虛擬機中/usr/local/java

COPY jdk-11.0.6_linux-x64_bin.tar.gz /usr/local/java

拷貝文件或目錄到鏡像中。將本地的jdk拷貝到虛擬機中/usr/local/java, 用法同 ADD,只是不支持自動下載和解壓。

EXPOSE 80 443 8080/tcp

暴露容器運行時的監聽端口給外部,可以指定端口是監聽 TCP 還是 UDP,如果未指定協議,則默認為 TCP。想使得容器與宿主機的端口有映射關系,必須在容器啟動的時候加上 -p 參數

ENV JAVA_HOME /usr/local/java/jdk-11.0.6/

設置容器內環境變量。

CMD ehco $JAVA_HOME

啟動容器時執行的 Shell 命令。在 Dockerfile 中只能有一條 CMD 指令。如果設置了多條 CMD,只有最后一條 CMD 會生效。如果創建容器的時候指定了命令,則 CMD 命令會被替代,會被docker run給覆蓋掉

ENTRYPOINT ehco $JAVA_HOME

啟動容器時執行的 Shell 命令,同 CMD 類似,不會被 docker run 命令行指定的參數所覆蓋。在 Dockerfile 中只能有一條 ENTRYPOINT 指令。如果設置了多條 ENTRYPOINT,只有最后一條 ENTRYPOINT 會生效。

WORKDIR /usr/local

為 RUN、CMD、ENTRYPOINT 以及 COPY 和 AND 設置工作目錄

VOLUME ["/var/lib/mysql"]

容器的 /var/lib/mysql 目錄會在運行時自動掛載為匿名卷,匿名卷在宿主機的 /var/lib/docker/volumes 目錄下

4??總結

在這里插入圖片描述
Docker鏡像構建是將應用程序和其依賴項打包到一個獨立、可移植的容器環境中的過程。通過使用Dockerfile定義構建步驟和環境配置,可以實現快速、一致和可重復的鏡像構建。鏡像構建的好處包括環境一致性、快速部署、版本控制、資源隔離和易于維護更新。

如果您在學習過程中有什么疑問或者不懂的地方,可以隨時私信我,看到會及時回復!!

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

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

相關文章

【IMX6ULL驅動開發學習】08.馬達驅動實戰:驅動編寫、手動注冊平臺設備和設備樹添加節點信息

目錄 一、使用設備樹 1.1 修改設備樹流程 二、手動創建平臺設備 三、總結&#xff08;附驅動程序&#xff09; 前情提要&#xff1a;???????【IMX6ULL驅動開發學習】07.驅動程序分離的思想之平臺總線設備驅動模型和設備樹_阿龍還在寫代碼的博客-CSDN博客 手動注冊…

Android中如何不編譯源生模塊

如果想讓自己的app 替換系統的app 比如使用閃電瀏覽器替換系統的Browser 首先把閃電瀏覽器放到 vendor/rockchip/common/apps Android.mk LOCAL_PATH : $(call my-dir) include $(CLEAR_VARS)LOCAL_MODULE : Lightning LOCAL_SRC_FILES : $(LOCAL_MODULE).apk LOCAL_MODULE_C…

英語詞法——冠詞

冠詞是一種虛詞,與名詞連用,放在名詞的前面,說明或限制該名詞所表示的人或物是泛指的還是特指的。冠詞是最主要、最典型的限定詞。冠詞可以分為不定冠詞a,an,定冠詞the和零冠詞(即不用任何冠詞的場合)三種。 第一節 定冠詞 定冠詞the用于各類名詞(單數可數名詞、復數可…

linux 命令- systemctl

systemctl 參數說明 1、使用語法 用法&#xff1a;systemctl [OPTIONS…] {COMMAND} … 2 、參數說明 參數參數說明start立刻啟動后面接的unitstop立刻關閉后面接的unitrestart立刻關閉后啟動后面接的unit&#xff0c;亦即執行stop再start的意思reload不關閉后面接的unit的…

Elasticsearch查詢之Disjunction Max Query

前言 Disjunction Max Query 又稱最佳 best_fields 匹配策略&#xff0c;用來優化當查詢關鍵詞出現在多個字段中&#xff0c;以單個字段的最大評分作為文檔的最終評分&#xff0c;從而使得匹配結果更加合理 寫入數據 如下的兩條例子數據&#xff1a; docId: 1 title: java …

基于 Redis 實現分布式限流

基于 Redis 實現分布式限流 一、 簡介二、分布式限流1 數據結構1.1 Redis List1.2 Redis Set1.3 Redis Sorted Set 2 實現分布式限流3 實現原理分析 三、分布式限流算法1. 計數器算法2. 漏斗算法3. 令牌桶算法 四、分布式限流實戰1. 單機限流實現2. 基于Redis Clusters的分布式…

常見程序搜索關鍵字轉碼

個別搜索類的網站因為用戶惡意搜索出現誤攔截情況&#xff0c;這類網站本身沒有非法信息&#xff0c;只是因為把搜索關鍵字顯示在網頁中&#xff08;如下圖&#xff09;&#xff0c;可以參考下面方法對輸出的關鍵字進行轉碼 DEDECMS程序 本文針對Dedecms程序進行搜索轉碼&…

優先級隊列【C++】

文章目錄 priority_queuepriority_queue 使用priority_queue的模擬實現向上調整算法向下調整算法pushpoptopsizeempty 仿函數完整代碼 priority_queue 優先隊列&#xff08;priority_queue&#xff09;也是隊列的一種&#xff0c;priority_queue的接口是和queue的接口是相同的…

快速上手Vue開發:在項目中如何配置 tsconfig.json 文件?

文章目錄 一、簡介二、配置1、示例2、編譯器選項列表 一、簡介 tsconfig.json文件中指定了用來編譯這個項目的根文件和編譯選項。 二、配置 1、示例 {"compilerOptions": {"baseUrl": ".","paths": {"/*": ["src/*&…

C#__基本特性和使用

// 特性&#xff08;attribute&#xff09;: // 一種允許我們向程序集添加元數據的語言結構 // 用于保存程序結構信息的某種特殊類型的類 // 類似“批注”&#xff0c;用于解釋說明 #define IsShowMessage // 宏定義&#xff0c;在開頭定義&#xff0…

uni-app彈窗列表滾動, 彈框下面的內容也跟隨滾動解決方案

滑動彈窗里的列表&#xff0c;彈框下面的內容也會跟著滑動&#xff0c;導致彈窗中的列表不能正常滾動 1.彈窗組件代碼&#xff0c;需要在最外層的view中加入touchmove.stop.prevent"moveHandle"&#xff0c;且彈窗中需要滾動的列表要使用scroll-view標簽包裹起來&…

Python爬蟲——requests_post請求

import requests import jsonurl https://fanyi.baidu.com/sugheaders {User-Agent: ,Cookie: }data {kw: hello }response requests.post(url, data, headersheaders)content response.textobj json.loads(content.encode(utf-8)) print(obj)總結&#xff1a; post請求…

五分鐘搭建生鮮蔬果小程序

如今&#xff0c;隨著移動互聯網的快速發展&#xff0c;小程序已經成為眾多企業和商家推廣產品和服務的重要工具。而生鮮蔬果行業作為一個常見的消費領域&#xff0c;也開始逐漸轉向小程序商城來進行銷售和服務。那么&#xff0c;如何從零開始搭建一個生鮮蔬果小程序商城呢&…

Hlang--用Python寫個解釋器

文章目錄 前言流程數學解釋器結果封裝數的操作運行時異常運行解釋實現總結前言 沒錯今天提前來做這個東西,昨天晚上干這個玩意差不多干了兩個多小時才搞定,導致凌晨2點才睡覺,最要命的是,寫著寫著突然想到有一道線代理解錯了,一個晚上,做夢全是這兩個東西。尤其是晚上效…

LeetCode150道面試經典題-- 快樂數(簡單)

1.題目 編寫一個算法來判斷一個數 n 是不是快樂數。 「快樂數」 定義為&#xff1a; 對于一個正整數&#xff0c;每一次將該數替換為它每個位置上的數字的平方和。然后重復這個過程直到這個數變為 1&#xff0c;也可能是 無限循環 但始終變不到 1。如果這個過程 結果為 1&am…

JVM——JVM參數指南

文章目錄 1.概述2.堆內存相關2.1.顯式指定堆內存–Xms和-Xmx2.2.顯式新生代內存(Young Ceneration)2.3.顯示指定永久代/元空間的大小 3.垃圾收集相關3.1.垃圾回收器3.2.GC記錄 1.概述 在本篇文章中&#xff0c;你將掌握最常用的 JVM 參數配置。如果對于下面提到了一些概念比如…

Linux系統之安裝my-mind思維導圖工具

Linux系統之安裝my-mind思維導圖工具 一、my-mind介紹二、本地環境介紹2.1 本地環境規劃2.2 本次實踐介紹 三、檢查本地環境3.1 檢查本地操作系統版本3.2 檢查系統內核版本3.3 檢查端口占用情況 四、安裝httpd4.1 檢查本地yum倉庫4.2 安裝httpd4.3 關閉防火墻和selinux4.4 創建…

arcgis數據采集與拓撲檢查

1、已準備好一張配準好的浙江省行政區劃圖&#xff0c;如下&#xff1a; 2、現在需要繪制湖州市縣級行政區劃。需要右擊文件夾新建文件地理數據庫&#xff0c;如下&#xff1a; 其余步驟均默認即可。 創建好縣級要素數據集后&#xff0c;再新建要素類&#xff0c;命名為縣。 為…

【Java 動態數據統計圖】動態數據統計思路案例(動態,排序,containsKey)五(117)

需求&#xff1a;前端根據后端的返回數據&#xff1a;畫統計圖&#xff1b; 1.動態獲取地域數據以及數據中的平均值&#xff0c;按照平均值降序排序&#xff1b; 說明&#xff1a; X軸是動態的&#xff0c;有對應區域數據則展示&#xff1b; X軸 區域數據降序排序&#xff1b;…

03-第一個Spark程序WordCount

Scala版 1&#xff09;創建項目 增加 Scala 插件 Spark 由 Scala 語言開發的&#xff0c;咱們當前使用的 Spark 版本為 3.2.0&#xff0c;默認采用的 Scala 編譯版本為 2.13&#xff0c;所以后續開發時。我們依然采用這個版本。開發前請保證 IDEA 開發工具中含有 Scala 開發…