Docker如何創(chuàng)建一個Jar服務容器
Docker創(chuàng)建一個Jar服務容器
- 將jar包構建成為docker鏡像
- 啟動鏡像生成容器
- 將鏡像上傳至鏡像倉庫
1. 構建Docker鏡像
創(chuàng)建一個Dockerfile文件內(nèi)容如下:
// 指定鏡像源 FROM java:8 MAINTAINER cuixiaojian // 將文件復制到容器中,COPY [宿主機路徑] [容器內(nèi)路徑] COPY config-1.0.0.jar /usr/local/config-1.0.0.jar // 開放端口 EXPOSE 26999 // 需要開放多個端口則多一條expose // EXPOSE 27000 // 生成容器后,容器啟動時執(zhí)行的命令 ENTRYPOINT ["java -Xms256M -Xmx256M -XX:MaxMetaspaceSize=256M", "-jar", "/usr/local/config-1.0.0.jar -server -Dfile.encoding=UTF-8"]
在Dockerfile所在目錄執(zhí)行以下命令
build命令后的 “.” 符號代表為當前目錄,會將本目錄當做為docker build上下文,copy或add命令在執(zhí)行時候,文件需要在上下文中可以找到,所以需要復制進容器的文件也需要和dockerfile在同一目錄
此命令需要在dockerfile所在目錄執(zhí)行
docker build -t [自定義鏡像名]:[版本號] -f Dockerfile .
構建完成后查看鏡像
docker images
2. 啟動鏡像生成容器
執(zhí)行命令:
docker run --name [自定義容器名] -it -p 26999:26999 [自定義鏡像名]:[版本號] /bin/bash
指定容器后臺運行(增加d參數(shù)表示后臺運行):
docker run --name [自定義容器名] -itd -p 26999:26999 [自定義鏡像名]:[版本號] /bin/bash
3. 上傳鏡像至遠程倉庫
標記本地鏡像,將其歸入某一倉庫
docker tag [鏡像ID] [遠程文件路徑 + 鏡像名]:[版本號]
推送鏡像至遠程倉庫
docker push [遠程文件路徑 + 鏡像名]:[版本號]
Docker Jar項目啟動慢
問題描述
jar包項目,啟動后外面不能訪問,要過很長時間才可以訪問,日志也沒有報錯。

開始了 漫長的 填坑之路。
lsof -i:端口(方向不對)


第一張圖帶ipv4是創(chuàng)建容器指定了端口,并且沒有配置 --network host參數(shù)
第二張圖不帶ipv4是創(chuàng)建容器配置 --network=host 沒有指定端口(這種方式不能指定端口)
結果還是沒有解決問題,一直以為是因為使用 --network=host 方式?jīng)]有ipv4綁定呢,這里走了很多彎路,沒有解決,但是為什么沒有ipv4也不知道為什么。
下面說一說我對docker network的理解,安裝好docker后自動創(chuàng)建下面三種。

1、bridge:橋接網(wǎng)絡 默認情況下啟動的Docker容器,都是使用 bridge,Docker安裝時創(chuàng)建的橋接網(wǎng)絡,每次Docker容器重啟時,會按照順序獲取對應的IP地址,這個就導致重啟下,Docker的IP地址就變了
2、none:無指定網(wǎng)絡 使用 --network=none,docker 容器就不會分配局域網(wǎng)的IP。
3、host: 主機網(wǎng)絡 使用 --network=host,此時,Docker 容器的網(wǎng)絡會附屬在主機上,兩者是互通的。 例如,在容器中運行一個Web服務,監(jiān)聽8080端口,則主機的8080端口就會自動映射到容器中。這時配置 -p 端口參數(shù)是無效的
注:--network=host 和 --net=hos 好像是一樣的,說下我的簡單理解,如果所有docker 容器都在一臺機器上,使用bridge或host都可以,如果是分布在不面的物理機上,必須選擇host,如果不指定host那么兩臺物理機上的容器不能相互訪問。
docker exec 不能進入容器

出現(xiàn)這樣的問題是由于鏡像系統(tǒng)不一,使用錯誤shell解釋器導致,可嘗試以下其中一種方案。
docker exec -it container-test /bin/bash docker exec -it container-test /bin/sh docker exec -it container-test /bin/csh
正確的解決方法
方法一:
進入容器的 JAVA安裝目錄 /jre/lib/security/
vi java.security 修改這個文件
找到 securerandom.source=file:/dev/random 修改為 securerandom.source=file:/dev/./urandom
然后重啟容器,發(fā)現(xiàn)就正常了
方法二:
-Djava.security.egd=file:/dev/./urandom 加入JVM的這個啟動參數(shù)

也是可以的,這個主要是使用tomcat 隨機數(shù)引起的,用jetty或undertow在不配置此參數(shù)時不知道會不會有這種情況,也不知道為什么會存在這么大的一個問題。
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Docker Base Image自己創(chuàng)建具體實現(xiàn)
這篇文章主要介紹了Docker Base Image創(chuàng)建具體實現(xiàn)的相關資料,這里提供了詳細的具體步驟,需要的朋友可以參考下2016-11-11
docker實現(xiàn)redis-cluster模式集群部署的示例代碼
本文介紹了使用Docker部署Redis Cluster集群的完整方案,采用3臺服務器,每臺運行2個Redis實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2026-04-04
Docker 倉庫管理和Docker Dockerfile詳解
倉庫(Repository)是集中存放鏡像的地方,以下介紹一下 Docker Hub,當然不止 docker hub,只是遠程的服務商不一樣,操作都是一樣的,對Docker 倉庫管理相關知識感興趣的朋友一起看看吧2023-11-11
Docker中處理持久化存儲(如數(shù)據(jù)庫)的方法詳解
在使用Docker容器時,容器的生命周期通常是短暫的,當容器被刪除后,其內(nèi)部的數(shù)據(jù)也會隨之丟失,然而,對于像數(shù)據(jù)庫這樣需要持久化存儲數(shù)據(jù)的應用來說,這是不可接受的,所以本文給大家介紹了Docker中處理持久化存儲(如數(shù)據(jù)庫)的方法,需要的朋友可以參考下2025-06-06

