Docker如何創(chuàng)建一個(gè)Jar服務(wù)容器
Docker創(chuàng)建一個(gè)Jar服務(wù)容器
- 將jar包構(gòu)建成為docker鏡像
- 啟動(dòng)鏡像生成容器
- 將鏡像上傳至鏡像倉(cāng)庫(kù)
1. 構(gòu)建Docker鏡像
創(chuàng)建一個(gè)Dockerfile文件內(nèi)容如下:
// 指定鏡像源 FROM java:8 MAINTAINER cuixiaojian // 將文件復(fù)制到容器中,COPY [宿主機(jī)路徑] [容器內(nèi)路徑] COPY config-1.0.0.jar /usr/local/config-1.0.0.jar // 開(kāi)放端口 EXPOSE 26999 // 需要開(kāi)放多個(gè)端口則多一條expose // EXPOSE 27000 // 生成容器后,容器啟動(dòng)時(shí)執(zhí)行的命令 ENTRYPOINT ["java -Xms256M -Xmx256M -XX:MaxMetaspaceSize=256M", "-jar", "/usr/local/config-1.0.0.jar -server -Dfile.encoding=UTF-8"]
在Dockerfile所在目錄執(zhí)行以下命令
build命令后的 “.” 符號(hào)代表為當(dāng)前目錄,會(huì)將本目錄當(dāng)做為docker build上下文,copy或add命令在執(zhí)行時(shí)候,文件需要在上下文中可以找到,所以需要復(fù)制進(jìn)容器的文件也需要和dockerfile在同一目錄
此命令需要在dockerfile所在目錄執(zhí)行
docker build -t [自定義鏡像名]:[版本號(hào)] -f Dockerfile .
構(gòu)建完成后查看鏡像
docker images
2. 啟動(dòng)鏡像生成容器
執(zhí)行命令:
docker run --name [自定義容器名] -it -p 26999:26999 [自定義鏡像名]:[版本號(hào)] /bin/bash
指定容器后臺(tái)運(yùn)行(增加d參數(shù)表示后臺(tái)運(yùn)行):
docker run --name [自定義容器名] -itd -p 26999:26999 [自定義鏡像名]:[版本號(hào)] /bin/bash
3. 上傳鏡像至遠(yuǎn)程倉(cāng)庫(kù)
標(biāo)記本地鏡像,將其歸入某一倉(cāng)庫(kù)
docker tag [鏡像ID] [遠(yuǎn)程文件路徑 + 鏡像名]:[版本號(hào)]
推送鏡像至遠(yuǎn)程倉(cāng)庫(kù)
docker push [遠(yuǎn)程文件路徑 + 鏡像名]:[版本號(hào)]
Docker Jar項(xiàng)目啟動(dòng)慢
問(wèn)題描述
jar包項(xiàng)目,啟動(dòng)后外面不能訪問(wèn),要過(guò)很長(zhǎng)時(shí)間才可以訪問(wèn),日志也沒(méi)有報(bào)錯(cuò)。
開(kāi)始了 漫長(zhǎng)的 填坑之路。
lsof -i:端口(方向不對(duì))
第一張圖帶ipv4是創(chuàng)建容器指定了端口,并且沒(méi)有配置 --network host參數(shù)
第二張圖不帶ipv4是創(chuàng)建容器配置 --network=host 沒(méi)有指定端口(這種方式不能指定端口)
結(jié)果還是沒(méi)有解決問(wèn)題,一直以為是因?yàn)槭褂?--network=host 方式?jīng)]有ipv4綁定呢,這里走了很多彎路,沒(méi)有解決,但是為什么沒(méi)有ipv4也不知道為什么。
下面說(shuō)一說(shuō)我對(duì)docker network的理解,安裝好docker后自動(dòng)創(chuàng)建下面三種。
1、bridge:橋接網(wǎng)絡(luò) 默認(rèn)情況下啟動(dòng)的Docker容器,都是使用 bridge,Docker安裝時(shí)創(chuàng)建的橋接網(wǎng)絡(luò),每次Docker容器重啟時(shí),會(huì)按照順序獲取對(duì)應(yīng)的IP地址,這個(gè)就導(dǎo)致重啟下,Docker的IP地址就變了
2、none:無(wú)指定網(wǎng)絡(luò) 使用 --network=none,docker 容器就不會(huì)分配局域網(wǎng)的IP。
3、host: 主機(jī)網(wǎng)絡(luò) 使用 --network=host,此時(shí),Docker 容器的網(wǎng)絡(luò)會(huì)附屬在主機(jī)上,兩者是互通的。 例如,在容器中運(yùn)行一個(gè)Web服務(wù),監(jiān)聽(tīng)8080端口,則主機(jī)的8080端口就會(huì)自動(dòng)映射到容器中。這時(shí)配置 -p 端口參數(shù)是無(wú)效的
注:--network=host 和 --net=hos 好像是一樣的,說(shuō)下我的簡(jiǎn)單理解,如果所有docker 容器都在一臺(tái)機(jī)器上,使用bridge或host都可以,如果是分布在不面的物理機(jī)上,必須選擇host,如果不指定host那么兩臺(tái)物理機(jī)上的容器不能相互訪問(wèn)。
docker exec 不能進(jìn)入容器
出現(xiàn)這樣的問(wèn)題是由于鏡像系統(tǒng)不一,使用錯(cuò)誤shell解釋器導(dǎo)致,可嘗試以下其中一種方案。
docker exec -it container-test /bin/bash docker exec -it container-test /bin/sh docker exec -it container-test /bin/csh
正確的解決方法
方法一:
進(jìn)入容器的 JAVA安裝目錄 /jre/lib/security/
vi java.security 修改這個(gè)文件
找到 securerandom.source=file:/dev/random 修改為 securerandom.source=file:/dev/./urandom
然后重啟容器,發(fā)現(xiàn)就正常了
方法二:
-Djava.security.egd=file:/dev/./urandom 加入JVM的這個(gè)啟動(dòng)參數(shù)
也是可以的,這個(gè)主要是使用tomcat 隨機(jī)數(shù)引起的,用jetty或undertow在不配置此參數(shù)時(shí)不知道會(huì)不會(huì)有這種情況,也不知道為什么會(huì)存在這么大的一個(gè)問(wèn)題。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用Dockerfile部署nodejs服務(wù)的方法步驟
這篇文章主要介紹了使用Dockerfile部署nodejs服務(wù)的方法步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01docker run的--rm選項(xiàng)使用說(shuō)明
這篇文章主要介紹了docker run的--rm選項(xiàng)使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11Docker buildx構(gòu)建多平臺(tái)鏡像并推送到私有倉(cāng)庫(kù)的方法
這篇文章主要介紹了Docker buildx構(gòu)建多平臺(tái)鏡像并推送到私有倉(cāng)庫(kù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01docker?運(yùn)行花生殼實(shí)現(xiàn)內(nèi)外網(wǎng)穿透的詳細(xì)過(guò)程
這篇文章主要介紹了docker?運(yùn)行花生殼實(shí)現(xiàn)內(nèi)外網(wǎng)穿透,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03vscode利用ssh配置docker容器并開(kāi)啟遠(yuǎn)程編程模式的詳細(xì)步驟
這篇文章主要介紹了vscode利用ssh配置docker容器內(nèi)開(kāi)啟遠(yuǎn)程編程模式,本文給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03