摘要:完成之后運行命令你的輸出可能會像這樣和都為,這是因為剛剛在編寫時沒有指定它們。多階段構建鏡像多階段構建鏡像其實運行程序只需要就行,我們沒有必要使用作為基礎鏡像。但把程序打包成包,然后再交給的方式太麻煩了。
先在當前目錄創建App.java文件
public class App{ public static void main(String[] args){ String os = System.getProperty("os.name"); String osArch = System.getProperty("os.arch"); String osVersion = System.getProperty("os.version"); System.out.println(os); System.out.println(osArch); System.out.println(osVersion); }}
然后創建Dockerfile
## 設置基礎鏡像FROM openjdk:8## 設置進入容器時的工作目錄WORKDIR /root/app## 將本地目錄復制進容器目錄中COPY App.java /root/app## 鏡像制作時執行的命令RUN javac App.java## 容器啟動時執行的命令ENTRYPOINT java App
準備工作做好之后在當前目錄輸入命令
docker build .
.
是指明Dockerfile文件在哪個路徑之下,因為我們是在當前路徑下創建的,所以只需要填寫.
就好。
build完成之后運行命令:
docker images## 你的輸出可能會像這樣REPOSITORY TAG IMAGE ID CREATED SIZE 2045f43c5e88 6 hours ago 526MB
REPOSITORY
和TAG
都為
,這是因為剛剛在編寫Dockerfile
時沒有指定它們。
之后的段落里會解決這個問題,對于這個簡單的項目,我們只需要IMAGE ID
就夠了。
現在根據鏡像啟動容器,運行命令:
## 偷懶的話可以只打IMAGE ID的前三位## 這個IMAGE ID要根據你實際build出來的鏡像進行修改## 請務必運行前一條命令docker images, 找到對應的IDdocker run 2045f43c5e88
輸出如下:
Linuxamd645.4.72-microsoft-standard-WSL2
這段Java程序的作用就是輸出當前操作系統的環境,根據輸出可以知道博主是在WSL2
上運行docker
的。
FROM alpineWORKDIR /root/appCOPY App.java /root/appRUN apk add openjdk8## 設置環境變量ENV JAVA_HOME /usr/lib/jvm/java-1.8-openjdkENV PATH $PATH:$JAVA_HOME/binRUN javac App.javaENTRYPOINT java App
為了便于區別兩次構建出的不同鏡像,我們給之前的鏡像打上tag
使用命令:
docker tag 2045 myapp:1.0
在build
時可以使用-t
來為鏡像打tag
docker build . -t myapp:2.0
再次運行命令
docker images
REPOSITORY TAG IMAGE ID CREATED SIZEmyapp 1.0 2045f43c5e88 12 hours ago 526MBmyapp 2.0 0545999c0fc0 25 hours ago 131MB
可以看到兩個鏡像已經被分別打上了tag
,不過值得注意的是tag
為1.0的鏡像體積要比2.0的大,這是為什么?
直接將openjdk作為基礎鏡像會包含所有的Java語言編譯工具和庫。
其實運行Java程序只需要jre就行,我們沒有必要使用jdk作為基礎鏡像。但把程序打包成jar包,然后再交給docker的方式太麻煩了。
有沒有辦法實現編譯、打包、運行一體化呢?
當然是有的,簡單修改一下Dockerfile就可以了
先基于Maven鏡像生成jar包,最后運行在jre鏡像中,同時刪除已經用不到的Maven鏡像
首先創建一個maven項目
這是我的pom.xml文件
4.0.0 org.example demoapp app demoapp http://www.example.com UTF-8 1.8 1.8 junit junit 4.11 test maven-clean-plugin 3.1.0 maven-resources-plugin 3.0.2 maven-compiler-plugin 3.8.0 maven-surefire-plugin 2.22.1 maven-jar-plugin 3.0.2 true false lib/ org.example.App maven-install-plugin 2.5.2 maven-deploy-plugin 2.8.2 maven-site-plugin 3.7.1 maven-project-info-reports-plugin 3.0.0
然后在項目的根目錄下創建Dockerfile
文件
## build stageFROM maven:3.8.3-jdk-8 AS MAVEN_BUILDWORKDIR /build/# 把本地的pom.xml和src目錄復制到鏡像的/build目錄下COPY pom.xml /build/COPY src /build/src/# 執行打包命令RUN mvn package## run sFROM openjdk:8-jre-alpine# 設置工作目錄在鏡像的 /app 目錄下WORKDIR /app# 將第一階段生成的jar包添加到第二階段的容器中COPY --from=MAVEN_BUILD /build/target/demoapp-app.jar /app/# 運行jar包ENTRYPOINT java -jar demoapp-app.jar
REPOSITORY TAG IMAGE ID CREATED SIZE 770d75ab38d7 7 seconds ago 84.9MB
最后生成的鏡像大小要比之前的500MB小了很多
命令 | 描述 |
---|---|
FROM | 基礎鏡像 |
MAINTAINER | 維護者信息 |
ADD | 添加文件到鏡像(自動解壓) |
COPY | 添加文件到鏡像(不解壓) |
USER | 設置運行RUN指令的用戶 |
ENV | 設置環境變量 |
RUN | 鏡像制作時執行的命令 |
ENTRYPOINT | 容器啟動時執行的命令(無法被覆蓋) |
CMD | 容器啟動時執行的命令(多條CMD只執行最后一條) |
EXPOSE | 聲明要打開的端口(實際還是要docker run -p port1:port2 才行) |
VOLUME | 目錄映射 |
ONBUILD | 構建時自動執行的命令 |
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/125095.html
摘要:應用化極簡教程陳光劍基于的企業級應用開發最佳實踐前面的章節中,我們都是在環境中開發運行測試應用程序。關鍵字是分布式應用微服務容器虛擬化。通常,在企業項目實踐中,會實現一套應用部署發布的自動化運維平臺工具。 Spring Boot 應用 Docker 化 《Spring Boot 2.0極簡教程》(陳光劍)—— 基于 Gradle + Kotlin的企業級應用開發最佳實踐 前面的章節中,...
摘要:應用化極簡教程陳光劍基于的企業級應用開發最佳實踐前面的章節中,我們都是在環境中開發運行測試應用程序。關鍵字是分布式應用微服務容器虛擬化。通常,在企業項目實踐中,會實現一套應用部署發布的自動化運維平臺工具。 Spring Boot 應用 Docker 化 《Spring Boot 2.0極簡教程》(陳光劍)—— 基于 Gradle + Kotlin的企業級應用開發最佳實踐 前面的章節中,...
摘要:通過指令可以將可修改層提交到鏡像中,從而生成一個新的鏡像。倉庫有了鏡像之后,可以很方便的在不同的機器上運行一致的環境。數據卷是獨立于容器存在的,容器銷毀后數據卷仍然存在。 Docker是一款比傳統虛擬機軟件更先進的虛擬化工具,可以快速的在不同機器上搭建出一致的開發、調試、運行環境。它的核心概念有鏡像、容器和倉庫。 鏡像(Image) 類似于ISO文件,是一個打包好的運行環境。一個鏡像可...
摘要:今天小數給大家帶來一篇技術正能量滿滿的分享來自社區線上群分享的實錄,分享嘉賓是數人云肖德時。第二級調度由被稱作的組件組成。它們是最小的部署單元,由統一創建調度管理。 今天小數給大家帶來一篇技術正能量滿滿的分享——來自KVM社區線上群分享的實錄,分享嘉賓是數人云CTO肖德時。 嘉賓介紹: 肖德時,數人云CTO 十五年計算機行業從業經驗,曾為紅帽 Engineering Service ...
閱讀 713·2023-04-25 19:43
閱讀 3910·2021-11-30 14:52
閱讀 3784·2021-11-30 14:52
閱讀 3852·2021-11-29 11:00
閱讀 3783·2021-11-29 11:00
閱讀 3869·2021-11-29 11:00
閱讀 3558·2021-11-29 11:00
閱讀 6105·2021-11-29 11:00