我們通常在 windows 環境下開發 Java,而通常是部署在Linux的服務器中,而CentOS通常是大多數企業的首選,基於Docker的虛擬化容器技術,多數Java應用選擇這種方式部署服務。本文章通過模擬這種場景部署一個Java的spring boot應用。
2. 環境
安裝Docker的CentOS 7虛擬機,虛擬機安裝和使用可以參照:https://www.linuxidc.com/Linux/2014-10/108013.htm
3. 工具
遠程連接服務器工具:xshell5,xftp5,xshell可以通過命令遠程操作Linux服務器,跟終端輸入命令效過一樣,xftp可以遠程傳輸文件。這兩款工具的安裝和使用可以百度搜索
下載安裝
4.操作過程
1. xshell5 和 xftp5 配置
Xshell:
打開xshell主面板,點擊新建,彈出會話配置面板,按如下填上連接信息
填完連接信息之后,點擊連接,輸入連接linux的用戶名和密碼即可登錄虛擬機系統。xshell出現一個命令行窗口
可在命令行窗口輸入Linux命令操作該Linux系統。如果連接不上請檢查CentOS防火牆有沒有開放22端口(一般默認開放),有沒有運行
sshd服務。
XFTP5:
打開xftp主面板,文件下新建一個會話,如圖配置相關連接信息,注意協議選擇 sftp和22端口
打開選項卡【選項】,勾選“使用UTF-8”編碼,遷移類型選擇 Binary,(注意這里不能選擇ASCII,這是一個大坑,選擇該項傳輸jar包時會丟失class文件,
編者曾試過這血的教訓),最后點擊確定建立連接(配置好之后重啟一下該工具,不重啟可能某些配置不起作用),這樣我們就可以通過鼠標拖曳的方式傳輸文件了。
2. 創建一個 spring-boot 應用,接口可以返回“Hello world”信息,制定服務端口8040
3. 服務部署
3.1 以maven插件的方式部署
3.1.1.確保docker服務開啟和防火牆開放2375端口
相關命令
#查看端口 成功返回yes firewall-cmd --query-port=2375/tcp #查看防火牆狀態 systemctl status firewalld.serice #開啟防火牆 systemctl start firewalld.services #解鎖防火牆進程 systemctl unmask firewalld.service #開放服務端口firewall-cmd --add-port=2375/tcp
3.1.2.在工程maven中加入如下插件,並填寫相關配置信息
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <docker.image.prefix>springboot</docker.image.prefix> </properties>
<plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <configuration> <dockerDirectory>src/main/docker</dockerDirectory> <dockerHost>http://192.168.42.210:2375</dockerHost> <imageName>${docker.image.prefix}/${project.artifactId}</imageName> <imageTags> <imageTag>${project.version}</imageTag> <imageTag>latest</imageTag> </imageTags> <entryPoint>["java","-jar","/${project.build.finalName}.mvnjar"]</entryPoint> <exposes>8040</exposes> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin>
3.1.3 在 工程 src/main/docker 目錄下新建Dockerfile 文件
FROM java VOLUME /tmp ADD hello-world-0.0.1-SNAPSHOT.jar app.jar RUN bash -c 'touch /app.jar' ENV JAVA_OPTS="" ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
3.1.4 項目完成后,在控制台執行 在pom.xml根目錄下執行
mvn clean package docker:build
3.1.5 執行完命令后,在xshell中查看docker鏡像,會出現兩個springboot/hello-word 的鏡像(其實是同一個)
接着,我們在xshell中執行啟動命令
sudo docker run -d -p 8040:8040 --name hello-world 7c4a665ed17d
我們可以執行 命令查看是否啟動成功
sudo docker ps
我們可以執行命令查看日志:
sudo docker logs hello-world
3.1.6 我們在windows主機訪問該服務接口(參照3.1.1開放8040端口)
3.2 通過 本地構建的方式部署應用。
3.2.1 首先我們將打包好的 jar 包和Dockerfile文件通過xftp工具遠程傳輸到CentOS上放在同一個目錄中
3.2.2 通過命令cd到該目錄執行如下命令構建鏡像
sudo docker build -t helloworld .
注意不要漏掉最后的“.",表市當前路徑,helloworld是鏡像名
3.3.3 然后通過該鏡像可構建我們的容器、開放服務端口,方法同3.1中的操作
PS:測試過程中可能使用到的命令
#關閉容器 sudo docker stop 容器名|容器ID #查看運行的容器 sudo docker ps # 查看所有的容器,包括停止的 sudo docker ps -a # 刪除容器 sudo docker rm 容器名|容器ID #刪除鏡像 sudo docker rmi 鏡像名:標簽 | 鏡像ID