前言:
Docker鏡像構建的作用是將應用程序及其依賴打包到一個可移植、自包含的鏡像中,以便在不同環境中快速、可靠地部署和運行應用程序。
文章目錄
- Docker鏡像構建
- 1??是什么?
- 2??為什么?
- 3??鏡像構建
- 一、用現有容器構建新鏡像
- 二、Dockerfile構建鏡像
- 4??總結
這篇文章是我的筆記,旨在帶您快速入門上手docker,更加深入學習docker知識
Docker鏡像構建
做事三步走:是什么,為什么,怎么辦 我們一步一步來進行分析
磨刀不誤砍柴工,讓我們一步一步去分析和深入。😉
1??是什么?
Docker鏡像構建提供了一種強大且靈活的方式來打包、部署和管理應用程序。通過實現環境一致性、快速部署、版本控制、資源隔離和易維護性等優點,它大大簡化了應用程序的交付和運維過程,提高了開發和運維的效率,并促進了應用程序的可移植性和可靠性。
2??為什么?
相信大家能從往期文章學到挺多docker的相關知識,在看了上面的相關介紹,應該很清楚的知道鏡像構建的好處和優點,下面我簡單匯總總結一下:
-
環境一致性和可移植性
: Docker鏡像構建允許將應用程序及其所有依賴項打包到一個獨立的、可移植的單元中。這意味著可以在不同的環境中運行相同的鏡像,無需擔心由于環境差異而導致的不兼容問題。無論是開發、測試還是生產環境, 可以使用相同的鏡像保持環境一致性,確保應用程序在不同環境中的行為一致。 -
快速部署和擴展
: Docker鏡像構建使部署應用程序變得非常簡單和快速。一旦構建好鏡像,可以將其部署到任何支持Docker的主機上,無需繁瑣的依賴項安裝和配置過程。此外,由于鏡像具有輕量級的特性,可以快速地復制和部署多個容器實例,從而輕松地進行應用程序的水平擴展。 -
版本控制和可重復性
: Docker鏡像構建可以與版本控制系統(如Git)集成,將構建過程納入代碼管理。通過在代碼庫中包含Dockerfile,可以確保每個構建步驟都是可追溯和可重復的。這樣一來,可以輕松地管理和維護應用程序的不同版本,以及構建和發布過程的變更。 -
資源隔離和安全性
: Docker容器提供了一種輕量級的虛擬化方式,能夠實現資源隔離并增強應用程序的安全性。鏡像構建過程允許您明確定義應用程序的依賴項和運行時環境,從而減少了應用程序與宿主機之間的耦合。這種隔離性可以防止應用程序對主機環境的干擾,同時減少了系統故障和依賴沖突的風險。 -
易于維護和更新
: 通過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定義構建步驟和環境配置,可以實現快速、一致和可重復的鏡像構建。鏡像構建的好處包括環境一致性、快速部署、版本控制、資源隔離和易于維護更新。
如果您在學習過程中有什么疑問或者不懂的地方,可以隨時私信我,看到會及時回復!!