如何在Docker中部署運(yùn)行jar
基本前提條件
1、系統(tǒng)已安裝Docker。
2、系統(tǒng)可上網(wǎng)。
第一大步
docker search justrydeng搜索Docker的JDK鏡像

注:這是本人自己組裝并上傳到Docker官方倉(cāng)庫(kù)里的一個(gè)jdk8的鏡像。如果讀者不想用這個(gè)鏡像,那么也可以使
用其他的jdk鏡像。
第二大步
docker pull justrydeng/jdk8拉取(下載)鏡像

此時(shí),就可以看到:本地有鏡像了:

第三大步
根據(jù)要運(yùn)行的.jar文件,使用Dockerfile + build生成對(duì)應(yīng)的新鏡像,并利用該鏡像生成容器
假設(shè):我們要運(yùn)行的jar包是jenkins-0.0.1-SNAPSHOT.jar。
第一小步:創(chuàng)建一個(gè)Dockerfile文件并編寫(xiě),如(這是編寫(xiě)后的樣子):
FROM justrydeng/jdk8 MAINTAINER dengshuai<13548417409@163.com> RUN mkdir /var/jarDir && mkdir /var/jarDir/jenkins-docker-test CMD ["nohup","java","-jar","/var/jarDir/jenkins-docker-test/jenkins-0.0.1-SNAPSHOT.jar","&"]
提示:此CMD里為啟動(dòng)jar包的指令,根據(jù)不同的需求,編寫(xiě)對(duì)應(yīng)的啟動(dòng)jar包指令即可。
說(shuō)明一:RUN指令的作用是當(dāng)利用新的鏡像創(chuàng)建容器后,容器馬上再創(chuàng)建一個(gè)目錄,來(lái)放置后面會(huì)放進(jìn)去的jar文件,這么做的目的是為了歸類(lèi)方便管理。
追注:實(shí)際上,此一步不是必要的,因?yàn)橐话愣?一個(gè)Docker容器就運(yùn)行一個(gè)jar包,所以也可以直接將jar包放置在/下也行。
說(shuō)明二:CMD指令的作用是:當(dāng)docker start 啟動(dòng)容器后(注意:是啟動(dòng),而不是創(chuàng)建),會(huì)馬上執(zhí)行該指令。
第二小步:使用docker build指令,生成新的鏡像;如這里:
docker build -t justrydeng/jar . -f jarDockerfile

說(shuō)明一:因?yàn)槲覀儎?chuàng)建新的鏡像時(shí),不需要什么外部的東西,所以我們指定其上下文“母體”時(shí),最好指定一個(gè)空的文件夾或者指定一個(gè)幾乎不含內(nèi)容的文件夾。本人這里為了方便,指定的是當(dāng)前文件夾。
此時(shí),可看見(jiàn),已經(jīng)生成了新的鏡像:

第三小步:使用docker run指令,配置映射、生成容器,如:
docker run -p 8080:8080 --name jenkins-docker-test -d justrydeng/jar

說(shuō)明一:-p 8080:8080作用是,將宿主機(jī)的端口8080(前面那個(gè)),與docker的端口8080(后面那個(gè))映射。
說(shuō)明二:docker ps 只能查看正在運(yùn)行著的容器,而docker ps -a可以查看所有的容器。
第四大步
使用docker cp將宿主機(jī)中的jar包,拷貝至容器中的對(duì)應(yīng)位置
如:
docker cp jenkins-0.0.1-SNAPSHOT.jar jenkins-docker-test:/var/jarDir/jenkins-docker-test

說(shuō)明一:將jar包放進(jìn)容器中的對(duì)應(yīng)的位置(即:Dockerfile的CMD指令對(duì)應(yīng)的位置)。
說(shuō)明二:只要容器存在(無(wú)論容器是否正在運(yùn)行),就能將東西放進(jìn)去。
第五大步
docker start啟動(dòng)容器即可
如:
docker start jenkins-docker-test

第六大步
http://宿主機(jī)ip:映射后的宿主機(jī)端口訪(fǎng)問(wèn)測(cè)試
提示,該jar包中的Controller方法有:

訪(fǎng)問(wèn):http://10.8.109.60:8080/jenkins/test?name=JustryDeng

