前言

前端时间, 使用docker过程中, 又接触到需要docker network的相关知识. 之前的了解都是, 可以满足日常的使用即可, 本次, 借着机会仔细的了解了一下.
当然, 对于网络知识的更加深入的理解可能没有精通网络的大佬玩的转.


docker的网络类型 及相应构造

据悉. docker 1.7和docker1.8 共有4种默认的网络类型, 其分别为: None/ Host/ Bridge(默认)/ Container.

  • 通过docker network ls查看

在这里插入图片描述

docker默认是会创建如下几种的网络的. Host/ None/ Bridge

  • None

--net=none不创建相关网络. 即只能容器内自己执行. 容器不进行网络虚拟化, 容器和外部无法进行通信.

  • host

--net=host主机模式. 容器和主机使用同一套网络. 比如容器内使用8080端口的一个进程, 那么宿主机也无法使用这个端口. 反之, 同理.

  • bridge (默认)

--net=bridge每个容器都进行网络虚拟化. 并且通过端口映射和主机进行通信.

  • container

--net=container:Name_or_Id某个容器启动时, 可以不进行自身网络的虚拟化. 而使用其他容器的网络.

bridge模式

在这里插入图片描述

​如一般Docker会使用172.17.0.0/16这个网段,并将172.17.0.1/16分配给docker0网桥(在主机上使用ifconfig命令是可以看到docker0的,可以认为它是网桥的管理接口,在宿主机上作为一块虚拟网卡使用)。单机环境下的网络拓扑如下,主机地址为10.10.0.186/24。


常用的docker network命令

  • 创建网络
docker network create --driver=bridge --subnet=192.168.88.0/24 demo 
# driver 网络模式
# subnet 网段 默认网段为172.17.0.0/16
# demo 名称
  • container启动时, 使用网络
#运行redis容器
docker run -itd --name redis  --network mynet --network-alias redis -p 6379:6379 redis
#运行nginx容器
docker run -d --name nginx -p 80:80 --network mynet --network-alias nginx --privileged=true   -v /home/wwwroot:/home/wwwroot -v /home/wwwlogs:/home/wwwlogs  nginx

  • 查询container的网络 docker inspect <containerName_or_Id>
# 运行容器;
$ docker run --name=nginx_bridge --net=bridge -p 80:80 -d nginx       
9582dbec7981085ab1f159edcc4bf35e2ee8d5a03984d214bce32a30eab4921a
 
# 查看容器;
$ docker ps
CONTAINER ID        IMAGE          COMMAND                  CREATED             STATUS              PORTS                NAMES
9582dbec7981        nginx          "nginx -g 'daemon ..."   3 seconds ago       Up 2 seconds        0.0.0.0:80->80/tcp   nginx_bridge
 
# 查看容器网络;
$ docker inspect 9582dbec7981
"Networks": {
    "bridge": {
        "IPAMConfig": null,
        "Links": null,
        "Aliases": null,
        "NetworkID": "9e017f5d4724039f24acc8aec634c8d2af3a9024f67585fce0a0d2b3cb470059",
        "EndpointID": "81b94c1b57de26f9c6690942cd78689041d6c27a564e079d7b1f603ecc104b3b",
        "Gateway": "172.17.0.1",
        "IPAddress": "172.17.0.2",
        "IPPrefixLen": 16,
        "IPv6Gateway": "",
        "GlobalIPv6Address": "",
        "GlobalIPv6PrefixLen": 0,
        "MacAddress": "02:42:ac:11:00:02"
    }
}
  • 查询network整体的网络
$ docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "9e017f5d4724039f24acc8aec634c8d2af3a9024f67585fce0a0d2b3cb470059",
        "Created": "2017-08-09T23:20:28.061678042-04:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "Containers": {
            "9582dbec7981085ab1f159edcc4bf35e2ee8d5a03984d214bce32a30eab4921a": {
                "Name": "nginx_bridge",
                "EndpointID": "81b94c1b57de26f9c6690942cd78689041d6c27a564e079d7b1f603ecc104b3b",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]
  • link相关容器
#1. 运行nginx和docker容器
docker run -itd --name redis -p 6379:6379 redis
docker run -d --name nginx -p 80:80 --privileged=true -v /home/wwwroot:/home/wwwroot -v /home/wwwlogs:/home/wwwlogs nginx

# 2. 链接网络
#加入nginx到mynet网络
[root@localhost /]# docker network connect mynet nginx
#加入redis到mynet网络
[root@localhost /]# docker network connect mynet redis
#查看mynet网络包含的容器,会发现两个容器都加入当前网络了,后面使用ping命令是能够ping通容器名称的。
[root@localhost /]# docker network inspect mynet


# 3. 取消链接网络
#将nginx移除mynet局域网络
docker network disconnect mynet nginx
Reference

[1]. Docker:网络模式详解

[2]. docker network详解、教程

[3]. Docker network整理


官方命令参考

Parent command

CommandDescription
dockerThe base command for the Docker CLI.

Child commands

CommandDescription
docker network connectConnect a container to a network
docker network createCreate a network
docker network disconnectDisconnect a container from a network
docker network inspectDisplay detailed information on one or more networks
docker network lsList networks
docker network pruneRemove all unused networks
docker network rmRemove one or more networks
Reference

[1]. (official)docker network

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