Docker網(wǎng)絡(luò)配置的三種方式
前言
在使用Docker時(shí),網(wǎng)絡(luò)通信是必不可少的,它可以使不同的Docker容器相互通信,也可以將容器與外部網(wǎng)絡(luò)連接起來。以下是一個(gè)場(chǎng)景的示例:
假設(shè)你正在開發(fā)一個(gè)包含前端和后端的Web應(yīng)用程序。你可以使用Docker來創(chuàng)建兩個(gè)容器,一個(gè)用于運(yùn)行前端代碼,另一個(gè)用于運(yùn)行后端代碼。
在這種情況下,網(wǎng)絡(luò)通信非常重要。前端容器需要能夠與后端容器進(jìn)行通信,以便從后端獲取數(shù)據(jù)并將其呈現(xiàn)給用戶。同時(shí),前端容器還需要能夠通過網(wǎng)絡(luò)將用戶的請(qǐng)求發(fā)送到后端容器。
通過創(chuàng)建一個(gè)自定義的Docker網(wǎng)絡(luò),你可以實(shí)現(xiàn)這種通信。你可以將兩個(gè)容器連接到同一個(gè)網(wǎng)絡(luò)中,使它們能夠通過網(wǎng)絡(luò)進(jìn)行通信。這樣,前端容器就可以通過網(wǎng)絡(luò)請(qǐng)求來獲取后端容器提供的數(shù)據(jù),然后將結(jié)果呈現(xiàn)給用戶。
此外,你還可以配置Docker網(wǎng)絡(luò),使得外部網(wǎng)絡(luò)可以通過特定端口訪問你的應(yīng)用程序。這樣,用戶可以通過他們的Web瀏覽器訪問你的應(yīng)用程序,并與前端容器進(jìn)行通信,通過網(wǎng)絡(luò)請(qǐng)求與后端容器進(jìn)行交互。
一、網(wǎng)絡(luò)相關(guān)
在學(xué)習(xí)網(wǎng)絡(luò)模式的配置之前我們需要了解以下幾個(gè)東西,分別是子網(wǎng)掩碼、網(wǎng)關(guān)、規(guī)則,這些東西對(duì)于后面我們對(duì)ip的理解有很大的幫助。
1.子網(wǎng)掩碼
IP地址是以網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)來標(biāo)示網(wǎng)絡(luò)上的主機(jī)的,我們把網(wǎng)絡(luò)號(hào)相同的主機(jī)稱之為本地網(wǎng)絡(luò),網(wǎng)絡(luò)號(hào)不相同的主機(jī)稱之為遠(yuǎn)程網(wǎng)絡(luò)主機(jī),本地網(wǎng)絡(luò)中的主機(jī)可以直接相互通信;遠(yuǎn)程網(wǎng)絡(luò)中的主機(jī)要相互通信必須通過本地網(wǎng)關(guān)(Gateway)來傳遞轉(zhuǎn)發(fā)數(shù)據(jù)。
- 子網(wǎng)掩碼是“255.255.255.0”的網(wǎng)絡(luò):
最后面一個(gè)數(shù)字可以在 0~255 范圍內(nèi)任意變化,因此可以提供 256 個(gè) IP 地址。但是實(shí)際可用的 IP 地址數(shù)量是256-2 ,即 254 個(gè),因?yàn)橹鳈C(jī)號(hào)不能全是 “0” 或全是 “1” 。
- 子網(wǎng)掩碼是“255.255.0.0”的網(wǎng)絡(luò):
后面兩個(gè)數(shù)字可以在 0~255 范圍內(nèi)任意變化,可以提供 255² 個(gè) IP 地址。但是實(shí)際可用的 IP 地址數(shù)量是255²-2 ,即 65023 個(gè)。
1.1.子網(wǎng)掩碼的組成
①同IP地址一樣,子網(wǎng)掩碼是由長(zhǎng)度為32位二進(jìn)制數(shù)組成的一個(gè)地址。
②子網(wǎng)掩碼32位與IP地址32位相對(duì)應(yīng),IP地址如果某位是網(wǎng)絡(luò)地址,則子網(wǎng)掩碼為1,否則為0。
③舉個(gè)栗子:如:11111111.11111111.11111111.00000000
注:左邊連續(xù)的1的個(gè)數(shù)代表網(wǎng)絡(luò)號(hào)的長(zhǎng)度,(使用時(shí)必須是連續(xù)的,理論上也可以不連續(xù)),右邊連續(xù)的0的個(gè)數(shù)代表主機(jī)號(hào)的長(zhǎng)度。
1.2.子網(wǎng)掩碼的表示方法
①、點(diǎn)分十進(jìn)制表示法
二進(jìn)制轉(zhuǎn)換十進(jìn)制,每8位用點(diǎn)號(hào)隔開
例如:子網(wǎng)掩碼二進(jìn)制11111111.11111111.11111111.00000000,表示為255.255.255.0
②、CIDR斜線記法
IP地址/n
例1:192.168.1.100/24,其子網(wǎng)掩碼表示為255.255.255.0,二進(jìn)制表示為11111111.11111111.11111111.00000000
例2:172.16.198.12/20,其子網(wǎng)掩碼表示為255.255.240.0,二進(jìn)制表示為11111111.11111111.11110000.00000000
不難發(fā)現(xiàn),例1中共有24個(gè)1,例2中共有20個(gè)1,所以n是這么來的。運(yùn)營(yíng)商ISP常用這樣的方法給客戶分配IP地址。
注:n為1到32的數(shù)字,表示子網(wǎng)掩碼中網(wǎng)絡(luò)號(hào)的長(zhǎng)度,通過n的個(gè)數(shù)確定子網(wǎng)的主機(jī)數(shù)=2^(32-n)-2(-2的原因:主機(jī)位全為0時(shí)表示本網(wǎng)絡(luò)的網(wǎng)絡(luò)地址,主機(jī)位全為1時(shí)表示本網(wǎng)絡(luò)的廣播地址,這是兩個(gè)特殊地址)。
1.3.子網(wǎng)掩碼的分類
①、缺省子網(wǎng)掩碼
也叫默認(rèn)子網(wǎng)掩碼,即未劃分子網(wǎng),對(duì)應(yīng)的網(wǎng)絡(luò)號(hào)的位都置 1 ,主機(jī)號(hào)都置 0 。
未做子網(wǎng)劃分的IP地址:網(wǎng)絡(luò)號(hào)+主機(jī)號(hào)
A類網(wǎng)絡(luò)缺省子網(wǎng)掩碼: 255.0.0.0,用CIDR表示為/8
B類網(wǎng)絡(luò)缺省子網(wǎng)掩碼: 255.255.0.0,用CIDR表示為/16
C類網(wǎng)絡(luò)缺省子網(wǎng)掩碼: 255.255.255.0,用CIDR表示為/24
②、自定義子網(wǎng)掩碼
將一個(gè)網(wǎng)絡(luò)劃分子網(wǎng)后,把原本的主機(jī)號(hào)位置的一部分給了子網(wǎng)號(hào),余下的才是給了子網(wǎng)的主機(jī)號(hào)。其形式如下:
做子網(wǎng)劃分后的IP地址:網(wǎng)絡(luò)號(hào)+子網(wǎng)號(hào)+子網(wǎng)主機(jī)號(hào)
舉個(gè)例子:
如:192.168.1.100/25,其子網(wǎng)掩碼表示:255.255.255.128
意思就是將192.168.1.0這個(gè)網(wǎng)段的主機(jī)位的最高1位劃分為了子網(wǎng)。關(guān)于子網(wǎng)劃分將在下篇文章講到,這里不在闡述。
2.網(wǎng)關(guān)
網(wǎng)關(guān)實(shí)質(zhì)上是一個(gè)網(wǎng)絡(luò)通向其他網(wǎng)絡(luò)的 IP 地址。 路由器( Windows 下叫默認(rèn)網(wǎng)關(guān),網(wǎng)關(guān)就是路由,路由就是網(wǎng)關(guān)不要蒙)
在如下拓?fù)鋱D示例中,A與B,C與D,都可以直接相互通信(都是屬于各自同一網(wǎng)段,不用經(jīng)過路由器),但是A與C,A與D,B與C,B與D它們之間不屬于同一網(wǎng)段,所以它們通信是要經(jīng)過本地網(wǎng)關(guān),然后路由器根據(jù)對(duì)方IP地址,在路由表中查找恰好有匹配到對(duì)方IP地址的直連路由,于是從另一邊網(wǎng)關(guān)接口轉(zhuǎn)發(fā)出去實(shí)現(xiàn)互連。
注意:網(wǎng)關(guān)的主機(jī)部分通常占用的是.1
3.規(guī)則
計(jì)算機(jī)的 IP 地址由兩部分組成,一部分為網(wǎng)絡(luò)標(biāo)識(shí),一部分為主機(jī)標(biāo)識(shí),同一網(wǎng)段內(nèi)的計(jì)算機(jī)網(wǎng)絡(luò)部分相同,主機(jī)部分不同同時(shí)重復(fù)出現(xiàn)。 路由器連接不同網(wǎng)段,負(fù)責(zé)不同網(wǎng)段之間的數(shù)據(jù)轉(zhuǎn)發(fā),交換機(jī)連接的是同一網(wǎng)段的計(jì)算機(jī)。通過設(shè)置網(wǎng)絡(luò)地址和主機(jī)地址,在互相連接的整個(gè)網(wǎng)絡(luò)中保證每臺(tái)主機(jī)的IP 地址不會(huì)互相重疊,即 IP 地址具有了唯一性。
在計(jì)算機(jī)網(wǎng)絡(luò)中,主機(jī) ID 全部為 0 的地址為網(wǎng)絡(luò)地址,而主機(jī) ID 全部為 1 的地址為廣播地址 這 2 個(gè)地址是不能分配給主機(jī)用的
二、Dockers的網(wǎng)絡(luò)配置
當(dāng)你安裝了 docker, 它會(huì)自動(dòng)創(chuàng)建 3 個(gè)網(wǎng)絡(luò),可以使用 docker network ls 命令來查看
docker network ls
Docker提供了以下常用的網(wǎng)絡(luò)模式:
Bridge模式(橋接模式):默認(rèn)的網(wǎng)絡(luò)模式,容器通過虛擬網(wǎng)橋連接到主機(jī)的物理網(wǎng)絡(luò)接口上,可以通過端口映射將容器的端口映射到主機(jī)上。
Host模式(主機(jī)模式):容器與主機(jī)共享網(wǎng)絡(luò)命名空間,容器直接使用主機(jī)的網(wǎng)絡(luò)棧,可以輕松訪問主機(jī)上的網(wǎng)絡(luò)資源,但會(huì)損失一定的隔離性。
None模式(無(wú)網(wǎng)絡(luò)模式):容器不連接到任何網(wǎng)絡(luò),只能通過內(nèi)部與其他容器進(jìn)行通信,不能與外部進(jìn)行網(wǎng)絡(luò)通信。
當(dāng)你運(yùn)行一個(gè)容器的時(shí)候,可以使用 --network 參數(shù)來指定你的容器連接到哪一個(gè)網(wǎng)絡(luò)。
1.bridge模式
當(dāng) Docker 進(jìn)程啟動(dòng)時(shí),會(huì)在主機(jī)上創(chuàng)建一個(gè)名為 docker0 的虛擬網(wǎng)橋,此主機(jī)上啟動(dòng)的 Docker 容器會(huì)連接到這個(gè)虛擬網(wǎng)橋上。
虛擬網(wǎng)橋的工作方式和物理交換機(jī)類似,這樣主機(jī)上的所有容器就通過交換機(jī)連在了一個(gè)二層網(wǎng)絡(luò)中。 從 docker0 子網(wǎng)中分配一個(gè) IP 給容器使用,并設(shè)置 docker0 的 IP 地址為容器的默認(rèn)網(wǎng)關(guān)。 在主機(jī)上創(chuàng)建一對(duì)虛擬網(wǎng)卡 veth pair 設(shè)備, Docker 將 veth pair 設(shè)備的一端放在新創(chuàng)建的容器中,并命名為eth0 (容器的網(wǎng)卡),另一端放在主機(jī)中,以 vethxxx 這樣類似的名字命名,并將這個(gè)網(wǎng)絡(luò)設(shè)備加入 到 docker0 網(wǎng)橋中。
bridge模式是docker的默認(rèn)網(wǎng)絡(luò)模式,不寫--net參數(shù),就是bridge模式。每個(gè)bridge模式的容器都有一個(gè)獨(dú)立的IP,如果外部需要訪問需要進(jìn)行端口映射。
docker run -itd --name t1 -p 8080:8080 tomcat:8.5.20
創(chuàng)建一個(gè)容器后我們查看一下它的bridge信息
docker inspect t1
可以看到它網(wǎng)橋是172.17.0.2,它的網(wǎng)關(guān)是172.17.0.1,網(wǎng)絡(luò)模式是bridge
我們?cè)賮砜匆幌逻@個(gè)網(wǎng)絡(luò)模式bridge
docker inspect bridge
這里有個(gè)Containers容器集合,bridge的容器中就會(huì)有個(gè)“t1”容器它的IP是172.17.0.2/16說明它的子網(wǎng)掩碼是255.255.0.0,用CIDR表示為/16
docker0 就像是一個(gè)路由器,容器就像是路由器下的設(shè)備,它們?cè)谕粋€(gè)網(wǎng)段內(nèi)可以互相 ping 通。
注意:
-p 參數(shù)可以出現(xiàn)多次,綁定多個(gè)端口號(hào)
docker run - itd -- name t1 - p 8082:8080 - p 8083:8080 tomcat:8.5.20
2.host模式
如果啟動(dòng)容器的時(shí)候使用 host 模式,那么這個(gè)容器將不會(huì)獲得一個(gè)獨(dú)立的 Network Namespace ,而是 和宿主機(jī)共用一個(gè)Network Namespace 。 容器將不會(huì)虛擬出自己的網(wǎng)卡,配置自己的 IP 等,而是使用宿主機(jī)的 IP 和端口。 但是,容器的其他方面,如文件系統(tǒng)、進(jìn)程列表等還是和宿主機(jī)隔離的。
創(chuàng)建一個(gè)容器指定為host模式
docker run -itd --name t2 --net=host tomcat:8.5.20
如果你的虛擬機(jī)是和主機(jī)一個(gè)網(wǎng)絡(luò)那么可直接訪問8080,不需要做端口映射
使用host模式可能會(huì)導(dǎo)致安全隱患。由于容器共享主機(jī)網(wǎng)絡(luò)棧,容器內(nèi)的進(jìn)程可以訪問主機(jī)上的所有網(wǎng)絡(luò)資源,包括主機(jī)上未公開的端口和共享文件。因此,如果容器本身存在安全漏洞,則容易受到攻擊。
三、容器之間相互通訊
我們了解了bridge模式,下面我們來嘗試一下看看是否真的可以建立連接
docker run -it --name c1 centos docker run -it --name c2 centos
首先創(chuàng)建兩個(gè)容器,因?yàn)槟J(rèn)是bridge模式所以不用指定,下面再查看一下c2的IP是多少
ip addr
可以看到我們的c2的IP是172.17.0.3我們使用c1連接一下
四、自定義IP通訊
1.容器之間連接mysql
我們現(xiàn)在宿主機(jī)上創(chuàng)建一個(gè)目錄名為soft并往目錄下放入一個(gè)war包
創(chuàng)建一個(gè)基于tomcat的容器并進(jìn)行目錄掛載
docker run -it \ --name t1 \ -p 8080:8080 \ -v /soft:/usr/local/tomcat/webapps \ tomcat:8.5.20
可以看到跑成功了
但是我們接下來做一個(gè)操作進(jìn)行數(shù)據(jù)訪問
進(jìn)行數(shù)據(jù)訪問它會(huì)去連接我們的mysql,因?yàn)闆]有mysql所以報(bào)錯(cuò),現(xiàn)在我們來搞一個(gè)mysql,創(chuàng)建mysql之前需要做一個(gè)事情,mysql需要一個(gè)my.cnf的配置文件,目前我們還沒有所以需要在宿主機(jī)上創(chuàng)建一個(gè)將該文件放入到目錄中
mkdir -p /mysql/{conf,data}
這是my.cnf的內(nèi)容
[client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] # Remove leading # and set to the amount of RAM for the most important data # cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%. # innodb_buffer_pool_size = 128M # # Remove leading # to turn on a very important data integrity option: logging # changes to the binary log between backups. # log_bin # # Remove leading # to set options mainly useful for reporting servers. # The server defaults are faster for transactions and fast SELECTs. # Adjust sizes as needed, experiment to find the optimal values. # join_buffer_size = 128M # sort_buffer_size = 2M # read_rnd_buffer_size = 2M skip-host-cache skip-name-resolve datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock secure-file-priv=/var/lib/mysql-files user=mysql # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid init_connect='SET collation_connection = utf8_unicode_ci' init_connect='SET NAMES utf8' character-set-server=utf8 collation-server=utf8_unicode_ci skip-character-set-client-handshake # default: sql_mode= STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION # modeified: sql_mode= STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION max_allowed_packet=10M default-time_zone='+8:00' default_authentication_plugin=mysql_native_password
我們進(jìn)入到mysql/data目錄下創(chuàng)建mysql容器
docker run \ --name m1 \ -v /mysql/conf/my.cnf:/etc/my.cnf \ -v /mysql/data:/var/lib/mysql \ --privileged=true \ -e MYSQL_ROOT_PASSWORD=123456 \ -d mysql/mysql-server:5.7
進(jìn)入我們的mysql容器進(jìn)行登錄
docker exec -it m1 bash mysql -uroot -p
登錄成功以后,我們現(xiàn)在需要一個(gè)賬戶進(jìn)行遠(yuǎn)程連接所以創(chuàng)建一個(gè)賬戶并賦予權(quán)限
grant all on *.* to ww@'%' identified by '密碼'
記得重啟一下docker restart m1
我們進(jìn)入到被解壓的war的配置文件中修改配置文件中的mysql連接
我們查看指定容器的日志并以實(shí)時(shí)方式跟蹤輸出看一下現(xiàn)在會(huì)怎么樣。
docker -logs -f t1
2.自定義容器IP
雖然現(xiàn)在容器之間是可以相互訪問了,但是我們的ip是docker0發(fā)放的,也就是說,這個(gè)ip和創(chuàng)建容器的順序有關(guān)系,如果我是先創(chuàng)建mysql容器后創(chuàng)建tomcat容器,那么我們的ip是不是又發(fā)生了改變,是不是有需要去修改mysql的配置連接?太麻煩了我只能說。
我們就可以使用自定義網(wǎng)絡(luò)的方式,自定義網(wǎng)絡(luò)不但支持自定義IP還可以支持以容器名的方式進(jìn)行訪問。
①我們首先需要?jiǎng)?chuàng)建一個(gè)網(wǎng)絡(luò)
docker network create --subnet 172.18.0.0/16 --gateway 172.18.1.1 [name]
②我們需要查看該網(wǎng)絡(luò)的網(wǎng)段是多少
docker inspect net
③為我們的容器指定IP
docker run -it \ --name t1 \ -p 8080:8080 \ -v /soft:/usr/local/tomcat/webapps \ --net net \ --ip 172.18.0.2 \ tomcat:8.5.20
docker run \ --name m1 \ -v /mysql/conf/my.cnf:/etc/my.cnf \ -v /mysql/data:/var/lib/mysql \ --privileged=true \ -e MYSQL_ROOT_PASSWORD=123456 \ --net net \ --ip 172.18.0.3 \ -d mysql/mysql-server:5.7
④修改mysql連接的配置文件
我們前面說過自定義網(wǎng)絡(luò)的方式可以通過容器名來訪問
五、注意事項(xiàng)
①根據(jù)自定義網(wǎng)絡(luò)創(chuàng)建容器失敗
如果在使用自定義網(wǎng)絡(luò)創(chuàng)建容器的時(shí)候出現(xiàn)這個(gè)問題
因?yàn)閐ocker中,只有使用 --subnet創(chuàng)建的網(wǎng)絡(luò)才能指定靜態(tài)IP。因此在使用docker-compose或者docker run命令創(chuàng)建容器時(shí),如果需要指定,則可以使用 :
- –subnet創(chuàng)建網(wǎng)絡(luò)(用來指定ip段)
- –gateway(用來指定網(wǎng)關(guān))
- name為創(chuàng)建的名字
docker network create --subnet 172.18.0.0/16 --gateway 172.18.1.1 [name]
②不同容器相互連接
我現(xiàn)在有兩個(gè)容器他們的IP分別是172.17.0.2和172.18.0.2根本不在一個(gè)網(wǎng)段里面,此時(shí)我想要172.17.0.2的這個(gè)容器去ping172.18.0.2是根本不可能的
運(yùn)行以下命令將c1容器連接到自定義的net網(wǎng)絡(luò)
docker network connect net c1
現(xiàn)在我們看一下我們c1有幾個(gè)網(wǎng)絡(luò)
現(xiàn)在就可以進(jìn)行連接了?
以上就是Docker網(wǎng)絡(luò)配置的三種方式的詳細(xì)內(nèi)容,更多關(guān)于Docker網(wǎng)絡(luò)配置的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Docker 容器指定自定義網(wǎng)段的固定IP/靜態(tài)IP地址
- Docker基礎(chǔ) :網(wǎng)絡(luò)配置詳解
- Docker 基礎(chǔ)網(wǎng)絡(luò)配置詳解
- docker compose自定義網(wǎng)絡(luò)實(shí)現(xiàn)固定容器ip地址
- docker網(wǎng)絡(luò)配置過程詳解介紹
- Docker網(wǎng)絡(luò)配置及部署SpringCloud項(xiàng)目詳解
- Docker網(wǎng)絡(luò)配置(橋接網(wǎng)絡(luò)和自定義網(wǎng)絡(luò))自定義網(wǎng)絡(luò)設(shè)置ip方式
- Docker網(wǎng)絡(luò)配置與自定義IP容器通信
相關(guān)文章
Docker部署Mysql,.Net6,Sqlserver等容器
這篇文章介紹了Docker部署Mysql,.Net6,Sqlserver等容器的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12使用Conda環(huán)境創(chuàng)建Docker鏡像的完整步驟指南
Docker是實(shí)現(xiàn)容器化的主流工具之一,而Conda作為科學(xué)計(jì)算和Python的包管理器,與Docker的結(jié)合能為開發(fā)者提供高度靈活、易于管理的開發(fā)環(huán)境,這篇文章主要介紹了使用Conda環(huán)境創(chuàng)建Docker鏡像的完整步驟,需要的朋友可以參考下2025-03-03Docker中Compose與Kubernetes的區(qū)別詳解
這篇文章主要給大家介紹了關(guān)于Docker中Compose與Kubernetes區(qū)別的相關(guān)資料,Docker Compose和Kubernetes(簡(jiǎn)稱k8s)都是容器編排工具,需要的朋友可以參考下2023-08-08Docker部署Mysql8的實(shí)現(xiàn)步驟
本文主要介紹了Docker部署Mysql8的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07docker?Desktop安裝WSL?--update報(bào)錯(cuò)問題成功解決辦法
這篇文章主要介紹了如何在Windows?11上設(shè)置WSL2為默認(rèn)版本,解決WSL2安裝和卸載過程中遇到的問題,包括強(qiáng)制中斷命令、wsl--uninstall命令無(wú)效以及手動(dòng)刪除Linux發(fā)行版的方法,需要的朋友可以參考下2025-02-02