一個微服務項目,小到幾個模塊,大到十幾二十幾個模塊,每一個模塊都是單獨的SpringBoot工程,這麼多模塊的部署,部署成本真的很高,並且每一個服務的部署,都是手動部署,打成war或者jar ?,一個一個的部署也是至關的麻煩,介於此:html
我前段時間倒騰了一個博客系統,昨天測試基本功能已經跑通了,可能再過段時間我就要買服務器架設本身的博客系統了,這個系統由SpringBoot支撐,咱們就把它看成一個微服務項目的一個一個模塊,進行學習微服務項目的部署java
基於前面的介紹,測試項目採用SpringBoot開發,咱們將該服務打成一個jar,而後再Docker中運行該jar便可mysql
整個流程咱們豪爽的分爲下面兩步:linux
SpringBoot項目打包jar 【maven插件支持,不然找不到main方法入口】git
建立Docker鏡像、容器、並啓動容器,訪問測試github
沒有其餘要說的,就是一個maven插件,這裏說明一下,這個插件必須有,不然打成的jar不能運行spring
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
經過idea分別執行clean package打包命令,而後咱們就能夠在項目內的target目錄下找我打成的jar包sql
【小提示】:能夠在本地運行該jar,測試功能是否暢通,功能測試無缺再作下一步深刻入入入...docker
java -jar jar包全名稱數據庫
在本地磁盤中找到該jar,並將其上傳到咱們的Linux服務器:
上傳到咱們的Linux服務器後,咱們就在該jar的同等路徑下,編寫Dockerfil文件,注意在同一路徑下!
下面對上面的命令作一個簡單的解釋:
jdk:8 :構建一個jdk8鏡像的新鏡像,若是本地不具備,docker回去中央倉庫下載
ADD 這一欄將當前目錄下的這個jar ,複製到鏡像內的根目錄下
最後一欄表示 完成上面操做後將進行的命令,相似於CMD 也就是啓動該jar的腳本命令
而後就是鏡像構建了: docker build -t 'ninjablog:1.0' .
下面仍然作一個簡單的解釋:
【docker build -t 'ninjablog:1.0' . 】 :表示構建一個鏡像取名爲ninjablo,版本號爲1.0
這裏我須要注意的是,鏡像名字千萬不要使用大寫字母,會構建失敗的,我也不知道爲何
構建完成以後,經過docker images 查看本地鏡像,就會看到咱們剛剛構建的那個鏡像大搖大擺的出如今了列表中
鏡像就算是已經構建成功,下面咱們建立基於該鏡像的容器
而後我建立容器,並運行容器,這個時候經過 docker logs -f 容器名/id 查看到一堆有一堆的異常,我炸了
通過30分鐘的排查後,我以爲多是mysql的配置錯了。我配置的localhost:3306,明顯個人容器中沒有這玩意兒,
通過一番折騰,我再次打包、上傳。作鏡像。開容器,...再打包....再打包......
一個小時後!啊,個人天啊,怎麼回事啊?Linux上都能遠程鏈接Windows上的mysql,爲何你個SpringBoot鏈接不上
我嘗試使用ip:port的方式用navicat鏈接本地數據庫,鏈接失敗
開啓本地數據庫遠程鏈接功能,開放全部數據庫訪問權限,Linux完美鏈接,項目報異常
忽然想起個人docker上好像有mysql誒?立刻折騰,啓動容器,建立數據庫,導數據,容器重啓,OJBK
好了,幾經波折,終於到了咱們最後的環節了,創鏡像,起容器,訪項目!
這裏我用數據庫容器,以及一個由項目構建的鏡像啓動的容器,兩個容器排排站:
而後就是測試訪問了!,而後就是404,我靠!,經過docker logs -f myblog 查看日誌,又是一堆異常!
此次沒上次折騰的久,安裝docker的機器的防火牆未關,在上一步中,我用了mysql容器,致使被牆了
首先全局關閉防火牆,啓動容器,發現報錯,不能啓動,重啓docker,刷新配置,再次重啓。
再次查看咱們容器的啓動日誌,沒有異常,刷新兩哈 docker ps ,發現咱們的myblog容器一直在線,並無宕掉
而後啓動瀏覽器,進行項目訪問測試:
docker build -t 'ninjablog:1.0' . :構建一個名爲ninjablog的鏡像,版本爲1.0,能夠缺省版本設置
docker run -d -p 8888:8888 --name myblog ninjablog:建立並運行一個容器,參數不少,詳見我給的資料
docker rm 容器Name/Id :根據名字或者id刪除該容器
docker rmi 鏡像名字/id :根據鏡像名字或者id刪除鏡像
firewall-cmd --state :CentOS7查看當前系統的防火牆狀態
firewall-cmd --permanent --zone=public --add-port=3306/tcp :在防火牆開啓狀態下,開放3306端口,自行修改
docker logs -f myblog :查看myblog容器的運行日誌,有版本號配置的話須要補全
systemctl restart docker:重啓docker
docker start 容器Name/id :根據名字或者id啓動一個容器
docker ps :查看全部的容器,後跟 -a 查看當前正在運行的容器
Dockerfile以前咱們已經編寫過了,這裏就是 拿來即用便可,把Dockerfile從Linux上拷下來,放到資源文件Resource下便可
複製本項目的pom.xml文件,命名爲pom_docker.xml,其餘數據不用更改,只是再原來的基礎上再加一個插件:
這個插件添在maven打包插件的然後面便可,可酌情修改相關數據
<!--自動構建鏡像相關: 依賴docker環境-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker‐maven‐plugin</artifactId>
<version>1.0.0</version>
<!--docker鏡像相關的配置信息-->
<configuration>
<!--鏡像名,這裏用工程名-->
<imageName>${project.artifactId}‐${project.version}</imageName>
<!--Dockerfile文件所在目錄-->
<dockerDirectory>${project.basedir}/src/main/resources</dockerDirectory>
<!--TAG,這裏用工程版本號-->
<imageTags>
<imageTag>${project.version}</imageTag>
</imageTags>
<imageName>${project.artifactId}:${project.version}</imageName>
<!--構建鏡像的配置信息-->
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.artifactId}‐${project.version}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
【提示】:此插件依賴docker環境,因此若是本地沒有安裝docker環境,建議這樣操做一波
在裝有docker的機器上,使用git clone 克隆項目
咱們將項目推送到github或者碼雲上,而後再Linux上吧項目克隆一份便可
而後再經過一個命令,指定打包建立鏡像
git 我能用,若是不能用,執行安裝環境
jdk環境我相信你們應該有的吧,這裏不作過多說明。
這裏也是須要maven的環境,我相信你們都沒有,簡單給一系列命令安裝一下
隨便找一個安裝目錄,依次執行下面的命令
yum -y install wget
wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.1/binaries/apache-maven-3.6.1-bin.tar.gz
tar -zxvf apache-maven-3.6.1-bin.tar.gz
修改setting文件,將依賴源改成國內的:而後將倉庫等玩意兒也部署上【剛搬家,還沒牽寬帶,有寬帶的不用管】
vi /etc/profile :加入環境變量,路徑寫本身的解壓路徑便可
export JAVA_HOME=/usr/local/jdk8/jdk1.8.0_171 export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/rt.jar export PATH=$PATH:$JAVA_HOME/bin
export MAVEN_HOME=/usr/local/apache-maven-3.6.1
export PATH=$MAVEN_HOME/bin:$PATH
source /etc/profile :刷新系統配置
最後測試一下 mvn -v:出現java版本、maven版本相關信息就能夠了
mvn ‐f pom_docker.xml clean package ‐DskipTests docker:build
果不其然報錯了,我費盡心思,暫時尚未找到解決的辦法,目前家裏沒寬帶,流量遭不住,過幾天再繼續