Docker学习笔记(4)——Docker网络配置

1.网络原理:网络虚拟化

Docker本地网络的实现就是利用Linux网络命名空间和虚拟网络设备
Docker中网络接口默认都是虚拟接口,虚拟接口最大优势就是转发效率高。
Docker利用虚拟网络技术,在本地主机与容器内分别创建一个虚拟接口,并让他们联通(veth path)
Docker创建容器时网络创建过程:


1)Docker随机分配一个为占用的私有网段中一个地址给docker0接口,比如典型的172.17.42.1,掩码为255.255.255.0
2)启动容器内的网口,也会自动非配给同一网段(172.17.0.0/16)的地址
3)创建一对虚拟接口(veth pair),分别放在本地主机和新容器的命名空间中
4)一端虚拟接口连(挂载)到默认docker0网桥上,名称呢以veth开头(eg:vethAQI2QT)
5)容器虚拟接口eth0
6)网桥可用地址段获取一个空闲地址分配给容器的eth0(eg:172.17.0.2/16)
并配置默认路由网关为docker0网卡的内部接口docker0的IP地址

2.手动配置网络

用户使用–net=none后,docker将不对容器网络进行配置
$ docker run -i -t --rm ==net=none ubuntu:latest /bin/bash
本地主机查找主机进程PID(port ID,容器开放端口)
$ docker inspect -f '{{.State.Pid}}' 63f36fc01b5f
2778(显示容器PID)
为它创建命名空间
$ pid=2778
$ sudo mkdir -p /var/run/netns
$ sudo ln -s /proc/$pid/ns/net /var/run/netns/$pid (ln -s创建文件连接)
查看网卡配置
$ ip addr show docker0 (检查桥接网卡的ip)
创建一对”veth pair”接口A和B
$ sudo ip link add A type veth pair name B
(ip link add命令 添加接口A,再veth pair名字为B的接口)
把接口A添加到docker0网桥
$ sudo brctl addif docker0 A
开启接口A
$ sudo ip link set A up
(ip link set 命令是 改变设备启动)
把接口B放在容器网络命名空间,命名为eth0
$ sudo ip link set B netns $pid (B是接口,netns将网络虚化,$pid即为所指网络空间)
(ip netns exec进入后面指的网络空间进行配置,从而再容器中配置)
$ sudo ip netns exec $pid ip link set dev B name eth0 (接口B命名)
$ sudp ip netns exec $pid ip link set eth0 up (启动接口B)
$ sudo ip netns exec $pid ip addr add 172.17.42.99/16 dev eth0 (docker0上接入eth0端口)
$ sudo ip netns exec $pid ip route add default via 172.17.42.1
(配置默认网关,直接到达ip路由器的ip地址)
3.配置容器DNS和主机名
从配置文件中修改:
/etc/resolv.conf与宿主机文件内容保持一致
/etc/hosts记录了容器自身的主机和名称:
root@75dbd6685305:/# cat /etc/hosts
172.17.0.2    75dbd6685305
...
127.0.0.1    localhost
/etc/hostname记录了容器的主机名
root@75dbd6685305:/# cat /etc/hostname
75dbd6685305
通过参数修改:
--hostname=HOSTNAME 设定容器主机名
--link=CONTAINER_NAME:ALIAS 会记录所连接容器的主机名到容器内的/etc/hosts文件中
--dns=IP_ADDRESS 添加DNS服务器到容器的/etc/resolv.conf
--dns-search=DOMAIN 设定容器的搜索域,当设定搜索域为.example.com时,在搜索一个名为host的主机时DNS不仅会搜索host,还会搜索host.example.com
4.容器访问控制
容器的访问控制主要通过Linux上的iptables防火墙来进行管理和实现,容器默认指定的网关为docker0网桥上的docker0内部接口,docker0的内部接口同时也是宿主机的本地接口,默认情况下是可以访问到本地的。
若想访问到外网,需要宿主机的转发
查看宿主机linux系统中转发是否打开:
$ sudo sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
若为0,手动打开:
$ sudo sysctl -w net.ipv4.ip_forward = 1
容器之间的访问:
可以通过(docker run)容器运行时参数–link=CONTAINER_NAME:ALIAS命令,来实现容器互联,连接前后可以通过如下命令来监控
$ sudo iptables -nL
...
CHAIN FORWARD (policy ACCEPT)
...
Docker会在iptable中为两个互联容器分别添加一条ACCEPT的规则,允许相互访问开放的端口。
5.映射容器端口到宿主主机
1)容器访问外部网络:容器访问外部网络源地址肯定不是172.17.0.2,需要进行源地址映射(SourceNAT)
映射是通过iptables的源地址伪装操作实现的。
查看主机nat表上POSTROUTING链的规则
$ sudo iptables -t nat -nvL POSTROUTING
上述规则将所有源地址在172.17.0.0/16网段动态伪装为从系统网卡发出。
2)外部容器访问容器实现:可以在docker run通过-p参数来启用
以一个开放80端口的web容器举例,使用-P时会自动映射到本地49000-49900范围内
注意:
1.这里规则映射了0.0.0.0,意味着确实主机来自所有网络接口上的流量
2.如果希望永久绑定到某个固定的IP地址,可以在Docker配置文件中 /etc/default/docker中指定DOCKER_OPTS=”–ip=IP_ADDRESS”,之后重启docker服务即可
6.自定义网桥
$ sudo service docker stop (停止服务)
$ sudo ip link set dev docker0 down (关闭网桥)
$ sudo brctl delbr docker0 (删除旧的网桥)

