一、制作jdk鏡像
1.1、Alpine linux簡介
Alpine Linux是一個輕量級的Linux發行版,專注于安全、簡潔和高效。它采用了musl libc和BusyBox,使得系統資源占用較少,啟動速度較快。
Alpine Linux也提供了一個簡單的包管理工具APK,(注意:ubuntu中是apt-get),我們可以通過https://pkgs.alpinelinux.org/packages 查詢包信息,可以方便地安裝、升級和管理軟件包。由于其輕量級和高安全性,Alpine Linux常被用于容器化應用和嵌入式系統中。
Alpine Docker鏡像繼承了Alpine Linux發行版的這些優勢,相比于其他Linux Docker鏡像,它的體積非常小
???? 對比常用的、沒有壓縮過的基礎鏡像(查看當前的:latest標簽):
???? Alpine - 4.8MB
???? centos - 124.8 MB? ? ? ? ? ? ? ? ?之前200MB
???? Debian - 125.1MB
???? Centos - 196MB
?? 4.建議使用Alpine Linux 3.10.0版本,這也是 v3.10 穩定系列的首個版本
???? alpine:3.10
1.2、基于alpine制作JDK8鏡像
原因:
1. Alpine是一個輕量級的Linux發行版,它的基礎鏡像大小很小,因此構建的鏡像也會更加輕量化,節省存儲空間和網絡帶寬。
2. Alpine使用了musl libc代替了glibc,這樣可以減少一些依賴和提高性能,尤其是在容器環境下。
3. Alpine采用了最小化的設計原則,只包含最基本的軟件包,因此更加安全,減少了潛在的安全風險。
4. Alpine的包管理工具apk相對于CentOS的yum更加簡潔和高效,構建鏡像的過程會更加快速。
不基于centos,而基于alpine,可以帶來更好的性能、安全性和效率。
1.3、具體操作v2.0
?? 下載鏡像
?docker pull alpine:latest
?? 創建并編輯dockerfile
#進到data目錄
cd /home/sha/data/#創建文件夾
vim? myjdkDockerfile1
復制的內容
#1.指定基礎鏡像,并且必須是第一條指令 FROM alpine:latest #FROM alpine:3.10 #2.指明該鏡像的作者和其電子郵件 MAINTAINER xyz "sha@qq.com" #3.在構建鏡像時,指定鏡像的工作目錄,之后的命令都是基于此工作目錄,如果不存在,則會創建目錄 WORKDIR /sha_docker/jdk #4.將一些安裝包復制到鏡像中,語法:ADD/COPY <src>... <dest> ## ADD與COPY的區別:ADD復制并解壓,COPY僅復制 ADD jdk-8u221-linux-x64.tar.gz /sha_docker/jdk/ ## glibc安裝包如果從網絡下載速度實在是太慢了,先提前下載復制到鏡像中 COPY glibc-2.29-r0.apk /sha_docker/jdk/ COPY glibc-bin-2.29-r0.apk /sha_docker/jdk/ COPY glibc-i18n-2.29-r0.apk /sha_docker/jdk/ #5.更新Alpine的軟件源為阿里云,因為從默認官源拉取實在太慢了 RUN echo http://mirrors.aliyun.com/alpine/v3.10/main/ > /etc/apk/repositories && \ ??? echo http://mirrors.aliyun.com/alpine/v3.10/community/ >> /etc/apk/repositories RUN apk update && apk upgrade #6.運行指定的命令 ## Alpine linux為了精簡本身并沒有安裝太多的常用軟件,apk類似于ubuntu的apt-get, ## 用來安裝一些常用軟V件,其語法如下:apk add bash wget curl git make vim docker ## wget是linux下的ftp/http傳輸工具,沒安裝會報錯“/bin/sh: wget: not found”,網上例子少安裝wget ## ca-certificates證書服務,是安裝glibc前置依賴 RUN apk --no-cache add ca-certificates wget \ ??? && wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub \ ??? && apk add glibc-2.29-r0.apk glibc-bin-2.29-r0.apk glibc-i18n-2.29-r0.apk \ ??? && rm -rf /var/cache/apk/* glibc-2.29-r0.apk glibc-bin-2.29-r0.apk glibc-i18n-2.29-r0.apk #7.配置環境變量 ENV JAVA_HOME=/sha_docker/jdk/jdk1.8.0_221 ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV PATH=$JAVA_HOME/bin:$PATH #容器啟動時需要執行的命令 #CMD ["java","-version"] |
粘貼后不能亂碼
上傳文件
制作鏡像
?docker build -f myjdkDockerfile1 -t jdk8:v2.0 .
測試
docker run -it --name mj1 +容器ID(docker images查出來 第三列就是)
1.4、具體操作v3.0
編譯環境(寫代碼)的是class文件,運行文件是jre
?? 1.首先下載jre或者上傳
下載地址是https://www.java.com/en/download/manual.jsp,大概是77M
??? 最終下載的資料為:/jre-8u221-linux-x64.tar.gz
?? 解壓
????? tar -zxvf jre-8u221-linux-x64.tar.gz
????? #查看jre大小(瘦身前230M)
????? du -sh jre1.8.0_221
????? #進入jre目錄,并執行瘦身命令
????? cd jre1.8.0_221
????? #執行瘦身命令(命令見資料,瘦身后111M)
\換行|隔行運行命令
#刪除文本文件
rm -rf COPYRIGHT LICENSE README release THIRDPARTYLICENSEREADME-JAVAFX.txtTHIRDPARTYLICENSEREADME.txt Welcome.html \
#刪除其他無用文件
rm -rf lib/plugin.jar \
lib/ext/jfxrt.jar \
bin/javaws \
lib/javaws.jar \
lib/desktop \
plugin \
lib/deploy* \
lib/*javafx* \
lib/*jfx* \
lib/amd64/libdecora_sse.so \
lib/amd64/libprism_*.so \
lib/amd64/libfxplugins.so \
lib/amd64/libglass.so \
lib/amd64/libgstreamer-lite.so \
lib/amd64/libjavafx*.so \
lib/amd64/libjfx*.so
測試
返回上級,再次測試du -sh jre1.8.0_221大小
???????? ?
????? 返回上級目錄,重新打包jre
???
???
#返回上一級
cd ../#刪除之前220M的
rm -rf jre-8u221-linux-x64.tar.gz#打成壓縮包
tar -zcvf jre1.8.0_221.tar.gz jre1.8.0_221
創建并編輯dockerfile
vim myjdkdockerfile1
????? 注1:dockerfile內容如下
#1.指定基礎鏡像,并且必須是第一條指令 FROM alpine:latest #FROM alpine:3.10 #2.指明該鏡像的作者和其電子郵件 MAINTAINER xyz "xyz@qq.com" #3.在構建鏡像時,指定鏡像的工作目錄,之后的命令都是基于此工作目錄,如果不存在,則會創建目錄 WORKDIR /javaxl_docker/jdk #4.將一些安裝包復制到鏡像中,語法:ADD/COPY <src>... <dest> ## ADD與COPY的區別:ADD復制并解壓,COPY僅復制 ## 注意~~~上傳的瘦身后的jre ADD jre1.8.0_221.tar.gz /javaxl_docker/jdk/ ## glibc安裝包如果從網絡下載速度實在是太慢了,先提前下載復制到鏡像中 COPY glibc-2.29-r0.apk /javaxl_docker/jdk/ COPY glibc-bin-2.29-r0.apk /javaxl_docker/jdk/ COPY glibc-i18n-2.29-r0.apk /javaxl_docker/jdk/ #5.更新Alpine的軟件源為阿里云,因為從默認官源拉取實在太慢了 RUN echo http://mirrors.aliyun.com/alpine/v3.10/main/ > /etc/apk/repositories && \ ??? echo http://mirrors.aliyun.com/alpine/v3.10/community/ >> /etc/apk/repositories RUN apk update && apk upgrade #6.運行指定的命令 ## Alpine linux為了精簡本身并沒有安裝太多的常用軟件,apk類似于ubuntu的apt-get, ## 用來安裝一些常用軟V件,其語法如下:apk add bash wget curl git make vim docker ## wget是linux下的ftp/http傳輸工具,沒安裝會報錯“/bin/sh: wget: not found”,網上例子少安裝wget ## ca-certificates證書服務,是安裝glibc前置依賴 RUN apk --no-cache add ca-certificates wget \ ??? && wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub \ ??? && apk add glibc-2.29-r0.apk glibc-bin-2.29-r0.apk glibc-i18n-2.29-r0.apk \ ??? && rm -rf /var/cache/apk/* glibc-2.29-r0.apk glibc-bin-2.29-r0.apk glibc-i18n-2.29-r0.apk #7.配置環境變量 ## 注意~~~沒有jdk啦,直接指向jre ENV JAVA_HOME=/javaxl_docker/jdk/jre1.8.0_221 ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV PATH=$JAVA_HOME/bin:$PATH #容器啟動時需要執行的命令 #CMD ["java","-version"] |
?執行dockerfile創建鏡像
docker build -t myjdkdockerfile2?-t jdk8:v3.0 .
測試
查看(里面有id)
docker imagesdocker run -it --name mj2 容器iDjava -version
?? 注1:openjdk:8-jdk-alpine這個鏡像就和我們自己創建的鏡像是一樣,只不過JDK瘦身過了,體積更小。
??????? 另外,openjdk和jdk也是有一定區別的,大家可以看下資料“14 OpenJDK與JDK的區別分析 - 簡書.mht”了解一下
?? 注2:Alpine制作JDK8鏡像是有時區問題的,可以使用時區查看命令看一下
????
二、配置阿里云鏡像倉庫
2.1、Docker鏡像上傳至阿里云
容器鏡像服務 (aliyun.com)
認證一下
退出去再次按照之前那樣進入
2.2、推送阿里云
復制這個去瀏覽器
復制令牌
綁定成功就代表成功了
回答上傳阿里再次開始
發現Godeup有選擇了
復制它去登錄,注意不用把$它也復制上去,否則報錯
登錄
輸入密碼后要等一會
忘記密碼可以點擊菜單:“容器鏡像服務”->“默認實例”-->“訪問憑證”進行修改
?? docker login --username=javaxl registry.cn-shenzhen.aliyuncs.com
上傳
#查看(可以看到容器id)
docker images#打標
docker tag 容器id registry.cn-shenzhen.aliyuncs.com/javaxl/alpine_jre:[鏡像版本號]#上傳
docker push registry.cn-shenzhen.aliyuncs.com/javaxl/alpine_jre:[鏡像版本號]
?
檢查成功
下拉
假設換了服務器,所有要刪除本地的
#刪除,刪除失敗用下面的
dockker rmi -f 容器端口號#查看
docker ps#
docker rm -f mj2docker rmi -f 容器端口號
?? 從Registry中拉取鏡像
?? docker pull registry.cn-shenzhen.aliyuncs.com/javaxl/alpine_jre:[鏡像版本號]
測試運行
#
docker images#mj3 取一個名字
docker run -it --name mj3 容器idjava -version