摘要:完成之后運行命令你的輸出可能會像這樣和都為,這是因為剛剛在編寫時沒有指定它們。多階段構(gòu)建鏡像多階段構(gòu)建鏡像其實運行程序只需要就行,我們沒有必要使用作為基礎(chǔ)鏡像。但把程序打包成包,然后再交給的方式太麻煩了。
先在當(dāng)前目錄創(chuàng)建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); }}
然后創(chuàng)建Dockerfile
## 設(shè)置基礎(chǔ)鏡像FROM openjdk:8## 設(shè)置進(jìn)入容器時的工作目錄WORKDIR /root/app## 將本地目錄復(fù)制進(jìn)容器目錄中COPY App.java /root/app## 鏡像制作時執(zhí)行的命令RUN javac App.java## 容器啟動時執(zhí)行的命令ENTRYPOINT java App
準(zhǔn)備工作做好之后在當(dāng)前目錄輸入命令
docker build .
.
是指明Dockerfile文件在哪個路徑之下,因為我們是在當(dāng)前路徑下創(chuàng)建的,所以只需要填寫.
就好。
build完成之后運行命令:
docker images## 你的輸出可能會像這樣REPOSITORY TAG IMAGE ID CREATED SIZE 2045f43c5e88 6 hours ago 526MB
REPOSITORY
和TAG
都為
,這是因為剛剛在編寫Dockerfile
時沒有指定它們。
之后的段落里會解決這個問題,對于這個簡單的項目,我們只需要IMAGE ID
就夠了。
現(xiàn)在根據(jù)鏡像啟動容器,運行命令:
## 偷懶的話可以只打IMAGE ID的前三位## 這個IMAGE ID要根據(jù)你實際build出來的鏡像進(jìn)行修改## 請務(wù)必運行前一條命令docker images, 找到對應(yīng)的IDdocker run 2045f43c5e88
輸出如下:
Linuxamd645.4.72-microsoft-standard-WSL2
這段Java程序的作用就是輸出當(dāng)前操作系統(tǒng)的環(huán)境,根據(jù)輸出可以知道博主是在WSL2
上運行docker
的。
FROM alpineWORKDIR /root/appCOPY App.java /root/appRUN apk add openjdk8## 設(shè)置環(huán)境變量ENV JAVA_HOME /usr/lib/jvm/java-1.8-openjdkENV PATH $PATH:$JAVA_HOME/binRUN javac App.javaENTRYPOINT java App
為了便于區(qū)別兩次構(gòu)建出的不同鏡像,我們給之前的鏡像打上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
可以看到兩個鏡像已經(jīng)被分別打上了tag
,不過值得注意的是tag
為1.0的鏡像體積要比2.0的大,這是為什么?
直接將openjdk作為基礎(chǔ)鏡像會包含所有的Java語言編譯工具和庫。
其實運行Java程序只需要jre就行,我們沒有必要使用jdk作為基礎(chǔ)鏡像。但把程序打包成jar包,然后再交給docker的方式太麻煩了。
有沒有辦法實現(xiàn)編譯、打包、運行一體化呢?
當(dāng)然是有的,簡單修改一下Dockerfile就可以了
先基于Maven鏡像生成jar包,最后運行在jre鏡像中,同時刪除已經(jīng)用不到的Maven鏡像
首先創(chuàng)建一個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
然后在項目的根目錄下創(chuàng)建Dockerfile
文件
## build stageFROM maven:3.8.3-jdk-8 AS MAVEN_BUILDWORKDIR /build/# 把本地的pom.xml和src目錄復(fù)制到鏡像的/build目錄下COPY pom.xml /build/COPY src /build/src/# 執(zhí)行打包命令RUN mvn package## run sFROM openjdk:8-jre-alpine# 設(shè)置工作目錄在鏡像的 /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 | 基礎(chǔ)鏡像 |
MAINTAINER | 維護(hù)者信息 |
ADD | 添加文件到鏡像(自動解壓) |
COPY | 添加文件到鏡像(不解壓) |
USER | 設(shè)置運行RUN指令的用戶 |
ENV | 設(shè)置環(huán)境變量 |
RUN | 鏡像制作時執(zhí)行的命令 |
ENTRYPOINT | 容器啟動時執(zhí)行的命令(無法被覆蓋) |
CMD | 容器啟動時執(zhí)行的命令(多條CMD只執(zhí)行最后一條) |
EXPOSE | 聲明要打開的端口(實際還是要docker run -p port1:port2 才行) |
VOLUME | 目錄映射 |
ONBUILD | 構(gòu)建時自動執(zhí)行的命令 |
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/125095.html
摘要:應(yīng)用化極簡教程陳光劍基于的企業(yè)級應(yīng)用開發(fā)最佳實踐前面的章節(jié)中,我們都是在環(huán)境中開發(fā)運行測試應(yīng)用程序。關(guān)鍵字是分布式應(yīng)用微服務(wù)容器虛擬化。通常,在企業(yè)項目實踐中,會實現(xiàn)一套應(yīng)用部署發(fā)布的自動化運維平臺工具。 Spring Boot 應(yīng)用 Docker 化 《Spring Boot 2.0極簡教程》(陳光劍)—— 基于 Gradle + Kotlin的企業(yè)級應(yīng)用開發(fā)最佳實踐 前面的章節(jié)中,...
摘要:應(yīng)用化極簡教程陳光劍基于的企業(yè)級應(yīng)用開發(fā)最佳實踐前面的章節(jié)中,我們都是在環(huán)境中開發(fā)運行測試應(yīng)用程序。關(guān)鍵字是分布式應(yīng)用微服務(wù)容器虛擬化。通常,在企業(yè)項目實踐中,會實現(xiàn)一套應(yīng)用部署發(fā)布的自動化運維平臺工具。 Spring Boot 應(yīng)用 Docker 化 《Spring Boot 2.0極簡教程》(陳光劍)—— 基于 Gradle + Kotlin的企業(yè)級應(yīng)用開發(fā)最佳實踐 前面的章節(jié)中,...
摘要:通過指令可以將可修改層提交到鏡像中,從而生成一個新的鏡像。倉庫有了鏡像之后,可以很方便的在不同的機器上運行一致的環(huán)境。數(shù)據(jù)卷是獨立于容器存在的,容器銷毀后數(shù)據(jù)卷仍然存在。 Docker是一款比傳統(tǒng)虛擬機軟件更先進(jìn)的虛擬化工具,可以快速的在不同機器上搭建出一致的開發(fā)、調(diào)試、運行環(huán)境。它的核心概念有鏡像、容器和倉庫。 鏡像(Image) 類似于ISO文件,是一個打包好的運行環(huán)境。一個鏡像可...
摘要:今天小數(shù)給大家?guī)硪黄夹g(shù)正能量滿滿的分享來自社區(qū)線上群分享的實錄,分享嘉賓是數(shù)人云肖德時。第二級調(diào)度由被稱作的組件組成。它們是最小的部署單元,由統(tǒng)一創(chuàng)建調(diào)度管理。 今天小數(shù)給大家?guī)硪黄夹g(shù)正能量滿滿的分享——來自KVM社區(qū)線上群分享的實錄,分享嘉賓是數(shù)人云CTO肖德時。 嘉賓介紹: 肖德時,數(shù)人云CTO 十五年計算機行業(yè)從業(yè)經(jīng)驗,曾為紅帽 Engineering Service ...
閱讀 769·2023-04-25 19:43
閱讀 4022·2021-11-30 14:52
閱讀 3855·2021-11-30 14:52
閱讀 3909·2021-11-29 11:00
閱讀 3839·2021-11-29 11:00
閱讀 3949·2021-11-29 11:00
閱讀 3613·2021-11-29 11:00
閱讀 6310·2021-11-29 11:00