--net=bridge
默认网络,Docker启动后创建一个docker0网桥,默认创建的容器也是添加到这个网桥中。
--net=host
容器不会获得一个独立的network namespace,而是与宿主机公用一个。这意味着容器不会有自己的网卡信息,而是使用宿主机的。容器除了网络,其他都是隔离的。
docker run -it -d --name box01 --net=host busybox
docker exec -it box01 sh
/ # ifconfig
--net=none
获取独立的network namespace,但不为容器进行任何网络配置,需要我们手动配置。
docker run -it -d --name box02 --net=none busybox
/ # ifconfig
--net=container:Name/ID
与指定的容器使用同一个network namespace,具有同样的网络配置信息,两个容器除了网络,其他都还是隔离的。
docker run -itd --name bs -p 99:80 busybox
docker run -itd --name nginx01 --net=container:bs nginx
curl 127.0.0.1:99
与默认的bridge原理一样,但自定义网络具备内部DNS发现,可以通过容器名或者主机名容器之间网络通信。
docker network create bs-test
docker run -itd --name box1 --net=bs-test busybox
docker run -itd --name box2 --net=bs-test busybox
docker exec -it box1 sh
/ # ping box2
docker network inspect bs-test
SNAT:局域网共享一个公网IP接入lnternel
DNAT:向internel发布内网服务器
[root@test-docker01 ~]# vim a.sh
# 网桥名称
br_name=br0
# 添加网桥
brctl addbr $br_name
# 给网桥设置IP
ip addr add 192.168.43.10/24 dev $br_name
# 删除已存在的eth0网卡配置
ip addr del 192.168.43.10/24 dev eth0
# 激活网桥
ip link set $br_name up
# 添加eth0到网桥
brctl addif $br_name eth0
# 添加路由
ip route add default via 192.168.43.2 dev br0
[root@test-docker01 ~]# sh a.sh
#桥接成功
[root@test-docker01 ~]# brctl show
bridge name bridge id STP enabled interfaces
br-67e7e0736b2c 8000.0242f6e74907 no
br0 8000.000c2946f293 no eth0
docker0 8000.024232deb134 no veth0e8ad3d
[root@test-docker01 ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -b=br0
#重启docker生效
[root@test-docker01 ~]# systemctl daemon-reload
[root@test -docker01 ~]# systemctl restart docker
vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BRISGE=br0
vim /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.68.1.10
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS=223.5.5.5
#编辑配置文件,添加-b=br0
[root@test-docker01 ~]# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -b=br0
#重启docker生效
[root@test-docker01 ~]# systemctl daemon-reload
[root@test -docker01 ~]# systemctl restart docker
C_ID=$(docker run -itd --net=none ubuntu)
C_PID=$(docker inspect -f '{{.State.Pid}}' $C_ID)
# 创建network namespace目录并将容器的network namespace软连接到此目录,以便ip netns命令读取
mkdir -p /var/run/netns
ln -s /proc/$C_PID/ns/net /var/run/netns/$C_PID
# 添加虚拟网卡veth+容器PID,类型是veth pair,名称是vp+容器PID
ip link add veth$C_PID type veth peer name vp$C_PID
# 添加虚拟网卡到br0网桥
brctl addif br0 veth$C_PID
# 激活虚拟网卡
ip link set veth$C_PID up
# 设置容器网络信息
IP='192.168.43.123/24'
GW='192.168.43.2'
# 给进程配置一个network namespace
ip link set vp$C_PID netns $C_PID
# 在容器进程里面设置网卡信息
ip netns exec $C_PID ip link set dev vp$C_PID name eth0
ip netns exec $C_PID ip link set eth0 up
ip netns exec $C_PID ip addr add $IP dev eth0
ip netns exec $C_PID ip route add default via 192.168.43.2
[root@test-docker01 ~]# yum install git -y
[root@test-docker01 ~]# git clone https://github.com/jpetazzo/pipework.git
[root@test-docker01 ~]# mv pipework/pipework /usr/bin/
[root@test-docker01 ~]# docker run -itd --name bs2 --net none busybox
d28efc7d562301a67d40f63930c75d9b7277137c9f7adc7b5568223f3496aa83
[root@test-docker01 ~]# pipework br0 bs2 192.168.43.55/24@192.168.43.2
[root@test-docker01 ~]# docker exec -it bs2 sh
/ # ifconfig
eth1 Link encap:Ethernet HWaddr 46:76:F4:DA:DC:39
inet addr:192.168.43.55 Bcast:192.168.43.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:9 errors:0 dropped:0 overruns:0 frame:0
TX packets:1 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:730 (730.0 B) TX bytes:42 (42.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
/ # ping baidu.com
PING baidu.com (220.181.57.216): 56 data bytes
64 bytes from 220.181.57.216: seq=0 ttl=128 time=57.848 ms
64 bytes from 220.181.57.216: seq=1 ttl=128 time=46.033 ms
注:重启容器,IP会失效。