[转载]修改docker.daemon文件后启动失败

本文介绍如何配置Docker监听TCP端口,包括修改daemon.json文件及docker.service启动文件的方法,解决了因重复配置导致的服务启动失败问题。

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

注: 本文系转载, 转载自: https://blog.youkuaiyun.com/jerry010101/article/details/85817893#comments , 请大家多多支持原创.

前言

在 docker 的官方文档中, 介绍了三种访问 docker Remote API 的方式, 分别是 unix 套接字文件/ tcp 监听端口和 fd 文件描述符. 由于 docker 默认会为我们开启本地 socket 套接字(/var/run/docker.sock) 所以本篇文章主要介绍如何让 docker 监听 tcp端口

在 docker 配置文件中设置

docker 1.12 版本之后, 建议在 docker 的 js 配置文件中配置, 路径为 /etc/docker/daemon.json 默认没有这个文件, 可以手动创建此文件, docker 启动时默认会读取此配置文件

> vim /etc/docker/daemon.json
{
    "hosts": [
        "tcp://0.0.0.0:2375",
        "unix:///var/run/docker.sock"
    ]
}

unix:///var/run/docker.sock注意上面?一定要写上本地的 socket 位置, 不然无法使用本地的 CLI 控制 docker

修改完js配置文件后, 重启 docker 服务, 出现了如下报错

> systemctl restart docker.service
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.

 

 

查看日志发现关键信息如下

> 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 Mon 2017-02-06 12:16:57 CST; 13s ago
     Docs: https://docs.docker.com
  Process: 21952 ExecStart=/usr/bin/dockerd -H fd:// (code=exited, status=1/FAILURE)
 Main PID: 21952 (code=exited, status=1/FAILURE)

