Docker系列6:Docker網絡管理

1、建立容器時候的選項
html

  • --network xx:指定容器使用的網絡類型linux

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

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

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

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

2、建立封閉式網絡容器bash

建立容器的時候,默認用none網絡網絡

  • 能夠再建立容器的時候,用network選項來指定容器的類型是 nonecurl

建立容器tcp

[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
  • 此時這個容器是沒有地址的

3、暴露容器地址到網絡

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

  • 而容器一般是以nat方式工做,也就是隱藏在docker0網橋後,用戶沒法訪問

  • 所以須要將容器暴露在網絡中才能夠

一、將容器端口指定暴露到宿主機的動態端口

案例:啓動一個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 "<h1>test page</h1>">>/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的頁面,須要宿主機上的個動態端口

  • docker的端口暴漏到外面,須要iptables規則來實現的,因此查看nat表規則以下

[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

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

image.png

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

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

案例:建立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

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

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

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

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

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

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

 【若是須要暴漏出多個端口,那麼就能夠使用屢次-p選項

4、建立聯盟式網絡容器

  • 聯盟式容器,其實就是讓多個容器共享網絡等三個名稱空間

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

先建立容器

[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
/ #

再建立一個容器,並加入上個容器的名稱空間中

[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來訪問

  • 可是兩個容器的文件系統不是共享的,好比在一個主機中建立的文件或者目錄,在另外一個主機中是訪問不到的

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

[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
/ #

、修改的默認網絡和網橋

一、修改Docker0

  • docker0網橋的默認地址是172.17的

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

  image.png

  • bip是知道docker0的ip地址

二、建立自定義網橋

建立一個網橋,名稱爲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是網絡名稱,不是網絡接口名稱

[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

建立容器使用這個網橋設備

[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
/ #

擴展:在一個主機上作了兩個網橋(其實就至關於兩個虛擬交換機),而後每一個交換機上安裝一個容器,這兩個容器不在同一個網段

    image.png

想實現兩個容器通訊,其實只須要在宿主機上啓動路由轉發功能就能夠了,緣由 有兩個

  • 容器的網關指向了虛擬交換機地址

  • 虛擬交換機自己就在宿主機上

  • 有一點須要注意,默認會在防火牆上添加一些規則阻止這種狀況下的容器之間的通訊,因此,要想實現容器之間的通訊,須要去修改itpables規則。

相關文章
相關標籤/搜索