1. 程式人生 > >將可執行的jar包 製作成docker image映象

將可執行的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"

相關連結