Docker Java程序鏡像製做
製做前的準備
- jre:不須要完整的jdk,jre便可,到Oracle進行下載便可,下載連接,根據本身的狀況進行選擇,這裏選擇jre-8u221-linux-x64.tar.gz,通常只能使用解壓安裝了,rpm的能夠直接使用yum命令進行安裝,但咱們這裏用不了
- jar包:本身寫好的程序的可執行jar,放到鏡像中直接運行便可
製做步驟
- mkdir docker:建立一個製做鏡像的工做目錄,裏面用於存放構建鏡像須要的文件,如jre和jar包,還有鏡像構建文件Dockfile
- 在目錄下放入jar包和jre
- 生產Dockfile文件並進行編寫,編寫示例和說明以下,下面的操做環境是centos7
# 建立鏡像製做目錄
mkdir docker
cd docker
# 將oracle的jre包和生成好的程序jar放到目錄中
# 爲了製造較小體積的鏡像,不使用jdk包,也沒有必要使用它
cp ../jre-8u221-linux-x64.tar.gz ./
cp ../seckill-1.0-SNAPSHOT.jar ./
# 建立並編輯編輯Dockfile鏡像生成文件
vim Dockerfile
# 將下面的內容寫入文件中,詳細的東西在後面會有說明
FROM docker.io/jeanblanchard/alpine-glibc
ADD jre-8u221-linux-x64.tar.gz /usr/java/jdk
ENV JAVA_HOME /usr/java/jdk/jre1.8.0_221
ENV PATH ${PATH}:${JAVA_HOME}/bin
COPY seckill-1.0-SNAPSHOT.jar /home/seckill-1.0-SNAPSHOT.jar
CMD java -jar /home/seckill-1.0-SNAPSHOT.jar
# 生成名稱爲seckill,版本爲v0的鏡像
docker build -t seckill:v0 .
# 運行鏡像,個人Java程序是監聽在8080端口的,因此將鏡像容器的8080端口映射到宿主機的8080,並命名容器的名稱爲seckill
docker run --name seckill -p 8080:8080 seckill
# 查看當前seckill容器的輸出,這裏會打印顯示Java的控制檯輸出內容
docker logs seckill
下面講解下Dockfile文件的內容:html
- FROM docker.io/jeanblanchard/alpine-glibc:docker的linux鏡像有不少,好比Ubuntu、centos之類的,但他們的體積都比較大,單純一個鏡像的都是400M以上的,而其中的alpine鏡像只用不到10M,很是的小巧,因此這裏就選用它做爲基礎的構建鏡像。可是alpine是基於MUSL libs(mini libc)的,而Java是基於GUN Standard C (glibc)library的,若是不作任何處理的話Java不能在其上運行,而在網上有大佬已經制造安裝了glibc的alpine鏡像,咱們直接使用便可
- ADD jre-8u221-linux-x64.tar.gz /usr/java/jdk:解壓並添加jre壓縮包到/usr/java/jdk目錄下
- ENV JAVA_HOME /usr/java/jdk/jre1.8.0_22一、ENV PATH ${PATH}:${JAVA_HOME}/bin:這種Java環境變量,這裏踩過一個坑,須要注意的是JAVA_HOME的路徑設置,若是你的jre包的版本和我不同話,須要進行修改,我這裏解壓後是jre1.8.0_221
- COPY seckill-1.0-SNAPSHOT.jar /home/seckill-1.0-SNAPSHOT.jar:複製添加Java程序到指定目錄
- CMD java -jar /home/seckill-1.0-SNAPSHOT.jar:設置在容器運行後啓動Java程序
若是對docker不是太瞭解的話,能夠查看下面的我製做過程當中參考的連接java
參考連接