溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Docker系列6:Docker網(wǎng)絡管理

發(fā)布時間:2020-07-26 09:22:44 來源:網(wǎng)絡 閱讀:200 作者:zxhk 欄目:云計算

一、創(chuàng)建容器時候的選項

  • --network xx:指定容器使用的網(wǎng)絡類型

  • --hostname xx:指定容器使用的主機名

  • --dns x.x.x.x:指定容器使用的DNS地址

  • --dns-search xxx:指定搜索域,默認搜索域是宿主機

  • --add-host 域名:地址 在hosts文件添加記錄

二、創(chuàng)建封閉式網(wǎng)絡容器

創(chuàng)建容器的時候,默認用none網(wǎng)絡

  • 可以再創(chuàng)建容器的時候,用network選項來指定容器的類型是 none

創(chuàng)建容器

[root@host1?~]#?docker?run?--name?t1?-it?--rm?\
>?--network?none?--hostname?t1?--dns?114.114.114.114?\
>?--dns-search?linux.io?\
>?--add-host?www.baidu.com:1.2.3.4
>?busybox
  • 此時這個容器是沒有地址的

三、暴露容器地址到網(wǎng)絡

  • 安裝容器的目的是讓用戶訪問容器的服務

  • 而容器通常是以nat方式工作,也就是隱藏在docker0網(wǎng)橋后,用戶無法訪問

  • 因此需要將容器暴露在網(wǎng)絡中才可以

1、將容器端口指定暴露到宿主機的動態(tài)端口

案例:啟動一個apache,并將其80端口暴露出來

[root@host1?~]#?docker?run?--name?httpd1?-it?-p?80?--rm?busybox
WARNING:?IPv4?forwarding?is?disabled.?Networking?will?not?work.
/?#?
/?#?mkdir?/html
/?#?echo?"<h2>test?page</h2>">>/html/index.html
/?#?
/?#?httpd?-h?/html/
/?#?
/?#?netstat?-an
Active?Internet?connections?(servers?and?established)
Proto?Recv-Q?Send-Q?Local?Address???????????Foreign?Address?????????State???????
tcp????????0??????0?:::80???????????????????:::*????????????????????LISTEN

此時,就可以在宿主機訪問了

[root@host1?~]#?curl?172.17.0.2
test?page

在其他主機上想訪問這個nginx的頁面,需要宿主機上的個動態(tài)端口

  • docker的端口暴漏到外面,需要iptables規(guī)則來實現(xiàn)的,所以查看nat表規(guī)則如下

[root@host1?~]#?iptables?-L?-n?-t?nat
???...
???...
???...
Chain?DOCKER?(2?references)
target?????prot?opt?source???????????????destination?????????
RETURN?????all??--??0.0.0.0/0????????????0.0.0.0/0???????????
DNAT???????tcp??--??0.0.0.0/0????????????0.0.0.0/0????????????tcp?dpt:32770?to:172.17.0.2:80

docker命令可以查看端口映射關系

[root@host1?~]#?docker?port?httpd1
80/tcp?->?0.0.0.0:32770

在其他主機上訪問這個主機上的容器

Docker系列6:Docker網(wǎng)絡管理

  • 當這個容器被刪除了,這個端口映射規(guī)則自動刪除

2、將容器端口指定暴露到宿主機的指定端口

案例:創(chuàng)建apache容器,將80端口映射到宿主機的8081端口

[root@host1?~]#?docker?run?--name?httpd1?-it?-p?80:8081?--rm?busybox
/?#
[root@host1?~]#?docker?port?httpd1
8081/tcp?->?0.0.0.0:80

3、將容器的指定端口暴漏到宿主機指定IP的動態(tài)端口

  • 方法1中的效果是將容器的端口映射到宿主機的隨機端口,這個端口會綁定在宿主機的所有IP上面。

  • -p 宿主機ip::容器端口

4、將容器的指定端口暴漏到宿主機指定IP的指定端口

  • 方法3中的效果是將容器的端口映射到宿主機的指定端口,這個端口會綁定在宿主機的所有IP上面。

  • -p 宿主機ip:宿主機端口:容器端口

?【如果需要暴漏出多個端口,那么就可以使用多次-p選項