$ sudo brctl addbr bridge0 (添加网桥)
$ sudo ip addr add 192.168.5.1/24 dev bridge0 (网桥ip)
$ sudo ip link set dev bridge0 up (开启网桥)

$ sudo ip addr show bridge0 (查看网桥ip地址配置)
$ sudo service docker start (启动服务)
可以用brctl show查看桥接信息
(启动两个容器)
$ docker run -i -t --rm --net=none ubuntu:latest /bin/bash
root@1f1f4c1f931a:/#
$ docker run -i -t --rm --net=none ubuntu:latest /bin/bash
root@12e343489d2f:/#
(找到进程号)
$ docker inspect -f '{{.State.Pid}}' 1f1f4c1f931a
2989
$ docker inspect -f '{{.State.Pid}}' 12e343489d2f
(创建网络命名空间)
$ sudo mkdir -p /var/run/netns
$ sudo ln -s /proc/2989/ns/net /var/run/netns/2989
$ sudo ln -s /proc/3004/ns/net /var/run/netns/3004
(创建一对pair接口)
$ sudo ip link add A type veth peer name B

$ sudo ip link set A netns 2989 (接口A接到2989虚拟空间中)
$ sudo ip netns exec 2989 ip addr add 10.1.1.1/32 dev A (增加虚拟ip)
$ sudo ip netns exec 2989 ip link set A up (开启A接口)
$ sudo ip netns exec 2989 ip route add 10.1.1.1/32 dev A (添加到路由)

$ sudo ip link set B netns 3004 (接口B接到3004虚拟空间中)
$ sudo ip netns exec 3004 ip addr add 10.1.1.1/32 dev B (增加虚拟ip)
$ sudo ip netns exec 3004 ip link set B up (开启B接口)
$ sudo ip netns exec 3004 ip route add 10.1.1.1/32 dev B (添加到路由)
几种命令详解:
up/down 起动/关闭设备。
$ ip link set dev eth0 up
改变网络设备MTU(最大传输单元)的值。
$ ip link set dev eth0 mtu 1500
ip addr add–添加一个新的协议地址
$ ip addr add local 192.168.4.1/28 brd + label eth0:1 dev eth0
ip addr show–显示协议地址
$ ip addr show eth0
.ip route add – 添加新路由
设置到网络10.0.0/24的路由经过网关193.233.7.65
$ ip route add 10.0.0/24 via 193.233.7.65
ip route show – 列出路由
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值