在Docker中部署執行jar
宣告:瀏覽此部落格,最好會一點Docker基礎知識。
基本前提條件:
1、系統已安裝Docker。
2、系統可上網。
第一大步:docker search justrydeng搜尋Docker的JDK映象
注:這是本人自己組裝並上傳到Docker官方倉庫裡的一個jdk8的映象。如果讀者不想用這個映象,那麼也可以使 用其他的jdk映象。
第二大步:docker pull justrydeng/jdk8拉取(下載)映象
此時,就可以看到:本地有映象了:
第三大步:根據要執行的.jar檔案,使用Dockerfile + build生成對應的新映象,並利用該映象生成容器
假設:我們要執行的jar包是jenkins-0.0.1-SNAPSHOT.jar。
第一小步:建立一個Dockerfile檔案並編寫,如(這是編寫後的樣子):
FROM justrydeng/jdk8 MAINTAINER dengshuai<[email protected]> 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","&"]
說明一:RUN指令的作用是當利用新的映象建立容器後,容器馬上再建立一個目錄,來放置後面會放進去的jar檔案, 這麼做的目的是為了歸類方便管理。 追注:實際上,此一步不是必要的,因為一般而言,一個Docker容器就執行一個jar包,所以也可以直接 將jar包放置在/下也行。
說明二:CMD指令的作用是:當docker start 啟動容器後(注意:是啟動,而不是建立),會馬上執行該指令。
說明三:更多Dockerfile指令細節,這裡不再多說,更多可參考《程式設計師成長筆記(三)》Docker章第七節。
第二小步:使用docker build指令,生成新的映象;如這裡: docker build -t justrydeng/jar . -f jarDockerfile
說明一:因為我們建立新的映象時,不需要什麼外部的東西,所以我們指定其上下文“母體”時,最好指定一個空的文 件夾或者指定一個幾乎不含內容的資料夾。本人這裡為了方便,指定的是當前資料夾。
說明二:關於Docker上下文知識、docker build 指令,這裡不再多說,更多可參考《程式設計師成長筆記(三)》Docker 章第七節。
此時,可看見,已經生成了新的映象:
第三小步:使用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包,拷貝至容器中的對應位置
如:docker cp jenkins-0.0.1-SNAPSHOT.jar jenkins-docker-test:/var/jarDir/jenkins-docker-test
說明一:將jar包放進容器中的對應的位置(即:Dockerfile的CMD指令對應的位置)。
說明二:只要容器存在(無論容器是否正在執行),就能將東西放進去。
第五大步: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<[email protected]>
RUN mkdir /jarAppDir/
CMD ["nohup","java","-jar","/jarAppDir/app.jar","&"]
> 生成映象docker build -t justrydeng/common-run-jar . -f jarDockerfile 注: -f 可以指定Dockerfile檔案的檔名。
> 在後面使用時,我們可以使用同一個映象來製作對應不同埠(不同服務)的容器 docker run -p 宿主機埠:要對映的容器埠 --name 容器名 -d justrydeng/common-run-jar
> 在更新jar包時,需要在把xxx.jar包複製進容器時,統一重新命名為app.jar docker cp 宿主機jar包 容器名(或容器ID):/jarAppDir/app.jar
說明:此方式的優勢在於:每次如果要更新jar包,只需要先將容器stop,然後直接替換容器裡面的jar包,最後再將該容 器start即可。無需每次都建立新的映象,建立新的容器。