javascript
学习Spring Boot:(二十三)Spring Boot 中使用 Docker
前言
簡單的學習下怎么在 Spring Boot 中使用 Docker 進行構建,發布一個鏡像,現在我們通過遠程的 docker api 構建鏡像,運行容器,發布鏡像等操作。
這里只介紹兩種方式:
開啟 Docker api 遠程訪問
開啟 docker api 遠程操作的功能,
例如,centos 7 中在 /usr/lib/systemd/system/docker.service,文件中,修改 ExecStart 的參數:
端口自定義設置即可。
重載所有修改過的配置文件,并且重啟 docker,
systemctl daemon-reload systemctl restart docker.service需要注意的是,由于沒有密碼登陸任何權限驗證,外網或者生產環境需要上證書使用。
命令方式構建鏡像
這種方式其實非常簡單,就是需要懂得 docker 命令,才能操作。
經過上面開啟 Docker Api 后,我們可以使用網絡環境操作 Docker 引擎了。
新建 Dockerfile 構建鏡像文件,新創建一個文件夾,專門放構建鏡像需要的文件,我創建的是 /src/docker/
FROM java:8 EXPOSE 8080VOLUME /tmp ADD springboot-docker.jar app.jar ENTRYPOINT ["java","-jar","/app.jar"]執行 maven 命令 ,將項目打包 mvn clean package --DskipTests,然后將打好的 jar 包,也放入到 Dockerfile項目目錄中。
然后進入 src/docker 目錄下執行 :
docker -H tcp://xxx.xxx.xxx.xxx:2375 build -t test .開始構建鏡像:
Sending build context to Docker daemon 31.74MB Step 1/5 : FROM java:8---> d23bdf5b1b1b Step 2/5 : EXPOSE 8080---> Using cache---> 060a43a42146 Step 3/5 : VOLUME /tmp---> Using cache---> b4f88fde6181 Step 4/5 : ADD springboot-docker.jar app.jar---> 3a40188825b0 Step 5/5 : ENTRYPOINT ["java","-jar","/app.jar"]---> Running in ab093916fc4c Removing intermediate container ab093916fc4c---> 45a3966feb60 Successfully built 45a3966feb60 Successfully tagged test:latest?
使用 docker-maven-plugin構建鏡像
在 maven 項目下加入 docker-maven-plugin
<!--打包docker插件相關參數的配置--><plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>0.4.14</version><configuration><!--打包的鏡像名--><imageName>${project.groupId}/${project.artifactId}</imageName><!--Dockerfile文件位置,以項目的 root 目錄為根節點,建議到單獨建立一個目錄--><dockerDirectory>./src/docker/</dockerDirectory><!--Docker 遠程的 API 地址及端口--><dockerHost>http://xxx.xxx.xxx.199:2375</dockerHost><imageTags><imageTag>latest</imageTag></imageTags><!--執行構建docker鏡像的時候需要哪些文件,springboot項目指定 打包好的jar 鏡像就好--><resources><resource><!--這里指定的文件是target中的jar文件--><targetPath>/</targetPath><directory>${project.build.directory}</directory><include>${project.build.finalName}.jar</include></resource></resources></configuration></plugin>創建 Dockerfile
需要跟pom.xml 上面配置的路徑保持一致,所以我的路徑是 ${baseProjectFolder}/src/docker的文件夾下新建一個文件 Dockerfile,添加構建 docker 相關命令參數:
FROM java:8 EXPOSE 8080VOLUME /tmp ADD springboot-docker.jar app.jar # 根據打包的jar 包文件名進行修改 ENTRYPOINT ["java","-jar","/app.jar"]打包
在應用的根目錄下執行命令(打包加 dokcer build):
$ mvn clean package docker:build -DskipTests比如使用我的工程,進行打包后完成了 docker 的構建的信息:
[INFO] Building image com.wuwii/springboot-docker Step 1/5 : FROM java:8---> d23bdf5b1b1b Step 2/5 : EXPOSE 8080---> Running in b7936baae57f Removing intermediate container b7936baae57f---> 060a43a42146 Step 3/5 : VOLUME /tmp---> Running in 65e2b8ac44d3 Removing intermediate container 65e2b8ac44d3---> b4f88fde6181 Step 4/5 : ADD springboot-docker.jar app.jar---> aa3762cda143 Step 5/5 : ENTRYPOINT ["java","-jar","/app.jar"]---> Running in d9f5f63b9736 Removing intermediate container d9f5f63b9736---> 622a7d1e315c ProgressMessage{id=null, status=null, stream=null, error=null, progress=null, progressDetail=null} Successfully built 622a7d1e315c Successfully tagged com.wuwii/springboot-docker:latest使用鏡像
進入安裝 docker 的主機中,使用命令查看鏡像(IMAGE ID 和上面是一致的):
$ docker image ls com.wuwii/springboot-docker REPOSITORY TAG IMAGE ID CREATED SIZE com.wuwii/springboot-docker latest 622a7d1e315c 22 minutes ago 659MB運行容器:
$ docker run -d -p 8080:8080 --name learn com.wuwii/springboot-docker180fe4a7ddfc10c0cf2c37649ae1628e804564bfe1594ef05840e707801e6da3監聽 8080 端口,測試是否成功。
服務編排 compose
一般的我們的 WEB 項目會使用到很多外部工具,例如 Redis ,MYSQL, ES等,如果一個一個啟動搭建部署,太麻煩了,還要測試如果把這個一套環境拿到別的地方還能用嗎?
使用服務編排可以避免這些坑。
加入我們的項目中增加了 Mysql 的數據庫,在根目錄新建一個 docker-compose.yml:
version: '3' services:web:depends_on:- dbports:- "8080:8080" # 建議加上引號,如果單獨兩位數的數字,可能出現解析問題restart: always# build:# context: ./src/docker # Dockerfile 文件的目錄,可以遠程地址,絕對 or 相對# dockerfile: Dockerfile # 如果你的 Dockerfile 重命名了,需要指定image: test:latestenvironment:DB_HOST: db:3306DATABASE: learnDB_USERNAME: root # 測試用下 rootDB_PASSWORD: 123456 # # 建議使用 secretdb:image: mysql:5.7volumes:- db_data:/var/lib/mysqlrestart: alwaysenvironment:MYSQL_ROOT_PASSWORD: 123456MYSQL_DATABASE: learnMYSQL_USER: kronchanMYSQL_PASSWORD: 123456volumes:db_data: # 使用的數據卷必須聲明上面我使用的是前面已經構建好的鏡像,然后執行的編排,更好的是直接使用 build 讓它自己編排服務。
系統配置文件application.yml使用缺省值的方式,不影響開發的使用:
spring:datasource:url: jdbc:mysql://${DB_HOST:localhost:3306}/${DATABASE:learn}?useSSL=false&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8username: ${DB_USERNAME:root}password: ${DB_PASSWORD:123456}driver-class-name: com.mysql.jdbc.Driverjpa:show-sql: truedatabase: mysqlhibernate:ddl-auto: updateproperties:hibernate:dialect: org.hibernate.dialect.MySQL57Dialect # 方言根據 數據庫版本選擇吧也可以使用不同的 spring.profiles指定不同的環境,在 docker-compose.yml 中覆蓋執行命令指定環境也是常見做法的:command: mvn clean spring-boot:run -Dspring-boot.run.profiles=xxx
最后啟動,在 docker-compose.yml目錄下執行 : docker-compose up
關閉服務 docker-compose down
注意
docker-compose 順序的問題,這個是開始學習編排的時候需要注意的問題,如果上面的服務編排中 mysql 啟動的慢, web 項目就會啟動失敗,它啟動的時候不知道被依賴的服務是否啟動完成,就會出現這樣的問題。
解決的辦法有以下幾種:
- 足夠的容錯和重試機制,比如連接數據庫,在初次連接不上的時候,服務消費者可以不斷重試,直到連接上位置
- docker-compose拆分,分成兩部分部署,將要先啟動的服務放在一個docker-compose中,后啟動的服務放在兩一個docker-compose中,啟動兩次,兩者使用同一個網絡。
- 同步等待,使用wait-for-it.sh或者其他shell腳本將當前服務啟動阻塞,直到被依賴的服務加載完畢
wait-for-it的github地址為:wait-for-it
總結
總結
以上是生活随笔為你收集整理的学习Spring Boot:(二十三)Spring Boot 中使用 Docker的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: web开发入门到深入-WebAssemb
- 下一篇: gradle idea java ssm