5.0 网络模式基本介绍
Docker 单机网络模式分为以下几种:
1) bridge NetWork,启动容器时使用--net=bridge参数指定,默认设置。
2) Host NetWork ,启动容器时使用--net=host参数指定。
3) None NetWork, 启动容器时使用--net=none参数指定。
4) Container NetWork,启动容器时使用--net=container:NAME_or_ID参数指定。
5.1 Docker 网络模式详解
5.1.1 host 模式
如果启动容器的时候使用host 模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP 等,而是使用宿主机的IP 和端口。但是容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。用主机网络的时候,一个宿主机,相同的容器,只能启动一个?
5.1.1.1 案例:容器网络host模式
#注意如果是host模式,命令行参数不能带-p/-P 主机端口:容器端口
# WARNING: Published ports are discarded when using host network mode [root@master ~]# docker run --name host_demo -it --network host gliderlabs/alpine /bin/sh / # ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:d0:f0:73 brd ff:ff:ff:ff:ff:ff inet 192.168.91.8/24 brd 192.168.91.255 scope global ens32 valid_lft forever preferred_lft forever inet6 fe80::c634:c8f0:327e:10a8/64 scope link valid_lft forever preferred_lft forever 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN link/ether 02:42:da:53:55:ff 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 / # ping www.baidu.com PING www.baidu.com (14.215.177.38): 56 data bytes 64 bytes from 14.215.177.38: seq=0 ttl=128 time=10.177 ms [root@demo ~]# docker run --name nginx_host1111 -d --network host nginx
/
5.1.2 bridge 模式
bridge 模式是Docker 默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker 容器连接到一个虚拟网桥上。
当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的 Docker容器会连接到这个虚拟网桥上。虚拟网桥(根据MAC地址进行数据交换)的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。如果不写--net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。
5.1.2.1 案例:容器网络模式桥接
#此模式可以添加端口映射参数:-p 2000:22
[root@master ~]# docker run --name host_demo_bridge -it --network bridge gliderlabs/alpine /bin/sh / # ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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 6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP 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
5.1.3 container 模式
Container 模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过localhost 网卡设备通信。
5.1.3.1 案例:容器网络使用container
#使用其他容器的桥接网卡出外网, 此模式不支持-p主机端口:容器端口
[root@master ~]# docker run --name host_demo_container -it \ --network container:host_demo_bridge gliderlabs/alpine /bin/sh / # ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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 8: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP 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
5.1.4 none 模式
使用none 模式,Docker 容器拥有自己的Network Namespace,但是,并不为Docker 容器进行任何网络配置。也就是说,这个Docker 容器没有网卡、IP、路由等信息。需要我们自己为Docker 容器添加网卡、配置IP 等。
5.1.4.1 案例容器网络模式为none模式
[root@master ~]# docker run --name host_demo_none -it --network none gliderlabs/alpine /bin/sh / # ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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
5.2 容器网络操作
5.2.1 容器网络配置查看
语法:docker container inspect 容器ID
#系统默认分配的IP 地址段为172.17.0.0/16
[root@docker chapter]# docker container inspect 658273be34ee ........省略......... "NetworkSettings": { "Bridge": "", "SandboxID": "d2e6b8e57c55a552abb825b11ed3faff4541fe28fa20244caa29ee2b2ed8ce74", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": { "80/tcp": [ { "HostIp": "0.0.0.0", "HostPort": "80" } ] }, "SandboxKey": "/var/run/docker/netns/d2e6b8e57c55", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "73023ec84983ee451e065700c61c8b43bc67fafb3997946002a7a48ca24923cf", "Gateway": "172.17.0.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "172.17.0.2", "IPPrefixLen": 16,
/
5.2.2 容器端口映射
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。当使用 -P(大写) 标记时,Docker 会随机映射一个端口到内部容器开放的网络端口。当使用 -p(小写)标记时,Docker 指定一个宿主机端口映射到到内如容器开放的网络端口。使用 docker ps 可以看到,本地主机的端口被映射到了容器端口。
在一个指定端口上只可以绑定一个容器。
指定映射(docker 会自动添加一条iptables规则来实现端口映射)
-p hostPort:containerPort
#映射主机指定端口8080到容器的端口80
[root@docker master ]# docker run --name nginx-demo -p 8080:80 -d nginx #查看 iptables [root@master ~]# iptables -L -n -t nat | grep 8080 DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:172.17.0.4:80 -p ip:hostPort:containerPort #映射主机的指定IP 与指定 8180端口到容器80端口 [root@master ~]# docker run --name nginx-demo-8180 -p 192.168.91.8:8180:80 -d nginx #查看 iptables [root@master ~]# iptables -L -n -t nat | grep 8180 DNAT tcp -- 0.0.0.0/0 192.168.91.8 tcp dpt:8180 to:172.17.0.5:80 -p ip::containerPort(随机端口) [root@master ~]# docker run --name nginx-1 -p 192.168.91.8::80 -d nginx [root@master ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f5fb8604f330 nginx "nginx -g 'daemon of…" 7 seconds ago Up 6 seconds 192.168.91.8:32768->80/tcp nginx-1 -p hostPort:containerPort/udp [root@master ~]# docker run --name dns-udp -p 53:53/udp -d andyshinn/dnsmasq #命令成功 -p 81:80 –p 443:443 可以指定多个-p [root@master ~]# docker run --name nginx-demo-81 -p 81:80 -p 32:22 -d nginx -P 宿主机随机端口映射 [root@master ~]# docker run --name nginx-port -P -d nginx [root@master ~]# docker ps | grep nginx-port e08c51faced1 nginx "nginx -g 'daemon of…" 7 seconds ago Up 5 seconds 0.0.0.0:32769->80/tcp #查看容器的端口映射 [root@master ~]# docker port 4a52c7b5035b 80/tcp -> 192.168.91.8:8110
/