十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
本篇內(nèi)容主要講解“怎么用DockerFile定制屬于自己的專屬鏡像”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“怎么用DockerFile定制屬于自己的專屬鏡像”吧!
港口網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、自適應(yīng)網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)2013年至今到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
在這之前,我們需要知道dockerfile ,因?yàn)槲覀兙褪峭ㄟ^dockerfile 來創(chuàng)建鏡像的。那dockerfile 是什么呢? dockerfile 是一個(gè)文件,文件里面是我們寫的一條條的指令,然后通過docker build
命令來構(gòu)建一個(gè)鏡像。 現(xiàn)在難就難在這個(gè)指令怎么寫,所以接下讓我們一起看看dockfile 指令吧。
FROMFROM : #tag是可選的,默認(rèn)會(huì)使用latest版本的基礎(chǔ)鏡像
from 指令是依賴的基礎(chǔ)鏡像,所謂的定制鏡像,是在其他的鏡像上添加一些我們自己東西,定制成我們自己的鏡像。當(dāng)然我們也可以不依賴任何鏡像,自己從頭開始搭建。那就使用
FROM scratch
scratch 其實(shí)也是一個(gè)docker 鏡像,但是這個(gè)鏡像比較難特殊,它是一個(gè)虛擬鏡像,里面什么都沒有,是一個(gè)空白的鏡像,所以如果想不依賴任何鏡像,可以使用from scratch
。
那現(xiàn)在又有一個(gè)問題了,dockfile 文件中可以出現(xiàn)多個(gè)From 么?
在docker 17.05 版本之前是不支持出現(xiàn)多個(gè)From 的,一個(gè)dockefile只能有一個(gè)From 指令,且必須放在文件中的第一行。因?yàn)樽鳛榛A(chǔ)鏡像使用。在docker17.05 后支持多From 。表示構(gòu)建的多重階段,不過最終生成的鏡像還是以最后一個(gè)From 基礎(chǔ)鏡像為基礎(chǔ)的。
run 指令 是表示在鏡像構(gòu)建時(shí)運(yùn)行的指令。 兩種格式:
#shell格式 run <命令> eg: run apt-get update #exec 格式 run ["可執(zhí)行文件",“參數(shù)1”,“參數(shù)2”...]
復(fù)制文件的指令
copy 源路徑 目標(biāo)路徑 #支持通配符 eg:copy hom?.txt /mydir/
add 是更高級(jí)的復(fù)制。copy 有的功能它都用,它還能訪問網(wǎng)絡(luò)資源,源路徑可以是一個(gè)URL。源路徑文件也可以是一個(gè)壓縮文件,可以直接解壓。 所以如果想要直接復(fù)制一個(gè)壓縮包進(jìn)去的話,就要使用COPY 而不能只用ADD了。 官方建議是能使用COPY 的就使用COPY ,因?yàn)镃OPY 命令語義比較明確就是復(fù)制文件,并且ADD 指令會(huì)使得鏡像構(gòu)建緩存失效,使得鏡像構(gòu)建比較緩慢。
cmd 指令是表示在運(yùn)行容器時(shí)執(zhí)行的指令。
#shell 格式 cmd <命令> eg:cmd echo $HOME #exec 格式 cmd ["可執(zhí)行文件",“參數(shù)1”,“參數(shù)2”] eg: cmd ["sh","-c","echo $HOME"]
entrypoint 入口點(diǎn)
entrypoint <命令> entrypoint ["可執(zhí)行文件","參數(shù)1","參數(shù)2"]
entryPoint 指令和 cmd 指令功能類似,不過entrypoint 可以讓鏡像變成像命令一樣使用,可以做應(yīng)用運(yùn)行前的準(zhǔn)備工作。這個(gè)具體的后面講。
env 是設(shè)置環(huán)境變量的指令,
env MY_VERSION 1.0.0
arg 用于構(gòu)建時(shí)傳遞的參數(shù)
arg <參數(shù)名>[=<默認(rèn)值>] eg: arg version arg myversion=1.0.0
定義匿名卷
volume <路徑> volume ["<路徑1>",["<路徑2>"...] eg: volume /etc/docker/log
申明端口
expose <端口1> [<端口2>...]
這里需要注意的是,expose 是申明容器應(yīng)用端口,但是容器運(yùn)行是并不一定就是開啟這個(gè)端口提供服務(wù)。在dockerfile 中寫入端口申明有兩個(gè)好處,一是當(dāng)做鏡像服務(wù)的守護(hù)端口,方便映射,二是在運(yùn)行時(shí)使用隨機(jī)端口映射時(shí),就會(huì)映射的expose設(shè)置的端口上。
好了,指令當(dāng)然不止這些,更多的想了解的查看:
https://docs.docker.com/engine/reference/builder/
之前這篇文章寫到一半放下了,因?yàn)橹虚gdocker出了一點(diǎn)問題,下載鏡像一直提示超時(shí),然后設(shè)置了國(guó)內(nèi)加速,才弄好。 上面我們了解了Dockerfile 指令,接下來就讓我們先做一個(gè)簡(jiǎn)單的測(cè)試吧。 我們穿件一個(gè)springboot項(xiàng)目。創(chuàng)建一個(gè)HelloController 類。
@RestController public class HelloController { @RequestMapping("/") public String hello(){ return "hello docke 我的簡(jiǎn)單測(cè)試 "; } }
然后打成jar 包。放到我們服務(wù)器的文件夾下。 并且在文件下創(chuàng)建Dockerfile文件
vim Dcokerfile #文件內(nèi)容 FROM java:8 VOLUME /tmp ADD hello-1.0.0.jar hello-1.0.0.jar ENTRYPOINT ["java","-jar","/hello-1.0.0.jar"]
可以看到用到的命令都是我們上面介紹的。java8作為基礎(chǔ)鏡像,/tmp作為數(shù)據(jù)卷, add 將本地jar包添加到鏡像中,entrypoint 運(yùn)行我們的jar包。
在該目錄下構(gòu)建鏡像現(xiàn)在,最后面的點(diǎn)別忘記了。
docker build -t helle:v1 .
可以看到我們的鏡像分4不構(gòu)建,也就是構(gòu)建四個(gè)鏡像,因?yàn)槲覀僁ockerfile 中有四條指令。前面說了后一條指令是在前一條指令的基礎(chǔ)上構(gòu)建鏡像的。所以這四個(gè)鏡像中前面三個(gè)就是中間鏡像了。
我們現(xiàn)在看看我們創(chuàng)建的鏡像。
我們接下來啟動(dòng)鏡像
docker run -d -p 8090:8080 hello:v1
其中 -d 是后臺(tái)啟動(dòng),-p 是映射端口,前面的是我們?cè)O(shè)置的端口,后面是項(xiàng)目運(yùn)行的端口。 啟動(dòng)后我們?cè)跒g覽器上訪問下。
http://192.168.252.53:8090
這樣我們通過docker 構(gòu)建我們springboot 的項(xiàng)目,創(chuàng)建屬于我們自己的鏡像就完成了。
我們現(xiàn)在要做的是,直接通過idea打包生成docker鏡像。所以,第一步開啟docker的遠(yuǎn)程訪問,我的docker 是安裝到服務(wù)器上的。我先在本地檢測(cè)一下,服務(wù)器上的docker 是否開啟的遠(yuǎn)程訪問。
docker -H 192.168.252.53 info
說明是沒有開啟docker的遠(yuǎn)程服務(wù)的。所以進(jìn)入服務(wù)器。 執(zhí)行如下操作,在docker.service. 文件夾下創(chuàng)建一個(gè)http-proxy.conf文件.
sudo mkdir /etc/systemd/system/docker.service.d sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf
文件內(nèi)容
[Service] ExecStart= ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
然后重啟daemon和docker
sudo systemctl daemon-reload sudo systemctl restart docker
然后我們?cè)?在本地測(cè)試一下。說明docker 的遠(yuǎn)程訪問已經(jīng)配置好了。
我們打開我們的hello 項(xiàng)目,在pom.xml 中增加配置
1.8 quellanan
在build 中增加。
com.spotify docker-maven-plugin 1.0.0 build-image package build ${docker.image.prefix}/${project.artifactId} ${project.version} src/main/docker http://192.168.252.53:2375 / ${project.build.directory} ${project.build.finalName}.jar
在src/main/docker 中創(chuàng)建Dockerfile 文件,文件內(nèi)容上面Dockerfile 內(nèi)容一樣
FROM java:8 VOLUME /tmp ADD hello-1.0.0.jar hello-1.0.0.jar ENTRYPOINT ["java","-jar","/hello-1.0.0.jar"]
因?yàn)槲覀兣渲迷跇?gòu)建的時(shí)候就會(huì)進(jìn)行docker 打包。所以我們知己運(yùn)行mvn package
控制臺(tái)查看是打包成功的。 我們?nèi)シ?wù)器上看下,有沒有
可以看到已經(jīng)成功了。
到此,相信大家對(duì)“怎么用DockerFile定制屬于自己的專屬鏡像”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!