qianlei90 / Blog

那些该死的文字呦
https://qianlei.notion.site
103 stars 20 forks source link

深入Docker网络(一):概念和原理 #38

Open qianlei90 opened 7 years ago

qianlei90 commented 7 years ago

深入Docker网络(一):概念和原理

Tags: 印象笔记 Docker

docker官方文档Docker container networking的笔记。

[toc]


1. docker自带的网络

docker默认提供了3种网络:bridgehostnone

1.1 host网络

容器的网络接口跟主机一样。

1.2 none网络

除了lo接口外,容器没有任何其他网络接口。

1.3 bridge网络

这是新建容器时默认使用的网络,也是使用得最多的网络。网络中的所有容器可以通过IP互相访问。 bridge网络通过网络接口docker0跟主机桥接,可以在主机上通过ifconfig docker0查看到该网络接口的信息。

2. 用户自定义的网络

2.1 bridge

这是自定义网络中最简单的,跟docker提供的默认bridge相差无几。

$ docker network create --driver bridge isolated_nw

1196a4c5af43a21ae38ef34515b6af19236a3fc48122cf585e3f3054d509679b

$ docker network inspect isolated_nw

[
    {
        "Name": "isolated_nw",
        "Id": "1196a4c5af43a21ae38ef34515b6af19236a3fc48122cf585e3f3054d509679b",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Config": [
                {
                    "Subnet": "172.21.0.0/16",
                    "Gateway": "172.21.0.1/16"
                }
            ]
        },
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

$ docker network ls

NETWORK ID          NAME                DRIVER
9f904ee27bf5        none                null
cf03ee007fb4        host                host
7fca4eb8c647        bridge              bridge
c5ee82f76de3        isolated_nw         bridge

$ docker run --network=isolated_nw -itd --name=container3 busybox

8c1a0a5be480921d669a073393ade66a3fc49933f08bcc5515b37b8144f6d47c

$ docker network inspect isolated_nw

[
    {
        "Name": "isolated_nw",
        "Id": "1196a4c5af43a21ae38ef34515b6af19236a3fc48122cf585e3f3054d509679b",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Config": [
                {}
            ]
        },
        # 注意"Containers"字段,跟之前相比,多了我们加进去的容器。
        "Containers": {
            "8c1a0a5be480921d669a073393ade66a3fc49933f08bcc5515b37b8144f6d47c": {
                "EndpointID": "93b2db4a9b9a997beb912d28bcfc117f7b0eb924ff91d48cfa251d473e6a9b08",
                "MacAddress": "02:42:ac:15:00:02",
                "IPv4Address": "172.21.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

两点限制:

2.2 docker_gwbridge

在下列两种情况下,docker_gwbridge网络会自动被docker创建

  1. 初始化或加入一个swarm集群
  2. 容器的网络无法提供对外部网络的连通(?????)

可以提前自己创建docker_gwbridge网络,否则docker会按默认的创建:

$ docker network create --subnet 172.30.0.0/16 \
                        --opt com.docker.network.bridge.name=docker_gwbridge \
                        --opt com.docker.network.bridge.enable_icc=false \
                        docker_gwbridge

2.3 swarm模式下的overlay

可以在swarm的节点中创建overlay网络,该网络只对swarm集群的服务有效,在节点上不属于swarm集群的容器,运行docker run指令是无法使用该网络的。

# Create an overlay network `my-multi-host-network`.
$ docker network create \
  --driver overlay \
  --subnet 10.0.9.0/24 \
  my-multi-host-network

400g6bwzd68jizzdx5pgyoe95

# Create an nginx service and extend the my-multi-host-network to nodes where
# the service's tasks run.
$ docker service create --replicas 2 --network my-multi-host-network --name my-web nginx

716thylsndqma81j6kkkb5aus

2.4 外部KV存储模式下的overlay

如果overlay网络不是运行在swarm集群中,则需要一个KV存储,如Consul、Etcd、Zookeeper等。

#  创建overlay网络
docker network create --driver overlay my-multi-host-network

网络中的容器互相连通,不管是在哪台主机上。

3. docker内置的DNS服务器

docker运行了一个内置的DNS服务器,容器在做域名解析时先访问内置的DNS,失败后再去访问外网的DNS。

- 完 - 2017/03/13