Docker|“ssh: connect to host xxx.xxx.xxx.xxx port 8000: Connection refused“问题解决

文章目录

问题出现

  • 使用docker run从镜像ubuntu:20.04启动了一个容器
shell 复制代码
docker run -p 8000:22 --name server -itd ubuntu:20.04
  • 云服务的安全组已经放行的端口8000
  • 在宿主机使用ssh连接刚刚启动的容器server
shell 复制代码
ssh root@xxx.xxx.xxx.xxx -p 8000
  • 显示结果
shell 复制代码
ssh: connect to host xxx.xxx.xxx.xxx port 8000: Connection refused

问题排查与解决

  • 第一步检查云服务器是否真的放行了端口8000,经过核实的确放行了端口8000
  • 第二检查容器是否开启了ssh服务,发现docker容器没有开启ssh服务,经过查阅资料发现原始的ubuntu镜像并没有安装ssh服务,需要手动安装
shell 复制代码
 docker exec -it server ps aux | grep ssh
  • 进入docker容器,安装openssh-server
shell 复制代码
docker exec -it server /bin/bash
apt-get update & apt-get install -y openssh-server
  • 配置ssh服务
shell 复制代码
# 首先安装vim
apt-get install vim
# 配置ssh服务
vim /etc/ssh/sshd_config
# 开启以下服务
PermitRootLogin yes
PasswordAuthentication yes
  • 重启ssh服务
shell 复制代码
service ssh restart

重新登陆

  • 首先安装sudo
shell 复制代码
apt-get install -y sudo
  • 添加新用户,并将其加入到sudo组,使其拥有sudo权限
shell 复制代码
adduser username
usermod -aG sudo username
  • 再次使用ssh登录
shell 复制代码
 ssh username@xxx.xxx.xxx.xxx -p 8000

显示登录成功,但是要输入密码,为了避免每次输入密码可以进行以下的配置

  • 配置docker容器的信息
shell 复制代码
vim .ssh/config
# 添加以下的信息
Host <容器别名>
    HostName <宿主机IP地址>
    User <登录的用户名>
    Port <容器暴露的端口>
  • 将宿主机上的ssh公钥id_rsa.pub拷贝到docker容器中的.ssh/authorized_keys
shell 复制代码
# 在宿主机上生成密钥
ssh-keygen
# 可以通过命令将公钥传输到docker容器
ssh-copy-id  <容器别名>
# 直接通过`ssh <容器别名>`即可登录到容器,无需输入密码
ssh server

+可以将我们刚刚配置好的容器提升为镜像,下次直接从镜像创建容器即可

shell 复制代码
docker commit <容器名> <镜像名>:<tag>
# docker commit server myserver:1.0
  • root/.bashrc文件中配置service ssh start,可以登录容器时自动启动ssh服务

深度剖析

  • 之所以出现port 8000: Connection refused的本质原因,是因为容器内部没有服务正在监听22端口。
  • 建立连接需要先进行TCP三次握手,握手之前服务端必须处于Listen状态,并且监听相应的端口,具体的过程可见TCP三次握手
  • 服务端没有监听相应的端口,请求连接的报文传输到服务端时,就会回应rst报文终止本次连接,详见服务端没有 listen,客户端发起连接建立,会发生什么?

参考资料

相关推荐
AAA@峥15 小时前
容器数据不丢失:Docker 分层存储 + Volume 共享、备份迁移完整指南
运维·docker·容器
十年磨一剑~17 小时前
docker 为何每次 docker tag才能 docker push
docker·容器·eureka
梦梦代码精18 小时前
LikeShop 前后端架构升级对比总白皮书——从传统商城架构到高性能多端统一体系
docker·架构·开源
Z_W_H_19 小时前
minikube start --driver=docker --memory=4000mb出现PROVIDER_DOCKER_NEWGRP
java·docker·minikube
江湖有缘20 小时前
基于Docker环境部署tillywork开源工作管理工具
docker·容器·开源
行止AC21 小时前
vscode-ssh免密链接
ssh·免密连接·vscode免密ssh连接
辉的技术笔记21 小时前
Dify 配完了怎么知道对不对?5 个关键指标 + 诊断命令
docker
鸿儒5171 天前
MR-50国产化GPU docker配置方法
docker·容器·mr
Asuicao1 天前
centos7.9版本升级ssh OpenSSH 9.8p1 源码 OpenSSL 1.1.1w 源码包以及安装升级回滚文档
运维·ssh
梦想的颜色2 天前
【Docker部署插件】:使用 Docker 部署生产级 Kafka 完整版教程
安全·docker·中间件·kafka·消息队列·docker-compose·后端开发