作為軟件開發(fā)者败潦,平常最痛恨的應(yīng)該就是環(huán)境配置問題了吧。比如說,我要在一臺新電腦(新環(huán)境)上安裝tomcat跑一個javaweb應(yīng)用膝舅,因為tomcat是java代碼編寫的驰坊,所以首先我要安裝一個java運行時環(huán)境(JRE)匾二,配置JAVA_HOME,然后才能安裝tomcat開始跑javaweb拳芙。還有察藐,如果我要學(xué)習(xí)一門新的語言go、或新的中間件RabbitMQ舟扎、可能花費在安裝這些環(huán)境的時間就讓你想放棄了分飞。
而作為運維人員,平時肯定也為部署新環(huán)境折騰得焦頭爛額睹限,一下子要為好幾臺新機器配置運行環(huán)境譬猫,每臺機器上執(zhí)行相同操作,十分機械化羡疗。
知道了平時開發(fā)中的痛點染服,那是否有一種工具,能讓我快速安裝tomcat而不用去理會環(huán)境問題叨恨。能讓我把go柳刮、RabbitMQ整個環(huán)境下載下來,不需任何配置痒钝,我就能在這個環(huán)境中直接運行g(shù)o代碼秉颗。能讓我配置了一臺機器后,原樣復(fù)制一份午乓,發(fā)到其他機器直接運行站宗,不用再做配置就可以得到相同的環(huán)境?是有這種工具的益愈,它就是虛擬化容器技術(shù)梢灭,而docker夷家,就是這門技術(shù)中的佼佼者。
1. 什么是docker
docker是一門虛擬化容器技術(shù)敏释,其設(shè)計理念是"build once, run anywhere"(一次構(gòu)建库快,到處運行),聽起來钥顽,是不是跟java的"wirte once, run anywhere"(一次編寫义屏,到處運行)很像?那么蜂大,什么是虛擬化容器技術(shù)呢闽铐?docker 將應(yīng)用程序與該程序的依賴,打包在一個文件里面奶浦。運行這個文件兄墅,就會生成一個虛擬容器,程序在這個虛擬容器里運行澳叉,就好像在真實的物理機上運行一樣隙咸。有了 Docker,就不用擔(dān)心環(huán)境問題成洗。正如開篇第一張圖docker的標(biāo)志一樣五督,docker就是這條鯨魚,其上馱著的集裝箱瓶殃,就是一個個互相隔離的容器充包,你可以隨時往上添加集裝箱,不會影響到原有集裝箱里的內(nèi)容遥椿。
2. docker和虛擬機的區(qū)別
docker 和傳統(tǒng)虛擬化方式的不同之處误证,傳統(tǒng)虛擬機技術(shù)是虛擬出一套硬件后,在其上運行一個完整操作系統(tǒng)修壕,在該系統(tǒng)上再運行所需應(yīng)用進程;而容器內(nèi)的應(yīng)用進程直接運行于宿主的內(nèi)核遏考,容器內(nèi)沒有自己的內(nèi)核慈鸠,共享宿主機的內(nèi)核,而且也沒有進行硬件虛擬灌具。因此容器要比傳統(tǒng)虛擬機更為輕便青团。
[圖片上傳失敗...(image-926fd8-1572257136481)]
3. 安裝docker
docker可以在各個操作系統(tǒng)上安裝,過程很簡單咖楣,安裝教程請看這里:https://www.runoob.com/docker/windows-docker-install.html督笆。
docker在windows上安裝是一件麻煩事,但不想在vm虛擬機中的linux上安裝因為懶得開诱贿,所以還是在windows上安裝了娃肿,windows上有兩種安裝方法:
- docker toolbox:這個安裝包適用于所有windows版本(windows xp的當(dāng)我沒說)咕缎,包括win7, win8, win10家庭版。我就是安裝的這個版本
- docker for windows:這個版本適合win10專業(yè)版料扰,因為win10專業(yè)版帶有Hyper-v虛擬化功能凭豪,安裝前需要開啟該功能,具體看上面的安裝鏈接晒杈。
3.1. 安裝docker toolbox遇到的問題
這是安裝docker toolbox遇到的卡在下載boot2docker.iso的問題嫂伞,安裝docker其他版本的這節(jié)可以忽略不看。
docker toolbox安裝完成后拯钻,會有如下三個圖標(biāo)帖努,
[圖片上傳失敗...(image-6ed3d3-1572257136481)]
啟動docker需要點擊Docker Quickstart,其會查找指定目錄下的boot2docker.iso(一個輕量級的linux虛擬機)文件粪般,并根據(jù)該文件創(chuàng)建一個名為default的linux虛擬機拼余,初次點擊時找不到該文件,會從github下載刊驴,但docker下載速度相當(dāng)慢姿搜,等了個把小時都無法完成。提示如下:
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)舅柜,如下圖:
下載完成后斷開網(wǎng)絡(luò),將下載好的boot2docker.iso放到提示的位置躲惰,我這里是:
C:\Users\huang\machine\cache\
目錄致份。記住要斷開網(wǎng)絡(luò),重新點擊Docker Quickstart圖標(biāo)啟動docker即可础拨,啟動完成即可連接網(wǎng)絡(luò)氮块,開始學(xué)習(xí)docker了。
3.2. boot2docker
對boot2docker感興趣的可以看看其github的介紹诡宗,boot2docker是一個輕量級的滔蝉、用于運行docker容器的linux系統(tǒng),完全在內(nèi)存中運行塔沃,大小只有45m左右蝠引,啟動迅速。所以在windows中運行docker蛀柴,其原理是使用啟動了一個linux虛擬機螃概,該虛擬機中安裝了docker,點擊Docker Quickstart后鸽疾,我們可以看到控制臺的輸出吊洼,該虛擬主機名為default,默認的ip是192.168.99.100制肮。再從github中的介紹可以看到冒窍,該虛擬機有docker用戶递沪,密碼為tcuser。因此超燃,我們可以從secureCRT或者git bash中使用ssh登錄到該機器区拳,在上面使用docker命令。當(dāng)然你可以在default虛擬機中安裝vim等工具意乓,但是由于其是內(nèi)存操作系統(tǒng)樱调,重啟后這些新安裝的工具都會消失。
遠程登錄命令:
ssh docker@192.168.99.100
# 密碼
tcuser
3.3. docker阿里云鏡像加速
這一節(jié)可以暫時不看届良,等你覺得docker下載太慢時笆凌,可以看我的另一篇文章,配置鏡像加速士葫,地址為:http://www.reibang.com/p/aff1a4a471de
4. docker架構(gòu)
這里我想先從docker的架構(gòu)圖和幾個重要的概念說起乞而,最后再說具體的命令,這樣方便大家知道每一條命令的意思和執(zhí)行過程慢显∽δ#看完這篇文章后 ,推薦一個docker教程荚藻,不長屋灌,鏈接在文章最下方的參考資料。
[圖片上傳失敗...(image-ccd01f-1572257136481)]
如上圖应狱,docker采用的是C/S架構(gòu)共郭。客戶端向服務(wù)器發(fā)送請求疾呻,服務(wù)器負責(zé)構(gòu)建除嘹、運行和分發(fā)容器“段希客戶端和服務(wù)器可以運行在同一個Host上尉咕,客戶端也可以通過socket或者REST API與遠程的服務(wù)器通信。對照上圖璃岳,涉及到的概念如下:
- Client:docker客戶端龙考,最常見的客戶端就是docker命令,如docker build矾睦、docker pull、docker run等炎功,通過這些命令我們可以方便的在host上構(gòu)建和運行容器枚冗。
- Daemon:docker deamon是服務(wù)器組件,以linux后臺服務(wù)的方式運行蛇损。docker daemon運行在宿主機docker host上赁温,負責(zé)創(chuàng)建坛怪、運行、監(jiān)控容器股囊,構(gòu)建袜匿、存儲鏡像。
- image:鏡像稚疹,可將鏡像看成只讀模板居灯,通過它可以創(chuàng)建docker容器。正如Java中了.class文件内狗,通過.class可以創(chuàng)建出類的實例怪嫌。鏡像是層疊的,最底層就是linux內(nèi)核柳沙,每添加一個文件或者操作都會在原來的基礎(chǔ)上疊加一層岩灭,如JDK環(huán)境疊加在linux內(nèi)核之上,tomcat又疊加在JDK環(huán)境之上赂鲤,此時如果你的docker中已有JDK鏡像的話噪径,就只需下載tomcat這層即可。因為鏡像是只讀的数初、共享的找爱。
- container:容器,docker容器就是docker鏡像的運行實例妙真。
- registry:registry是存放docker鏡像的倉庫缴允,我們可以將自己的鏡像推到遠程,或者從遠程下載鏡像到本地運行珍德,正如github练般。docker官方有一個docker hub,我們可以從上面下載官方的鏡像锈候。如薄料,下載一個官方的tomcat鏡像,直接運行該鏡像即可啟動tomcat泵琳,不需任何配置摄职。
綜上,結(jié)合上圖获列,整個docker架構(gòu)交互流程為:啟動docker谷市,docker以守護進程的方式運行在linux主機上(docker toolbox下為boot2docker虛擬出來的linux上),我們發(fā)送docker命令給到docker daemon執(zhí)行击孩,docker可以從docker hub中拉取所需要的image迫悠,再根據(jù)image創(chuàng)建出container。
5. 實戰(zhàn)
知道了上面docker架構(gòu)的交互流程了巩梢,我這里以運行一個tomcat容器為例创泄,一步步介紹常用的命令:
-
docker images
:列出當(dāng)前docker中有哪些鏡像艺玲,如果是第一次執(zhí)行,當(dāng)然就沒有鏡像了鞠抑。 -
docker search tomcat
:在docker hub中搜索tomcat鏡像饭聚。當(dāng)然你可以在瀏覽器中訪問docker hub,地址為:(https://hub.docker.com/)搁拙,就像訪問maven的遠程倉庫一樣秒梳,可以搜索你需要的內(nèi)容。
20191028120959.png -
docker pull tomcat
:拉取最新版的tomcat鏡像到本地感混,下載完成后再使用docker images就能看到感下載的鏡像了端幼。 -
docker run --name mytomcat -p 8080:8080 -d tomcat
:根據(jù)tomcat鏡像運行出一個tomcat實例,執(zhí)行兩遍就有兩個實例了(注意改端口)弧满,--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以交互、附加模式啟動并進入容器后執(zhí)行/bin/bash命令募谎,不以后臺運行扶关,進入容器后執(zhí)行exit命令后,會退出容器数冬,此時使用docker ps -a命令查看會顯示為exit狀態(tài)怎燥。 -
ctrl+p+q
:退出但是后臺運行晶框,如上一個命令溉卓,執(zhí)行exit退出后容器就會退出趾盐,此時若不想容器退出,可按這一組快捷鍵秸架。 -
docker ps -a
:顯示所有容器狀態(tài)揍庄,docker ps只顯示運行中的容器,-a表示顯示所有容器东抹,包括已退出的容器蚂子。這時就能看到剛剛啟動的tomcat了。 -
docker logs -f mytomcat
:查看剛剛啟動的tomcat打出來的日志缭黔,-f表示跟蹤滾動日志打印食茎。 -
docker exec -it mytomcat /bin/bash
:exec表示執(zhí)行命令,命令最后需要帶將要執(zhí)行的命令馏谨,如/bin/bash别渔,-it表示以交互、附加模式啟動返回一個終端,/bin/bash表示進入容器后首先執(zhí)行的命令钠糊。這條命令執(zhí)行后就登錄到了容器內(nèi)部,該容器中就是tomcat應(yīng)用壹哺。就像使用ssh登錄到容器內(nèi)部一樣抄伍。這時候你可以修改容器內(nèi)部的配置文件,當(dāng)然管宵,生產(chǎn)環(huán)境不建議這么做截珍,而是使用配置文件外部掛載的方式。 -
docker stop mytomcat
:停止mytomcat實例箩朴,不會刪除容器內(nèi)的東西岗喉。 -
docker start -i mytomcat
:啟動已停止的mytomcat實例,如果啟動前修改了容器內(nèi)的配置文件炸庞,此時重新啟動會重新加載該配置钱床,如果該配置文件是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表示設(shè)置環(huán)境變量JAVA_HOME纸颜,進入到容器中,使用echo $JAVA_HOME可以看到該環(huán)境變量的值绎橘。-v表示掛載宿主機的/host/path/file到容器中的/container/path/file胁孙,修改宿主機的文件時,容器中的文件也會修改称鳞。如果使用的是docker toolbox涮较,則宿主機掛在的文件需要在當(dāng)前用戶目錄下,即c:\user\yourname下才行胡岔,否則不會報錯但無法掛載成功法希,當(dāng)時被這個問題坑了一個下午。 -
docker cp /host/path/file mytomcat02:/container/path/file
:復(fù)制宿主機文件到容器中靶瘸,可以用于當(dāng)修改了容器配置文件后苫亦,配置文件錯誤導(dǎo)致無法啟動時,復(fù)制配置文件到宿主機修改配置怨咪,然后重新復(fù)制回容器即可屋剑。 -
docker inspect mytomcat
:查看容器信息,包括容器ip等信息诗眨。
6. 構(gòu)建docker鏡像
假如我們下載了tomcat鏡像并啟動了容器實例唉匾,并在tomcat容器中修改了配置文件。這時,我們可以把配置文件也一起打包做成鏡像巍膘,發(fā)到另外的機器直接執(zhí)行厂财,就不用再單獨對每一臺機器配置了。docker提供了兩種方式來構(gòu)建鏡像峡懈,如下:
- docker commit:通過容器構(gòu)建
- docker build:通過dockerfile文件構(gòu)建
dockerfile文件方式構(gòu)建需要編寫dockerfile璃饱,也只有幾個命令,不難肪康,請自行查閱資料荚恶。此處講下docker commit命令。
docker commit mytomcat huangzb/tomcat
:將當(dāng)前的mytomcat容器提交為鏡像磷支,鏡像名為huangzb/tomcat
7. 容器的網(wǎng)絡(luò)結(jié)構(gòu)
熟悉docker的網(wǎng)絡(luò)結(jié)構(gòu)是相當(dāng)重要的谒撼,因為這樣我們就可以做集群啦。廢話不多說雾狈,那就直入主題吧廓潜。
docker的網(wǎng)絡(luò)使用了linux網(wǎng)絡(luò)中的bridge(網(wǎng)橋)和veth(virtual ethernet虛擬以太網(wǎng))虛擬設(shè)備。
- bridge:網(wǎng)絡(luò)橋接器箍邮,簡稱網(wǎng)橋茉帅,普通的網(wǎng)橋只有兩個接口,連接兩個網(wǎng)絡(luò)锭弊,工作在二層(數(shù)據(jù)鏈路層)堪澎,只要有mac地址就能轉(zhuǎn)發(fā)數(shù)據(jù)包。而linux得虛擬bridge有多個接口味滞,并且能配置ip樱蛤,更像一個路由器。安裝完docker后剑鞍,在宿主機中使用ifconfig命令昨凡,可以看到網(wǎng)絡(luò)配置中出現(xiàn)了docker0網(wǎng)絡(luò)。docker0就是docker設(shè)置的linux虛擬網(wǎng)橋蚁署。
- veth:virtual ethernet是linux中的虛擬網(wǎng)絡(luò)設(shè)備便脊,其像一條兩端有網(wǎng)卡的線,可以將兩個設(shè)備連接起來分別配置ip地址光戈。
[圖片上傳失敗...(image-b672e-1572257136481)]
因此哪痰,在我windows下docker toolbox中的網(wǎng)絡(luò)如下圖。
[圖片上傳失敗...(image-3f9661-1572257136481)]
7.1. 容器間互聯(lián)
由上久妆,docker中新建的容器默認都使用了docker0網(wǎng)橋連接了起來晌杰,所有默認的,docker創(chuàng)建的所有容器都在一個網(wǎng)絡(luò)中筷弦,互相可以訪問肋演。
以上。有興趣的同學(xué)可以學(xué)習(xí)下面的參考資料。
參考資料
- docker教程:https://yeasy.gitbooks.io/docker_practice/introduction/what.html
- 極客學(xué)院視頻教程:https://www.bilibili.com/video/av17854410/?p=1
- docker bridge網(wǎng)橋:https://www.ibm.com/developerworks/cn/linux/1310_xiawc_networkdevice/index.html
- docker網(wǎng)絡(luò)深度研究:http://www.reibang.com/p/19d6f55b9563