Feb 06 12:16:57 xsl systemd[1]: Starting Docker Application Container Engine...
Feb 06 12:16:57 xsl dockerd[21952]: unable to configure the Docker daemon with file /etc/docker/daemon.json: the following directives are specified both as a flag and in the configuration file: hosts: (from flag: [fd://], from file: [tcp://0.0.0.0:2375, unix:///var/run/docker.socket])
Feb 06 12:16:57 xsl systemd[1]: docker.service: Main process exited, code=exited, status=1/FAILURE
Feb 06 12:16:57 xsl systemd[1]: Failed to start Docker Application Container Engine.
Feb 06 12:16:57 xsl systemd[1]: docker.service: Unit entered failed state.
Feb 06 12:16:57 xsl systemd[1]: docker.service: Failed with result 'exit-code'.

从上面?的报错信息中可以判断出, 是因为 docker 的 socket 配置出现了冲突, 接下来查看 docker 的启动入口文件

> vim /lib/systemd/system/docker.service # Ubuntu的路径; CentOS 的路径为: /usr/lib/systemd/system/docker.service
# ...省略
# 关键行
ExecStart=/usr/bin/dockerd -H fd://
# ...省略

从上面可以看出, 在 docker 的启动入口文件中配置了 host 相关的信息, 而在 docker 的配置文件中也配置了 host 的信息, 所以发生了冲突. 解决办法, 建议将 docker 启动入口文件中的 -H fd:// 删除, 再重启 docker 服务即可

# ExecStart=/usr/bin/dockerd -H fd://
ExecStart=/usr/bin/dockerd


在 docker 启动入口中设置

当然你也可以在启动入口配置监听的端口和本地 socket 信息

> vim /lib/systemd/system/docker.service # Ubuntu的路径; CentOS 的路径为: /usr/lib/systemd/system/docker.service

# ExecStart=/usr/bin/dockerd -H fd://
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
# ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375


最下面两条配置是等价的, docker 默认的本地 socket 文件就在 /var/run/docker.sock 这个位置, 如果没有特殊需求, 不需要显示的进行配

<think>好的,我现在需要解决用户遇到的Docker启动失败问题。用户提到在修改daemon.json文件后,执行systemctl restart docker时出现错误:“Job for docker.service failed because start of the service was attempted too often”。他们还想知道如何解决这个问题,特别是使用systemctl reset-failed和重新启动的方法。 首先,我需要回忆一下Docker服务启动失败的可能原因。根据引用[1]、[2]、[3]、[4]中的信息,常见的问题可能包括daemon.json配置错误、频繁启动尝试导致的系统限制,或者服务依赖的问题。 用户已经尝试过systemctl restart docker失败,并收到建议使用systemctl reset-failed来重置失败计数,然后再次启动。这可能是因为systemd有机制防止服务在短时间内频繁启动,导致被标记为失败次数过多。所以,第一步应该是执行reset-failed命令,清除之前的失败记录,然后再尝试启动。 接下来,需要检查daemon.json文件的语法是否正确。JSON格式非常严格,逗号遗漏或多余的逗号、括号不匹配都会导致解析失败。用户可能在修改配置文件时不小心引入了语法错误,比如在最后一个键值对后面多了一个逗号,或者忘记闭合括号。这时候,可以使用json.tool来验证,如python -m json.tool /etc/docker/daemon.json,这能帮助用户快速发现语法问题。 另外,引用[4]中提到用户是为了配置阿里云镜像加速,可能在daemon.json中添加了registry-mirrors的配置,但格式不正确。需要确认registry-mirrors的URL是否正确,以及是否用逗号正确分隔多个条目,或者是否遗漏了引号等。 如果配置没有问题,可能需要检查Docker的日志。使用journalctl -u docker.service来查看详细的错误信息,这可能会给出更具体的失败原因,比如某个配置项不被支持,或者权限问题。 此外,用户可能没有在修改daemon.json后正确重新加载配置。虽然通常重启服务会重新加载,但有时可能需要先执行systemctl daemon-reload来确保systemd读取了最新的配置文件。 如果以上步骤都未能解决问题,可能需要考虑回滚daemon.json的更改,或者检查是否有其他依赖服务未能启动,比如containerd服务是否正常运行。有时候,Docker依赖的其他组件出现问题也会导致启动失败。 总结步骤应该是: 1. 重置失败计数器。 2. 检查配置文件语法。 3. 查看日志定位具体错误。 4. 修正配置后再次启动。 5. 如果问题依旧,考虑回滚配置或检查依赖服务。 同时,需要确保用户按照正确的步骤操作,避免遗漏任何关键检查点。例如,在修改配置文件前备份,避免直接编辑导致无法恢复。另外,用户可能不熟悉JSON格式,指导他们使用工具验证会很有帮助。</think>### 解决Docker修改daemon.json后启动失败的步骤 #### 1. **重置systemd失败计数器** 由于系统限制服务频繁启动,需先清除失败记录: ```bash systemctl reset-failed docker.service ``` #### 2. **检查daemon.json语法** Docker配置文件对JSON格式敏感,常见错误包括: - 多余的逗号(如最后一个配置项后加逗号) - 括号不匹配 - 引号未闭合 使用以下命令验证语法: ```bash python -m json.tool /etc/docker/daemon.json ``` 若报错,需按提示修正格式[^2][^4]。 #### 3. **回退或修正配置** 若不确定具体错误,可暂时恢复默认配置: ```bash mv /etc/docker/daemon.json /etc/docker/daemon.json.bak systemctl restart docker ``` 若此时启动成功,说明原配置文件有错误[^3]。 #### 4. **查看详细日志定位问题** 通过日志获取具体错误信息: ```bash journalctl -u docker.service -xe ``` 常见错误类型: - 镜像加速地址格式错误(如`registry-mirrors`未用数组格式) - 未授权的配置项(如拼写错误`insecure-registries`写错) - 端口冲突或权限问题[^1]。 #### 5. **重新加载配置启动** 修正配置后,执行完整流程: ```bash systemctl daemon-reload # 重新加载systemd配置 systemctl restart docker # 重启Docker ``` #### 6. **验证Docker状态** 确认服务是否正常运行: ```bash systemctl status docker ``` --- ### 示例场景:配置阿里云镜像加速 **错误配置**(注意末尾多余的逗号): ```json { "registry-mirrors": ["https://xxxx.mirror.aliyuncs.com",] } ``` **修正后**: ```json { "registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"] } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值