歡迎來到Docker入門系列的第三篇博客!在前兩篇博客中,我們已經(jīng)了解了什么是Docker以及如何安裝和配置它。本篇博客將重點(diǎn)介紹Docker鏡像的概念,以及它們之間的關(guān)系。我們還將學(xué)習(xí)如何拉取、創(chuàng)建、管理和分享Docker鏡像,這是使用Docker的重要步驟之一。
Docker鏡像是Docker的核心概念之一,它提供了一個(gè)可執(zhí)行的軟件包,其中包含了運(yùn)行應(yīng)用程序所需的一切:代碼、運(yùn)行時(shí)環(huán)境、系統(tǒng)工具、庫以及依賴項(xiàng)等。
通過學(xué)習(xí)Docker鏡像的概念,您將能夠更好地理解Docker的工作原理,并利用Docker提供的強(qiáng)大功能來開發(fā)、測試和部署應(yīng)用程序。接下來,讓我們深入探索Docker鏡像的世界吧!
1. Docker鏡像
Docker鏡像是Docker的核心構(gòu)建塊,它是一個(gè)輕量級、可執(zhí)行的軟件包,用于構(gòu)建和運(yùn)行容器化應(yīng)用程序。一個(gè)Docker鏡像包含了運(yùn)行應(yīng)用程序所需的一切,包括應(yīng)用程序的代碼、運(yùn)行時(shí)環(huán)境、系統(tǒng)工具、庫以及依賴項(xiàng)等。
1.1 Docker鏡像的特點(diǎn)
- 輕量級:Docker鏡像采用了分層存儲(chǔ)的機(jī)制,不同層之間可以共享相同的文件,從而減少了存儲(chǔ)空間的占用。
- 可移植性:Docker鏡像具有良好的可移植性,可以在不同的主機(jī)和環(huán)境中運(yùn)行,無需關(guān)注底層操作系統(tǒng)的差異。
- 版本控制:每個(gè)Docker鏡像都有唯一的標(biāo)識符,稱為鏡像ID,可以用于對鏡像進(jìn)行版本控制和管理。
- 可復(fù)用性:可以通過基于已有的Docker鏡像構(gòu)建新的鏡像,從而實(shí)現(xiàn)鏡像的復(fù)用和擴(kuò)展。
1.2 Docker鏡像的獲取
獲取Docker鏡像通常有兩種方式:拉取公共鏡像倉庫中的鏡像,或者通過構(gòu)建自定義鏡像來創(chuàng)建。
1.2.1 拉取鏡像
Docker鏡像可以從公共的鏡像倉庫中拉取,最著名的鏡像倉庫就是Docker Hub。您可以在Docker Hub上找到數(shù)以萬計(jì)的官方和社區(qū)維護(hù)的Docker鏡像。使用docker pull
命令可以拉取鏡像,命令格式如下:
docker pull <鏡像名稱>:<標(biāo)簽>
例如,要拉取官方的Ubuntu鏡像:
docker pull ubuntu:latest
1.2.2 使用Dockerfile構(gòu)建鏡像
1.3 Docker鏡像的管理
在使用Docker時(shí),我們可能需要對鏡像進(jìn)行管理,包括查看鏡像列表、刪除鏡像、導(dǎo)出和導(dǎo)入鏡像等操作。
1.3.1 查看鏡像列表
要查看本地主機(jī)上已有的鏡像列表,可以使用docker images
命令。該命令將顯示鏡像的倉庫名稱、標(biāo)簽、鏡像ID、創(chuàng)建時(shí)間和大小等信息。
docker images ls
1.3.2 刪除鏡像
要?jiǎng)h除本地主機(jī)上的一個(gè)或多個(gè)鏡像,可以使用docker rmi
命令。需要指定要?jiǎng)h除的鏡像的鏡像ID或者倉庫名稱和標(biāo)簽。
docker rmi <鏡像ID或名稱>:<標(biāo)簽>
1.3.3 導(dǎo)出和導(dǎo)入鏡像
有時(shí)候,我們可能需要將一個(gè)鏡像導(dǎo)出到一個(gè)文件中,或者從一個(gè)文件中導(dǎo)入一個(gè)鏡像??梢允褂?code>docker save命令將鏡像導(dǎo)出到一個(gè)tar文件中,然后使用docker load
命令從tar文件中導(dǎo)入鏡像。
導(dǎo)出鏡像:
docker save -o <導(dǎo)出文件名.tar> <鏡像名稱>:<標(biāo)簽>
導(dǎo)入鏡像:
docker load -i <導(dǎo)入文件名.tar>
2. 使用Dockerfile定制鏡像
2.1 Dockerfile定制鏡像
鏡像的定制實(shí)際上就是定制每一層所添加的配置、文件。如果我們可以把每一層修改、安裝、構(gòu)建、操作的命令都寫入一個(gè)腳本,用這個(gè)腳本來構(gòu)建、定制鏡像,那么之前提及的無法重復(fù)的問題、鏡像構(gòu)建透明性的問題、體積的問題就都會(huì)解決。這個(gè)腳本就是 Dockerfile。
Dockerfile 是一個(gè)文本文件,其內(nèi)包含了一條條的 指令(Instruction),每一條指令構(gòu)建一層,因此每一條指令的內(nèi)容,就是描述該層應(yīng)當(dāng)如何構(gòu)建。
以我們剛剛定制nginx鏡像為例子,我們在一個(gè)空白目錄中,建立一個(gè)文本文件,并命名為Dockerfile:
$ mkdir mynginx
$ cd mynginx
$ touch Dockerfile
其內(nèi)容為:
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
其中命令我們后面再詳細(xì)講述,我們使用它構(gòu)建鏡像,dockerfile構(gòu)建鏡像命令格式如下:
docker build -t <鏡像名稱>:<標(biāo)簽> <Dockerfile路徑>
接下來您可以使用以下命令構(gòu)建鏡像:
docker build -t myimage:latest .
然后我們再運(yùn)行這個(gè)鏡像,你可以選擇直接命令行運(yùn)行,也可以直接在docker客戶端運(yùn)行,這里為了方便理解,我用docker客戶端運(yùn)行這個(gè)鏡像:
隨便填個(gè)端口:
打開網(wǎng)頁訪問這個(gè)端口:
2.2 Dockerfile指令
2.2.1 COPY 復(fù)制文件
格式如下:
COPY [--chown=<user>:<group>] <源路徑>... <目標(biāo)路徑>
COPY [--chown=<user>:<group>] ["<源路徑1>",... "<目標(biāo)路徑>"]
COPY 指令將從構(gòu)建上下文目錄中 <源路徑> 的文件/目錄復(fù)制到新的一層的鏡像內(nèi)的 <目標(biāo)路徑> 位置。比如:
COPY package.json /usr/src/app/
<源路徑> 可以是多個(gè),甚至可以是通配符,其通配符規(guī)則要滿足 Go 的 filepath.Match 規(guī)則,如:
COPY hom* /mydir/
COPY hom?.txt /mydir/
2.2.2 FROM 指定基礎(chǔ)鏡像
所謂定制鏡像,那一定是以一個(gè)鏡像為基礎(chǔ),在其上進(jìn)行定制。就像我們之前運(yùn)行了一個(gè) nginx 鏡像的容器,再進(jìn)行修改一樣,基礎(chǔ)鏡像是必須指定的。而 FROM 就是指定 基礎(chǔ)鏡像,因此一個(gè) Dockerfile 中 FROM 是必備的指令,并且必須是第一條指令。
在 Docker Hub 上有非常多的高質(zhì)量的官方鏡像,有可以直接拿來使用的服務(wù)類的鏡像,如 nginx、redis、mongo、mysql、httpd、php、tomcat 等;也有一些方便開發(fā)、構(gòu)建、運(yùn)行各種語言應(yīng)用的鏡像,如 node、openjdk、python、ruby、golang 等??梢栽谄渲袑ふ乙粋€(gè)最符合我們最終目標(biāo)的鏡像為基礎(chǔ)鏡像進(jìn)行定制。
格式如下:
FROM <鏡像名字>
如:
FROM nginx
2.2.3 RUN 執(zhí)行命令
RUN 指令是用來執(zhí)行命令行命令的。由于命令行的強(qiáng)大能力,RUN 指令在定制鏡像時(shí)是最常用的指令之一。其格式有兩種:
- shell 格式:RUN <命令>,就像直接在命令行中輸入的命令一樣。剛才寫的 Dockerfile 中的 RUN 指令就是這種格式。
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
- exec 格式:RUN [“可執(zhí)行文件”, “參數(shù)1”, “參數(shù)2”],這更像是函數(shù)調(diào)用中的格式。
2.2.4 ADD 更高級的復(fù)制文件
ADD 指令和 COPY 的格式和性質(zhì)基本一致。但是在 COPY 基礎(chǔ)上增加了一些功能。
比如 <源路徑> 可以是一個(gè) URL,這種情況下,Docker 引擎會(huì)試圖去下載這個(gè)鏈接的文件放到 <目標(biāo)路徑> 去。下載后的文件權(quán)限自動(dòng)設(shè)置為 600,如果這并不是想要的權(quán)限,那么還需要增加額外的一層 RUN 進(jìn)行權(quán)限調(diào)整,另外,如果下載的是個(gè)壓縮包,需要解壓縮,也一樣還需要額外的一層 RUN 指令進(jìn)行解壓縮。所以不如直接使用 RUN 指令,然后使用 wget 或者 curl 工具下載,處理權(quán)限、解壓縮、然后清理無用文件更合理。因此,這個(gè)功能其實(shí)并不實(shí)用,而且不推薦使用。
例如:
FROM scratch
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /
2.2.5 CMD 容器啟動(dòng)命令
指定容器啟動(dòng)時(shí)要執(zhí)行的命令,可以有多個(gè) CMD,但只有最后一個(gè)生效。
CMD ["python", "app.py"]
2.2.6 WORKDIR 設(shè)置工作目錄
設(shè)置工作目錄,后續(xù)的指令將在該目錄下執(zhí)行。
WORKDIR /app
2.2.7 EXPOSE 暴露端口
聲明容器運(yùn)行時(shí)需要監(jiān)聽的端口。
EXPOSE 80
2.2.8 ENV 設(shè)置環(huán)境變量。
ENV APP_VERSION=1.0
3. Docker鏡像的分享和推送
Docker鏡像的分享和推送是與團(tuán)隊(duì)合作和社區(qū)共享的重要環(huán)節(jié)。您可以將自己創(chuàng)建的鏡像分享給其他開發(fā)者,也可以將鏡像推送到公共的或私有的鏡像倉庫中。
3.1 分享Docker鏡像
要分享一個(gè)Docker鏡像,可以通過導(dǎo)出和導(dǎo)入的方式進(jìn)行。首先,使用docker save
命令將鏡像導(dǎo)出到一個(gè)tar文件中,然后通過郵件、文件共享等方式與其他人共享該文件。
docker save -o <導(dǎo)出文件名.tar> <鏡像名稱>:<標(biāo)簽>
接收方可以使用docker load
命令從tar文件中導(dǎo)入鏡像。
docker load -i <導(dǎo)入文件名.tar>
3.2 推送Docker鏡像
如果您希望將鏡像推送到Docker Hub或其他鏡像倉庫中,可以使用docker push
命令。推送鏡像之前,您需要先登錄到鏡像倉庫。
docker login
然后,使用docker push
命令將鏡像推送到倉庫。
docker push <鏡像名稱>:<標(biāo)簽>
總結(jié)
在本篇博客中,我們深入探討了Docker鏡像的概念。我們學(xué)習(xí)了如何獲取和管理Docker鏡像,包括拉取鏡像、構(gòu)建自定義鏡像以及導(dǎo)出和導(dǎo)入鏡像。我們還介紹了如何通過Dockerfile制作鏡像以及Dockerfile的指令。最后,我們了解了如何分享和推送Docker鏡像,以便與他人共享和合作。
通過學(xué)習(xí)和掌握Docker鏡像的基本概念,您將能夠更好地利用Docker來開發(fā)、測試和部署應(yīng)用程序。容器化技術(shù)的出現(xiàn)使得應(yīng)用程序的開發(fā)和部署更加靈活、高效,并帶來了諸多優(yōu)勢。在接下來的博客中,我們將繼續(xù)探索Docker的更多功能和應(yīng)用場景,下一篇文章我們會(huì)進(jìn)入Docker容器的入門實(shí)踐。文章來源:http://www.zghlxwxcb.cn/news/detail-576516.html
希望本篇博客對您理解Docker鏡像起到了很好的指導(dǎo)作用。繼續(xù)探索Docker的世界,您將發(fā)現(xiàn)更多令人興奮的功能和應(yīng)用!文章來源地址http://www.zghlxwxcb.cn/news/detail-576516.html
到了這里,關(guān)于【云原生|Docker系列第3篇】Docker鏡像的入門實(shí)踐的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!