docker入門教程這一篇就夠了

20191028091820.png

作為軟件開發者,平常最痛恨的應該就是環境配置問題了吧。比如說,我要在一臺新電腦(新環境)上安裝tomcat跑一個javaweb應用,因為tomcat是java代碼編寫的,所以首先我要安裝一個java運行時環境(JRE),配置JAVA_HOME,然后才能安裝tomcat開始跑javaweb。還有,如果我要學習一門新的語言go、或新的中間件RabbitMQ、可能花費在安裝這些環境的時間就讓你想放棄了。
而作為運維人員,平時肯定也為部署新環境折騰得焦頭爛額,一下子要為好幾臺新機器配置運行環境,每臺機器上執行相同操作,十分機械化。
知道了平時開發中的痛點,那是否有一種工具,能讓我快速安裝tomcat而不用去理會環境問題。能讓我把go、RabbitMQ整個環境下載下來,不需任何配置,我就能在這個環境中直接運行go代碼。能讓我配置了一臺機器后,原樣復制一份,發到其他機器直接運行,不用再做配置就可以得到相同的環境?是有這種工具的,它就是虛擬化容器技術,而docker,就是這門技術中的佼佼者。

1. 什么是docker

docker是一門虛擬化容器技術,其設計理念是"build once, run anywhere"(一次構建,到處運行),聽起來,是不是跟java的"wirte once, run anywhere"(一次編寫,到處運行)很像?那么,什么是虛擬化容器技術呢?docker 將應用程序與該程序的依賴,打包在一個文件里面。運行這個文件,就會生成一個虛擬容器,程序在這個虛擬容器里運行,就好像在真實的物理機上運行一樣。有了 Docker,就不用擔心環境問題。正如開篇第一張圖docker的標志一樣,docker就是這條鯨魚,其上馱著的集裝箱,就是一個個互相隔離的容器,你可以隨時往上添加集裝箱,不會影響到原有集裝箱里的內容。

2. docker和虛擬機的區別

docker 和傳統虛擬化方式的不同之處,傳統虛擬機技術是虛擬出一套硬件后,在其上運行一個完整操作系統,在該系統上再運行所需應用進程;而容器內的應用進程直接運行于宿主的內核,容器內沒有自己的內核,共享宿主機的內核,而且也沒有進行硬件虛擬。因此容器要比傳統虛擬機更為輕便。
[圖片上傳失敗...(image-926fd8-1572257136481)]

3. 安裝docker

docker可以在各個操作系統上安裝,過程很簡單,安裝教程請看這里:https://www.runoob.com/docker/windows-docker-install.html
docker在windows上安裝是一件麻煩事,但不想在vm虛擬機中的linux上安裝因為懶得開,所以還是在windows上安裝了,windows上有兩種安裝方法:

  • docker toolbox:這個安裝包適用于所有windows版本(windows xp的當我沒說),包括win7, win8, win10家庭版。我就是安裝的這個版本
  • docker for windows:這個版本適合win10專業版,因為win10專業版帶有Hyper-v虛擬化功能,安裝前需要開啟該功能,具體看上面的安裝鏈接。

3.1. 安裝docker toolbox遇到的問題

這是安裝docker toolbox遇到的卡在下載boot2docker.iso的問題,安裝docker其他版本的這節可以忽略不看。
docker toolbox安裝完成后,會有如下三個圖標,
[圖片上傳失敗...(image-6ed3d3-1572257136481)]
啟動docker需要點擊Docker Quickstart,其會查找指定目錄下的boot2docker.iso(一個輕量級的linux虛擬機)文件,并根據該文件創建一個名為default的linux虛擬機,初次點擊時找不到該文件,會從github下載,但docker下載速度相當慢,等了個把小時都無法完成。提示如下:

Running pre-create checks...
(default) No default Boot2Docker ISO found locally, downloading the latest release...
(default) Latest release for github.com/boot2docker/boot2docker is v1.12.1
(default) Downloading C:\Users\huang\machine\cache\boot2docker.iso from https://github.com/boot2docker/boot2docker/releases/download/v1.12.1/boot2docker.iso...