由此可見(jiàn):在Docker的容器中部署運(yùn)行jar包,成功!
拓展一
編寫(xiě)一個(gè)通用的運(yùn)行jar包的鏡像(這里只給思路,不給具體示例)
> Dockerfile如:
FROM justrydeng/jdk8 MAINTAINER dengshuai<13548417409@163.com> RUN mkdir /jarAppDir/ CMD ["nohup","java","-jar","/jarAppDir/app.jar","&"]
> 生成鏡像docker build -t justrydeng/common-run-jar . -f jarDockerfile
注: -f 可以指定Dockerfile文件的文件名。
> 在后面使用時(shí),我們可以使用同一個(gè)鏡像來(lái)制作對(duì)應(yīng)不同端口(不同服務(wù))的容器
docker run -p 宿主機(jī)端口:要映射的容器端口 --name 容器名 -d justrydeng/common-run-jar
> 在更新jar包時(shí),需要在把xxx.jar包復(fù)制進(jìn)容器時(shí),統(tǒng)一重命名為app.jar
docker cp 宿主機(jī)jar包 容器名(或容器ID):/jarAppDir/app.jar
說(shuō)明:此方式的優(yōu)勢(shì)在于:每次如果要更新jar包,只需要先將容器stop,然后直接替換容器里面的jar包,最后再將該容器start即可。無(wú)需每次都創(chuàng)建新的鏡像,創(chuàng)建新的容器。
拓展二
解決Docker部署微服務(wù)時(shí),服務(wù)之間不能調(diào)用的問(wèn)題(示例)
調(diào)用服務(wù)出錯(cuò)時(shí)的Eureka:

如圖所示:
eureka找服務(wù)時(shí),會(huì)根據(jù)服務(wù)名【efficiency-taskrelease-service】,找到對(duì)應(yīng)的要訪(fǎng)問(wèn)的地址【6129d46c643e:2050】;一般的,如果我們?cè)谖⒎?wù)中只配了:

的話(huà),那么這個(gè)服務(wù)注冊(cè)到eureka中的就可能是【主機(jī)名:服務(wù)應(yīng)用名稱(chēng):服務(wù)端口號(hào)】。
如果主機(jī)名是localhost的話(huà),那可能影響不大;
但是如果主機(jī)名是其他的什么的話(huà)(如:6129d46c643e),那么就可能造成java.net.UnknownHostException: 6129d46c643e異常,將微服務(wù)放在Docker容器中進(jìn)行服務(wù)注冊(cè)時(shí)可能會(huì)出問(wèn)題,微服務(wù)會(huì)將Docker容器的主機(jī)名(而不是宿主機(jī)的主機(jī)名)注冊(cè)到eureka上,這時(shí)我們可以通過(guò)配置,來(lái)指定使用宿主機(jī)的ip,如:

注:此時(shí),可以不需要指定server.port了,因?yàn)槲覀円呀?jīng)在eureka.instance.instance-id中指明了;但spring.application.name還是需要指明的。
配置完成后,再重啟服務(wù),再次查看eureka,可看見(jiàn):

此時(shí),微服務(wù)集成Docker時(shí),各個(gè)服務(wù)不能調(diào)用的問(wèn)題就得到了解決!
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解如何用docker安裝laravel開(kāi)發(fā)環(huán)境
本篇文章主要介紹了詳解如何用docker安裝laravel開(kāi)發(fā)環(huán)境,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02
Docker部署Java應(yīng)用程序的實(shí)現(xiàn)步驟
本文主要介紹了Docker部署Java應(yīng)用程序的實(shí)現(xiàn)步驟,通過(guò)將Java應(yīng)用程序打包成一個(gè)Docker鏡像,可以實(shí)現(xiàn)快速部署、資源隔離和靈活擴(kuò)展,感興趣的可以了解一下2024-03-03
Docker實(shí)現(xiàn)容器化的分布式鎖服務(wù)RedisLock的快速搭建
本文主要介紹了Docker實(shí)現(xiàn)容器化的分布式鎖服務(wù)RedisLock的快速搭建,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2026-04-04
Docker訪(fǎng)問(wèn)容器中的Spring Boot日志的幾種方法
在本文中,我們將演示如何在Docker容器中訪(fǎng)問(wèn)Spring Boot日志,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2026-04-04
docker build上下文的實(shí)現(xiàn)示例
Docker build上下文是構(gòu)建Docker鏡像時(shí)傳遞給Docker引擎的所有文件和目錄的集合,可以提高構(gòu)建效率,避免無(wú)用文件的傳輸,同時(shí)確保鏡像構(gòu)建過(guò)程的順利進(jìn)行,感興趣的可以了解一下2025-09-09
Docker如何解決tomcat容器啟動(dòng)成功,無(wú)法訪(fǎng)問(wèn)的問(wèn)題
這篇文章主要介紹了Docker如何解決tomcat容器啟動(dòng)成功,無(wú)法訪(fǎng)問(wèn)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
Docker中安裝Redis并開(kāi)啟遠(yuǎn)程訪(fǎng)問(wèn)的詳細(xì)步驟
這篇文章主要介紹了Docker中安裝Redis并開(kāi)啟遠(yuǎn)程訪(fǎng)問(wèn)的詳細(xì)步驟,文中有詳細(xì)的代碼示例供大家參考,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2025-01-01
如何使用docker+frp進(jìn)行內(nèi)網(wǎng)穿透
這篇文章主要介紹了使用docker+frp進(jìn)行內(nèi)網(wǎng)穿透,在公網(wǎng)上的ubuntu系統(tǒng)需要配置相關(guān)操作,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04

