907  
查询码:00000025
6 容器网络
作者: wyasw 于 2020年03月29日 发布在分类 / Docker / docker基础 下,并于 2020年03月29日 编辑
docker

容器网络

1.1 网络模式

1.1.1 bridge

--net=bridge

默认网络,Docker启动后创建一个docker0网桥,默认创建的容器也是添加到这个网桥中。

1.1.2 host

--net=host

容器不会获得一个独立的network namespace,而是与宿主机公用一个。这意味着容器不会有自己的网卡信息,而是使用宿主机的。容器除了网络,其他都是隔离的。

docker run  -it -d  --name box01 --net=host busybox

docker exec -it box01  sh

/ # ifconfig

1.1.3 none

--net=none

获取独立的network namespace,但不为容器进行任何网络配置,需要我们手动配置。

docker run  -it -d  --name box02 --net=none busybox

/ # ifconfig

1.1.4 container

--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

1.1.5 自定义网络

与默认的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

1.2 容器网络访问原理

SNAT:局域网共享一个公网IP接入lnternel

DNAT:向internel发布内网服务器

粘贴图片


1.3 桥接宿主机网络与配置固定IP地址

1.3.1 临时生效

[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

#编辑配置文件,添加-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

1.3.2 永久生效

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

1.3.3 配置固定IP

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

 

1.3.4 pipework工具配置容器固定IP

[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会失效。



 推荐知识

 历史版本

修改日期 修改人 备注
2020-03-29 13:51:56[当前版本] 系统管理员 创建版本

 附件

附件类型

PNGPNG

文艺知识分享平台 -V 4.9.5 -wcp
京公网安备100012199188号 京ICP备2021030911号