Docker容器启动时报错:Address already in ues解决办法

mokemore 发布于 2024-11-10 223 次阅读


看过我之前文章的小伙伴应该知道我的服务器是家里云,也就是一个用家用宽带的小主机,今天上午家里突然停电了,虽然不到10分钟就恢复了,但是在服务器重启后我发现好几个docker服务访问不了,看后台会发现这些服务都是停止状态。

包括本站,当我访问本站的时候Wordpress会报错没连接到数据库(当时只想着解决问题了,忘记截图了),在已停止的docker容器里果然发现了mysql。

当我尝试启动这些服务时,出现了报错Address already in ues

地址被占用?什么地址?我第一时间反应应该是IP地址,但是为什么之前不冲突现在一重启就不行了呢?

既然是占用冲突那就一个个找出来好了,我把所有容器都停掉,一个个手动启动,启动mysql时很顺利,mysql启动后我的图床也正常启动了(原来图床没启动不是因为冲突,而是mysql没启动)

正当我以为故障不能复现的时候,我启动了alist,然后又弹出了那个熟悉的报错Address already in ues,然后关了mysql的容器alist就能启动了。

现在已经基本确定了就是mysql和alist有冲突,但是查看他们docker的ip,一个是172.17.0.4,一个是172.17.0.6这明明不冲突啊。

网上搜了一下类似的问题,都是把冲突的容器kill掉,然后启动另一个再启动这个就好了,但显然不适用于我这种情况,然后我就想既然冲突,那就让你俩走不同的网桥好了。

查看docker网桥命令

docker network ls

我的alist走的是1panel的网桥,现在我要单独创建一个

docker创建网桥命令

docker network creat --driver bridge --subnet 172.18.1.0/16 --getaway 172.18.1.0 alist_network
  • --driver :指定链接模式,bridge是桥接
  • --subnet :指定网段
  • --getaway :指定网关

容器运行时指定网桥命令

docker run -d -p 外部端口:内部端口 --name 镜像名 容器名

这下再启动alist就不报错了

除此之外我还发现有些容器自己没问题,但是因为mysql没启动直接被“逼停了”,针对这种情况可以在docker-compose.yml加上depends_on参数,在指定容器启动后再启动。

或者也可以关掉全部容器的自动重启,直接在宿主机的rc.local开机启动文件里手动一个个启动

#rc.local
#等待docker启动
sleep 15s
#逐一启动容器
docker start 容器1
sleep 1s
docker start 容器2

#以此类推