將可執行的jar包 製作成docker image映象
目的:
將原本可以通過如下命令
//執行client.jar 包中的 io.grpc.examples.helloworld.HelloWorldServer 的主函式,並且要依賴同級目錄libs下的jar包
java -Djava.ext.dirs=libs -cp client.jar io.grpc.examples.helloworld.HelloWorldServer
執行的java專案打包為docker image映象檔案
grpc-demo目錄結構如下(grpc-demo是一實現grpc的一個demo)
│ client.jar
└─libs
error_prone_annotations-2.1 .2.jar
grpc-context-1.14.0.jar
grpc-core-1.14.0.jar
grpc-netty-shaded-1.14.0.jar
grpc-protobuf-1.14.0.jar
grpc-protobuf-lite-1.14.0.jar
grpc-stub-1.14.0.jar
gson-2.7.jar
guava-20.0.jar
hamcrest-core-1.3.jar
jsr305-3.0.0.jar
junit-4.11 .jar
opencensus-api-0.12.3.jar
opencensus-contrib-grpc-metrics-0.12.3.jar
proto-google-common-protos-1.0.0.jar
protobuf-java-3.5.1.jar
流程:
將專案打包成docker映象可以在ide中使用有關的打包並上傳到映象倉庫的外掛,這裡介紹的是手動使用命令打包
1、 將grpc-demo專案上傳至運行了docker 的主機上,並進入到grpc-demo目錄中
2、 編寫製作映象的命令檔案也就是DockerFile
vi DockerFileService
內容如下:
#指定以openjdk:8-jre 為基礎映象,來構建此映象,可以理解為執行的需要基礎環境
FROM openjdk:8-jre
#WORKDIR指令用於指定容器的一個目錄, 容器啟動時執行的命令會在該目錄下執行。
WORKDIR /
#將當前client.jar 複製到容器根目錄下
ADD client.jar client.jar
#將依賴包 複製到容器根目錄/libs下
ADD libs /libs
#暴露容器埠為50051 Docker映象告知Docker宿主機應用監聽了50051埠
EXPOSE 50051
#容器啟動時執行的命令
CMD java -Djava.ext.dirs=libs -cp client.jar io.grpc.examples.helloworld.HelloWorldServer
3、使用docker build 構建映象
//docker build
// . 表示當前目錄 -f 引數指定Dockerfile檔案 -t 表示 製作的映象tag
docker build -f DockerfileServer -t grpcdemo/helloworld-server:1.0.0 .
4、 構建成功後使用 docker images 檢視是否存在grpcdemo/helloworld-server:1.0.0 這個映象
5 、可以使用docker run 執行打包好的映象,檢視是否能按需求執行
//-d 表示後臺執行容器 如果使用-d
docker run -d grpcdemo/helloworld-server:1.0.0
備註:在前臺模式下(不指定-d引數即可),Docker會在容器中啟動程序,同時將當前的命令列視窗附著到容器的標準輸入、標準輸出和標準錯誤中。也就是說容器中所有的輸出都可以在當前視窗中看到。甚至它都可以虛擬出一個TTY視窗,來執行訊號中斷(不加 -d引數 可能會導致當前shell 視窗始終為容器中程序執行的輸出內容,甚至(ctrl+c)都無法中斷)
-d
,那麼容器將會執行在後臺模式。此時所有I/O資料只能通過網路資源或者共享卷組來進行互動。因為容器不再監聽你執行docker run
的這個終端命令列視窗,只是會輸出本次容器啟動的containerID。可以使用docker logs containerID
來列印容器應用相關日誌’
6、docker run 啟動對dockerfile中的命令進行重寫覆蓋
可以在啟動容器的時候,為docker run設定新的命令選項,從而覆蓋掉Dockerfile檔案中的CMD指令(不會再諮詢Dockerfile檔案中的CMD指令)。示例如下:
#docker run ... <New_Command>,可以給出其他命令以覆蓋Dockerfile檔案中的預設指令
docker run -d grpcdemo/helloworld-server:1.0.0 java -cp client.jar io.grpc.examples.helloworld.HelloWorldClient
7、 覆蓋EXPOSE指令
Dockerfile檔案中的 EXPOSE指令,用以向容器所在主機保留埠。
顯然這是執行時容器的一個特性,所以docker run可以方便地覆蓋該指令。示例如下:
docker run --expose="port_number:port_number"
相關連結