您好,登錄后才能下訂單哦!
本篇內容主要講解“怎么用DockerFile定制屬于自己的專屬鏡像”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么用DockerFile定制屬于自己的專屬鏡像”吧!
在這之前,我們需要知道dockerfile ,因為我們就是通過dockerfile 來創建鏡像的。那dockerfile 是什么呢? dockerfile 是一個文件,文件里面是我們寫的一條條的指令,然后通過docker build
命令來構建一個鏡像。 現在難就難在這個指令怎么寫,所以接下讓我們一起看看dockfile 指令吧。
FROM <image> FROM <image>:<tag> #tag是可選的,默認會使用latest版本的基礎鏡像
from 指令是依賴的基礎鏡像,所謂的定制鏡像,是在其他的鏡像上添加一些我們自己東西,定制成我們自己的鏡像。當然我們也可以不依賴任何鏡像,自己從頭開始搭建。那就使用
FROM scratch
scratch 其實也是一個docker 鏡像,但是這個鏡像比較難特殊,它是一個虛擬鏡像,里面什么都沒有,是一個空白的鏡像,所以如果想不依賴任何鏡像,可以使用from scratch
。
那現在又有一個問題了,dockfile 文件中可以出現多個From 么?
在docker 17.05 版本之前是不支持出現多個From 的,一個dockefile只能有一個From 指令,且必須放在文件中的第一行。因為作為基礎鏡像使用。在docker17.05 后支持多From 。表示構建的多重階段,不過最終生成的鏡像還是以最后一個From 基礎鏡像為基礎的。
run 指令 是表示在鏡像構建時運行的指令。 兩種格式:
#shell格式 run <命令> eg: run apt-get update #exec 格式 run ["可執行文件",“參數1”,“參數2”...]
復制文件的指令
copy 源路徑 目標路徑 #支持通配符 eg:copy hom?.txt /mydir/
add 是更高級的復制。copy 有的功能它都用,它還能訪問網絡資源,源路徑可以是一個URL。源路徑文件也可以是一個壓縮文件,可以直接解壓。 所以如果想要直接復制一個壓縮包進去的話,就要使用COPY 而不能只用ADD了。 官方建議是能使用COPY 的就使用COPY ,因為COPY 命令語義比較明確就是復制文件,并且ADD 指令會使得鏡像構建緩存失效,使得鏡像構建比較緩慢。
cmd 指令是表示在運行容器時執行的指令。
#shell 格式 cmd <命令> eg:cmd echo $HOME #exec 格式 cmd ["可執行文件",“參數1”,“參數2”] eg: cmd ["sh","-c","echo $HOME"]
entrypoint 入口點
entrypoint <命令> entrypoint ["可執行文件","參數1","參數2"]
entryPoint 指令和 cmd 指令功能類似,不過entrypoint 可以讓鏡像變成像命令一樣使用,可以做應用運行前的準備工作。這個具體的后面講。
env 是設置環境變量的指令,
env MY_VERSION 1.0.0
arg 用于構建時傳遞的參數
arg <參數名>[=<默認值>] eg: arg version arg myversion=1.0.0
定義匿名卷
volume <路徑> volume ["<路徑1>",["<路徑2>"...] eg: volume /etc/docker/log
申明端口
expose <端口1> [<端口2>...]
這里需要注意的是,expose 是申明容器應用端口,但是容器運行是并不一定就是開啟這個端口提供服務。在dockerfile 中寫入端口申明有兩個好處,一是當做鏡像服務的守護端口,方便映射,二是在運行時使用隨機端口映射時,就會映射的expose設置的端口上。
好了,指令當然不止這些,更多的想了解的查看:
https://docs.docker.com/engine/reference/builder/
之前這篇文章寫到一半放下了,因為中間docker出了一點問題,下載鏡像一直提示超時,然后設置了國內加速,才弄好。 上面我們了解了Dockerfile 指令,接下來就讓我們先做一個簡單的測試吧。 我們穿件一個springboot項目。創建一個HelloController 類。
@RestController public class HelloController { @RequestMapping("/") public String hello(){ return "hello docke 我的簡單測試 "; } }
然后打成jar 包。放到我們服務器的文件夾下。 并且在文件下創建Dockerfile文件
vim Dcokerfile #文件內容 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作為基礎鏡像,/tmp作為數據卷, add 將本地jar包添加到鏡像中,entrypoint 運行我們的jar包。
在該目錄下構建鏡像現在,最后面的點別忘記了。
docker build -t helle:v1 .
可以看到我們的鏡像分4不構建,也就是構建四個鏡像,因為我們Dockerfile 中有四條指令。前面說了后一條指令是在前一條指令的基礎上構建鏡像的。所以這四個鏡像中前面三個就是中間鏡像了。
我們現在看看我們創建的鏡像。
我們接下來啟動鏡像
docker run -d -p 8090:8080 hello:v1
其中 -d 是后臺啟動,-p 是映射端口,前面的是我們設置的端口,后面是項目運行的端口。 啟動后我們在瀏覽器上訪問下。
http://192.168.252.53:8090
這樣我們通過docker 構建我們springboot 的項目,創建屬于我們自己的鏡像就完成了。
我們現在要做的是,直接通過idea打包生成docker鏡像。所以,第一步開啟docker的遠程訪問,我的docker 是安裝到服務器上的。我先在本地檢測一下,服務器上的docker 是否開啟的遠程訪問。
docker -H 192.168.252.53 info
說明是沒有開啟docker的遠程服務的。所以進入服務器。 執行如下操作,在docker.service. 文件夾下創建一個http-proxy.conf文件.
sudo mkdir /etc/systemd/system/docker.service.d sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf
文件內容
[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
然后我們再 在本地測試一下。說明docker 的遠程訪問已經配置好了。
我們打開我們的hello 項目,在pom.xml 中增加配置
<properties> <java.version>1.8</java.version> <docker.image.prefix>quellanan</docker.image.prefix> </properties>
在build 中增加。
<!-- Docker --> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <!-- 將插件綁定在某個phase執行 --> <executions> <execution> <id>build-image</id> <!-- 用戶只需執行mvn package ,就會自動執行mvn docker:build --> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> </executions> <configuration> <!-- 指定生成的鏡像名 --> <imageName>${docker.image.prefix}/${project.artifactId}</imageName> <!-- 指定標簽 --> <imageTags> <imageTag>${project.version}</imageTag> </imageTags> <!-- 指定 Dockerfile 路徑 --> <dockerDirectory>src/main/docker</dockerDirectory> <!-- 指定遠程 docker api地址 --> <dockerHost>http://192.168.252.53:2375</dockerHost> <resources> <resource> <targetPath>/</targetPath> <!-- jar包所在的路徑此處配置的對應target目錄 --> <directory>${project.build.directory}</directory> <!-- 需要包含的jar包,這里對應的是Dockerfile中添加的文件名 --> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin>
在src/main/docker 中創建Dockerfile 文件,文件內容上面Dockerfile 內容一樣
FROM java:8 VOLUME /tmp ADD hello-1.0.0.jar hello-1.0.0.jar ENTRYPOINT ["java","-jar","/hello-1.0.0.jar"]
因為我們配置在構建的時候就會進行docker 打包。所以我們知己運行mvn package
控制臺查看是打包成功的。 我們去服務器上看下,有沒有
可以看到已經成功了。
到此,相信大家對“怎么用DockerFile定制屬于自己的專屬鏡像”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。