在docker中用Tomcat運行web項目

本文旨在用最通俗的語言講述最枯燥的基本知識

上一篇文章《爲什麼要用docker》已經講述了什麼是docker以及我們要用docker的原因,並且講解了如何安裝docker。這時候很多讀者磨拳擦腳躍躍欲試但卻發現安裝好docker之後就無從下手了,那麼,接下來,小編會從以下方面講述docker的一些基礎知識,當然,理論都是生硬的,所以小編選取了javaweb項目中最常用的一個軟件--tomcat的安裝和使用來引導學習一些docker相關的知識,藉此讓讀者能夠從實戰的角度去理解docker爲什麼會有這些基礎知識以及如何使用這些基礎知識。

我們知道,web開發和部署離不開tomcat,而在目前的實際情況是:
一個項目中,每個開發者本機電腦都有自己的tomcat或者用idea的內置tomcat,當我們開發完成提交測試時,測試服務器上也有一個tomcat;當項目上線時,線上服務器也有一個tomcat,因此就很容易出現一些奇奇怪怪的問題,比如在同事A電腦上能正常運行的,到同事B電腦上就出問題的;或者是在測試環境裏一切正常,到了線上bug一堆。這時候docker就有了用武之地,項目負責人把docker的tomcat鏡像做好了之後上傳到鏡像倉庫,項目成員的電腦環境、測試環境、線上環境均拉取這個tomcat使用,就能保持在所有的環境下tomcat的版本、設置都是一致的,避免了一些非技術的問題。
那麼,現在我們就用docker來做一個tomcat的環境。

  1. 鏡像的查找和拉取

首先,我們需要去鏡像倉庫找到我們要的鏡像,查找鏡像的語法是

docker search 鏡像名稱:鏡像TAG

因此,查找Tomcat鏡像:

docker search tomcat

有讀者會疑問:什麼是鏡像TAG?
鏡像的TAG值就是鏡像的版本,就比如Tomcat有7.0、8.5、9.0等我們常用的版本,那麼相應的這些軟件被做成docker鏡像之後,官方也會根據軟件本身的版本對應出docker鏡像的版本。
下圖爲查找結果:
docker下查找Tomcat鏡像
可以看到,有很多的Tomcat鏡像,那麼我們應該怎麼選用這些鏡像呢?通常情況下,我們都知道官方的東西基本上代表安全無公害,因爲可以看到右邊有official標識爲OK的就是官方的鏡像,因此我們拉取第一個Tomcat就可以。
拉取鏡像的語法是:

docker pull 鏡像NAME:鏡像TAG

因爲我們要拉取Tomcat時,就可以這樣寫:

docker pull tomcat

有人說你怎麼沒加上鏡像TAG
在拉取鏡像時,如果加上鏡像TAG,就會去查找是否有相應版本的鏡像,如果有則拉取,如果沒有則不拉去。而沒有加TAG時,就默認代表拉取的是該鏡像的最新版本。

假如需要拉取固定版本如拉取Tomcat8.5:

docker pull tomcat:8.5

就會相應的拉取了該版本的Tomcat鏡像。
拉取成功之後,我們要查看我們拉取的版本,可以用命名:

docker images

可以看到,鏡像列表裏已經有了我們要拉取的Tomcat鏡像
本機的鏡像列表

  1. 鏡像的使用

鏡像拉取下來之後,就如我們把從網上把下載到了本地電腦,但是沒有任何生命的跡象,只有把它安裝運行起來,纔是一個活的容器,相應地,docker鏡像只有在run起來的時候,纔是一個有生命的容器。
創建和運行一個Tomcat容器只需要一行命令:

 
docker run  --name my_tomcat tomcat:8.5

其中 --name是指給容器起的名字,後面的tomcat是指下載的驚喜的NAME。8.5是鏡像TAG。
到這裏,一個tomcat服務就安裝並且啓動好了,因爲默認的Tomcat端口都是8080,因此通常情況下此時我們用ip:8080就應該可以訪問到Tomcat的標誌性主頁了。
但是!!!
事實並不是如此
因爲我們是在docker下運行的容器,你們的腦海中可否還有docker的logo圖?
大海就相當於我們的服務器(宿主機),而在海中游走的鯨魚就是docker服務,而鯨魚上的每一個集裝箱都是一個容器,也就是說:
容器之間是互相隔離的,容器和宿主服務器也是互相隔離的。
因此我們在docker中運行了一個Tomcat的服務器,雖然端口是8080,
但是~
那是容器中的8080端口,因此我們通過ip:8080訪問到的其實只是宿主機上的8080端口,並不是容器中的端口。
此時我們只需要把容器中的端口映射到宿主機上相應的端口即可。
端口映射只需要在運行時加入指令 -p 映射的宿主機端口:容器運行端口
如下,把容器運行的8080端口映射到宿主機的8099端口:
名稱設置爲my_tomcat_1

