Docker with Spring Boot

前段時間在我廠卷爺?shù)闹笇聦ocker在我的實際項目中落地,最近幾個小demo都盡量熟悉docker的使用,希望通過這篇文章分享我截止目前的使用經(jīng)驗(如有不準確的表述,歡迎幫我指出)。本文的主要內(nèi)容是關于Java應用程序的docker化,首先簡單介紹了docker和docker-compose,然后利用兩個案例進行實踐說明。

簡單說說Docker,現(xiàn)在云計算領域火得一塌糊涂的就是它了吧。Docker的出現(xiàn)是為了解決PaaS的問題:運行環(huán)境與具體的語言版本、項目路徑強關聯(lián),因此干脆利用lxc技術進行資源隔離,構造出跟隨應用發(fā)布的運行環(huán)境,這樣就解決了語言版本的限制問題。PaaS的出現(xiàn)是為了讓運維人員不需要管理一臺虛擬機,IaaS的出現(xiàn)是為了讓運維人員不需要管理物理機。云計算,說到底都是倆字——運維。

云計算領域的技術分為虛擬化技術和資源管理兩個方面,正好對應我們今天要講的兩個工具:Docker和docker-compose。Docker的主要概念有:容器、鏡像、倉庫;docker-compose是fig的后續(xù)版本,負責將多個docker服務整合起來,對外提供一致服務。

1. Spring Boot應用的docker化

首先看Spring Boot應用程序的docker化,由于Spring Boot內(nèi)嵌了tomcat、Jetty等容器,因此我們對docker鏡像的要求就是需要java運行環(huán)境。我的應用代碼的的Dockerfile文件如下:

#基礎鏡像:倉庫是java,標簽用8u66-jdk
FROM java:8u66-jdk
#當前鏡像的維護者和聯(lián)系方式
MAINTAINER duqi duqi@example.com
#將打包好的spring程序拷貝到容器中的指定位置
ADD target/bookpub-0.0.1-SNAPSHOT.jar /opt/bookpub-0.0.1-SNAPSHOT.jar
#容器對外暴露8080端口
EXPOSE 8080
#容器啟動后需要執(zhí)行的命令
CMD java -Djava.security.egd=file:/dev/./urandom -jar /opt/bookpub-0.0.1-SNAPSHOT.jar

因為目前的示例程序比較簡單,這個dockerfile并沒有在將應用程序的數(shù)據(jù)存放在宿主機上。如果你的應用程序需要寫文件系統(tǒng),例如日志,最好利用VOLUME /tmp命令,這個命令的效果是:在宿主機的/var/lib/docker目錄下創(chuàng)建一個臨時文件并把它鏈接到容器中的/tmp目錄。

把這個Dockerfile放在項目的根目錄下即可,后續(xù)通過docker-compose build統(tǒng)一構建:基礎鏡像是只讀的,然后會在該基礎鏡像上增加新的可寫層來供我們使用,因此java鏡像只需要下載一次。

docker-compose是用來做docker服務編排,參看《Docker從入門到實踐》中的解釋:

Compose 項目目前在 Github 上進行維護,目前最新版本是 1.2.0。Compose 定位是“defining and running complex applications with Docker”,前身是 Fig,兼容 Fig 的模板文件。

Dockerfile 可以讓用戶管理一個單獨的應用容器;而 Compose 則允許用戶在一個模板(YAML 格式)中定義一組相關聯(lián)的應用容器(被稱為一個 project,即項目),例如一個 Web 服務容器再加上后端的數(shù)據(jù)庫服務容器等。

單個docker用起來確實沒什么用,docker技術的關鍵在于持續(xù)交付,通過與jekins的結合,可以實現(xiàn)這樣的效果:開發(fā)人員提交push,然后jekins就自動構建并測試剛提交的代碼,這就是我理解的持續(xù)交付。

2. spring boot + redis + mongodb

在這個項目中,我啟動三個容器:web、redis和mongodb,然后將web與redis連接,web與mongodb連接。首先要進行redis和mongodb的docker化,redis鏡像的Dockerfile內(nèi)容是:

FROM        ubuntu:14.04
RUN         apt-get update
RUN         apt-get -y install redis-server
EXPOSE      6379
ENTRYPOINT  ["/usr/bin/redis-server"]

Mongodb鏡像的Dockerfile內(nèi)容是,docker官方給了mongodb的docker化教程,我直接拿來用了,參見Dockerizing MongoDB

