服务器重启之后,docker启动不了,提示 "bind: cannot assign requested address"

本文详述了服务器强制重启后,Docker服务无法启动的问题及解决过程。作者遇到因远程多账号操作导致的文件冲突和未设置TLS验证绑定IP地址的错误,通过删除冲突文件、重建docker0网桥和配置daemon.json文件,最终成功重启Docker。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近手残,把服务器重启了,而且是强制重启那种,导致了部署了docker的项目跑不起来了,docker服务也启动不了,然后百度了N久,结果给出的解决基本上都是一样的,但是都不能解决我得问题。  
  终于找到了一篇认真分析问题的博客(博客地址见文末),可惜没有提到解决方案。
先来说说我得问题是什么:

docker重启错误原因

1.我重启服务器之后,docker就停了,没有重新启动,虽然我设置了开机重启,然并卵。于是我手动重启,提示错误 如下:
在这里插入图片描述
unable to create file '/run/user/1001/dconf/user': 打开的文件过多,dconf will not work property.

原因:
  目测是因为我之前用另一台服务器远程启动了很多次,没有启动成功,然后又直接到该服务器启动,多账号操作的问题,这个解决方法很简单,删除 /run/user/1001/dconf 下的user 即可。 
   
2.然后重新启动docker,依然没有启动成功,使用命令查看详细的错误提示,如下:
查看命名
sudo systemctl status docker.service
错误提示:

● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since 四 2019-08-15 09:43:22 CST; 21s ago
     Docs: https://docs.docker.com
  Process: 8012 ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2376 -H tcp://172.17.0.1:2376 (code=exited, status=1/FAILURE)
 Main PID: 8012 (code=exited, status=1/FAILURE)

8月 15 09:43:22 a-desktop systemd[1]: Starting Docker Application Container Engine...
8月 15 09:43:22 a-desktop dockerd[8012]: time="2019-08-15T09:43:22.107955080+08:00" level=warning msg="[!] DON'T BIND ON ANY IP ADDRESS WITHOUT setting -tlsverify IF YOU DON'T KNOW WHAT YOU'RE DOING [!]"
8月 15 09:43:22 a-desktop dockerd[8012]: time="2019-08-15T09:43:22.108102187+08:00" level=warning msg="[!] DON'T BIND ON ANY IP ADDRESS WITHOUT setting -tlsverify IF YOU DON'T KNOW WHAT YOU'RE DOING [!]"
8月 15 09:43:22 a-desktop dockerd[8012]: listen tcp 172.17.0.1:2376: bind: cannot assign requested address
8月 15 09:43:22 a-desktop systemd[1]: docker.service: Main process exited, code=exited, status=1/FAILURE
8月 15 09:43:22 a-desktop systemd[1]: Failed to start Docker Application Container Engine.
8月 15 09:43:22 a-desktop systemd[1]: docker.service: Unit entered failed state.
8月 15 09:43:22 a-desktop systemd[1]: docker.service: Failed with result 'exit-code'.

这个错误就是导致docker 启动失败的真正原因。
"DON'T BIND ON ANY IP ADDRESS WITHOUT setting -tlsverify IF YOU DON'T KNOW WHAT YOU'RE DOING"
翻译过来就是:如果你不知道自己在做什么,在没有设置TLS验证的情况下,不要绑定任何IP地址
关于这个TLS验证,我不是很明白,欢迎懂的朋友指导。
isten tcp 172.17.0.1:2376: bind: cannot assign requested address 翻译: 绑定了不能分配的地址

问题分析

这个原因就跟docker的ip有关,使用ifconfig 的命令查看就会发现docker0没了。

正常情况在我们安装完docker之后,会默认分配一个docker0的网桥给docker使用,而我强制重启服务器之后可能就导致了这个docker0丢失,重启之后重新绑定了一个不能分配的IP地址。

解决方案

默认的docker0使用的172.17.0.1/21的网段,我们重新建一个仍然使用这个网段,或者你想改成其他的也可以,要注意不要跟宿主机的网段重复。
步骤如下:
1.创建docker0 网桥

sudo brctl addbr docker0
sudo ip addr add 172.17.0.1/21 dev docker0
sudo ip link set dev docker0 up

2.配置docker文件

vim /etc/docker/daemon.json  

如果没有daemon.json的话,新建就可以

{
    "bip": "172.17.0.1/21"
}

以上内容写入json,保存即可。
最后重启docker即可。
重启命令:

