1. 程式人生 > >kubernetes構建微服務-Dockerfile構建springboot

kubernetes構建微服務-Dockerfile構建springboot

前言

上一篇部落格Kubernetes構建Springboot微服務,講到chenpeihai/springboot-helloworld映象的構建,這篇部落格詳細講述該映象的構建過程。

Dokcerfile

Dockerfile如下

FROM ubuntu
MAINTAINER chen "[email protected]"
RUN mkdir -p /data/webapp
ADD jdk-8u112-linux-x64.tar.gz /data/jdk/
COPY demo-0.0.1.jar /data/webapp/
ENV JAVA_HOME /data/jdk/jdk1.8.0_112
ENV PATH $PATH:$JAVA_HOME/bin
EXPOSE 8080
CMD ["java","-jar","/data/webapp/demo-0.0.1.jar"]

該Dockerfile由一系列的指令和引數組成。每條指令,如FROM,都必須大寫,並且後面跟隨引數。Dockerfile中的指令按順序從上往下執行。

  • Docker從基礎映象ubuntu執行一個容器,執行一條指令並修改容器
  • 提交一個新的映象層,基於此映象層在執行一個新的容器
  • 執行Dockerfile中的下一條指令,直到所有指令都執行完畢

當映象構建完成後,能看到Docker刪除了很多臨時的容器。

RUN指令

預設情況下,RUN指令會在shell裡使用命令包裝器/bin/sh -c 來執行。也可以用exec格式的RUN指令,比如

RUN ["mkdir","-p","/data/jdk"]

ADD指令

ADD指令用來構建環境下的檔案和目錄複製到映象中,它和COPY有些不一樣,能看到Dockerfile中的JDK是一個gzip包,它能在複製的同時進行解壓,合法的檔案格式有gzip、bzip2、xz原始檔,同時還遲滯通過URL的方式下載後在複製到指定的目錄。

COPY指令

copy指令非常類似ADD,他們根本的不同是COPY只關心在構建上下文複製本地檔案,而不會做提取和解壓檔案。

ENV指令

ENV指令用來在映象構建過程中設定環境變數,如Dockerfile中的

ENV JAVA_HOME /data/jdk/jdk1.8.0_112
ENV PATH $PATH:$JAVA_HOME/bin

實際上就是設定了JAVA_HOME,在springboot啟動的時候就會能讀取到jdk的執行時環境。

EXPOSE指令

這條指令告訴Docker該容器內的應用程式將會使用容器指定埠。但是這並不意味可以自動訪問該埠,而是需要在docker run時指定對映的埠,類似於

docker run -d -p 8080:8080 --name springboot-hello chenpeihai/springboot-helloworld

如果不指定-p 8080:8080,實際上你通過埠8080埠是訪問不到的。

CMD指令

CMD指令用於指定一個容器啟動時要執行的命令,有點類似於RUN指令,只是RUN指令是構建映象的時要執行的指令,CMD是映象構建後要執行的指令。

構建映象

在/data/springboot-helloworld目錄下,有以下檔案


然後執行

sudo docker build -t="chenpeihai/springboot-helloworld" .

這樣映象就完成了。

推送映象

chenpeihai是dockerhub上我註冊的ID,就是Repository,springbott-helloworld是映象名稱,註冊後可以使用

sudo docker login

輸入使用者名稱密碼後登陸並把映象推到自己的倉庫中,實際上也可以建立自己的私有倉庫,這個在一些生產環境中有應用場景。

sudo docker push chenpeihai/springboot-helloworld

這樣就把映象推送到Dockerhub上了,如果你現在在另外一臺伺服器上也想執行該映象,那麼只要簡單的執行以下步驟就可以

sudo docker pull chenpeihai/springboot-helloworld

等映象拉取下來後,執行docker run就可以了。

結束語

這樣整個docker的映象就完成了,在kubernetes建立ReplicationController的時候就可以拉取該映象並執行起來,關於demo.jar實際上就是一個簡單的springboot應用,另起一篇詳細寫下springboot的helloworld好了。