Docker網絡管理

1、基礎配置
一、端口映射
從外部訪問容器應用
docker run -d -P nginx  #映射隨機端口
docker run -d -p 80:80 nginx  #映射指定端口
docker run -d -p 80:80 -p 5000:5000 nginx  #映射多個指定端口
docker run -d -p 127.0.0.1:80:50 #映射指定地址的指定端口,默認會綁定本地全部接口上的全部地址
docker run -d -p 127.0.0.1::80 nginx #映射到指定地址的任意端口
docker port 610889eaab4b 80 #查看映射端口配置,610889eaab4b爲容器ID,80爲容器端口。
二、容器互聯實現容器間通訊
自定義容器名
docker run -d -p 80:80 --name web nginx
查看容器名稱
docker inspect -f "{{.Name}}" 8f3c7f469b18
容器互聯
docker run -d --name db mysql
docker run -d -p 80:80 --name web2 --link web1:web1 nginx
--link參數的格式爲--link name:alias,其中name是要連接的容器名稱,alias是這個鏈接的別名。
三、查看映射IP
docker inspect --format '{{ .NetworkSettings.IPAddress }}'  web1
docker inspect web1|awk -F\" '/"IPAddress/{print $--NF}'
docker exec -ti web1 awk 'END{print $1}' /etc/hosts
 