四、創(chuàng)建聯(lián)盟式網(wǎng)絡容器

  • 聯(lián)盟式容器,其實就是讓多個容器共享網(wǎng)絡等三個名稱空間

1、將容加入其它容器的名稱空間

先創(chuàng)建容器

[root@host1?~]#?docker?run?--name?httpd1?-it?--rm?busybox?
/?#?
/?#?ip?addr?
1:?lo:?<LOOPBACK,UP,LOWER_UP>?mtu?65536?qdisc?noqueue?qlen?1000
????link/loopback?00:00:00:00:00:00?brd?00:00:00:00:00:00
????inet?127.0.0.1/8?scope?host?lo
???????valid_lft?forever?preferred_lft?forever
13:?eth0@if14:?<BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN>?mtu?1500?qdisc?noqueue?
????link/ether?02:42:ac:11:00:02?brd?ff:ff:ff:ff:ff:ff
????inet?172.17.0.2/16?brd?172.17.255.255?scope?global?eth0
???????valid_lft?forever?preferred_lft?forever
/?#?
/?#?hostname
2ce8cf2a2f28
/?#?
/?#?mkdir?/html
/?#?echo?"test?page">/html/index.html
/?#?httpd?-h?/html/
/?#?
/?#?wget?-O?-?-q?127.0.0.1
test?page
/?#

再創(chuàng)建一個容器,并加入上個容器的名稱空間中

[root@host1?~]#?docker?run?--name?httpd2?--network?container:httpd1?--rm?-it?busybox
/?#?
/?#?ip?addr
1:?lo:?<LOOPBACK,UP,LOWER_UP>?mtu?65536?qdisc?noqueue?qlen?1000
????link/loopback?00:00:00:00:00:00?brd?00:00:00:00:00:00
????inet?127.0.0.1/8?scope?host?lo
???????valid_lft?forever?preferred_lft?forever
13:?eth0@if14:?<BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN>?mtu?1500?qdisc?noqueue?
????link/ether?02:42:ac:11:00:02?brd?ff:ff:ff:ff:ff:ff
????inet?172.17.0.2/16?brd?172.17.255.255?scope?global?eth0
???????valid_lft?forever?preferred_lft?forever
/?#?
/?#?hostname
2ce8cf2a2f28
/?#?
/?#?wget?-O?-?-q?127.0.0.1
test?page
/?#
  • 兩個容器的主機名、地址、IPC都是相同的

  • 在一個容器里啟動進程,在另一個容器里是可以用127.0.0.1來訪問

  • 但是兩個容器的文件系統(tǒng)不是共享的,比如在一個主機中創(chuàng)建的文件或者目錄,在另一個主機中是訪問不到的

2、將容器加入到宿主機的名稱空間

[root@host1?~]#?docker?run?--name?httpd1?-it?--rm?--network?host?busybox?
/?#?ip?addr
1:?lo:?<LOOPBACK,UP,LOWER_UP>?mtu?65536?qdisc?noqueue?qlen?1000
????link/loopback?00:00:00:00:00:00?brd?00:00:00:00:00:00
????inet?127.0.0.1/8?scope?host?lo
???????valid_lft?forever?preferred_lft?forever
????inet6?::1/128?scope?host?
???????valid_lft?forever?preferred_lft?forever
2:?ens33:?<BROADCAST,MULTICAST,UP,LOWER_UP>?mtu?1500?qdisc?pfifo_fast?qlen?1000
????link/ether?00:0c:29:3f:bf:cf?brd?ff:ff:ff:ff:ff:ff
????inet?192.168.114.132/24?brd?192.168.114.255?scope?global?dynamic?ens33
???????valid_lft?1653sec?preferred_lft?1653sec
????inet6?fe80::b487:3618:3453:eabe/64?scope?link?
???????valid_lft?forever?preferred_lft?forever
3:?ens37:?<BROADCAST,MULTICAST,UP,LOWER_UP>?mtu?1500?qdisc?pfifo_fast?qlen?1000
????link/ether?00:0c:29:3f:bf:d9?brd?ff:ff:ff:ff:ff:ff
????inet?192.168.64.130/24?brd?192.168.64.255?scope?global?dynamic?ens37
???????valid_lft?1648sec?preferred_lft?1648sec
????inet?172.16.100.5/24?brd?172.16.100.255?scope?global?ens37
???????valid_lft?forever?preferred_lft?forever
????inet6?fe80::e81:e5e0:505:f39b/64?scope?link?
???????valid_lft?forever?preferred_lft?forever
4:?docker0:?<NO-CARRIER,BROADCAST,MULTICAST,UP>?mtu?1500?qdisc?noqueue?
????link/ether?02:42:37:b9:09:55?brd?ff:ff:ff:ff:ff:ff
????inet?172.17.0.1/16?brd?172.17.255.255?scope?global?docker0
???????valid_lft?forever?preferred_lft?forever
????inet6?fe80::42:37ff:feb9:955/64?scope?link?
???????valid_lft?forever?preferred_lft?forever
/?#?
/?#?
/?#?hostname
host1
/?#

