說(shuō)起Docker,大家并不陌生子刮。是目前在開(kāi)源社區(qū)比較火爆的一個(gè)東東威酒。它是一個(gè)開(kāi)源的應(yīng)用引擎窑睁,可以為應(yīng)用系統(tǒng)創(chuàng)建一個(gè)可移植的獨(dú)立的自主容器。容器運(yùn)行在Linux上葵孤,相當(dāng)于一個(gè)虛擬機(jī)担钮。但是它與傳統(tǒng)的虛擬機(jī)有區(qū)別。Docker啟動(dòng)速度快尤仍,占用資源少箫津,所以非常適合來(lái)發(fā)布微服務(wù)。
如我們的spring boot項(xiàng)目宰啦,就十分適合部署在docker上苏遥。我想這是未來(lái)的一種趨勢(shì)。
一個(gè)周末赡模,終于搞明白了如何在docker上發(fā)布spring boot項(xiàng)目田炭。由于本人水平有限,還是折騰了一下漓柑,文中描述的都是自己一步一步探索出來(lái)教硫,經(jīng)過(guò)驗(yàn)證通過(guò)×静迹可能有的比描述的更簡(jiǎn)便瞬矩,或者是描述的并不恰當(dāng),望大家多多指點(diǎn)一下锋玲,讓小弟也學(xué)習(xí)一下丧鸯,更進(jìn)一步。謝謝嫩絮。
- 關(guān)于使用spring boot快速構(gòu)建Restful API接口丛肢,在這里不在講述,spring boot官方文檔就是一個(gè)很好的例子剿干。
關(guān)于Restful API接口的設(shè)計(jì)指南蜂怎,下面這篇文章講解比較好。
http://www.ruanyifeng.com/blog/2014/05/restful_api.html下面我們就開(kāi)始吧
說(shuō)明:docker和docker-compose的安裝置尔,在此不再講述杠步,請(qǐng)查閱相關(guān)資料。
本次我使用的是安裝在VituralBox 中的centos7.2
1榜轿、創(chuàng)建Dockerfile
Dockerfile是一個(gè)文本文件幽歼。
- 登錄Linux系統(tǒng),在根目錄創(chuàng)建一個(gè)文件夾谬盐。
[root@rainbow /]# mkdir web
[root@rainbow /]# cd web/
[root@rainbow web]#
- 創(chuàng)建Dockerfile
[root@rainbow web]# vi Dockerfile
- Dockerfile文件內(nèi)容如下:
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"]
- 保存退出甸私。
- 關(guān)于Dockerfile文件命令請(qǐng)查看相關(guān)文檔
2、打包飞傀、上傳spring boot項(xiàng)目的jar文件
- 打包
點(diǎn)擊如下圖:
- 然后輸入命令:
- 說(shuō)明:關(guān)于數(shù)據(jù)庫(kù)連接的配置
- 由于我的mongodb數(shù)據(jù)庫(kù)是安裝在Linux中的,項(xiàng)目部署后,是去訪問(wèn)Linux中的mongodb憎妙,雖然docker也是安裝在Linux上的,但是數(shù)據(jù)庫(kù)連接不能配置為127.0.0.1绞吁,因?yàn)?27.0.0.1是指向docker容器自己。因?yàn)長(zhǎng)inux與物理機(jī)共用IP唬格,所以查看一下宿主機(jī)的IP是多少家破,那就把數(shù)據(jù)庫(kù)配置連接中的IP寫成多少,如我的宿主機(jī)IP是192.168.31.88购岗,那配置如下:
如果配置為127.0.0.1员舵,那從物理機(jī)可以訪問(wèn)到Linux中的mongodb,但是如果spring boot部署到docker容器中藕畔,就無(wú)法訪問(wèn)了马僻,因?yàn)?27.0.0.1指向的是容器本身。這點(diǎn)我也是踩了個(gè)坑注服。
待項(xiàng)目打包完成后韭邓,在項(xiàng)目的target路徑下,會(huì)有兩個(gè)jar包溶弟,我們需要如下的:
- 上傳項(xiàng)目女淑,使用sftp 工具,將jar文件上傳到Linux服務(wù)器辜御。
我們?cè)趧倓倓?chuàng)建的web目錄下鸭你,再創(chuàng)建一個(gè)webapp文件夾,并把Dockerfile文件移動(dòng)到webapp文件夾下:
[root@rainbow web]# mkdir webapp
[root@rainbow web]# mv Dockerfile webapp/
將jar文件上傳到webapp目錄下擒权。此時(shí)袱巨,webpp下有如下兩個(gè)文件:
現(xiàn)在,我們可以使用docker來(lái)構(gòu)建項(xiàng)目了碳抄。由于我們本次的目的是使用docker-compose構(gòu)建愉老,所以只寫出構(gòu)建命令
在webapp路徑下執(zhí)行:
docker build -t spring .
- 注意:命令最后的那個(gè)點(diǎn),不能少剖效,表示的是當(dāng)前路徑嫉入,因?yàn)镈ockerfile在當(dāng)前路徑下。spring是構(gòu)建的鏡像名璧尸,可以自己取咒林。
3、使用docker-compose構(gòu)建
首先爷光,新建一個(gè)docker-compose.yml文件垫竞。由于這是個(gè)yaml文件,所以格式瞎颗、縮進(jìn)很重要件甥。為了不出錯(cuò),所以在spring boot項(xiàng)目的resources目錄下新建一個(gè)docker-compose.yml文件哼拔,配置好相關(guān)項(xiàng)之后引有,再上傳到服務(wù)器。內(nèi)容如下:
spring:
build: ./webapp
ports:
- "80:8085"
這個(gè)腳本表示倦逐,從當(dāng)前路徑的webapp目錄中創(chuàng)建鏡像譬正,并將鏡像命名為:web,然后使用宿主的80端口映射容器的8085端口檬姥。當(dāng)然曾我,webapp中存放有項(xiàng)目的jar和Dockerfile腳本。
說(shuō)明:容器的8085端口健民,因?yàn)槲易约旱捻?xiàng)目是跑在8085端口上的抒巢,所以要將容器的8085端口映射出來(lái),才能訪問(wèn)秉犹。
將docker-compose.yml文件上傳到服務(wù)器的web目錄下:
此時(shí)蛉谜,web的目錄結(jié)構(gòu)如下:
最后,我們就可以使用docker-compose up -d 命令來(lái)構(gòu)建運(yùn)行了崇堵。-d表示在后臺(tái)運(yùn)行型诚。注意,要在web路徑下執(zhí)行鸳劳。
構(gòu)建成功之后狰贯,會(huì)與如下的提示:
[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]#
到此,容器已經(jīng)構(gòu)建運(yùn)行完成赏廓。spring boot項(xiàng)目已經(jīng)完成發(fā)布了涵紊。
查看運(yùn)行的容器
docker-compose ps
- 可以看到,我們的容器已經(jīng)正在運(yùn)行了幔摸。
[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
- 停止容器
docker-compose stop spring
- 啟動(dòng)容器
docker-compose start spring
- 訪問(wèn)spring boot項(xiàng)目∑艽現(xiàn)在,可以訪問(wèn)容器了抚太。spring boot項(xiàng)目的端口號(hào)是8085塘幅,我們把容器的8085端口映射到了宿主機(jī)的80端口,所以可以直接使用80端口訪問(wèn)項(xiàng)目尿贫。
- 如下电媳,可以正常訪問(wèn),到此庆亡,我們的spring boot項(xiàng)目部署成功
4匾乓、使用外網(wǎng)能夠訪問(wèn)docker容器中的spring boot項(xiàng)目
企業(yè)一般應(yīng)該是使用VPN工具來(lái)映射IP地址,然后就可以通過(guò)外網(wǎng)訪問(wèn)了又谋。由于我們沒(méi)有公網(wǎng)IP拼缝,所以我在此使用了花生殼這個(gè)工具娱局,將宿主機(jī)的IP和端口映射到花生殼,就可以使用域名從外網(wǎng)訪問(wèn)docker容器中的spring boot項(xiàng)目了咧七。
- 花生殼的使用不再介紹衰齐。
花生殼中有個(gè)內(nèi)網(wǎng)映射功能。映射之前要先開(kāi)通花生殼的內(nèi)網(wǎng)穿透功能继阻。我把我宿主機(jī)的IP:192.168.31.88耻涛,因?yàn)閟pring boot項(xiàng)目的端口是8085,但是經(jīng)過(guò)docker容器映射到了宿主機(jī)的80端口瘟檩,所以我們只需要映射宿主機(jī)的80端口即可抹缕。
- 使用域名訪問(wèn)docker容器中的spring boot。
到此墨辛,spring boot項(xiàng)目在docker容器中的部署已完成卓研。由于本人水平有心,不足支持網(wǎng)大家多多指導(dǎo)一下小弟睹簇,謝謝<帧!