docker run -p 8099:8080  --name my_tomcat_1 tomcat:8.5

此時,你會發現,控制檯打出了Tomcat啓動的日誌,啓動完成後,我們在瀏覽器上用ip:8099訪問,就會發現,Tomcat主頁就顯示了,說明Tomcat已經正確地運行起來了。
而用命令也可以查看容器是否起來,我們用docker ps 能查出本docker中運行的多有容器:

docker ps

在Tomcat運行的情況下,當你用ctrl+c回到命令行輸入docker ps時,發現並沒有找到my_tomcat_1這個Tomcat容器,而你重新用ip:8099發現Tomcat也不見了
噢 no!
什麼原因?
這是因爲:在Linux下用指令的方式運行程序,如果沒有加後臺執行的指令,那麼在切回到命令時,程序就被殺死了。
因此,此時是因爲我們運行Tomcat容器時,沒有設置在後臺運行,因此,需要在運行時,加上後臺運行的指令,在docker中設置後臺運行只需要在run命名中加入-d即可。
因此我們重新運行Tomcat,名稱設置爲my_tomcat_2:

docker run -d -p 8099:8080  --name my_tomcat_2 tomcat:8.5

運行完成後,此時我們放心大膽的回到命名行。重新執行docker ps
看控制檯的輸出:
展示正在運行的所有容器
可以看到:my_tomcat_2已經在運行,IMAGE代表所用鏡像以及鏡像版本,PORTS顯示的是0.0.0.0:8099->8080/tcp 。代表的是把本機的8080端口映射到宿主機上的8099端口中。

但是,有讀者又有疑問了:
”Tomcat是運行了,那我怎麼把我的項目丟進去docker的Tomcat中呢?我用FTP工具鏈接到服務器上也找不到Tomcat在哪裏,怎麼辦?”

上面提到,docker中容器和宿主機是互相隔離的,因此容器是不會在宿主機中有明確的文件夾路徑,所以找不到纔是對的。
但是既然端口都能映射,爲啥文件夾不能映射呢?
在docker中,可以用 -v 指令指定把容器中的某個文件夾掛載到宿主機中
它的語法爲:

-v 宿主機目錄:容器目錄

所以我們可以在創建運行一個容器時,同時可以把指定的文件夾掛載到宿主機中
通常情況下,Tomcat運行程序的文件是在webapps下的,那麼可以在運行時把這個文件夾掛載到宿主機某個路徑上(如:/data目錄中),
名稱設置爲my_tomcat_3,端口設置爲8098,要把容器中的webapps文件夾掛載到宿主機中/data/my_tomcat_3/webapps文件夾:

docker run -d -p 8098:8080 -v /data/my_tomcat_3/webapps:/usr/local/tomcat/webapps  --name my_tomcat_3  tomcat:8.5

此時我們再用FTP工具鏈接到宿主機服務器上,進入data文件夾,就會發現:my_tomcat_3/webapps文件夾已經躺在裏邊了,可見已經掛載成功。

把文件夾掛載成功之後,此時我們把web項目丟到宿主機中的webapps下,重啓Tomcat容器後,再用ip:8099訪問,就會展示我們的web項目的內容了。
到這裏,docker中用Tomcat運行web項目的工作已經完成。

但是,回過頭來想想,留下很多問題:

  1. docker run是創建並且運行容器,那我怎麼控制容器的狀態呢?比如啓動和停止
  1. 爲什麼我在docker run時一直在重命名Tomcat的名字my_tomcat_1、my_tomcat_2、my_tomcat_3..
  2. 拉取和運行了那麼多鏡像,佔據很多磁盤空間,怎麼處理?
  3. 運行後的Tomcat,怎麼查看日誌?
  4. 我想要修改一下Tomcat中的server.xml的設置,但是宿主機中有沒有這個文件,難道我要掛載出來嗎?

看完此文之後,你有什麼問題嗎?歡迎讀者把問題後臺留言給小編或者加小編的微信,下一篇文章,小編會針對上面的問題以及讀者提出的問題,做一個完整的解答以及把如何做好的Tomcat上傳到鏡像倉庫做一個演示,所以:
關!注!我!

下期小編甚至會把常用的一些docker命名整理出來,方便大家集中記憶和使用!


覺得本文對你有幫助?請分享給更多人
關注「編程無界」,提升裝逼技能

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章