在docker中用Tomcat運行web項目
本文旨在用最通俗的語言講述最枯燥的基本知識
上一篇文章《為什麽要用docker》已經講述了什麽是docker以及我們要用docker的原因,並且講解了如何安裝docker。這時候很多讀者磨拳擦腳躍躍欲試但卻發現安裝好docker之後就無從下手了,那麽,接下來,小編會從以下方面講述docker的一些基礎知識,當然,理論都是生硬的,所以小編選取了javaweb項目中最常用的一個軟件--tomcat的安裝和使用來引導學習一些docker相關的知識,借此讓讀者能夠從實戰的角度去理解docker為什麽會有這些基礎知識以及如何使用這些基礎知識。
我們知道,web開發和部署離不開tomcat,而在目前的實際情況是:
那麽,現在我們就用docker來做一個tomcat的環境。
- 鏡像的查找和拉取
首先,我們需要去鏡像倉庫找到我們要的鏡像,查找鏡像的語法是
docker search 鏡像名稱:鏡像TAG
因此,查找Tomcat鏡像:
docker search tomcat
有讀者會疑問:什麽是鏡像TAG?
鏡像的TAG值就是鏡像的版本,就比如Tomcat有7.0、8.5、9.0等我們常用的版本,那麽相應的這些軟件被做成docker鏡像之後,官方也會根據軟件本身的版本對應出docker鏡像的版本。
下圖為查找結果:
可以看到,有很多的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鏡像
- 鏡像的使用
鏡像拉取下來之後,就如我們把從網上把下載到了本地電腦,但是沒有任何生命的跡象,只有把它安裝運行起來,才是一個活的容器,相應地,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項目的工作已經完成。
但是,回過頭來想想,留下很多問題:
- docker run是創建並且運行容器,那我怎麽控制容器的狀態呢?比如啟動和停止
- 為什麽我在docker run時一直在重命名Tomcat的名字my_tomcat_1、my_tomcat_2、my_tomcat_3..
- 拉取和運行了那麽多鏡像,占據很多磁盤空間,怎麽處理?
- 運行後的Tomcat,怎麽查看日誌?
- 我想要修改一下Tomcat中的server.xml的設置,但是宿主機中有沒有這個文件,難道我要掛載出來嗎?
看完此文之後,你有什麽問題嗎?歡迎讀者把問題後臺留言給小編或者加小編的微信,下一篇文章,小編會針對上面的問題以及讀者提出的問題,做一個完整的解答以及把如何做好的Tomcat上傳到鏡像倉庫做一個演示,所以:
關!註!我!
下期小編甚至會把常用的一些docker命名整理出來,方便大家集中記憶和使用!
覺得本文對你有幫助?請分享給更多人
關註「編程×××」,提升裝逼技能
<br>
在docker中用Tomcat運行web項目