如何在Docker中部署運行jar
基本前提條件
1、系統(tǒng)已安裝Docker。
2、系統(tǒng)可上網(wǎng)。
第一大步
docker search justrydeng搜索Docker的JDK鏡像
注:這是本人自己組裝并上傳到Docker官方倉庫里的一個jdk8的鏡像。如果讀者不想用這個鏡像,那么也可以使
用其他的jdk鏡像。
第二大步
docker pull justrydeng/jdk8拉取(下載)鏡像
此時,就可以看到:本地有鏡像了:
第三大步
根據(jù)要運行的.jar文件,使用Dockerfile + build生成對應(yīng)的新鏡像,并利用該鏡像生成容器
假設(shè):我們要運行的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指令的作用是當利用新的鏡像創(chuàng)建容器后,容器馬上再創(chuàng)建一個目錄,來放置后面會放進去的jar文件,這么做的目的是為了歸類方便管理。
追注:實際上,此一步不是必要的,因為一般而言,一個Docker容器就運行一個jar包,所以也可以直接將jar包放置在/下也行。
說明二:CMD指令的作用是:當docker start 啟動容器后(注意:是啟動,而不是創(chuàng)建),會馬上執(zhí)行該指令。
第二小步:使用docker build指令,生成新的鏡像;如這里:
docker build -t justrydeng/jar . -f jarDockerfile
說明一:因為我們創(chuàng)建新的鏡像時,不需要什么外部的東西,所以我們指定其上下文“母體”時,最好指定一個空的文件夾或者指定一個幾乎不含內(nèi)容的文件夾。本人這里為了方便,指定的是當前文件夾。
此時,可看見,已經(jīng)生成了新的鏡像:
第三小步:使用docker run指令,配置映射、生成容器,如:
docker run -p 8080:8080 --name jenkins-docker-test -d justrydeng/jar
說明一:-p 8080:8080作用是,將宿主機的端口8080(前面那個),與docker的端口8080(后面那個)映射。
說明二:docker ps 只能查看正在運行著的容器,而docker ps -a可以查看所有的容器。
第四大步
使用docker cp將宿主機中的jar包,拷貝至容器中的對應(yīng)位置
如:
docker cp jenkins-0.0.1-SNAPSHOT.jar jenkins-docker-test:/var/jarDir/jenkins-docker-test
說明一:將jar包放進容器中的對應(yīng)的位置(即:Dockerfile的CMD指令對應(yīng)的位置)。
說明二:只要容器存在(無論容器是否正在運行),就能將東西放進去。
第五大步
docker start啟動容器即可
如:
docker start jenkins-docker-test
第六大步
http://宿主機ip:映射后的宿主機端口訪問測試
提示,該jar包中的Controller方法有:
訪問:http://10.8.109.60:8080/jenkins/test?name=JustryDeng
由此可見:在Docker的容器中部署運行jar包,成功!
拓展一
編寫一個通用的運行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 宿主機端口:要映射的容器端口 --name 容器名 -d justrydeng/common-run-jar
> 在更新jar包時,需要在把xxx.jar包復制進容器時,統(tǒng)一重命名為app.jar
docker cp 宿主機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中的就可能是【主機名:服務(wù)應(yīng)用名稱:服務(wù)端口號】。
如果主機名是localhost的話,那可能影響不大;
但是如果主機名是其他的什么的話(如:6129d46c643e),那么就可能造成java.net.UnknownHostException: 6129d46c643e異常,將微服務(wù)放在Docker容器中進行服務(wù)注冊時可能會出問題,微服務(wù)會將Docker容器的主機名(而不是宿主機的主機名)注冊到eureka上,這時我們可以通過配置,來指定使用宿主機的ip,如:
注:此時,可以不需要指定server.port了,因為我們已經(jīng)在eureka.instance.instance-id中指明了;但spring.application.name還是需要指明的。
配置完成后,再重啟服務(wù),再次查看eureka,可看見:
此時,微服務(wù)集成Docker時,各個服務(wù)不能調(diào)用的問題就得到了解決!
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用Docker部署Spring Boot的實現(xiàn)方法
這篇文章主要介紹了使用Docker部署Spring Boot的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-08-08docker安裝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實現(xiàn)前端自動化部署
本文主要介紹了搭建Docker+Nginx+Jenkins環(huán)境,用于實現(xiàn)前端自動化部署的流程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-07-07