解決方案是:使用瀏覽器(或者迅雷)到boot2docker的主頁下載最新版boot2docker.iso,地址:(https://github.com/boot2docker/boot2docker/releases),如下圖:

20191028104542.png

下載完成后斷開網絡,將下載好的boot2docker.iso放到提示的位置,我這里是:C:\Users\huang\machine\cache\目錄。記住要斷開網絡,重新點擊Docker Quickstart圖標啟動docker即可,啟動完成即可連接網絡,開始學習docker了。

3.2. boot2docker

對boot2docker感興趣的可以看看其github的介紹,boot2docker是一個輕量級的、用于運行docker容器的linux系統,完全在內存中運行,大小只有45m左右,啟動迅速。所以在windows中運行docker,其原理是使用啟動了一個linux虛擬機,該虛擬機中安裝了docker,點擊Docker Quickstart后,我們可以看到控制臺的輸出,該虛擬主機名為default,默認的ip是192.168.99.100。再從github中的介紹可以看到,該虛擬機有docker用戶,密碼為tcuser。因此,我們可以從secureCRT或者git bash中使用ssh登錄到該機器,在上面使用docker命令。當然你可以在default虛擬機中安裝vim等工具,但是由于其是內存操作系統,重啟后這些新安裝的工具都會消失。


20191028111854.png

遠程登錄命令:

ssh docker@192.168.99.100
# 密碼
tcuser

3.3. docker阿里云鏡像加速

這一節可以暫時不看,等你覺得docker下載太慢時,可以看我的另一篇文章,配置鏡像加速,地址為:http://www.lxweimin.com/p/aff1a4a471de

4. docker架構

這里我想先從docker的架構圖和幾個重要的概念說起,最后再說具體的命令,這樣方便大家知道每一條命令的意思和執行過程。看完這篇文章后 ,推薦一個docker教程,不長,鏈接在文章最下方的參考資料。
[圖片上傳失敗...(image-ccd01f-1572257136481)]
如上圖,docker采用的是C/S架構。客戶端向服務器發送請求,服務器負責構建、運行和分發容器。客戶端和服務器可以運行在同一個Host上,客戶端也可以通過socket或者REST API與遠程的服務器通信。對照上圖,涉及到的概念如下:

  • Client:docker客戶端,最常見的客戶端就是docker命令,如docker build、docker pull、docker run等,通過這些命令我們可以方便的在host上構建和運行容器。
  • Daemon:docker deamon是服務器組件,以linux后臺服務的方式運行。docker daemon運行在宿主機docker host上,負責創建、運行、監控容器,構建、存儲鏡像。
  • image:鏡像,可將鏡像看成只讀模板,通過它可以創建docker容器。正如Java中了.class文件,通過.class可以創建出類的實例。鏡像是層疊的,最底層就是linux內核,每添加一個文件或者操作都會在原來的基礎上疊加一層,如JDK環境疊加在linux內核之上,tomcat又疊加在JDK環境之上,此時如果你的docker中已有JDK鏡像的話,就只需下載tomcat這層即可。因為鏡像是只讀的、共享的。
  • container:容器,docker容器就是docker鏡像的運行實例。
  • registry:registry是存放docker鏡像的倉庫,我們可以將自己的鏡像推到遠程,或者從遠程下載鏡像到本地運行,正如github。docker官方有一個docker hub,我們可以從上面下載官方的鏡像。如,下載一個官方的tomcat鏡像,直接運行該鏡像即可啟動tomcat,不需任何配置。

綜上,結合上圖,整個docker架構交互流程為:啟動docker,docker以守護進程的方式運行在linux主機上(docker toolbox下為boot2docker虛擬出來的linux上),我們發送docker命令給到docker daemon執行,docker可以從docker hub中拉取所需要的image,再根據image創建出container。

5. 實戰

知道了上面docker架構的交互流程了,我這里以運行一個tomcat容器為例,一步步介紹常用的命令:

  • docker images:列出當前docker中有哪些鏡像,如果是第一次執行,當然就沒有鏡像了。
  • docker search tomcat:在docker hub中搜索tomcat鏡像。當然你可以在瀏覽器中訪問docker hub,地址為:(https://hub.docker.com/),就像訪問maven的遠程倉庫一樣,可以搜索你需要的內容。
    20191028120959.png
  • docker pull tomcat:拉取最新版的tomcat鏡像到本地,下載完成后再使用docker images就能看到感下載的鏡像了。
  • docker run --name mytomcat -p 8080:8080 -d tomcat:根據tomcat鏡像運行出一個tomcat實例,執行兩遍就有兩個實例了(注意改端口),--name表示為這個實例命名,-p 8080:8080表示將本地的8080端口綁定到容器中的8080端口,才能使用localhost:8080(docker toolbox是192.168.99.100:8080)訪問到tomcat端口。-d表示后臺運行。
  • docker run --name mytomcat03 -p 8082:8080 -it tomcat /bin/bash:-it以交互、附加模式啟動并進入容器后執行/bin/bash命令,不以后臺運行,進入容器后執行exit命令后,會退出容器,此時使用docker ps -a命令查看會顯示為exit狀態。
  • ctrl+p+q:退出但是后臺運行,如上一個命令,執行exit退出后容器就會退出,此時若不想容器退出,可按這一組快捷鍵。
  • docker ps -a:顯示所有容器狀態,docker ps只顯示運行中的容器,-a表示顯示所有容器,包括已退出的容器。這時就能看到剛剛啟動的tomcat了。
  • docker logs -f mytomcat:查看剛剛啟動的tomcat打出來的日志,-f表示跟蹤滾動日志打印。
  • docker exec -it mytomcat /bin/bash:exec表示執行命令,命令最后需要帶將要執行的命令,如/bin/bash,-it表示以交互、附加模式啟動返回一個終端,/bin/bash表示進入容器后首先執行的命令。這條命令執行后就登錄到了容器內部,該容器中就是tomcat應用。就像使用ssh登錄到容器內部一樣。這時候你可以修改容器內部的配置文件,當然,生產環境不建議這么做,而是使用配置文件外部掛載的方式。
  • docker stop mytomcat:停止mytomcat實例,不會刪除容器內的東西。
  • docker start -i mytomcat:啟動已停止的mytomcat實例,如果啟動前修改了容器內的配置文件,此時重新啟動會重新加載該配置,如果該配置文件是linux宿主機級別的,如/etc/profile文件,則不會加載,因為容器是共享宿主機的配置的。-i表示啟動并進入交互命令界面。
  • docker rm mytomcat:刪除已停止的mytomcat實例
  • docker run --name mytomcat02 -p8081:8080 -e JAVA_HOME=/path/to/java/home -v /host/path/file:/container/path/file -d tomcat:-e表示設置環境變量JAVA_HOME,進入到容器中,使用echo $JAVA_HOME可以看到該環境變量的值。-v表示掛載宿主機的/host/path/file到容器中的/container/path/file,修改宿主機的文件時,容器中的文件也會修改。如果使用的是docker toolbox,則宿主機掛在的文件需要在當前用戶目錄下,即c:\user\yourname下才行,否則不會報錯但無法掛載成功,當時被這個問題坑了一個下午。
  • docker cp /host/path/file mytomcat02:/container/path/file:復制宿主機文件到容器中,可以用于當修改了容器配置文件后,配置文件錯誤導致無法啟動時,復制配置文件到宿主機修改配置,然后重新復制回容器即可。
  • docker inspect mytomcat:查看容器信息,包括容器ip等信息。

6. 構建docker鏡像

假如我們下載了tomcat鏡像并啟動了容器實例,并在tomcat容器中修改了配置文件。這時,我們可以把配置文件也一起打包做成鏡像,發到另外的機器直接執行,就不用再單獨對每一臺機器配置了。docker提供了兩種方式來構建鏡像,如下:

  • docker commit:通過容器構建
  • docker build:通過dockerfile文件構建

dockerfile文件方式構建需要編寫dockerfile,也只有幾個命令,不難,請自行查閱資料。此處講下docker commit命令。
docker commit mytomcat huangzb/tomcat:將當前的mytomcat容器提交為鏡像,鏡像名為huangzb/tomcat

7. 容器的網絡結構

熟悉docker的網絡結構是相當重要的,因為這樣我們就可以做集群啦。廢話不多說,那就直入主題吧。
docker的網絡使用了linux網絡中的bridge(網橋)和veth(virtual ethernet虛擬以太網)虛擬設備。

  • bridge:網絡橋接器,簡稱網橋,普通的網橋只有兩個接口,連接兩個網絡,工作在二層(數據鏈路層),只要有mac地址就能轉發數據包。而linux得虛擬bridge有多個接口,并且能配置ip,更像一個路由器。安裝完docker后,在宿主機中使用ifconfig命令,可以看到網絡配置中出現了docker0網絡。docker0就是docker設置的linux虛擬網橋。
  • veth:virtual ethernet是linux中的虛擬網絡設備,其像一條兩端有網卡的線,可以將兩個設備連接起來分別配置ip地址。
    [圖片上傳失敗...(image-b672e-1572257136481)]
    因此,在我windows下docker toolbox中的網絡如下圖。
    [圖片上傳失敗...(image-3f9661-1572257136481)]

7.1. 容器間互聯

由上,docker中新建的容器默認都使用了docker0網橋連接了起來,所有默認的,docker創建的所有容器都在一個網絡中,互相可以訪問。

以上。有興趣的同學可以學習下面的參考資料。

參考資料

  1. docker教程:https://yeasy.gitbooks.io/docker_practice/introduction/what.html
  2. 極客學院視頻教程:https://www.bilibili.com/video/av17854410/?p=1
  3. docker bridge網橋:https://www.ibm.com/developerworks/cn/linux/1310_xiawc_networkdevice/index.html
  4. docker網絡深度研究:http://www.lxweimin.com/p/19d6f55b9563
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容