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好了。