Docker学习之网络模式配置

以前搭建过虚拟机(vmware)的小伙伴,有可能知道vmware为我们提供了三种网络工作模式,它们分别是:Bridged(桥接模式)、NAT(网络地址转换模式)、Host-Only(仅主机模式)。

网络模式

显然Docker 也支持4种网络模式供大家选择:

  • host模式,使用- -net=host指定。
  • container模式,使用- -net=container:NAME_or_ID指定。
  • none模式,使用- -net=none指定。
  • bridge模式,使用- -net=bridge指定,默认设置。

host模式

众所周知,Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。

例如,我们在10.10.101.105/24的机器上用host模式启动一个含有web应用的Docker容器,监听tcp80端口。当我们在容器中执行任何类似ifconfig命令查看网络环境时,看到的都是宿主机上的信息。而外界访问容器中的应用,则直接使用10.10.101.105:80即可,不用任何NAT转换,就如直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

container模式

在理解了host模式后,这个模式也就好理解了。这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。

none模式

这个模式和前两个不同。在这种模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。

bridge模式

bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。下面着重介绍一下此模式。

bridge模式的拓扑

当Docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。接下来就要为容器分配IP了,Docker会从RFC1918所定义的私有IP网段中,选择一个和宿主机不同的IP地址和子网分配给docker0,连接到docker0的容器就从这个子网中选择一个未占用的IP使用。如一般Docker会使用172.17.0.0/16这个网段,并将172.17.42.1/16分配给docker0网桥(在主机上使用ifconfig命令是可以看到docker0的,可以认为它是网桥的管理接口,在宿主机上作为一块虚拟网卡使用)。单机环境下的网络拓扑如下,主机地址为10.10.101.105/24。

132468-20160914104955539-406370187.png
132468-20160914104956773-342701859.jpg

默认网络

当您安装Docker时,会自动创建三个网络。您可以使用以下docker network ls命令列出这些网络:

$ docker network ls



NETWORK ID          NAME                DRIVER

7fca4eb8c647        bridge              bridge

9f904ee27bf5        none                null

cf03ee007fb4        host                host

这三个网络都建在Docker中。运行容器时,可以使用该--network标志来指定容器应连接到的网络。

默认网桥

Docker 服务启动后默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。

Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信,它还给出了 MTU(接口允许接收的最大传输单元),通常是 1500 Bytes,或宿主主机网络路由上支持的默认值。这些值都可以在服务启动的时候进行配置。

bridge所有Docker主机上都存在默认网络。如果您不指定其他网络,则新的容器会自动连接到默认bridge网络。

该docker network inspect命令返回有关网络的信息:

[root@iZ2ze74fkxrls31tr2ia2fZ ~]# docker network inspect bridge

