赞
踩
注意第一种方法是在网上找的 , 我并没有执行成功 , 但是他分析的很不错,
可以参考第二种方法
首先需要明确docker的网桥模式,网桥工作在二层(OSI堆栈),是通用网络设备的一种,可以设置IP地址。有了IP地址,Linux便可通过路由表或IP表,在网络层定位网桥,这就相当于有了一个虚拟网卡,即docker0。docker0默认的地址划分:IP(172.17.0.1/16),在启动容器时,docker会在宿主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备,容器启动时,Docker引擎将veth pair设备的一端放在新创建的容器中,并命名为eth0。另一端放在宿主机中,以veth***这样类似的名字命名,并将这个网络设备加入到docker0网桥中,可以通过brctl show命令查看,从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。
1. 首先检查宿主机的网络配置
需要先安装网桥管理工具包
yum install bridge-utils -y
1)检查网桥brctl show
[root@localhost ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.000000000000 no
2) 检查ip
[root@localhost ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:85:de:4a brd ff:ff:ff:ff:ff:ff inet 192.168.137.130/24 brd 192.168.137.255 scope global dynamic eno16777736 valid_lft 1627sec preferred_lft 1627sec inet6 fe80::20c:29ff:fe85:de4a/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:32:06:66:2d 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 inet6 fe80::42:32ff:fe06:662d/64 scope link valid_lft forever preferred_lft forever
可以看到docker创建的虚拟网卡docker0的网段为172.17.0.1/16
3)查看路由: ip route
[root@localhost ~]# ip route
default via 192.168.137.2 dev eno16777736 proto static metric 100
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
192.168.137.0/24 dev eno16777736 proto kernel scope link src 192.168.137.130 metric 100
即172.17.0.0/16网段的包均通过docker0网桥来转发.
[root@localhost ~]# docker exec -it mn ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
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
129: eth0@if130: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:0a:02 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.0/16 brd 172.17.10.255 scope global eth0
valid_lft forever preferred_lft forever
可以看到虚拟网卡eth0的ip为172.17.0.0
[root@localhost ~]# docker exec -it mn ip route
default via 172.17.10.1 dev eth0
172.17.0.0/16 dev eth0 scope link src 172.17.0.1
由此可知172.17.0.0网段的包均走容器内的eth0,默认网关为172.17.10.1
[root@localhost ~]# tcpdump -i vethaef304e -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on vethaef304e, link-type EN10MB (Ethernet), capture size 262144 bytes
17:17:16.282976 IP 172.17.10.2 > 8.8.8.8: ICMP echo request, id 2304, seq 0, length 64
17:17:16.325812 IP 8.8.8.8 > 172.17.10.2: ICMP echo reply, id 2304, seq 0, length 64
17:17:21.297595 ARP, Request who-has 172.17.10.1 tell 172.17.10.2, length 28
17:17:21.297656 ARP, Reply 172.17.10.1 is-at f2:29:f4:5b:3d:f2, length 28
异常时就只有request who-has包,没有reply
查看网桥,路由和ip均没发现问题,试试修改docker0的默认网段,居然成功了,步骤如下:
1) 删除原有配置
service docker stop
ip link set dev docker0 down
brctl delbr docker0
iptables -t nat -F POSTROUTING
brctl addbr docker0
ip addr add 172.17.10.1/24 dev docker0
ip link set dev docker0 up
vim /etc/docker/daemon.json
{
"insecure-registries":["x.x.x"],
"bip": "172.17.10.1/24"
}
4)重启docker: systemctl restart docker
[root@localhost ~]# systemctl restart docker
docker容器自动分配的ip为172.17.0.0/24网段的ip,开发用的物理机和这个容器不在一个网段,根本没法访问到,这时候网上查到docker有一种网络模式是–net=host,就是让容器直接使用宿主服务器的ip,这样开发用的物理机就能够访问这个容器的接口了
在执行启动命令的时候 , 加一个属性 --net=host
docker run --name mn -p 80:80 -d --net=host nginx
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。