1. 程式人生 > >三、DockerFile 定製屬於自己的專屬映象

三、DockerFile 定製屬於自己的專屬映象

前言

上篇文章我們知道了怎麼操作映象和容器,到基礎都是從已經存在的映象開始的,那我們自己怎樣搭建一個映象並使用它呢?接下來就讓我們學習使用dockerfile 建立屬於自己的映象吧。

dockerfile

在這之前,我們需要知道dockerfile ,因為我們就是通過dockerfile 來建立映象的。那dockerfile 是什麼呢?
dockerfile 是一個檔案,檔案裡面是我們寫的一條條的指令,然後通過docker build
命令來構建一個映象。
現在難就難在這個指令怎麼寫,所以接下讓我們一起看看dockfile 指令吧。

## dockerfile 指令
### FROM
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

run 指令 是表示在映象構建時執行的指令。
兩種格式:

#shell格式
run <命令>
eg: run apt-get update

#exec 格式
run ["可執行檔案",“引數1”,“引數2”...]

COPY

複製檔案的指令

copy 源路徑  目標路徑
#支援萬用字元
eg:copy hom?.txt /mydir/

ADD

add 是更高階的複製。copy 有的功能它都用,它還能訪問網路資源,源路徑可以是一個URL。源路徑檔案也可以是一個壓縮檔案,可以直接解壓。
所以如果想要直接複製一個壓縮包進去的話,就要使用COPY 而不能只用ADD了。

官方建議是能使用COPY 的就使用COPY ,因為COPY 命令語義比較明確就是複製檔案,並且ADD 指令會使得映象構建快取失效,使得映象構建比較緩慢。

CMD

cmd 指令是表示在執行容器時執行的指令。

#shell 格式
cmd  <命令>
eg:cmd echo $HOME

#exec 格式
cmd ["可執行檔案",“引數1”,“引數2”]
eg: cmd ["sh","-c","echo $HOME"]

ENTRYPOINT

entrypoint 入口點

entrypoint <命令>

entrypoint ["可執行檔案","引數1","引數2"]

entryPoint 指令和 cmd 指令功能類似,不過entrypoint 可以讓映象變成像命令一樣使用,可以做應用執行前的準備工作。這個具體的後面講。

ENV

env 是設定環境變數的指令,

env MY_VERSION 1.0.0

ARG

arg 用於構建時傳遞的引數

arg <引數名>[=<預設值>]

eg: 
arg version
arg myversion=1.0.0

VOLUME

定義匿名卷

