Docker——docker网络详解

一、Docker原生网络

Docker作为目前最火的轻量级容器技术,有很多令人称道的功能,如Docker的镜像管理。然而,Docker同样有着很多不完善的地方,网络方面就是Docker比较薄弱的部分。因此,我们有必要深入了解Docker的网络知识,以满足更高的网络需求,便于我们以后学习如何优化docker网络。

安装Docker时,它会自动创建三个网络,bridge(创建容器默认连接到此网络)、 none 和host。

[root@server1 registry]# docker network ls 
NETWORK ID          NAME                DRIVER              SCOPE
f3aff7e4dad5        bridge              bridge              local
c5f20e91b8ca        host                host                local
0e8b7355d807        none                null                local
docker网络模式 功能
host 容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
Container(Joined) 创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。
None 该模式关闭了容器的网络功能。
Bridge 此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信。

运行容器的时候指定网络模式:

模式 参数
host模式 使用 --net=host(–network host) 指定。
none模式 使用 --net=none 指定。
bridge模式 使用 --net=bridge 指定,默认设置。
container模式 使用 --net=container:NAME_or_ID 指定。

我们这里需要提前安装网桥工具:yum install -y bridge-utils.x86_64

1 bridge网桥模式

bridge模式下容器没有一个公有ip,只有宿主机可以直接访问,外部主机是不可见的。
容器通过宿主机的NAT规则后可以访问外网。
在这里插入图片描述

[root@server2 shadowsocks-go-master]# docker start busy 
busy
[root@server2 shadowsocks-go-master]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
6f274191a8d3        busybox             "sh"                4 hours ago         Up 3 seconds                            busy
[root@server2 shadowsocks-go-master]# brctl show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.024259f20048	no		vethdd31213

可以发现,当挂起一个容器时,就会出现相对应的网桥接口。

这时,我们的容器就通过docker0网桥与宿主机建立通信了。

[root@server2 shadowsocks-go-master]# docker attach busy
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    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 
    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
/ # ping 172.25.10.1
PING 172.25.10.1 (172.25.10.1): 56 data bytes
64 bytes from 172.25.10.1: seq=0 ttl=63 time=0.705 ms

不仅如此,我们上面说了,只要宿主机做了NAT,我们同时在容器中做好dns解析,就能与外网通信。

在宿主虚拟机确保可以上网,且开启了内核路由转发功能。
[root@server2 ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 1

进入容器,做好dns解析(一般的镜像会默认做好dns解析的),发现可以上网。
[root@server2 ~]# docker attach busy 
/ # cat /etc/resolv.conf 
nameserver 114.114.114.114
/ # ping baidu.com
PING baidu.com (39.156.69.79): 56 data bytes
64 bytes from 39.156.69.79: seq=0 ttl=49 time=68.977 ms
64 bytes from 39.156.69.79: seq=1 ttl=49 time=49.094 ms

2 host模式

相当于使用了Vmware中的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。

众所周知,Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。

一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值