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,客户端发起连接建立,会发生什么?

参考资料

相关推荐
std8602116 小时前
容器化入门:一文掌握Docker安装与核心概念
运维·docker·容器
桥边驿语人20 小时前
Docker 容器无法访问外网的问题排查与解决指南
运维·docker·容器
清静诗意20 小时前
在 Ubuntu 上通过 Docker 与 Docker Compose 部署项目的完整指南
linux·ubuntu·docker
Clownseven21 小时前
如何用Fail2ban保护Linux服务器?防止SSH暴力破解教程
linux·服务器·ssh
小Lu的开源日常1 天前
如何使用 GitHub Action 发布 Docker 镜像
docker·开源·github
神秘人X7071 天前
docker安装
docker·容器·eureka
失因1 天前
Docker 容器与镜像
java·运维·spring cloud·docker·容器
耳东哇1 天前
sentinel docker gateway k8s 集群 主从
docker·gateway·sentinel
费益洲1 天前
Docker 网络详解:(二)虚拟网络环境搭建与测试
docker·容器
郁大锤1 天前
Docker 中删除镜像与容器的完整指南
运维·docker·容器