如何在Docker中部署運(yùn)行jar
基本前提條件
1、系統(tǒng)已安裝Docker。
2、系統(tǒng)可上網(wǎng)。
第一大步
docker search justrydeng搜索Docker的JDK鏡像
注:這是本人自己組裝并上傳到Docker官方倉庫里的一個jdk8的鏡像。如果讀者不想用這個鏡像,那么也可以使
用其他的jdk鏡像。
第二大步
docker pull justrydeng/jdk8拉取(下載)鏡像
此時,就可以看到:本地有鏡像了:
第三大步
根據(jù)要運(yùn)行的.jar文件,使用Dockerfile + build生成對應(yīng)的新鏡像,并利用該鏡像生成容器
假設(shè):我們要運(yùn)行的jar包是jenkins-0.0.1-SNAPSHOT.jar。
第一小步:創(chuàng)建一個Dockerfile文件并編寫,如(這是編寫后的樣子):
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里為啟動jar包的指令,根據(jù)不同的需求,編寫對應(yīng)的啟動jar包指令即可。
說明一:RUN指令的作用是當(dāng)利用新的鏡像創(chuàng)建容器后,容器馬上再創(chuàng)建一個目錄,來放置后面會放進(jìn)去的jar文件,這么做的目的是為了歸類方便管理。
追注:實(shí)際上,此一步不是必要的,因?yàn)橐话愣?一個Docker容器就運(yùn)行一個jar包,所以也可以直接將jar包放置在/下也行。
說明二:CMD指令的作用是:當(dāng)docker start 啟動容器后(注意:是啟動,而不是創(chuàng)建),會馬上執(zhí)行該指令。
第二小步:使用docker build指令,生成新的鏡像;如這里:
docker build -t justrydeng/jar . -f jarDockerfile
說明一:因?yàn)槲覀儎?chuàng)建新的鏡像時,不需要什么外部的東西,所以我們指定其上下文“母體”時,最好指定一個空的文件夾或者指定一個幾乎不含內(nèi)容的文件夾。本人這里為了方便,指定的是當(dāng)前文件夾。
此時,可看見,已經(jīng)生成了新的鏡像:
第三小步:使用docker run指令,配置映射、生成容器,如:
docker run -p 8080:8080 --name jenkins-docker-test -d justrydeng/jar
說明一:-p 8080:8080作用是,將宿主機(jī)的端口8080(前面那個),與docker的端口8080(后面那個)映射。
說明二:docker ps 只能查看正在運(yùn)行著的容器,而docker ps -a可以查看所有的容器。
第四大步
使用docker cp將宿主機(jī)中的jar包,拷貝至容器中的對應(yīng)位置
如:
docker cp jenkins-0.0.1-SNAPSHOT.jar jenkins-docker-test:/var/jarDir/jenkins-docker-test
說明一:將jar包放進(jìn)容器中的對應(yīng)的位置(即:Dockerfile的CMD指令對應(yīng)的位置)。
說明二:只要容器存在(無論容器是否正在運(yùn)行),就能將東西放進(jìn)去。
第五大步
docker start啟動容器即可
如:
docker start jenkins-docker-test
第六大步
http://宿主機(jī)ip:映射后的宿主機(jī)端口訪問測試
提示,該jar包中的Controller方法有:
訪問:http://10.8.109.60:8080/jenkins/test?name=JustryDeng
由此可見:在Docker的容器中部署運(yùn)行jar包,成功!
拓展一
編寫一個通用的運(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文件的文件名。
> 在后面使用時,我們可以使用同一個鏡像來制作對應(yīng)不同端口(不同服務(wù))的容器
docker run -p 宿主機(jī)端口:要映射的容器端口 --name 容器名 -d justrydeng/common-run-jar
> 在更新jar包時,需要在把xxx.jar包復(fù)制進(jìn)容器時,統(tǒng)一重命名為app.jar
docker cp 宿主機(jī)jar包 容器名(或容器ID):/jarAppDir/app.jar
說明:此方式的優(yōu)勢在于:每次如果要更新jar包,只需要先將容器stop,然后直接替換容器里面的jar包,最后再將該容器start即可。無需每次都創(chuàng)建新的鏡像,創(chuàng)建新的容器。
拓展二
解決Docker部署微服務(wù)時,服務(wù)之間不能調(diào)用的問題(示例)
調(diào)用服務(wù)出錯時的Eureka:
如圖所示:
eureka找服務(wù)時,會根據(jù)服務(wù)名【efficiency-taskrelease-service】,找到對應(yīng)的要訪問的地址【6129d46c643e:2050】;一般的,如果我們在微服務(wù)中只配了:
的話,那么這個服務(wù)注冊到eureka中的就可能是【主機(jī)名:服務(wù)應(yīng)用名稱:服務(wù)端口號】。
如果主機(jī)名是localhost的話,那可能影響不大;
但是如果主機(jī)名是其他的什么的話(如:6129d46c643e),那么就可能造成java.net.UnknownHostException: 6129d46c643e異常,將微服務(wù)放在Docker容器中進(jìn)行服務(wù)注冊時可能會出問題,微服務(wù)會將Docker容器的主機(jī)名(而不是宿主機(jī)的主機(jī)名)注冊到eureka上,這時我們可以通過配置,來指定使用宿主機(jī)的ip,如:
注:此時,可以不需要指定server.port了,因?yàn)槲覀円呀?jīng)在eureka.instance.instance-id中指明了;但spring.application.name還是需要指明的。
配置完成后,再重啟服務(wù),再次查看eureka,可看見:
此時,微服務(wù)集成Docker時,各個服務(wù)不能調(diào)用的問題就得到了解決!
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Docker實(shí)現(xiàn)安裝ELK(單節(jié)點(diǎn))
這篇文章主要介紹了Docker實(shí)現(xiàn)安裝ELK(單節(jié)點(diǎn)),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08使用Docker部署Spring Boot的實(shí)現(xiàn)方法
這篇文章主要介紹了使用Docker部署Spring Boot的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Docker基礎(chǔ)學(xué)習(xí)之?dāng)?shù)據(jù)管理
我們在使用Docker 的時候,會產(chǎn)生很多數(shù)據(jù),比如web服務(wù)器啊,數(shù)據(jù)庫之類的,有時我們還需要備份或復(fù)制這些數(shù)據(jù),這就需要涉及到Docker的數(shù)據(jù)管理了。這篇文章就給大家詳細(xì)的介紹Docker的數(shù)據(jù)管理,感興趣的朋友們可以參考借鑒,下面來一起看看吧。2016-10-10docker安裝nacos并配置數(shù)據(jù)庫的全過程
這篇文章主要給大家介紹了關(guān)于docker安裝nacos并配置數(shù)據(jù)庫的相關(guān)資料, Nacos是SpringCloudAlibaba架構(gòu)中最重要的組件,Nacos 是一個更易于幫助構(gòu)建云原生應(yīng)用的動態(tài)服務(wù)發(fā)現(xiàn)、配置和服務(wù)管理平臺,文中介紹的非常信息,需要的朋友可以參考下2023-09-09基于Docker、Nginx和Jenkins實(shí)現(xiàn)前端自動化部署
本文主要介紹了搭建Docker+Nginx+Jenkins環(huán)境,用于實(shí)現(xiàn)前端自動化部署的流程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-07-07Docker安裝RabbitMQ并安裝延時隊(duì)列插件
本文主要介紹了Docker安裝RabbitMQ并安裝延時隊(duì)列插件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05