# Format: FROM repository[:version]
FROM       ubuntu:14.04
# Format: MAINTAINER Name <email@addr.ess>
MAINTAINER duqi duqi@example.com
# Installation:
# Import MongoDB public GPG key AND create a MongoDB list file
RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
RUN echo "deb http://repo.mongodb.org/apt/ubuntu "$(lsb_release -sc)"/mongodb-org/3.0 multiverse" | tee /etc/apt/sources.list.d/mongodb-org-3.0.list
# Update apt-get sources AND install MongoDB
RUN apt-get update && apt-get install -y mongodb-org
# Create the MongoDB data directory
RUN mkdir -p /data/db
# Expose port 27017 from the container to the host
EXPOSE 27017
# Set usr/bin/mongod as the dockerized entry-point application
ENTRYPOINT ["/usr/bin/mongod"]```

使用docker-compose編排三個服務,具體的模板文件如下:

web:
build: .
ports:

  • "49161:8080"
    links:
  • redis
  • mongodb

redis:
image: duqi/redis
ports:
- "6379:6379"

mongodb:
image: duqi/mongodb
ports:
- "27017:27017"


架構比較簡單,第一個區(qū)塊的build,表示docker中的命令“docker build .”,用于構建web鏡像;ports這塊表示將容器的8080端口與宿主機(IP地址是:192.168.99.100)的49161對應。因為現(xiàn)在docker不支持原生的osx,因此在mac下使用docker,實際上是在mac上的一臺虛擬機(docker-machine)上使用docker,這臺機器的地址就是192.168.99.100。參見:[在mac下使用docker](https://docs.docker.com/v1.8/installation/mac/)

links表示要連接的服務,redis與下方的redis區(qū)塊對應、mongodb與下方的mongodb區(qū)塊對應。redis和mongodb類似,首先說明要使用的鏡像,然后規(guī)定端口映射。

那么,如何運行呢?
1. 命令`docker-compose build`,表示構建web服務,目前我用得比較土,就是編譯jar之后還需要重新更新docker,優(yōu)雅點不應該這樣。
![docker-compose build](http://upload-images.jianshu.io/upload_images/44770-feb314e36b94f1ef.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
2. 命令`docker-compose up`,表示啟動web服務,可以看到mongodb、redis和web依次啟動,啟動后用`docker ps`查看當前的運行容器。
![docker ps](http://upload-images.jianshu.io/upload_images/44770-97dc7650eadaa9ab.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

特別注意,在配置文件中寫redis和mongodb的url時,要用虛擬機的地址,即192.168.99.100。例如,redis的一個配置應該為:spring.redis.host=192.168.99.100。

## 3. spring boot + mysql
拉取mysql鏡像的指令是:`docker run --name db001 -p 3306:3306  -e MYSQL_ROOT_PASSWORD=admin -d mysql:5.7`,表示啟動的docker容器名字是db001,登錄密碼一定要設定, -d表示設置Mysql版本。

我的docker-compose模板文件是:

web:
build: .
ports:

  • "49161:8080"
    links:
  • mysql

mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: admin
MYSQL_DATABASE: springbootcookbook
ports:
- "3306:3306"


主要內(nèi)容跟之前的類似,主要講下mysql部分,通過environement來設置進入mysql容器后的環(huán)境變量,即連接數(shù)據(jù)庫的密碼MYSQL_ROOT_PASSWORD,使用的數(shù)據(jù)庫名稱MSYQL_DATABASE等等。

一直想寫這篇文章做個總結,寫來發(fā)現(xiàn)還是有點薄,對于docker我還需要系統(tǒng)得學習,不過,針對上面的例子,我都是親自實踐過的,大家有什么問題可以與我聯(lián)系。

## 參考資料
1. [Docker從入門到實踐](https://www.gitbook.com/book/yeasy/docker_practice/details)
2. [Docker - Initialize mysql database with schema](http://stackoverflow.com/questions/29145370/docker-initialize-mysql-database-with-schema)
3. [使用Docker搭建基礎的mysql應用](http://blog.csdn.net/smallfish1983/article/details/40080305)
4. [Spring Boot with docker](https://spring.io/guides/gs/spring-boot-docker/)

***
本號專注于后端技術、JVM問題排查和優(yōu)化、Java面試題、個人成長和自我管理等主題,為讀者提供一線開發(fā)者的工作和成長經(jīng)驗,期待你能在這里有所收獲。
![javaadu](https://upload-images.jianshu.io/upload_images/44770-7daebe9e48739106.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內(nèi)容