sudo systemctl restart docker

执行完以上操作,docker就可以重启了,可以使用ifconfig命名查看,就能看到docker0的网桥了。

以上就是我的踩坑经历,与大家共勉。

docker网桥相关详细的内容可以参考这个博客:https://blog.youkuaiyun.com/wangdaoge/article/details/52703890
docker网桥相关详细的内容可以参考这个博客:https://blog.youkuaiyun.com/wangdaoge/article/details/52703890
docker启动问题分析参考博客:https://blog.youkuaiyun.com/counsellor/article/details/53456663
daemon.json其他配置参考博客:https://blog.youkuaiyun.com/u013948858/article/details/79974796

### 排查 Nginx Upstream 连接失败问题及 Connect() 调用错误的原因 Nginx 报错 `(111: Connection refused)` 和 `(99: Cannot assign requested address)` 是常见的网络连接问题,以下是可能的原因及其解决方案。 --- #### 1. **(111: Connection Refused)** **(a) 后端服务未启动或未监听指定端口** 当后端服务(如 Tomcat、PHP-FPM)未启动或未正确绑定到指定的 IP 和端口时,Nginx 将无法与其建立连接[^1]。 解决方案: 确认后端服务的状态和监听配置。例如,对于 PHP-FPM: ```bash ps aux | grep php-fpm netstat -tuln | grep :9000 ``` 如果发现服务未运行或未监听预期端口,请重新启动服务并检查其配置文件。 --- **(b) 防火墙阻止了连接请求** 操作系统的防火墙可能会拦截来自 Nginx 的连接请求,导致 `Connection refused` 错误[^4]。 解决方案: 临时禁用防火墙以排除干扰,或添加规则允许特定端口通信。 ```bash sudo ufw disable sudo iptables -A INPUT -p tcp --dport 48005 -j ACCEPT ``` --- **(c) 配置错误:IP 地址或端口号不匹配** Nginx 的 `upstream` 或 `proxy_pass` 配置中的 IP 地址或端口号与实际服务绑定的信息不符,也会引发此错误[^3]。 解决方案: 仔细核对 Nginx 配置文件中的地址和端口是否正确。例如: ```nginx upstream backend { server 192.168.1.51:48005; } server { location / { proxy_pass http://backend; } } ``` --- #### 2. **(99: Cannot Assign Requested Address)** **(a) 网络接口不可达** 该错误通常发生在 Nginx 尝试绑定到一个不存在或不可访问的网络接口时。可能是由于服务器缺少相应的网卡配置或路由表设置有误[^2]。 解决方案: 检查服务器的网络接口状态,并确保目标地址可访问。 ```bash ip addr show ping 192.168.1.51 ``` --- **(b) 多个进程竞争同一地址** 在同一台机器上运行多个 Nginx 实例或其他占用相同端口的服务时,可能导致地址冲突[^2]。 解决方案: 查找是否有其他进程占用了目标地址和端口。 ```bash lsof -i :48005 ``` 如果有冲突,请调整其中一个服务的绑定地址或端口。 --- **(c) Docker 容器内的网络隔离** 在使用 Docker 部署时,若容器之间缺乏有效的网络通信机制,也可能出现此类错误[^4]。 解决方案: 确保所有相关容器共享同一个自定义桥接网络,并通过内部 DNS 名称相互引用。 ```yaml version: '3' services: nginx: image: nginx:latest networks: app_net: aliases: - webserver app: image: myapp:latest ports: - "48005:80" networks: app_net: networks: app_net: ``` 随后更新 Nginx 配置文件以指向新名称: ```nginx upstream backend { server app:80; } server { location / { proxy_pass http://backend; } } ``` --- #### 3. **综合排查步骤** - 检查后端服务的日志文件,寻找潜在的启动或绑定错误。 - 使用工具验证目标地址和服务端口的可达性: ```bash telnet 192.168.1.51 48005 curl http://192.168.1.51:48005 ``` - 若问题仍未解决,启用详细的 Nginx 日志记录功能以获取更多信息: ```nginx error_log /var/log/nginx/error.log debug; ``` --- ### 示例代码片段 以下是一个完整的 Nginx 配置示例,适用于反向代理场景: ```nginx upstream backend { server 192.168.1.51:48005 fail_timeout=10s max_fails=3; } server { listen 80; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://backend; } error_page 502 503 504 @maintenance; location @maintenance { root /usr/share/nginx/html/maintenance; index maintenance.html; } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值