本文旨在用最通俗的語言講述最枯燥的基本知識
上一篇文章《爲何要用docker》已經講述了什麼是docker以及咱們要用docker的緣由,而且講解了如何安裝docker。這時候不少讀者磨拳擦腳躍躍欲試但卻發現安裝好docker以後就無從下手了,那麼,接下來,小編會從如下方面講述docker的一些基礎知識,固然,理論都是生硬的,因此小編選取了javaweb項目中最經常使用的一個軟件--tomcat的安裝和使用來引導學習一些docker相關的知識,藉此讓讀者可以從實戰的角度去理解docker爲何會有這些基礎知識以及如何使用這些基礎知識。java
咱們知道,web開發和部署離不開tomcat,而在目前的實際狀況是:
一個項目中,每一個開發者本機電腦都有本身的tomcat或者用idea的內置tomcat,當咱們開發完成提交測試時,測試服務器上也有一個tomcat;當項目上線時,線上服務器也有一個tomcat,所以就很容易出現一些奇奇怪怪的問題,好比在同事A電腦上能正常運行的,到同事B電腦上就出問題的;或者是在測試環境裏一切正常,到了線上bug一堆。這時候docker就有了用武之地,項目負責人把docker的tomcat鏡像作好了以後上傳到鏡像倉庫,項目成員的電腦環境、測試環境、線上環境均拉取這個tomcat使用,就能保持在全部的環境下tomcat的版本、設置都是一致的,避免了一些非技術的問題。
那麼,如今咱們就用docker來作一個tomcat的環境。web
- 鏡像的查找和拉取
首先,咱們須要去鏡像倉庫找到咱們要的鏡像,查找鏡像的語法是docker
docker search 鏡像名稱:鏡像TAG
所以,查找Tomcat鏡像:編程
docker search tomcat
有讀者會疑問:什麼是鏡像TAG?
鏡像的TAG值就是鏡像的版本,就好比Tomcat有7.0、8.五、9.0等咱們經常使用的版本,那麼相應的這些軟件被作成docker鏡像以後,官方也會根據軟件自己的版本對應出docker鏡像的版本。
下圖爲查找結果:
能夠看到,有不少的Tomcat鏡像,那麼咱們應該怎麼選用這些鏡像呢?一般狀況下,咱們都知道官方的東西基本上表明安全無公害,由於能夠看到右邊有official標識爲OK的就是官方的鏡像,所以咱們拉取第一個Tomcat就能夠。
拉取鏡像的語法是:瀏覽器
docker pull 鏡像NAME:鏡像TAG
由於咱們要拉取Tomcat時,就能夠這樣寫:tomcat
docker pull tomcat
有人說你怎麼沒加上鏡像TAG
在拉取鏡像時,若是加上鏡像TAG,就會去查找是否有相應版本的鏡像,若是有則拉取,若是沒有則不拉去。而沒有加TAG時,就默認表明拉取的是該鏡像的最新版本。安全
假如須要拉取固定版本如拉取Tomcat8.5:服務器
docker pull tomcat:8.5
就會相應的拉取了該版本的Tomcat鏡像。
拉取成功以後,咱們要查看咱們拉取的版本,能夠用命名:微信
docker images
能夠看到,鏡像列表裏已經有了咱們要拉取的Tomcat鏡像
app
- 鏡像的使用
鏡像拉取下來以後,就如咱們把從網上把下載到了本地電腦,可是沒有任何生命的跡象,只有把它安裝運行起來,纔是一個活的容器,相應地,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是建立而且運行容器,那我怎麼控制容器的狀態呢?好比啓動和中止
看完此文以後,你有什麼問題嗎?歡迎讀者把問題後臺留言給小編或者加小編的微信,下一篇文章,小編會針對上面的問題以及讀者提出的問題,作一個完整的解答以及把如何作好的Tomcat上傳到鏡像倉庫作一個演示,因此:
關!注!我!
下期小編甚至會把經常使用的一些docker命名整理出來,方便你們集中記憶和使用!
以爲本文對你有幫助?請分享給更多人
關注「編程無界」,提高裝逼技能