无HTTPS仅HTTP远程Docker主机及SSH创建docker-machine问题求助
我来帮你一步步解决这两个问题,先搞定无安全设置的远程Docker控制,再排查docker-machine的SSH创建故障。
虽然这种无认证的远程访问绝对不适合生产环境,但按照你的需求,我们可以这么配置:
修改Docker Daemon的监听配置
Ubuntu 16.04的Docker配置分两种情况,选其中一种即可:- 若用Upstart(旧版服务管理):编辑
/etc/default/docker文件
找到sudo nano /etc/default/dockerDOCKER_OPTS行,修改为:
这里DOCKER_OPTS="-H tcp://0.0.0.0:2373 -H unix:///var/run/docker.sock"-H tcp://0.0.0.0:2373让Docker监听所有网卡的2373端口,-H unix://...保留本地socket连接。 - 若用Systemd(新版服务管理):创建/编辑
/etc/docker/daemon.json
写入以下内容:sudo nano /etc/docker/daemon.json{ "hosts": ["tcp://0.0.0.0:2373", "unix:///var/run/docker.sock"] }
- 若用Upstart(旧版服务管理):编辑
重启Docker服务生效
- Upstart环境:
sudo service docker restart - Systemd环境:
sudo systemctl restart docker
验证监听状态:
sudo netstat -tulpn | grep docker你应该能看到
0.0.0.0:2373的监听记录。- Upstart环境:
确保VirtualBox网络连通
Windows机器必须能访问到dockervm的2373端口:- 最简单的方式是把虚拟机网络改成桥接模式,这样dockervm会和Windows在同一个局域网,用
ip addr查看dockervm的IP,Windows用ping <dockervm-ip>测试连通性。 - 若用NAT模式,需设置端口转发:VirtualBox虚拟机设置→网络→高级→端口转发,添加规则:主机端口2373,子系统端口2373,协议TCP。此时Windows要访问
tcp://localhost:2373,或者在Windows的hosts文件里把dockervm映射到localhost。
- 最简单的方式是把虚拟机网络改成桥接模式,这样dockervm会和Windows在同一个局域网,用
Windows端配置与测试
在命令提示符里临时设置环境变量(仅当前窗口有效):set DOCKER_HOST=tcp://dockervm:2373这里的
dockervm要能被Windows解析,要么靠hosts映射,要么直接用虚拟机IP(比如set DOCKER_HOST=tcp://192.168.1.100:2373)。
然后执行docker ps测试,如果失败,先通过telnet dockervm 2373检查端口连通性,排查网络问题。
docker-machine的SSH创建失败大多和连通性、权限、参数有关,按以下步骤排查:
先验证基础SSH连通性
- 确保dockervm的SSH服务已开启:
sudo service ssh start sudo systemctl enable ssh # 设置开机自启 - 在Windows上测试SSH连接:如果你装了Git Bash或Windows自带的OpenSSH(设置→可选功能安装),打开终端执行:
比如ssh <你的dockervm用户名>@dockervm-ipssh ubuntu@192.168.1.100,如果能成功登录,说明基础连通性没问题;若失败,先解决防火墙、端口22开放、用户名密码/密钥等问题。
- 确保dockervm的SSH服务已开启:
使用正确的docker-machine创建命令
不要依赖主机名解析,直接用IP,同时指定必要参数:docker-machine create --driver generic ^ --generic-ip-address <dockervm的实际IP> ^ --generic-ssh-user <你的dockervm用户名> ^ --generic-ssh-key <你的SSH私钥路径(如果用密钥登录)> ^ dockervm-machine如果用密码登录,去掉
--generic-ssh-key参数,命令执行时会提示你输入密码。配置免密码sudo权限
docker-machine需要在dockervm里执行sudo命令而无需输入密码,否则会失败:
在dockervm里执行:sudo visudo添加一行(替换
<你的用户名>):<你的用户名> ALL=(ALL) NOPASSWD: ALL保存退出后,测试
sudo docker ps是否无需密码即可执行。查看debug日志定位问题
如果还是失败,开启debug模式查看详细错误:docker-machine create --debug --driver generic ^ --generic-ip-address <dockervm的实际IP> ^ --generic-ssh-user <你的dockervm用户名> ^ dockervm-machine日志会显示SSH连接过程、执行的命令,根据错误信息针对性解决(比如密钥权限错误、网络超时、Docker安装失败等)。
解决Windows SSH客户端问题
若用原生cmd执行命令,可能缺少SSH客户端,建议用Git Bash或安装OpenSSH客户端后,在PowerShell/Git Bash里执行docker-machine命令,避免cmd的环境限制。
内容的提问来源于stack exchange,提问作者Beto Neto

