參考視頻地址:40分鐘的Docker實戰攻略,一期視頻精通Docker。感謝作者的辛苦付出。
本文是Docker學習相關視頻筆記(一)與Docker學習相關視頻筆記(二)的后續
4、Docker命令
4.8 Docker 網絡
4.8.1 橋接模式
docker網絡默認是bridge,也就是橋接模式,所有的容器默認都連接到這個網絡,每個容器都分配了一個內部IP地址,一般是172.17開頭的,在這個內部子網里面,容器可以通過內部IP地址互相訪問,但容器網絡與宿主機的網絡是隔離的,
我們可以使用docker network create創建出子網,默認情況下創建出來的子網,也是屬于橋接模式的一種,然后可以指定容器加入不同的子網,同一個子網的容器可以互相通信,而跨子網則不可以通信。
創建子網,還有一個好處是,同一個子網的容器,可以使用容器的名字互相訪問,而不必使用內部IP地址。
我們來試一下,首先第一個命令創建一個叫做network1的子網,第二個命令創建并且運行一個MONGODB的容器,我們看到這里使用–network指定它加入子網一,啟動MONGODB的時候,沒有使用-p參數進行端口映射,也就是使用宿主機是沒法訪問到這個MONGODB的,我們先把它啟動起來,
接下來啟動一個叫做mongo express的容器,這個容器就是MONGODB的網頁客戶端,同樣的把它加入到子網一里面,因為跟MONGODB屬于同一個子網,所以它們之間是可以互相訪問的,mongo express上面做了端口映射,我們注意到這里傳了一個環境變量,這里沒有傳數據庫容器在子網的IP地址,而是直接把名字告訴了他。
在瀏覽器輸入服務器的IP地址,端口8081,
第一次訪問的時候要登錄一下,
這樣成功登錄進來,
我們可以創建數據庫,數據庫里面可以做查詢,可以做新增等等等等的功能。
我們來看一下網絡的拓撲結構,兩個容器分配在同一個子網里面,它們可以互相通信,這里注意到我啟動第二個容器mongo express的時候,沒有告訴第二個容器,關于第一個容器在子網里面的IP地址,而是僅僅告訴了他第一個容器的名字,借助于docker內部的DNS機制,通過名字就可以在子網內進行互相的訪問。
我們來看一下它的效果,這里我進入到第二個容器mongo express里面,然后在容器里面執行這個命令,ping后面接的是第一個容器的名字,我們看到這里打印出來了第一個容器的IP地址,換句話說,docker子網內部有一個DNS機制,可以把名字轉換成IP地址。
接下來我又做了一個端口映射,讓瀏覽器可以訪問到mongo express,然后mongo express又可以通過內部子網訪問到MONGODB,這樣達成最終的效果,這樣我們就看到了默認的橋接模式,還有創建子網的橋接模式。
4.8.2 host模式
接下來我們看另外一種網絡模式,另外一種常見的網絡是host模式,docker容器直接共享宿主機的網絡,容器直接使用宿主機的IP地址,而且無需-p參數進行端口映射,容器內的服務直接運行在宿主機的端口上,通過宿主機的IP和端口就能訪問到容器,host模式可以解決一些非常棘手的網絡問題。
我們來使用host模式啟動一個nginx,這里在啟動參數加上–network,后面host,我們沒有進行端口映射
在瀏覽器直接訪問服務器的IP地址,加端口80就可以訪問到Nginx,
我們進入容器內看一下它的IP地址,在容器內部查看IP地址,
我們需要裝一些工具,首先apt update,然后裝這個工具,apt install ip router2,然后就可以查IP地址了,ip addr show,
我們看到容器內顯示的IP地址,主要是這個內網IP地址,跟我在云服務器的控制面板上看的內網IP地址,是一模一樣的。從這個例子可以看出,docker容器使用host模式,它直接共享了宿主機的網絡空間。
4.8.2 host模式
最后一種docker網絡是None模式,也就是不聯網,
docker network list展示出所有docker網絡,首先有默認的橋接模式,host模式,還有None模式,最后一個是我們剛才創建的子網,當然這個子網也是屬于橋接網絡的一種,這三種默認網絡是不能刪除的,我們可以使用命令docker network remove命令,刪除自定義的子網,比如把它刪除掉,再使用list命令就看不到剛才的子網了。
4.9 Docker compose
有些時候,一個完整的應用可能是很多部分組成的,比如前端后端數據庫等等,這時候怎么用docker把它們容器化呢,我們可以很自然的想到,把這些模塊都打包在一起,做成一個巨大的容器。但這樣只要有一個模塊發生了故障,比如后端出現了內存泄漏,整個容器都有可能崩潰,并且可伸縮性差。如果想給系統擴容,只能把整個大容器再復制一份,而做不到針對某和模塊的精準性擴容,多應用的最佳實踐是,把每一個模塊都打包成一個獨立的容器,不過這樣使用多容器增加了很多的使用成本,因為我們想創建多個容器,就得多次執行docker run,還得把它們之間的網絡配置好,嘗試管理這些容器的時候,很多地方都會出錯,這時候一個容器編排技術就很有用,也就是docker compose。
docker compose使用YML文件管理多個容器,里面列出了容器之間是如何創建,以及如何協同工作的,我們可以簡單的把docker compose文件理解成,一個或者多個的docker run命令,按照特定的格式列到了一個文件里面。
這是剛才視頻里面展示的,使用docker命令創建MONGOD,比喻mongo express的例子,我們先創建一個子網,然后創建mongo dB和mongo express兩個容器,并且把它們加入子網,右側展示出的是對應的docker compose文件的寫法,左右兩邊有非常工整的對應關系。
右側最頂級的是services元素,每個服務也就是一個service都對應一個容器,左側的杠杠內幕,也就是容器名在右側就變成了service名,左側的鏡像名在右側寫在了image后面,也表示鏡像名,接下來左邊的杠E參數對應右邊的environment,都是環境變量的意思,左側的杠V對應右側的volume,也就是掛載卷,左側的杠P對應右邊的pose,也就是端口映射,左右兩邊唯一一點區別,就是左邊自定義了一個子網network1而右邊沒有,因為docker會為每一個compose文件,都自動創建一個子網,同一個compose文件里面,定義的所有容器都會自動加入同一個子網,不用我們操心。
docker compose 還有一個額外功能是,可以自定義容器的啟動順序,比如我們可以在mongo express下面加上depend on,他的意思是這個mongo express容器依賴數據庫,所以程序會先把mongo dB的容器啟動起來,再去啟動mongo express的容器。
在AI時代也不用我們寫docker compose文件了,我們只需要把想要執行的docker命令告訴AI,然后讓它生成一個等價的docker compose文件就可以了。
我們來實戰一下,首先使用vi命令,在服務器上創建一個docker compose文件,
把文件內容粘貼過來保存一下,
然后我們執行docker compose up,這樣就是啟動這個文件里面定義的所有容器,同樣的我們可以在后面接杠D讓它在后臺運行,我們看到這個命令做了兩件事,首先他創建了一個子網,然后創建了兩個容器,這個容器的名字跟我們在compose文件里面,定義的service名字不太一樣,它在前面加了一個前綴,還加了一個編號,用來更加方便的管理,我們執行docker PS命令,可以看到正在運行的容器.
在瀏覽器訪問服務器的IP地址加端口8081。看到mongo express就在正常運行了,我們可以新增數據庫等等做各種操作。
剛才我們看了compose up命令,與它相反的就是compose down,這個命令會停止并且刪除容器,
我們使用docker ps -a看到容器不但被停止了,也被刪除了。如果我們只想停止,但是不想刪除容器,我們可以執行docker compose stop命令,這個命令只停止不刪除,然后我們執行docker compose start命令,就可以把剛才stop命令停止的容器再啟動起來。
如果容器已經在運行了,我們重復執行compose up命令,并不會啟動新的容器,它沒有任何的效果,我們執行docker compose命令的時候,它會自動識別當前目錄,下面嚴格叫做docker compose的這個文件,如果我們把這個文件改一個名字,讓它變成一個非標準的文件名,這樣再使用docker compose命令,它就識別不到了,對于這種非標準的文件名,我們可以在docker compose后面接一個杠F,杠F指的是file,也就是指定文件名,接下來我們把非標準的文件名指定給它,當然這個文件名也可以在其他的目錄下面,使用杠F命令就可以識別到對應的文件好,docker compose的內容就這么多,還是非常容易掌握的。
docker compose是一個輕量級的容器編排技術,它適合個人使用單機運行,對于企業級服務器集群大規模的容器編排需求,那就需要另外一個軟件Kubernetes登場,Kubernetes的功能非常的復雜,這個有機會我們再聊。
5、總結
本期視頻我們
(1)先介紹了docker的核心概念,主要有容器、鏡像,還有鏡像倉庫,
(2)演示了如何在linux windows,還有Mac電腦上安裝docker,
(3)使用docker pull命令下載鏡像,以及如何配置鏡像站,解決下載鏡像的網絡問題,
(4)接下來我們使用docker run命令創建并且運行了容器,介紹了docker run命令的幾個重要參數:-p端口映射,-v掛載卷,-e設置環境變量等等,
(5)接下來介紹了如何進入容器內部進行調試,然后我們還看了docker的幾種網絡,分別是bridge模式,創建子網,host模式與NN模式,
(6)我們學習了什么是docker file,如何使用docker file創建鏡像,以及如何把鏡 像推送到docker hub上面,
(7)視頻的最后,我們還介紹了一種輕量級的容器編排技術,Docker compose
這就是本期視頻的全部內容了。
參考視頻地址:40分鐘的Docker實戰攻略,一期視頻精通Docker。感謝作者的辛苦付出。