、修改的默認網(wǎng)絡和網(wǎng)橋

1、修改Docker0

  • docker0網(wǎng)橋的默認地址是172.17的

  • 修改這個需要修改配置文件:/etc/docker/daemon.json

??Docker系列6:Docker網(wǎng)絡管理

  • bip是知道docker0的ip地址

2、創(chuàng)建自定義網(wǎng)橋

創(chuàng)建一個網(wǎng)橋,名稱為mybr0

[root@host1?~]#?docker?network?create?\
>?--subnet?"30.0.0.0/8"?--gateway?"30.0.0.1"?\
>?mybr0
[root@host1?~]#?docker?network?ls
NETWORK?ID??????????NAME????????????????DRIVER??????????????SCOPE
5e905c47ac51????????bridge??????????????bridge??????????????local
386d8dc4beb8????????host????????????????host????????????????local
256a8b6832cb????????mybr0???????????????bridge??????????????local
eb7b7cf29f29????????none????????????????null????????????????local
  • mybr0是網(wǎng)絡名稱,不是網(wǎng)絡接口名稱

[root@host1?~]#?ip?addr
????...
????...
????...
15:?br-256a8b6832cb:?<NO-CARRIER,BROADCAST,MULTICAST,UP>?mtu?1500?qdisc?noqueue?state?DOWN?group?default?
????link/ether?02:42:c9:f6:5d:cd?brd?ff:ff:ff:ff:ff:ff
????inet?30.0.0.1/8?brd?30.255.255.255?scope?global?br-256a8b6832cb
???????valid_lft?forever?preferred_lft?forever

創(chuàng)建容器使用這個網(wǎng)橋設備

[root@host1?~]#?docker?run?--name?httpd1?-it?--rm?--network?mybr0?busybox?
/?#?
/?#?
/?#?ip?addr
1:?lo:?<LOOPBACK,UP,LOWER_UP>?mtu?65536?qdisc?noqueue?qlen?1000
????link/loopback?00:00:00:00:00:00?brd?00:00:00:00:00:00
????inet?127.0.0.1/8?scope?host?lo
???????valid_lft?forever?preferred_lft?forever
16:?eth0@if17:?<BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN>?mtu?1500?qdisc?noqueue?
????link/ether?02:42:1e:00:00:02?brd?ff:ff:ff:ff:ff:ff
????inet?30.0.0.2/8?brd?30.255.255.255?scope?global?eth0
???????valid_lft?forever?preferred_lft?forever
/?#

擴展:在一個主機上做了兩個網(wǎng)橋(其實就相當于兩個虛擬交換機),然后每個交換機上安裝一個容器,這兩個容器不在同一個網(wǎng)段

? ??Docker系列6:Docker網(wǎng)絡管理

想實現(xiàn)兩個容器通信,其實只需要在宿主機上啟動路由轉(zhuǎn)發(fā)功能就可以了,原因 有兩個

  • 容器的網(wǎng)關指向了虛擬交換機地址

  • 虛擬交換機本身就在宿主機上

  • 有一點需要注意,默認會在防火墻上添加一些規(guī)則阻止這種情況下的容器之間的通信,所以,要想實現(xiàn)容器之間的通信,需要去修改itpables規(guī)則。



向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI