直接解决 ------ 修改 docker0 MTU 配置后重启 docker

方式一、修改 daemon.json 文件
$ vim /etc/docker/daemon.json
{
"mtu": 1400
}
$ systemctl restart docker
方式二、修改 systemd unit file 指明启动参数 --mtu (不同系统位置可能不同
$ vim /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --mtu 1400 -H fd:// --containerd=/run/containerd/containerd.sock
$ systemctl daemon-reload
$ systemctl restart docker
注意,修改重启后,如果 docker0 上当前没有容器运行。使用 ifconfig/ip 命令会看到处于 DOWN 状态的 docker0 MTU 仍然会显示为 1500,创建容器后即会变成 1400
间接解决 ------ 不使用 docker0 网桥
即不使用默认网络,指定 opt com.docker.network.driver.mtu
$ docker network create \
--opt com.docker.network.bridge.name=mtu0 \
--opt com.docker.network.driver.mtu=1400 \
--driver=bridge \
--subnet=172.28.0.0/16 \
--gateway=172.28.0.1 \
mybridge
$ docker run --rm -it --name test --network mybridge alpine
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
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
25: eth0@if26: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1400 qdisc noqueue state UP
link/ether 02:42:ac:1c:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.28.0.2/16 brd 172.28.255.255 scope global eth0
valid_lft forever preferred_lft forever