[

    {

        "Name": "bridge",

        "Id": "7436e01fb532a9b25318c3d14c22a2b8bbf67fe9a1c4034d8529c17b98ce3408",

        "Scope": "local",

        "Driver": "bridge",

        "EnableIPv6": false,

        "IPAM": {

            "Driver": "default",

            "Options": null,

            "Config": [

                {

                    "Subnet": "192.168.1.1/24",

                    "Gateway": "192.168.1.1"

                }

            ]

        },

        "Internal": false,

        "Containers": {

            "ac36d9ff3cad1233ff52a46f413b8f5442c6d73470aca27c25c2296f72bcca0d": {

                "Name": "centos-java",

                "EndpointID": "62f4d3245b96dd5ff8da0fd5801388664d118b693bf5e0db72209b9335734269",

                "MacAddress": "02:42:c0:a8:01:03",

                "IPv4Address": "192.168.1.3/24",

                "IPv6Address": ""

            },

            "b5a21b26c111eb2b4c6a0823dd3c861de0e07fe485b51135cbf5c29318269810": {

                "Name": "centos",

                "EndpointID": "1719493bcaaec67568f5a39c1afc641c5dc6e7a65ea3733ad40c21f1b45c8ca4",

                "MacAddress": "02:42:c0:a8:01:02",

                "IPv4Address": "192.168.1.2/24",

                "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": {}

    }

]

修改网段

docker启动时默认使用172.17.x.x作为容器的ip地址,可以通过以下方法自定义该网段:

修改文件 /etc/docker/daemon.json 添加内容 "bip": "ip/netmask"

{

   "bip": "192.168.1.1/24"

}

重启 docker 服务:

systemctl restart docke

查看修改后的 docker0 网桥信息:

ifconfig docker0

有关daemon.json文件参数,这是Linux上允许的配置选项的完整示例:

{

    "authorization-plugins": [],

    "data-root": "",

    "dns": [],

    "dns-opts": [],

    "dns-search": [],

    "exec-opts": [],

    "exec-root": "",

    "experimental": false,

    "storage-driver": "",

    "storage-opts": [],

    "labels": [],

    "live-restore": true,

    "log-driver": "",

    "log-opts": {},

    "mtu": 0,

    "pidfile": "",

    "cluster-store": "",

    "cluster-store-opts": {},

    "cluster-advertise": "",

    "max-concurrent-downloads": 3,

    "max-concurrent-uploads": 5,

    "default-shm-size": "64M",

    "shutdown-timeout": 15,

    "debug": true,

    "hosts": [],

    "log-level": "",

    "tls": true,

    "tlsverify": true,

    "tlscacert": "",

    "tlscert": "",

    "tlskey": "",

    "swarm-default-advertise-addr": "",

    "api-cors-header": "",

    "selinux-enabled": false,

    "userns-remap": "",

    "group": "",

    "cgroup-parent": "",

    "default-ulimits": {},

    "init": false,

    "init-path": "/usr/libexec/docker-init",

    "ipv6": false,

    "iptables": false,

    "ip-forward": false,

    "ip-masq": false,

    "userland-proxy": false,

    "userland-proxy-path": "/usr/libexec/docker-proxy",

    "ip": "0.0.0.0",

    "bridge": "",

    "bip": "",

    "fixed-cidr": "",

    "fixed-cidr-v6": "",

    "default-gateway": "",

    "default-gateway-v6": "",

    "icc": false,

    "raw-logs": false,

    "allow-nondistributable-artifacts": [],

    "registry-mirrors": [],

    "seccomp-profile": "",

    "insecure-registries": [],

    "no-new-privileges": false,

    "default-runtime": "runc",

    "oom-score-adjust": -500,

    "node-generic-resources": ["NVIDIA-GPU=UUID1", "NVIDIA-GPU=UUID2"],

    "runtimes": {

        "cc-runtime": {

            "path": "/usr/bin/cc-runtime"

        },

        "custom": {

            "path": "/usr/local/bin/my-runc-replacement",

            "runtimeArgs": [

                "--debug"

            ]

        }

    }

}

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏LuckQI

初识Mongodb,从了解,安装到使用

关于Docker的基础知识相关内容基本上写完了,剩下的就是需要我们去多多熟练学习了。 一篇知识的完毕,不是结束,而是另外的一个开始。我们接下来的系列文章就是Mo...

1064
来自专栏Pythonista

docker入门

让开发人员最头疼的麻烦事之一就是环境配置了,每台计算机的环境都不相同,应该如何确保自己的程序换一台机器能运行起来呢?

3895
来自专栏北京马哥教育

把docker镜像当作桌面系统来用

博主一直都很喜欢思考怎样管理装在自己电脑上的桌面系统,这篇算是前作能当主力,能入虚拟机,还能随时打包带走,Linux就是这么强大的后续探索吧。

1760
来自专栏人工智能

在MacOs上用Docker开发

这是在开发者和运营团队之间的对话中经常听到的借口。即使使用复杂的工具,云中几乎没有限制的计算能力以及先进的持续集成工作流程,本地开发应用程序与在生产环境中运行应...

7040
来自专栏数据科学与人工智能

【Python环境】如何使用 Docker 快速配置数据科学开发环境?

数据科学开发环境配置起来让人头疼,会碰到包版本不一致、错误信息不熟悉和编译时间漫长等问题。这很容易让人垂头丧气,也使得迈入数据科学的这第一步十分艰难。而且这也是...

4695
来自专栏运维前线

CentOS6 安装mist.io

CentOS6 安装mist.io Mist.io不仅作为SaaS提供,而且还作为独立安装的开源软件组件,使组织和工程师能够在内部管理其基础设施。 开源组件...

2709
来自专栏云计算D1net

使用Docker时应该避免这10 件事…

容器可以解决很多问题,并且具有诸多优势,当你投身其中时便会发现其奥妙所在。 第一:容器是不可变的 - 操作系统,库版本,配置,文件夹和应用程序都包装在容器内。 ...

3557
来自专栏老司机的技术博客

docker实战入门(3)基本概念

docker的镜像是一个层叠的只读文件系统,最底端是一个引导文件系统(bootfs),这很像典型的linux的引导文件系统,docker用户几乎永远不会和引导文...

56610
来自专栏老司机的技术博客

docker实战入门(3)基本概念

Docker Client 客户端 / Docker Daemon 守护进程 docker是CS架构,Docker Daemon守护进程即为服务端 客户端向...

3775
来自专栏素质云笔记

caffe镜像︱window10+docker+ubuntu14.04+caffe镜像的简单尝试

win10专业版可以利用Hyper-V开启docker,一般升级而来的都是家庭版,现在要升级到win10专业版, 需要产品秘钥。 github网址:h...

3219

扫码关注云+社区

领取腾讯云代金券