如何从远程机器直接SSH到Ubuntu VM上运行的Docker容器?
直接SSH到Ubuntu虚拟机中运行的Docker容器的方法
我来给你几个实用的方案,帮你一步到位直接进入目标Docker容器的bash环境,不用先登录虚拟机再手动执行docker exec:
方案1:SSH远程执行docker exec命令(最推荐,无需修改容器)
这是最简单的方式,直接把docker exec命令作为SSH的远程执行命令,同时需要给SSH加上-t参数来分配伪终端(因为docker exec -it需要交互式终端才能正常工作)。
执行命令:
ssh -t -i path/to/private/key username_VM@ip_VM "docker exec -it CONTAINER_ID bash"
关键说明:
-t参数:强制SSH分配一个伪终端,否则docker exec -it会因为缺少终端环境而报错- 确保你的VM用户拥有Docker执行权限:如果执行时提示权限不足,把用户加入
docker组即可:# 在Ubuntu虚拟机上执行 sudo usermod -aG docker username_VM # 退出当前SSH会话后重新登录生效
方案2:给容器配置SSH服务(适合长期频繁访问场景,不推荐轻量化容器)
如果需要像登录普通机器一样直接SSH到容器,可以给容器安装SSH服务,然后通过虚拟机端口映射访问:
步骤:
进入容器安装SSH服务:
# 先登录虚拟机,进入容器 docker exec -it CONTAINER_ID bash # 以Debian/Ubuntu系容器为例,安装openssh-server apt update && apt install -y openssh-server # 启动SSH服务 service ssh start # 设置开机自启(可选) systemctl enable ssh配置SSH认证:
- 推荐用密钥登录(避免密码泄露风险):把远程机器的公钥复制到容器的
/root/.ssh/authorized_keys(或对应普通用户的目录) - 若用密码登录,修改SSH配置文件
/etc/ssh/sshd_config,确保PermitRootLogin yes(或PermitRootLogin prohibit-password如果用密钥),然后重启SSH服务:service ssh restart
- 推荐用密钥登录(避免密码泄露风险):把远程机器的公钥复制到容器的
映射容器SSH端口到虚拟机:
- 启动容器时直接配置端口映射(永久生效):
docker run -d -p 2222:22 [你的容器镜像] - 对已运行容器,可以用iptables临时做端口转发(重启虚拟机后失效):
iptables -t nat -A PREROUTING -d ip_VM -p tcp --dport 2222 -j DNAT --to-destination [容器内部IP]:22
- 启动容器时直接配置端口映射(永久生效):
远程直接SSH到容器:
ssh -i path/to/private/key root@ip_VM -p 2222
优缺点:
- ✅ 操作逻辑和登录普通机器完全一致
- ❌ 增加容器体积和复杂度,不符合Docker轻量化理念,额外引入SSH服务的安全风险
方案3:用SSH配置文件简化命令(让操作更便捷)
如果觉得方案1的命令太长,可以在本地机器的~/.ssh/config文件中添加配置,用别名一键登录:
配置内容:
Host container-direct HostName ip_VM User username_VM IdentityFile path/to/private/key RequestTTY yes # 自动分配伪终端,替代命令行的-t参数 RemoteCommand docker exec -it CONTAINER_ID bash
使用方法:
直接在终端输入:
ssh container-direct
这样就能一步到位进入容器的bash环境了!
内容的提问来源于stack exchange,提问作者gapc311
相关产品推荐
相关产品推荐

