[云原生专题-11]:容器 - 如何构建自己的docker镜像:Docker Dockerfile
作者主頁(yè)(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文網(wǎng)址:https://blog.csdn.net/HiWangWenBing/article/details/122713131
目錄
前言:
第1章(方法1):動(dòng)態(tài)構(gòu)建:基于現(xiàn)有的docker鏡像進(jìn)行修改
第2章(方法2):靜態(tài)構(gòu)建:基于現(xiàn)有的docker鏡像重新構(gòu)建自己的鏡像
2.1 步驟1:開(kāi)發(fā)機(jī)器:安裝應(yīng)用程序開(kāi)發(fā)所需要的依賴環(huán)境
2.2 步驟2:開(kāi)發(fā)機(jī)器:編寫自己的Linux應(yīng)用程序
2.3 步驟3:構(gòu)建機(jī)器:生成Linux應(yīng)用程序,可以是c++的*.so,也可以是java的*.jar,也可以是python文件。
2.4 步驟4:構(gòu)建機(jī)器:創(chuàng)建構(gòu)建鏡像的工作目錄,
2.5 步驟5:構(gòu)建機(jī)器:把生成的Linux應(yīng)用程序拷貝到工作目錄/work/target?
2.6 步驟6:構(gòu)建機(jī)器/開(kāi)發(fā)機(jī)器:選擇基礎(chǔ)鏡像
2.7 步驟7(關(guān)鍵):構(gòu)建機(jī)器/開(kāi)發(fā)機(jī)器:編寫docker鏡像構(gòu)建的配置文件Dockerfile
2.8 步驟8:構(gòu)建機(jī)器:用docker build構(gòu)建新的docker鏡像
2.9 步驟9:構(gòu)建機(jī)器/主機(jī)機(jī)器:運(yùn)行新構(gòu)建的docker鏡像
2.10 步驟10:云服務(wù)商環(huán)境:修改云服務(wù)器的安全組,使能Web應(yīng)用所需要的端口
2.11 步驟11:個(gè)人主機(jī):通過(guò)internet進(jìn)行遠(yuǎn)程訪問(wèn)測(cè)試
2.12 步驟12:構(gòu)建機(jī)器:發(fā)布分享鏡像
2.13 步驟13:任意支持docker的主機(jī):不任意環(huán)境部署鏡像
第3章(方法3):靜態(tài)構(gòu)建:從無(wú)到有,全新搭建自己的鏡像
前言:
我們除了使用他人開(kāi)發(fā)或的微服務(wù)構(gòu)建業(yè)務(wù)系統(tǒng),很多時(shí)候,我們需要構(gòu)建我們自己的應(yīng)用程序(微服務(wù))的鏡像,然后基于我們自己的微服務(wù)鏡像集成和部署我們自己的業(yè)務(wù)應(yīng)用。因此,構(gòu)建新的微服務(wù)鏡像就顯得非常重要,構(gòu)建我們自己的微服務(wù)鏡像,有兩個(gè)基本思路:
(1)基于現(xiàn)有的docker鏡像修改或增量,站在巨人的肩膀上進(jìn)行改進(jìn);(2)從無(wú)到有,全新搭建自己的鏡像。大多數(shù)時(shí)候,我們使用的第一種方法。
第1章(方法1):動(dòng)態(tài)構(gòu)建:基于現(xiàn)有的docker鏡像進(jìn)行修改
這種方式,就是在現(xiàn)有的docker鏡像基礎(chǔ)上進(jìn)行修改,通過(guò)文件拷貝(docker cp)、提交(docker commit)、存儲(chǔ)(docker save)等操作,把修改的內(nèi)容存儲(chǔ)成新的docker鏡像或新的壓縮文件。這種方式適合變化較小的docker鏡像生成和手工操作,并且這種方式需要runtime執(zhí)行docker,不適合靜態(tài)構(gòu)建
詳見(jiàn)本系列的前一文章:
[云原生專題-10]:容器 - Docker的修改、保存、共享_文火冰糖(王文兵)的博客-CSDN博客
第2章(方法2):靜態(tài)構(gòu)建:基于現(xiàn)有的docker鏡像重新構(gòu)建自己的鏡像
這種方法與第1種方法類似,是在現(xiàn)有的docker鏡像的基礎(chǔ)之上,進(jìn)行修改或增量,重新構(gòu)建自己的新的鏡像。
與第1種方法不同的是,這種方法不需要啟動(dòng)、運(yùn)行現(xiàn)有的docker鏡像,只需要使用原有的靜態(tài)的鏡像文件即可,整個(gè)構(gòu)建過(guò)程完全在靜態(tài)的方式下進(jìn)行,適合自動(dòng)化的方式構(gòu)建。
2.1 步驟1:開(kāi)發(fā)機(jī)器:安裝應(yīng)用程序開(kāi)發(fā)所需要的依賴環(huán)境
2.2 步驟2:開(kāi)發(fā)機(jī)器:編寫自己的Linux應(yīng)用程序
2.3 步驟3:構(gòu)建機(jī)器:生成Linux應(yīng)用程序,可以是c++的*.so,也可以是java的*.jar,也可以是python文件。
2.4 步驟4:構(gòu)建機(jī)器:創(chuàng)建構(gòu)建鏡像的工作目錄,
/work
/work/target? =》可以是其他名稱
2.5 步驟5:構(gòu)建機(jī)器:把生成的Linux應(yīng)用程序拷貝到工作目錄/work/target?
備注:構(gòu)建work/target目錄的作用是:為生成的docker鏡像做好準(zhǔn)備,方便后續(xù)把該目錄中的文件,拷貝到docker鏡像中。
當(dāng)然,拷貝的過(guò)程,需要通過(guò)Dockerfile命令完成,Docker build不會(huì)自己默認(rèn)這行拷貝操作。
2.6 步驟6:構(gòu)建機(jī)器/開(kāi)發(fā)機(jī)器:選擇基礎(chǔ)鏡像
從docker hub中選擇基礎(chǔ)鏡像,這個(gè)基礎(chǔ)鏡像通常包含了Linux rootfs以及應(yīng)用程序所需要的運(yùn)營(yíng)環(huán)境。
2.7 步驟7(關(guān)鍵):構(gòu)建機(jī)器/開(kāi)發(fā)機(jī)器:編寫docker鏡像構(gòu)建的配置文件Dockerfile
案例1:基于nginx鏡像,創(chuàng)建自定義的主頁(yè)的Web應(yīng)用的鏡像
Nginx?(engine x) 是一個(gè)高性能的HTTP和反向代理web服務(wù)器,同時(shí)也提供了IMAP/POP3/SMTP服務(wù)。
下面基于docker hub中現(xiàn)有的nginx 鏡像定制一個(gè)新的應(yīng)用程序鏡像,該鏡像包含有一個(gè) /usr/share/nginx/html/index.html 文件。
FROM nginx RUN echo '這是一個(gè)本地構(gòu)建的nginx鏡像' > /usr/share/nginx/html/index.html--FROM?nginx:docker繼續(xù)的基礎(chǔ)鏡像,docker Daemon自動(dòng)從docker hub中下載該基礎(chǔ)鏡像。
--RUN:Daemon會(huì)自動(dòng)運(yùn)行或解壓nginx鏡像,然后在nginx鏡像內(nèi)部執(zhí)行RUN后面的命令,如echo '這是一個(gè)本地構(gòu)建的nginx鏡像' > /usr/share/nginx/html/index.html,即生成/usr/share/nginx/html/index.html文件,文件的內(nèi)容為:'這是一個(gè)本地構(gòu)建的nginx鏡像'。
案例2:基于centos鏡像,創(chuàng)建包含redis數(shù)據(jù)庫(kù)的微服務(wù)鏡像。
Redis(Remote Dictionary Server ),即遠(yuǎn)程字典服務(wù),是一個(gè)開(kāi)源的使用ANSI C語(yǔ)言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫(kù),并提供多種語(yǔ)言的API。
FROM centos RUN yum -y install wget \&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \&& tar -xvf redis.tar.gz該案例中,
- 先以docker hub中已有的centos鏡像為基準(zhǔn):FROM centos。
- 然后在centos鏡像中,先安裝wget:?yum -y install wget
- 然后在centos鏡像中,通過(guò)wget遠(yuǎn)程下載redis鏡像文件:?wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
- 然后在centos鏡像中,通過(guò)tar命令解壓redis文件:tar -xvf redis.tar.gz
Dockerfile中的其他構(gòu)建命令
- COPY:復(fù)制指令,從上下文目錄中復(fù)制文件或者目錄到容器里指定路徑。
-
ADD:ADD 指令和 COPY 的使用格類似(同樣需求下,官方推薦使用 COPY)。功能也類似,不同之處如下,ADD 的優(yōu)點(diǎn):在執(zhí)行 <源文件> 為 tar 壓縮文件的話,壓縮格式為 gzip, bzip2 以及 xz 的情況下,會(huì)自動(dòng)復(fù)制并解壓到 <目標(biāo)路徑>。ADD 的缺點(diǎn):在不解壓的前提下,無(wú)法復(fù)制 tar 壓縮文件。會(huì)令鏡像構(gòu)建緩存失效,從而可能會(huì)令鏡像構(gòu)建變得比較緩慢。具體是否使用,可以根據(jù)是否需要自動(dòng)解壓來(lái)決定。
-
CMD:類似于 RUN 指令,用于運(yùn)行程序,但二者運(yùn)行的時(shí)間點(diǎn)不同: CMD 在docker run 時(shí)運(yùn)行。RUN 是在 docker build。
-
ENTRYPOINT:指定運(yùn)行docker時(shí),默認(rèn)執(zhí)行的程序入口。?
類似于 CMD 指令,但其不會(huì)被 docker run 的命令行參數(shù)指定的指令所覆蓋,而且這些命令行參數(shù)會(huì)被當(dāng)作參數(shù)送給 ENTRYPOINT 指令指定的程序。
但是, 如果運(yùn)行 docker run 時(shí)使用了 --entrypoint 選項(xiàng),將覆蓋 ENTRYPOINT 指令指定的程序。
-
ENV:設(shè)置環(huán)境變量,定義了環(huán)境變量,那么在后續(xù)的指令中,就可以使用這個(gè)環(huán)境變量。
-
ARG
構(gòu)建參數(shù),與 ENV 作用一致。不過(guò)作用域不一樣。ARG 設(shè)置的環(huán)境變量?jī)H對(duì) Dockerfile 內(nèi)有效,也就是說(shuō)只有 docker build 的過(guò)程中有效,構(gòu)建好的鏡像內(nèi)不存在此環(huán)境變量。
構(gòu)建命令 docker build 中可以用 --build-arg <參數(shù)名>=<值> 來(lái)覆蓋。
-
VOLUME
定義匿名數(shù)據(jù)卷。在啟動(dòng)容器時(shí)忘記掛載數(shù)據(jù)卷,會(huì)自動(dòng)掛載到匿名卷。
.......
2.8 步驟8:構(gòu)建機(jī)器:用docker build構(gòu)建新的docker鏡像
案例1:構(gòu)建nginx:v3鏡像
在 Dockerfile 文件的存放目錄下,執(zhí)行構(gòu)建動(dòng)作。
以下示例,通過(guò)目錄下的 Dockerfile 構(gòu)建一個(gè) nginx:v3(鏡像名稱:鏡像標(biāo)簽)。
注:最后的?.?代表本次執(zhí)行的上下文路徑,下一節(jié)會(huì)介紹。
docker build -t nginx:v3 .案例2:構(gòu)建redis:v1鏡像
docker build -t redis:v1 .2.9 步驟9:構(gòu)建機(jī)器/主機(jī)機(jī)器:運(yùn)行新構(gòu)建的docker鏡像
2.10 步驟10:云服務(wù)商環(huán)境:修改云服務(wù)器的安全組,使能Web應(yīng)用所需要的端口
2.11 步驟11:個(gè)人主機(jī):通過(guò)internet進(jìn)行遠(yuǎn)程訪問(wèn)測(cè)試
2.12 步驟12:構(gòu)建機(jī)器:發(fā)布分享鏡像
2.13 步驟13:任意支持docker的主機(jī):不任意環(huán)境部署鏡像
第3章(方法3):靜態(tài)構(gòu)建:從無(wú)到有,全新搭建自己的鏡像
這種方法已經(jīng)很少用了,畢竟至少可以基于centos或Ubuntu docker鏡像為基礎(chǔ),構(gòu)建其他自定義功能的鏡像,不需要重頭開(kāi)始。
當(dāng)然,如需重頭開(kāi)始構(gòu)建的話,可以通過(guò)Dockerfile支持的各種命令,從無(wú)到有的構(gòu)建鏡像。
作者主頁(yè)(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文網(wǎng)址:https://blog.csdn.net/HiWangWenBing/article/details/122713131
總結(jié)
以上是生活随笔為你收集整理的[云原生专题-11]:容器 - 如何构建自己的docker镜像:Docker Dockerfile的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 前端学习(1355)模板语法循环
- 下一篇: Win10 安装 MongoDB 3.6