Docker小白到实战之Docker网络简单了解一下
前言
現(xiàn)在對于Docker容器的隔離性都有所了解了,但對容器IP地址的分配、容器間的訪問等還是有點小疑問,如果容器的IP由于新啟動導(dǎo)致變動,那又怎么才能保證原有業(yè)務(wù)不會被影響,這就和網(wǎng)絡(luò)有掛鉤了,接下來就大概說說。
正文
1. Docker網(wǎng)絡(luò)模式簡介
當Docker進程啟動時,會在主機上創(chuàng)建一個名為docker0的虛擬網(wǎng)橋,此主機上啟動的Docker容器默認會連接到這個虛擬網(wǎng)橋上。這樣所有容器通過這個虛擬網(wǎng)橋就打通了,所以這里的docker0工作方式和物理交換機很像。
在主機上可以執(zhí)行命令ip link show docker0查看:
Docker在啟動容器時可以指定網(wǎng)絡(luò)模式,如果不指定,默認就是采用Bridge模式;Docker的網(wǎng)絡(luò)模式有如下幾種:
Bridge(橋接)模式:默認的網(wǎng)絡(luò)模式,比較適用于在同一Docker Daemon主機上運行的容器,用戶也可以自定義bridge網(wǎng)絡(luò),優(yōu)于默認的bridge網(wǎng)絡(luò);如果需要不同Docker主機進行通信,可以通過操作系統(tǒng)網(wǎng)絡(luò)配置,也可以使用Overlay模式。
Host模式:和宿主機共用一個Network Namespace。即容器不會虛擬出自己的網(wǎng)卡和配置自己的IP等,而是使用宿主機的IP和端口;
Overlay模式:覆蓋網(wǎng)絡(luò)可以將多個 Docker Daemon主機連接在一起,并使 swarm 服務(wù)能夠相互通信;也可以讓Docker Daemon主機上的兩個獨立容器進行通信。
Macvlan模式:Macvlan 網(wǎng)絡(luò)允許為容器分配 MAC 地址,使其在網(wǎng)絡(luò)上顯示為物理設(shè)備。Docker Deamon通過容器的 MAC 地址將流量路由到容器。
None模式:Docker容器擁有自己的Network Namespace,但是并不為容器進行任何網(wǎng)絡(luò)配置。即容器沒有網(wǎng)卡、IP、路由等信息。需要單獨為Docker容器添加網(wǎng)卡、配置IP;
Docker在啟動容器的時候可以通過--net指定網(wǎng)絡(luò)模式,不指定,默認就是bridge模式,如下:
#?--net指定網(wǎng)絡(luò)模式,這里指定為host模式 docker?run?-d?--name?testnet?--net?host?nginx #?通過docker?inspect?容器?看網(wǎng)絡(luò)細節(jié),如下圖 docker?inspect?testnet2. Bridge默認模式了解一下
這里就以默認的Bridge(橋接)展開來說說,其他模式后續(xù)根據(jù)應(yīng)用場景再具體細說。
這里主要看看主機和容器之間的網(wǎng)絡(luò)、容器和容器之間的網(wǎng)絡(luò)。
在Bridge模式下,當啟動容器時,Docker會分配一個IP給容器,并設(shè)置docker0的IP地址為容器的默認網(wǎng)關(guān);這個時候會在主機上創(chuàng)建一對虛擬網(wǎng)卡veth pair設(shè)備接口,Docker將veth pair設(shè)備的一端配置在新啟動的容器中,并命名為eth0@ifxxx(容器的網(wǎng)卡),另一端在主機中以veth***@ifxxx這樣類似的名字命名,并將這個網(wǎng)絡(luò)設(shè)備加入到docker0網(wǎng)橋中。
容器沒有啟動時主機的網(wǎng)絡(luò)配置如下:
當啟動容器時,Docker主機就會創(chuàng)建一對虛擬網(wǎng)卡vethpair設(shè)備接口,如下:
可以進入到容器看看IP分配情況,如果ip addr命令在容器內(nèi)找不到,那是因為基礎(chǔ)鏡像只包含核心命令,如果要執(zhí)行其他命令,需要額外安裝。可以在容器內(nèi)執(zhí)行如下命令進行安裝。
apt?update?&&?apt?install?-y?iproute2安裝好之后,就可以查看容器內(nèi)的IP情況了,如下:
這里有沒有發(fā)現(xiàn)容器內(nèi)的IP是和主機多出來的虛擬網(wǎng)卡是成對出現(xiàn),這樣主機網(wǎng)絡(luò)和容器之間肯定能通;
當然容器內(nèi)部也可以ping通主機。
那容器之間能不能訪問呢?
容器內(nèi)ping命令也找不到,需要進行安裝,執(zhí)行如下命令:
apt?update?&&?install?iputils-ping這里新啟動一個容器mynginx2,IP內(nèi)部分配如下:
mynginx容器內(nèi)能ping通mynginx2,那是因為兩個容器之間共用了docker0,通過docker0進行轉(zhuǎn)發(fā)。
大概一個網(wǎng)絡(luò)流程如下:
這里的Docker0就好比是交換機,形成了網(wǎng)絡(luò)橋梁。
3. 如何能通過容器名進行訪問
默認情況,容器間的訪問只能通過IP,不能通過容器名訪問;
這種情況對于線上項目很不靈活,比如數(shù)據(jù)庫備份需要臨時遷移,IP可能會不一樣,所以項目中的地址要重新配置,如果能通過容器名訪問,那么就不用操心更換啦,只要容器名一樣即可,就好比域名和IP的關(guān)系一樣,IP再怎么變,域名不變就行。
3.1 通過--link方式;
新啟動一個容器mynginx3,如下:
#?通過--link關(guān)聯(lián)?mynginx容器 docker?run?-d?--name?mynginx3?--link?mynginx?nginx容器啟動之后,可以進入到容器測試:
#?進入容器 docker?exec?-it?mynginx3?/bin/bash? #?安裝ping工具 apt?update?&&?apt?install?iputils-ping內(nèi)部原理其實是在mynginx3內(nèi)部做了個映射配置,容器mynginx3的hosts內(nèi)容如下:
這樣只能在容器mynginx3內(nèi)部通過mynginx容器名ping通,不能在mynginx內(nèi)部通過容器名mynginx3訪問,如果要達到同樣的效果,就得在啟動mynginx時通過--link和mynginx3關(guān)聯(lián)起來。
如果每個容器都這樣的顯示指定的話,感覺就有點麻煩啦,通常的做法都是通過自定義網(wǎng)絡(luò)方式來達到這個目的。
3.2 通過自定義網(wǎng)絡(luò)方式;
首先新創(chuàng)建一個網(wǎng)絡(luò),如下:
命令解析:
#?--driver?指定網(wǎng)絡(luò)模式,這里為bridge橋接模式 #?--subnet?指定子網(wǎng)IP??192.168.0.0/16 #?--gateway?指定網(wǎng)關(guān)?192.168.0.1 #?my-net?創(chuàng)建的網(wǎng)絡(luò)名 docker?network?create?--driver?bridge?--subnet?192.168.0.0/16?--gateway?192.168.0.1?my-net #?顯示網(wǎng)絡(luò) docker?network?ls讓啟動的容器使用自定義的網(wǎng)絡(luò),即在啟動容器時使用--net指定即可:
啟動容器時不需要--link,只需要接入到自定義網(wǎng)絡(luò)就可以通過容器名ping通了,如下:
自定義網(wǎng)絡(luò)之所以能通過容器名ping通,那是容器內(nèi)運行了一個本地DNS解析器,該解析器將請求轉(zhuǎn)發(fā)到Docker內(nèi)部DNS服務(wù)器當中,DNS服務(wù)器中記錄了容器啟動時通過--name或--net-alias參數(shù)指定的名稱與容器之間的關(guān)系。
另外還有一個點,現(xiàn)在分配給容器的IP是按照預(yù)先設(shè)置的子網(wǎng)范圍進行分配的,而不是默認的docker0子網(wǎng)范圍,執(zhí)行如下命令看詳細:
#?看容器詳細信息 docker?inspect?testmynetnginx1總結(jié)
關(guān)于Docker網(wǎng)絡(luò)簡單先說這么多,后續(xù)根據(jù)實際應(yīng)用場景再好好細說,這里主要的目的是了解一下默認的網(wǎng)絡(luò)模式和自定義網(wǎng)絡(luò)方式的使用和解決的問題。
Docker之前文章目錄:
Docker小白到實戰(zhàn)之開篇概述
Docker小白到實戰(zhàn)之常用命令演示,通俗易懂
Docker小白到實戰(zhàn)之容器數(shù)據(jù)卷,整理的明明白白
Docker小白到實戰(zhàn)之Dockerfile解析及實戰(zhàn)演示,果然順手
到目前為止,一般的Docker使用沒問題了,但當容器比較多時,一個一個的拉取鏡像和啟動容器就顯得有點不方便了,所以下次我們來學(xué)學(xué)Docker Compose,關(guān)注“Code綜藝圈”,和我一起學(xué)習(xí)吧;最后祝小伙伴們中秋快樂~~~
總結(jié)
以上是生活随笔為你收集整理的Docker小白到实战之Docker网络简单了解一下的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WPF 实现火炬效果
- 下一篇: Web使用热敏打印小票(IE环境)