2、網絡設置
一、建立網絡
Docker 安裝好,有三個網絡會被自動建立。能夠經過docker network ls命令查看:
# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
aaa59fabf719        bridge              bridge              local
1b89626fd45a        host                host                local
fe1dc2ce9a7c        none                null                local
用戶能夠自行建立bridge或overlay類型的網絡。bridge網絡適用於單臺宿主機運行的單Docker引擎環境,而overlay網絡容許咱們跨多臺宿主機進行通信。
docker network create my_network 
使用docker network inspect my_network能夠進行查看,建立的是一個本地橋接網絡
# docker network inspect my_network
[
    {
        "Name": "my_network",
        "Id": "421dae49712391e4f45c1397ee62281022eea83077f51696a2391a1ab36df53c",
        "Created": "2017-07-04T23:37:02.611184435+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

二、建立容器並鏈接到網絡mysql

docker run -ti --name system1 --network=my_network centos /bin/bash
docker run -ti --name system2 --network=my_network centos /bin/bash

docker network inspect my_network #能夠查看新建容器的IP
"Containers": {
            "612e416f671fd90d9a0b644dcfd2870b4b8c15e0651e6636dd062d6c33125c75": {
                "Name": "system2",
                "EndpointID": "1b8e7ffe5cbbdd246239ea8aedf0fc04ed8c16ab838551eae5e9d7e3af98b536",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            },
            "bca3b58af0a265399822f1d476744e627e2f629be5cc3e6c1084271600171457": {
                "Name": "system1",
                "EndpointID": "b25b67251cc93d5cbf3821dc2e33954ae8142aa8ab380ed59f8ce83ceacc6c11",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
在system2中測試連通性:
# ping 172.18.0.2
PING 172.18.0.2 (172.18.0.2) 56(84) bytes of data.
64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.463 ms
64 bytes from 172.18.0.2: icmp_seq=2 ttl=64 time=0.068 ms
64 bytes from 172.18.0.2: icmp_seq=3 ttl=64 time=0.093 ms
#直接ping容器的名稱也能夠
# ping system1  
PING system1 (172.18.0.2) 56(84) bytes of data.
64 bytes from system1.my_network (172.18.0.2): icmp_seq=1 ttl=64 time=0.719 ms
64 bytes from system1.my_network (172.18.0.2): icmp_seq=2 ttl=64 time=0.095 ms
64 bytes from system1.my_network (172.18.0.2): icmp_seq=3 ttl=64 time=0.077 ms
三、斷開網絡與網絡刪除
斷開
docker network disconnect my_network system1
刪除
docker network rm my_network
四、網絡模式
Docker的網絡模式分爲四種:Bridge、Host、Container、None
Bridge模式
當Docker進程啓動時,會在主機上建立一個名爲docker0的虛擬網橋,此主機上啓動的Docker容器會鏈接到這個虛擬網橋上。虛擬網橋的工做方式和物理交換機相似,這樣主機上的全部容器就經過交換機連在了一個二層網絡中。
從docker0子網中分配一個IP給容器使用,並設置docker0的IP地址爲容器的默認網關。在主機上建立一對虛擬網卡veth pair設備,Docker將veth pair設備的一端放在新建立的容器中,並命名爲eth0(容器的網卡),另外一端放在主機中,以vethxxx這樣相似的名字命名,並將這個網絡設備加入到docker0網橋中。能夠經過brctl show命令查看。
bridge模式是docker的默認網絡模式,不寫--net參數,就是bridge模式。使用docker run -p時,docker實際是在iptables作了DNAT規則,實現端口轉發功能。可使用iptables -t nat -vnL查看。
Host模式
若是啓動容器的時候使用host模式,那麼這個容器將不會得到一個獨立的Network Namespace,而是和宿主機共用一個Network Namespace。容器將不會虛擬出本身的網卡,配置本身的IP等,而是使用宿主機的IP和端口。可是,容器的其餘方面,如文件系統、進程列表等仍是和宿主機隔離的。
Container模式
這個模式指定新建立的容器和已經存在的一個容器共享一個 Network Namespace,而不是和宿主機共享。新建立的容器不會建立本身的網卡,配置本身的 IP,而是和一個指定的容器共享 IP、端口範圍等。一樣,兩個容器除了網絡方面,其餘的如文件系統、進程列表等仍是隔離的。兩個容器的進程能夠經過 lo 網卡設備通訊。
None模式
使用none模式,Docker容器擁有本身的Network Namespace,可是,並不爲Docker容器進行任何網絡配置。也就是說,這個Docker容器沒有網卡、IP、路由等信息。須要咱們本身爲Docker容器添加網卡、配置IP等。

 

3、docker高級網絡設置
一、配置 DNS在docker run時使用如下參數:nginx

參數 說明
-h HOSTNAME or --hostname=HOSTNAME 設定容器的主機名,它會被寫到容器內的 /etc/hostname 和/etc/hosts。但它在容器外部看不到,既不會在 docker ps 中顯示,也不會在其餘的容器的/etc/hosts 看到。
--link=CONTAINER_NAME:ALIAS 選項會在建立容器的時候,添加一個其餘容器的主機名到 /etc/hosts 文件中,讓新容器的進程可使用主機名 ALIAS 就能夠鏈接它。
--dns=IP_ADDRESS 添加 DNS 服務器到容器的 /etc/resolv.conf 中,讓容器用這個服務器來解析全部不在 /etc/hosts 中的主機名。
--dns-search=DOMAIN 設定容器的搜索域,當設定搜索域爲 .example.com 時,在搜索一個名爲 host 的主機時,DNS 不只搜索host,還會搜索 host.example.com。 注意:若是沒有上述最後 2 個選項,Docker 會默認用主機上的 /etc/resolv.conf 來配置容器。

二、容器訪問控制
容器訪問外部網絡
容器要想訪問外部網絡,須要本地系統的轉發支持。在Linux 系統中,檢查轉發是否打開。web

sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

容器之間訪問
容器之間相互訪問,須要兩方面的支持。
容器的網絡拓撲是否已經互聯。默認狀況下,全部容器都會被鏈接到 docker0 網橋上。
本地系統的防火牆軟件 -- iptables 是否容許經過。
訪問全部端口
當啓動 Docker 服務時候,默認會添加一條轉發策略到 iptables 的 FORWARD 鏈上。策略爲經過(ACCEPT)仍是禁止(DROP)取決於配置 --icc=true(缺省值)仍是 --icc=false。固然,若是手動指定 --iptables=false 則不會添加 iptables 規則。
可見,默認狀況下,不一樣容器之間是容許網絡互通的。若是爲了安全考慮,能夠在docker服務修改/usr/lib/systemd/system/docker.service啓動時添加--icc=false。
訪問指定端口在經過 -icc=false 關閉網絡訪問後,能夠經過 --link=CONTAINER_NAME:ALIAS 選項來訪問容器的開放端口。
例如,在啓動 Docker 服務時,能夠同時使用 --icc=false --iptables=true 參數來關閉容許相互的網絡訪問,並讓 Docker 能夠修改系統中的 iptables 規則。
此時,系統中的 iptables 規則多是相似:sql

iptables -nL 
... 
Chain     FORWARD   (policy ACCEPT) 
target     prot   opt   source     destination 
DROP      all     --   0.0.0.0/0   0.0.0.0/0...

以後,啓動容器(docker run)時使用 --link=CONTAINER_NAME:ALIAS 選項。Docker 會在 iptable中爲 兩個容器分別添加一條 ACCEPT 規則,容許相互訪問開放的端口(取決於 Dockerfile 中的 EXPOSE 行)。當添加了 --link=CONTAINER_NAME:ALIAS 選項後,添加了 iptables 規則。docker

iptables -nL
 ... 
Chain   FORWARD   (policy ACCEPT)
target   prot   opt   source     destination
ACCEPT   tcp    --   172.17.0.2   172.17.0.3     tcp spt:80 
ACCEPT   tcp    --   172.17.0.3   172.17.0.2     tcp dpt:80 
DROP    all    --   0.0.0.0/0    0.0.0.0/0
注意:--link=CONTAINER_NAME:ALIAS 中的 CONTAINER_NAME 目前必須是 Docker 分配的名字,或使用 --name 參數指定的名字。主機名則不會被識別。
相關文章
相關標籤/搜索