使用docker、docker-compose部署、發布spring boot項目,并通過外網訪問

說起Docker,大家并不陌生。是目前在開源社區比較火爆的一個東東。它是一個開源的應用引擎,可以為應用系統創建一個可移植的獨立的自主容器。容器運行在Linux上,相當于一個虛擬機。但是它與傳統的虛擬機有區別。Docker啟動速度快,占用資源少,所以非常適合來發布微服務。
如我們的spring boot項目,就十分適合部署在docker上。我想這是未來的一種趨勢。


一個周末,終于搞明白了如何在docker上發布spring boot項目。由于本人水平有限,還是折騰了一下,文中描述的都是自己一步一步探索出來,經過驗證通過。可能有的比描述的更簡便,或者是描述的并不恰當,望大家多多指點一下,讓小弟也學習一下,更進一步。謝謝。


  • 關于使用spring boot快速構建Restful API接口,在這里不在講述,spring boot官方文檔就是一個很好的例子。
  • 關于Restful API接口的設計指南,下面這篇文章講解比較好。
    http://www.ruanyifeng.com/blog/2014/05/restful_api.html

  • 下面我們就開始吧

  • 說明:docker和docker-compose的安裝,在此不再講述,請查閱相關資料。

  • 本次我使用的是安裝在VituralBox 中的centos7.2

1、創建Dockerfile

Dockerfile是一個文本文件。

  • 登錄Linux系統,在根目錄創建一個文件夾。
[root@rainbow /]# mkdir web
[root@rainbow /]# cd web/
[root@rainbow web]# 
  • 創建Dockerfile
[root@rainbow web]# vi Dockerfile
  • Dockerfile文件內容如下:
FROM java:8
ADD rainbow-api-user-0.0.1-SNAPSHOT.jar rainbow-api-user.jar
RUN bash -c 'touch /rainbow-api-user.jar'
EXPOSE 8085
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/rainbow-api-user.jar"]
  • 保存退出。
  • 關于Dockerfile文件命令請查看相關文檔

2、打包、上傳spring boot項目的jar文件

  • 打包
    點擊如下圖:
image.png
  • 然后輸入命令:
image.png
  • 說明:關于數據庫連接的配置
  • 由于我的mongodb數據庫是安裝在Linux中的,項目部署后,是去訪問Linux中的mongodb,雖然docker也是安裝在Linux上的,但是數據庫連接不能配置為127.0.0.1,因為127.0.0.1是指向docker容器自己。因為Linux與物理機共用IP,所以查看一下宿主機的IP是多少,那就把數據庫配置連接中的IP寫成多少,如我的宿主機IP是192.168.31.88,那配置如下:
image.png
  • 如果配置為127.0.0.1,那從物理機可以訪問到Linux中的mongodb,但是如果spring boot部署到docker容器中,就無法訪問了,因為127.0.0.1指向的是容器本身。這點我也是踩了個坑。

  • 待項目打包完成后,在項目的target路徑下,會有兩個jar包,我們需要如下的:

image.png
  • 上傳項目,使用sftp 工具,將jar文件上傳到Linux服務器。
    我們在剛剛創建的web目錄下,再創建一個webapp文件夾,并把Dockerfile文件移動到webapp文件夾下:
[root@rainbow web]# mkdir webapp
[root@rainbow web]# mv Dockerfile webapp/

將jar文件上傳到webapp目錄下。此時,webpp下有如下兩個文件:

image.png

現在,我們可以使用docker來構建項目了。由于我們本次的目的是使用docker-compose構建,所以只寫出構建命令
在webapp路徑下執行:

docker build -t spring .
  • 注意:命令最后的那個點,不能少,表示的是當前路徑,因為Dockerfile在當前路徑下。spring是構建的鏡像名,可以自己取。

3、使用docker-compose構建

首先,新建一個docker-compose.yml文件。由于這是個yaml文件,所以格式、縮進很重要。為了不出錯,所以在spring boot項目的resources目錄下新建一個docker-compose.yml文件,配置好相關項之后,再上傳到服務器。內容如下:

spring:
  build: ./webapp
  ports:
   - "80:8085"
  • 這個腳本表示,從當前路徑的webapp目錄中創建鏡像,并將鏡像命名為:web,然后使用宿主的80端口映射容器的8085端口。當然,webapp中存放有項目的jar和Dockerfile腳本。

  • 說明:容器的8085端口,因為我自己的項目是跑在8085端口上的,所以要將容器的8085端口映射出來,才能訪問。

  • 將docker-compose.yml文件上傳到服務器的web目錄下:

  • 此時,web的目錄結構如下:

image.png
  • 最后,我們就可以使用docker-compose up -d 命令來構建運行了。-d表示在后臺運行。注意,要在web路徑下執行。

  • 構建成功之后,會與如下的提示:

[root@rainbow web]# docker-compose up -d
Building spring
Step 1 : FROM java:8
 ---> d23bdf5b1b1b
Step 2 : ADD rainbow-api-user-0.0.1-SNAPSHOT.jar rainbow-api-user.jar
 ---> e2d71b21b18d
Removing intermediate container a67714060589
Step 3 : RUN bash -c 'touch /rainbow-api-user.jar'
 ---> Running in 80373f7f206f
 ---> 00e9ab13963d
Removing intermediate container 80373f7f206f
Step 4 : EXPOSE 8085
 ---> Running in a161e595c79c
 ---> b77fe6b6f8e3
Removing intermediate container a161e595c79c
Step 5 : ENTRYPOINT java -Djava.security.egd=file:/dev/./urandom -jar /rainbow-api-user.jar
 ---> Running in e25617bae6a2
 ---> a5a04f6f82a1
Removing intermediate container e25617bae6a2
Successfully built a5a04f6f82a1
WARNING: Image for service spring was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating web_spring_1 ... 
Creating web_spring_1 ... done
[root@rainbow web]# 
  • 到此,容器已經構建運行完成。spring boot項目已經完成發布了。

  • 查看運行的容器

docker-compose ps
  • 可以看到,我們的容器已經正在運行了。
[root@rainbow web]# docker-compose ps
    Name                  Command               State          Ports         
web_spring_1   java -Djava.security.egd=f ...   Up      0.0.0.0:80->8085/tcp 
[root@rainbow web]# 
  • 查看容器的日志信息:
    docker-compose logs -f [容器名]
docker-compose logs -f spring
image.png
  • 停止容器
docker-compose stop spring
  • 啟動容器
docker-compose start spring
  • 訪問spring boot項目。現在,可以訪問容器了。spring boot項目的端口號是8085,我們把容器的8085端口映射到了宿主機的80端口,所以可以直接使用80端口訪問項目。
  • 如下,可以正常訪問,到此,我們的spring boot項目部署成功
image.png

4、使用外網能夠訪問docker容器中的spring boot項目

企業一般應該是使用VPN工具來映射IP地址,然后就可以通過外網訪問了。由于我們沒有公網IP,所以我在此使用了花生殼這個工具,將宿主機的IP和端口映射到花生殼,就可以使用域名從外網訪問docker容器中的spring boot項目了。

  • 花生殼的使用不再介紹。

花生殼中有個內網映射功能。映射之前要先開通花生殼的內網穿透功能。我把我宿主機的IP:192.168.31.88,因為spring boot項目的端口是8085,但是經過docker容器映射到了宿主機的80端口,所以我們只需要映射宿主機的80端口即可。

image.png
  • 使用域名訪問docker容器中的spring boot。
image.png

到此,spring boot項目在docker容器中的部署已完成。由于本人水平有心,不足支持網大家多多指導一下小弟,謝謝!!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容