volume <路徑>
volume ["<路徑1>",["<路徑2>"...]

eg: volume  /etc/docker/log

EXPOSE

申明埠

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 的專案,建立屬於我們自己的映象就完成了。

配置docker遠端訪問

我們現在要做的是,直接通過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 的遠端訪問已經配置好了。

idea配置

我們開啟我們的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"]

mvn package

因為我們配置在構建的時候就會進行docker 打包。所以我們知己執行mvn package


控制檯檢視是打包成功的。
我們去伺服器上看下,有沒有

可以看到已經成功了。

番外

這篇總算寫完啦算是,中間自己親自試驗,踩了一路坑,也算是初步弄好了。以後我們專案不用將jar 包放到伺服器上再來建立映象了,可以直接在我們專案中打包構建映象就想構建jar 包一樣簡單。還是可以的吧。

好了,就說這麼多啦

後續加油♡

歡迎大家關注個人公眾號 "程式設計師愛酸奶"

分享各種學習資料,包含java,linux,大資料等。資料包含視訊文件以及原始碼,同時分享本人及投遞的優質技術博文。

如果大家喜歡記得關注和分享喲❤

相關推薦

DockerFile 定製屬於自己專屬映象

前言 上篇文章我們知道了怎麼操作映象和容器,到基礎都是從已經存在的映象開始的,那我們自己怎樣搭建一個映象並使用它呢?接下來就讓我們學習使用dockerfile 建立屬於自己的映象吧。 dockerfile 在這之前,我們需要知道dockerfile ,因為我們就是通過dockerfile 來建立映象的。那do

docker 簡單使用以及利用Dockerfile構建屬於自己映象

安裝docker  vim /etc/apt/sources.list  加入以下程式碼: deb http://http.debian.net/debian wheezy-backports main 然後重新整理源: apt-get updat

配置本地和共享yum源,定製屬於自己的yum倉庫

使用yum安裝軟體 命令: ####檢視軟體包 yum list all ##列出yum源倉庫裡面的所有可用的安裝包 yum list installed ##列出所有已經安裝的安裝包 yum l

Android Studio 使用教程()之新建一個屬於自己的工程

一、新建工程: 1、新建一個Project: 開啟Android Studio,新建一個Project,介面如下: 上圖中,設定好工程名和路徑之後,接下來可以一路next:

自己寫bootloader——mini2440(關閉看門狗,初始化始終)

com img tps image 參考 我們 csdn .net 參考資料 參考資料:https://blog.csdn.net/lee244868149/article/details/50450232      https://blog.csdn.net/lee244

小象學院Python入門基礎課程-新建pycharm工程 create New Project+新增需要的第三方庫+映象推薦#直譯器缺失怎麼辦#整合檔案式和命令列式程式設計

1.選擇新建一個Pure Python專案,新建專案路徑可以在Location處選擇。 2.Project Interpreter部分是選擇新建專案所依賴的python庫,第一個選項會在專案中簡歷一個venv(virtualenv)目錄,這裡存放一個虛擬的python環境。這裡所有

docker入門實踐,製作屬於自己的mysql5.7映象

在docker容器中安裝Mysql 在docker容器中安裝Mysql,與直接在centos中安裝是沒有任何區別的,可以參考這篇文章下載必要的安裝包,並進行安裝 https://blog.csdn.net/hl_java/article/details/82852627 在doc

定製屬於自己的ViewEngine(一套邏輯多套UI)

ASP.NET MVC出來這麼久了,心中卻又很多的疑惑:為什麼所有的View都要放在Views目錄下? 為什麼Shared資料夾下面的頁面可以被共享? 為什麼Page既可以是*.cshtml,也可以是*.aspx?  其實上面的幾個問題歸結起來都是檢視引擎的功效。 在傳統的ASP.NET中,可能還沒有

使用Dockerfile定製docker映象

Docker Store上已經有很多官方的映象我們可以直接使用,但是有時候我們的環境和映象會有些許差異,在pull之後還需要做一些變更,如果是團隊開發那操作起來就略顯繁瑣,如果能實現映象的定製那就很方便了。 定製映象有兩種方式一種是從容器commit生成映象,但是這種操作生成的映象體積會比較

我用小幫軟體幫你定製屬於自己的專利管理應用工具....專利定製

你還在用Excel表格管理的各種專利資訊嗎? 為了儲存一些專利的資訊,如申請號、申請時間、名稱、申請人等,你勤奮地手工輸入,一個欄位一個欄位切來換去,雖然打字很快,但工作效率並不高,繁瑣費時間。 有一款能夠合理的管理自有專利的軟體工具,該多好! 你的問題,博為小幫軟體機器人都可以解

Docker實踐(六):建立本地映象(commitDockerfile)

通常我們自己製作映象都是以某一映象為基礎,在此之上安裝或者定製自己需要的映象,推薦使用Dockerfile。 一、commit命令建立本地映象 這邊我們準備在centos為基礎的映象上,安裝jdk,並建立一個txt檔案,然後使用commit命

【Docker()】建立自己映象

    建立映象有兩種方式:commit命令方式與Dockerfile方式。但是一般不建議使用commit命令方式。本文將兩種方式均簡單說明一下。commit命令方式:    commit是直接在命令列使用,可以在某個映象的容器基礎上進行映象定製。也就是說可以執行某個映象的容

Docker學習筆記()- Dockerfile建立本地映象

Dockerfile建立本地映象 本博文將會介紹在docker中,如何建立本地映象。內容包括,編寫Dockerfile檔案,從編寫的Dockerfile建立映象,映象建立的過程解析,執行所建立的映象。 Dockerfile是用來建立自定義的im

實戰docker,編寫Dockerfile定製tomcat映象,實現web應用線上部署

最初在tomcat上部署web應用的方式,是通過maven的maven-compiler-plugin外掛先打成war包,再將war包複製到tomcat的webapps目錄下,後來用上了tomcat7-maven-plugin外掛,可以直接在maven上編譯,打

Docker入門實戰(二)----使用Dockerfile建立自己映象

上一篇文章中,我們是使用了別人做好的映象來使用docker。 更多的映象可以到https://hub.docker.com/查詢 這篇文章,我們將自己來製作映象。 自己製作映象非常簡單,只需要自己寫一個Dockerfile,build之後就能得到一個映象。

docker築基篇-04-使用Dockerfile構建自己映象

上一篇文章介紹了使用docker commit命令來構建自己的映象。 本篇文章將使用Dockerfile實現上篇文章中的需求。 1 構建自己的映象 此處我們打算,給一個centos:6.8容器安裝nginx伺服器。 並將其狀態保留,以便不用每次

Docker入門實戰()——用Dockerfile構建映象

在Docker中,構建一個自定義映象共有兩種方法,一是通過commit指令構建,二是通過Dockerfile檔案構建。第一種方式在上篇部落格中已經詳細介紹(Docker入門實戰(二)——Docker映象操作),接下來介紹在Docker中更為常用的方法——使用

Docker映象製作

映象製作 引數說明 命令 用途 FROM 引用的基礎映象 RUN 執行命令(容器內部) ADD 新增檔案(同時支援網路檔案,比COPY強一些)

大牛教你用Python打造一款屬於自己專屬影院!再也不買電影票了

      2. 安裝完Python以後,如果不出意外,應該是已經安裝了pip。通過pip可以非常方便的管理Python第三方包。可以在CMD或者任何shell終端輸入pip -V,如果提示了找不到pip命令,說明pip沒有安裝成功。那麼可以通過

013Dockerfile構建映象(2019-01-02 週三)

參考 https://www.cnblogs.com/CloudMan6/p/6830067.html   Dockerfile構建映象過程分析   [email protected]:~/111# ls