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就是這條鯨魚,其上馱着的集裝箱,就是一個個互相隔離的容器,你能夠隨時往上添加集裝箱,不會影響到原有集裝箱裏的內容。html

2. docker和虛擬機的區別

docker 和傳統虛擬化方式的不一樣之處,傳統虛擬機技術是虛擬出一套硬件後,在其上運行一個完整操做系統,在該系統上再運行所需應用進程;而容器內的應用進程直接運行於宿主的內核,容器內沒有本身的內核,共享宿主機的內核,並且也沒有進行硬件虛擬。所以容器要比傳統虛擬機更爲輕便。 java

20191028100057.png

3. 安裝docker

docker能夠在各個操做系統上安裝,過程很簡單,安裝教程請看這裏:www.runoob.com/docker/wind… docker在windows上安裝是一件麻煩事,但不想在vm虛擬機中的linux上安裝由於懶得開,因此仍是在windows上安裝了,windows上有兩種安裝方法:linux

  • 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安裝完成後,會有以下三個圖標, git

20191028102613.png
啓動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,地址:(github.com/boot2docker…),以下圖: github

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等工具,可是因爲其是內存操做系統,重啓後這些新安裝的工具都會消失。 web

20191028111854.png
遠程登陸命令:

ssh docker@192.168.99.100
# 密碼
tcuser
複製代碼

3.3. docker阿里雲鏡像加速

這一節能夠暫時不看,等你以爲docker下載太慢時,能夠看個人另外一篇文章,配置鏡像加速,地址爲:www.jianshu.com/p/aff1a4a47…docker

4. docker架構

這裏我想先從docker的架構圖和幾個重要的概念提及,最後再說具體的命令,這樣方便你們知道每一條命令的意思和執行過程。看完這篇文章後 ,推薦一個docker教程,不長,連接在文章最下方的參考資料。 vim

20191028114150.png
如上圖,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。windows

5. 實戰

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

  • docker images:列出當前docker中有哪些鏡像,若是是第一次執行,固然就沒有鏡像了。
  • docker search tomcat:在docker hub中搜索tomcat鏡像。固然你能夠在瀏覽器中訪問docker hub,地址爲:(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地址。
    20191028161708.png
    所以,在我windows下docker toolbox中的網絡以下圖。
    20191028172336.png

7.1. 容器間互聯

由上,docker中新建的容器默認都使用了docker0網橋鏈接了起來,全部默認的,docker建立的全部容器都在一個網絡中,互相能夠訪問。

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

參考資料

  1. docker教程:yeasy.gitbooks.io/docker_prac…
  2. 極客學院視頻教程:www.bilibili.com/video/av178…
  3. docker bridge網橋:www.ibm.com/developerwo…
  4. docker網絡深度研究:www.jianshu.com/p/19d6f55b9…
相關文章
相關標籤/搜索