docker服务无法访问宿主网络
背景
操作系统:本地搭建aws linux 2023
docker版本:25.0.5
docker-compose版本:v2.32.1
问题
启动docker服务之后,显示
port 1(vethd6e3d1c)entered disabled state
port 1(vethd6e3d1c)entered blocking state
结论
先说结论:首先尝试删除并重建网桥docker0,如果不行,再试试删除重复的虚拟网卡br-*
实践
本地启动docker-compose.yml
#[root@vm-hao-al2023 halo]# cat docker-compose.yaml
version: "3"
services:
halo:
image: registry.fit2cloud.com/halo/halo:2.20
restart: on-failure:3
depends_on:
halodb:
condition: service_healthy
networks:
halo_network:
volumes:
- ./halo2:/root/.halo2
ports:
- "8090:8090"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]
interval: 30s
timeout: 5s
retries: 5
start_period: 30s
environment:
# JVM 参数,默认为 -Xmx256m -Xms256m,可以根据实际情况做调整,置空表示不添加 JVM 参数
- JVM_OPTS=-Xmx256m -Xms256m
command:
- --spring.r2dbc.url=r2dbc:pool:mysql://halodb:3306/halo
- --spring.r2dbc.username=root
# MySQL 的密码,请保证与下方 MYSQL_ROOT_PASSWORD 的变量值一致。
- --spring.r2dbc.password=Passw0rd
- --spring.sql.init.platform=mysql
# 外部访问地址,请根据实际需要修改
- --halo.external-url=http://localhost:8090/
halodb:
image: mysql:8.1.0
restart: on-failure:3
networks:
halo_network:
command:
- --default-authentication-plugin=caching_sha2_password
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_general_ci
- --explicit_defaults_for_timestamp=true
volumes:
- ./mysql:/var/lib/mysql
- ./mysqlBackup:/data/mysqlBackup
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"]
interval: 3s
retries: 5
start_period: 30s
environment:
# 请修改此密码,并对应修改上方 Halo 服务的 SPRING_R2DBC_PASSWORD 变量值
- MYSQL_ROOT_PASSWORD=Passw0rd
- MYSQL_DATABASE=halo
networks:
halo_network:
服务可以正常启动,但是控制台出现了错误提示,一直循环。
解决
先说结论:首先尝试删除并重建网桥docker0,如果不行,再试试删除重复的虚拟网卡br-*
尝试了各种重启组件、查看网络相关信息的操作,发现没有解决。
随后在https://cloud.tencent.com/developer/article/1803122
看到了类似的情况,于是尝试修改docker0的网段,尝试后发现失败。
首先安装brctl
发现了一个宝藏网站:Packages for Linux and Unix
提供非常全的linux和unix安装包
https://pkgs.org/
经过查找可知,brctl所在包的名字是bridge-utils,于是到上方提供的网址搜索可得到下方链接:
wget https://cdn.amazonlinux.com/2/core/2.0/x86_64/6b0225ccc542f3834c95733dcf321ab9f1e77e6ca6817469771a8af7c49efe6c/../../../../../blobstore/d1a65e70a616b9ebd4c367ecef19a31a94a1c46bf7b22f6c697cbcbd73cf496b/bridge-utils-1.5-9.amzn2.0.2.x86_64.rpm
yum localinstall bridge-utils-1.5-9.amzn2.0.2.x86_64.rpm
service docker stop
关闭docker0的网卡
ip link set dev docker0 down
删除docker0网桥
brctl delbr docker0
重建docker0网桥
brctl addbr docker0
设置IP段(可选)
ip addr add 172.17.42.2/24 dev docker0
启动docker0网桥
ip link set dev docker0 up
重启docker引擎
service docker start
解决办法
上面提到了查看网络信息,忘记怎么想起来执行了一下 ifconfig,发现居然存在2个所起docker-compose服务的网关信息,大概如下所示:
[wang@DESKTOP-K8UBC7R system32]$ ifconfig
br-xdklfjdkfjdk: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.25.0.1 netmask 255.255.255.0 broadcast 172.25.0.255
inet6 fe80::cb3b:32ed:42d1:4efb prefixlen 64 scopeid 0xfd<compat,link,site,host>
ether 48:2a:e3:7f:4b:39 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
br-lkajfdlkj: flags=73<UP,LOOPBACK,RUNNING> mtu 1500
inet 172.25.0.1 netmask 255.255.255.0 broadcast 172.25.0.255
inet6 ::1 prefixlen 128 scopeid 0xfe<compat,link,site,host>
loop (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
此处就猜测应该是重启服务的过程中,可能出现了一些差错,导致多了一个服务的网关(虚拟网卡),因此通信出现了问题。
尝试去服务正常的服务器上查看,发现只有一个虚拟网卡。
于是尝试docker-compose down掉服务,删掉网卡,重启服务。执行后,服务正常,问题解决。
删掉虚拟网卡的过程如下:
ip link delete br-xxxxx
欢迎关注我的公众号 辣个男人Devin ,新鲜技术文章第一时间推送。