Docker 开启 2375 端口完整指南
⚠️ 重要安全警告
2375 端口是 Docker 的非加密 HTTP API 端口,直接暴露在公网非常危险!
✅ 推荐: 使用 2376 端口 (TLS 加密)
⚠️ 仅限: 内网环境或有防火墙保护
🚫 禁止: 在公网直接开启 2375
开启过程中可能会出现的问题
docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: enabled)
Active: activating (auto-restart) (Result: exit-code) since Fri 2025-10-24 18:16:57 CST; 858ms ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Process: 15870 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, status=1/FAILURE)
Main PID: 15870 (code=exited, status=1/FAILURE)
CPU: 61ms以下的方法将会解决上面的问题。
🔧 方法一:修改 Docker Daemon 配置(推荐)
Ubuntu/Debian 系统
1. 编辑 Docker 服务配置
# 创建或编辑 daemon.json
sudo mkdir -p /etc/docker
sudo nano /etc/docker/daemon.json2. 添加配置
{
"hosts": [
"unix:///var/run/docker.sock",
"tcp://0.0.0.0:2375"
]
}仅监听本地:
{
"hosts": [
"unix:///var/run/docker.sock",
"tcp://127.0.0.1:2375"
]
}监听特定内网 IP:
{
"hosts": [
"unix:///var/run/docker.sock",
"tcp://192.168.1.100:2375"
]
}
验证语法:
# 检测docker配置语法错误
sudo dockerd --validate
# 验证JSON格式
sudo cat /etc/docker/daemon.json | jq . # 验证JSON格式3. 修改 systemd 配置(重要!)
# 编辑 systemd 服务文件
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo nano /etc/systemd/system/docker.service.d/override.conf用
nano编辑器在该目录下创建名为 override.conf的配置文件。
添加以下内容:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd说明:
清空默认启动命令:ExecStart=这一行至关重要,它用于清除 Docker 服务单元文件中原始的定义。 2. 设置新启动命令:紧接着的 ExecStart=/usr/bin/dockerd则重新定义了启动命令,但这次没有携带任何参数(特别是移除了默认的 -H fd://)。
其核心目的是为了确保您在 /etc/docker/daemon.json 配置文件中对 Docker 守护进程(Docker Daemon)所做的设置(例如配置远程访问)能够真正生效 。
⚙️ 为什么要这样做?
这么做的根本原因在于 systemd 的配置优先级以及 Docker 默认配置的冲突。
解决冲突:在默认情况下,通过 systemd 管理的 Docker 服务,其服务单元文件(如 /usr/lib/systemd/system/docker.service)中已经定义了一个启动命令,通常会包含 -H fd:// 这样的参数 。这个参数本身会指定一个监听方式,并且它的优先级很高,会覆盖您在 /etc/docker/daemon.json 文件中通过 "hosts" 字段设置的监听配置 。
cat /lib/systemd/system/docker.service查看原始配置
使用覆盖配置:直接修改 /usr/lib/systemd/system/docker.service 这个原文件是不推荐的,因为当 Docker 升级时,这个文件可能会被新版本覆盖,导致您的修改丢失 。而在 /etc/systemd/system/docker.service.d/ 目录下创建 .conf 文件(如 override.conf)是一种标准且安全的方法。systemd 会优先读取这个目录下的配置,并将其与原始服务文件合并,从而实现自定义配置而不影响原文件 。
🔧 最终效果
当您完成上述配置并执行 sudo systemctl daemon-reload 和 sudo systemctl restart docker 后: • Docker 守护进程将不再被强制使用 -H fd:// 参数启动。
• 取而代之,它会读取并遵循您在 /etc/docker/daemon.json 文件中的 "hosts" 设置 。
• 例如,如果您在 daemon.json 中配置了 "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"],那么 Docker 就会同时监听本地 Unix Socket 和网络 2375 端口,从而实现远程管理。
简单来说,您执行的这套操作就像是在对 systemd 说:“请忘记 Docker 服务原来的启动指令,完全按照我新给的指令(一个不带参数的简单指令)来启动,具体的细节由 daemon.json 这个配置文件来提供。” 这样就确保了您对 Docker 的核心配置集中在 daemon.json 这一个文件中进行管理 。
3.1 💾 在 nano 中保存文件的步骤:
1️⃣ 按下
Ctrl + O(字母 O,不是数字 0) 这是 “写入文件”(即保存)的快捷键。
2️⃣ 终端底部会提示:
File Name to Write: /etc/systemd/system/docker.service.d/override.conf直接按回车键 Enter 确认保存。
3️⃣ 然后再按:
Ctrl + X退出编辑器。
4. 重启 Docker 服务
# 重载 systemd 配置
sudo systemctl daemon-reload
# 重启 Docker
sudo systemctl restart docker
# 检查状态
sudo systemctl status docker5. 验证端口已开启
# 检查监听端口
sudo netstat -tulnp | grep 2375
# 或
sudo ss -tulnp | grep 2375
# 测试 API
curl http://localhost:2375/version
# 局域网内的其他机器,命令测试
# Docker 命令
docker -H tcp://192.168.0.60:2375 version🔧 方法二:直接修改 systemd 服务
适用于快速配置
# 编辑 Docker 服务文件
sudo systemctl edit docker.service --full找到 ExecStart 行,修改为:
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375重启服务:
sudo systemctl daemon-reload
sudo systemctl restart docker🔧 方法三:临时启动(测试用)
# 停止 Docker 服务
sudo systemctl stop docker
# 手动启动并开启 2375
sudo dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375注意: 关闭终端后会停止,仅用于临时测试。
🐳 Docker Compose 环境变量配置
如果使用 Docker Compose 远程连接:
# 设置环境变量
export DOCKER_HOST=tcp://192.168.1.100:2375
# 测试连接
docker ps
# 或在 docker-compose.yml 中使用
docker-compose -H tcp://192.168.1.100:2375 up -d🔒 安全配置方案
方案 A: 使用 TLS 加密(强烈推荐)
1. 生成 CA 证书
# 创建证书目录
mkdir -p ~/.docker/certs
cd ~/.docker/certs
# 生成 CA 私钥
openssl genrsa -aes256 -out ca-key.pem 4096
# 生成 CA 证书
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem2. 生成服务器证书
# 服务器私钥
openssl genrsa -out server-key.pem 4096
# 服务器 CSR
openssl req -subj "/CN=your-server-ip" -sha256 -new -key server-key.pem -out server.csr
# 配置扩展
echo subjectAltName = DNS:your-domain.com,IP:192.168.1.100,IP:127.0.0.1 >> extfile.cnf
echo extendedKeyUsage = serverAuth >> extfile.cnf
# 签名服务器证书
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \
-CAcreateserial -out server-cert.pem -extfile extfile.cnf3. 生成客户端证书
# 客户端私钥
openssl genrsa -out key.pem 4096
# 客户端 CSR
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
# 配置扩展
echo extendedKeyUsage = clientAuth > extfile-client.cnf
# 签名客户端证书
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \
-CAcreateserial -out cert.pem -extfile extfile-client.cnf4. 配置 Docker 使用 TLS
# 复制证书到 Docker 目录
sudo mkdir -p /etc/docker/certs
sudo cp ca.pem server-cert.pem server-key.pem /etc/docker/certs/
# 修改 daemon.json
sudo nano /etc/docker/daemon.json{
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2376"],
"tls": true,
"tlscacert": "/etc/docker/certs/ca.pem",
"tlscert": "/etc/docker/certs/server-cert.pem",
"tlskey": "/etc/docker/certs/server-key.pem",
"tlsverify": true
}# 重启 Docker
sudo systemctl restart docker
# 客户端连接(需要证书)
docker --tlsverify \
--tlscacert=ca.pem \
--tlscert=cert.pem \
--tlskey=key.pem \
-H=tcp://192.168.1.100:2376 version方案 B: 使用防火墙限制访问
# UFW 防火墙(Ubuntu)
sudo ufw allow from 192.168.1.0/24 to any port 2375
sudo ufw enable
# iptables
sudo iptables -A INPUT -p tcp --dport 2375 -s 192.168.1.0/24 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 2375 -j DROP
# 保存规则
sudo iptables-save | sudo tee /etc/iptables/rules.v4方案 C: 使用 SSH 隧道(最安全)
# 在客户端建立 SSH 隧道
ssh -N -L 2375:localhost:2375 user@remote-server
# 然后本地连接
export DOCKER_HOST=tcp://localhost:2375
docker ps🧪 测试连接
本地测试
# 测试 API
curl http://localhost:2375/version
# Docker 命令
docker -H tcp://localhost:2375 ps远程测试
# 从其他机器测试
curl http://192.168.1.100:2375/version
# 设置环境变量
export DOCKER_HOST=tcp://192.168.1.100:2375
docker infoPython 测试
import docker
# 连接远程 Docker
client = docker.DockerClient(base_url='tcp://192.168.1.100:2375')
# 获取信息
print(client.version())
print(client.info())
# 列出容器
for container in client.containers.list():
print(container.name)🐛 常见问题排查
问题 1: 端口未监听
# 检查 Docker 日志
sudo journalctl -u docker -n 50
# 检查配置语法
sudo dockerd --validate
# 检查进程
ps aux | grep dockerd问题 2: 连接被拒绝
# 检查防火墙
sudo ufw status
sudo iptables -L -n
# 检查 SELinux(CentOS/RHEL)
sudo getenforce
sudo setenforce 0 # 临时关闭测试问题 3: systemd 冲突
错误信息: 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
解决方案:
# 必须清空 systemd 的 ExecStart
sudo systemctl edit docker.service --full找到并修改:
# 删除原来的 ExecStart
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
# 改为
ExecStart=/usr/bin/dockerd📋 配置检查清单
🔐 生产环境最佳实践
{
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2376"],
"tls": true,
"tlsverify": true,
"tlscacert": "/etc/docker/certs/ca.pem",
"tlscert": "/etc/docker/certs/server-cert.pem",
"tlskey": "/etc/docker/certs/server-key.pem",
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"live-restore": true,
"userland-proxy": false,
"ip-forward": true
}⚡ 快速配置命令(内网环境)
# 一键配置(仅限内网测试!)
sudo mkdir -p /etc/systemd/system/docker.service.d
echo '[Service]
ExecStart=
ExecStart=/usr/bin/dockerd' | sudo tee /etc/systemd/system/docker.service.d/override.conf
echo '{
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2375"]
}' | sudo tee /etc/docker/daemon.json
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo netstat -tulnp | grep 2375🚨 紧急关闭 2375 端口
# 删除配置
sudo rm /etc/docker/daemon.json
sudo rm -rf /etc/systemd/system/docker.service.d/
# 重启 Docker
sudo systemctl daemon-reload
sudo systemctl restart docker
# 验证端口已关闭
sudo netstat -tulnp | grep 2375记住:安全第一!在生产环境务必使用 TLS 加密或 SSH 隧道。
Last updated
Was this helpful?