当前位置: 首页 > 知识库问答 >
问题:

无法从docker容器连接到SSHECONNREFUSED127.0.0.1:22-NodeJS

洪宇定
2023-03-14

我正在nodejs上使用node-ssh模块。当我启动到ssh的连接时,它给出了错误。我也在使用WSL Ubuntu 18。我有docker compose文件。我在/etc/ssh/sshd\u config上将密码身份验证标记为“yes”。我可以从wsl ubuntu连接ssh。但是当我试图从我的Docked nodejs项目连接时。它给出了错误127.0.0.1:22

在nodejs上,我请求用户身份验证,运行一些命令,等等。

const Client = require('node-ssh').NodeSSH;
var client   = new Client();   

client.connect({
     host              : 'localhost',
     port              : 22,
     username          : req.body.username,
     password          : req.body.password,
     keepaliveInterval : 30 * 1000, // 30 minutes for idle as milliseconds
     keepaliveCountMax : 1,
}).then(()=>{

     // LOGIN SUCCESS

}).catch((e)=>{

     console.log(e); // ECONFUSED ERROR
     // LOGIN FAILED

});

docker撰写。yml公司

version: '3.8'

services:
  api:
    build:
      dockerfile: Dockerfile
      context: "./server"
    ports:
      - "3030:3030"
    depends_on:
      - mysql_db
    volumes:
      - /app/node_modules
      - ./server:/app

 ...

还有我的api的Dockerfile

Dockerfile文件

FROM node:alpine
WORKDIR /app
COPY package.json ./
COPY package-lock.json ./
COPY ./ ./
RUN npm i
RUN apk update \
&& apk add openssh-server 
COPY sshd_config /etc/ssh/
EXPOSE 22
CMD ["npm", "run", "start"]

[UPDATE__][Dockerfile]

FROM node:alpine
WORKDIR /app
COPY package.json ./
COPY package-lock.json ./
COPY ./ ./
RUN npm i \
&& apk add --update openssh \
&& rm  -rf /tmp/* /var/cache/apk/*
COPY sshd_config /etc/ssh/
# add entrypoint script
ADD ./docker-entrypoint.sh /usr/local/bin
# make sure we get fresh keys
RUN rm -rf /etc/ssh/ssh_host_rsa_key /etc/ssh/ssh_host_dsa_key
EXPOSE 22
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["/usr/sbin/sshd","-D"]

[UPDATE\uu 2][Dockerfile]

FROM node:alpine
WORKDIR /app
COPY package.json ./
COPY package-lock.json ./
COPY ./ ./
RUN npm i
RUN apk update && \
apk add openssh-client \ 
&& rm -rf /tmp/* /var/cache/apk/*

EXPOSE 22
CMD ["npm", "run", "start"]

[解决方案]
我已经更改了Dockerfile和我的nodejs代码。按照Stefan Golubović的建议申请后,我已经从docker容器连接了WSL的SSHhost.docker.internal.并使用了node:最新而不是node:高山docker图像。感谢@Stefan Golubović和@Etienne Dijon

[固定]

const Client = require('node-ssh').NodeSSH;
var client   = new Client();   

client.connect({
     host              : 'host.docker.internal', // It's worked on WSL2
     port              : 22,
     username          : req.body.username,
     password          : req.body.password,
     keepaliveInterval : 30 * 1000, // 30 minutes for idle as milliseconds
     keepaliveCountMax : 1,
}).then(()=>{

     // LOGIN SUCCESS

}).catch((e)=>{

     console.log(e); // ECONFUSED ERROR
     // LOGIN FAILED

});

[已修复]

FROM node:latest
WORKDIR /app
COPY package.json ./
COPY package-lock.json ./
COPY ./ ./
RUN npm i
RUN apt-get update 
EXPOSE 22
CMD ["npm", "run", "start"]

共有1个答案

邹海荣
2023-03-14

>

您可以使用其他节点映像来运行您的应用程序,如node:最新https://hub.docker.com/_/node

基于debian,替代node的等效版本:alpine

尽量避免在docker容器中使用ssh,您可以使用脚本作为入口点在运行时配置您的容器

文档:https://docs.docker.com/engine/reference/builder/#entrypoint

html" target="_blank">脚本示例的最佳实践:https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#entrypoint

要确保一切正常,您可以手动运行它

docker run-it-rm-name testalpine-v$PWD:/app/node:alpine/bin/sh

然后:

cd /app/
npm i
apk update && apk add openssh-server
# show listening services, openssh is not displayed
netstat -tlpn

如您所见,openssh不是自动启动的

Alpine有一个wiki,需要更新:

https://wiki.alpinelinux.org/wiki/Setting_up_a_ssh-server

阿尔卑斯山图像中没有rc更新。

这张图片是关于在alpine上运行ssh服务器的:

https://github.com/danielguerra69/alpine-sshd

正如您在Dockerfile中所看到的那样,涉及到更多步骤:

检查存储库以获取更新的dockerfile

FROM alpine:edge
MAINTAINER Daniel Guerra <daniel.guerra69@gmail.com>

# add openssh and clean
RUN apk add --update openssh \
&& rm  -rf /tmp/* /var/cache/apk/*
# add entrypoint script
ADD docker-entrypoint.sh /usr/local/bin
# make sure we get fresh keys
RUN rm -rf /etc/ssh/ssh_host_rsa_key /etc/ssh/ssh_host_dsa_key

EXPOSE 22
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["/usr/sbin/sshd","-D"]

容器启动后,您可以使用docker exec:

docker exec -it <container name/id> /bin/sh

这里留档:

https://docs.docker.com/engine/reference/commandline/exec/

  • Updated dockerfile
    FROM node:alpine
    
    WORKDIR /app
    
    COPY ./ ./
    
    RUN npm i
    
    ENTRYPOINT ["npm", "run", "start"]
    

 类似资料:
  • 我已经使用docker工具箱在视窗机器上安装了docker。我也在我的视窗机器上安装了mysql,服务器运行在端口3306上(localhost-127.0.0.1-在docker机器之外)。我在一个名为“micra-workq-svc”的docker网络内部的docker容器中运行一个冲刺启动应用程序,我希望在docker内部运行的应用程序连接到本地主机。我花了几个小时在谷歌上搜索,没有一个链接

  • 我正在尝试从另一个码头工人容器连接到 kafka docker 容器。但它没有连接。 为了运行kafka和zookeeper,我使用了docker compose文件: 容器docker compose 17138956372294708100 _ kafkatest . producer _ 1和docker compose 17138956372294708100 _ kafkatest .

  • 要运行测试文件,Flask应用程序需要连接到Redis。我尝试将这些URL用于redis主机,如localhost:6379,redis:6379,0.0.0.0:6379,但都没有用。他们都告诉我连接错误或连接拒绝。 知道如何从jenkins docker容器中连接到redis吗?

  • 我已经创建了一个MySQL数据库的映像,并在容器中运行它。我希望它在端口3406/3407上运行,因此我调用docker run命令如下所示: 如果我看我的容器,它看起来是这样的: 我非常想连接到我的数据库现在,但我似乎不能使我的URL工作。 这是我的URL的样子:

  • 问题内容: 我有用于创建mysql映像的docker- compose文件,并将端口公开给3306,但是当我尝试安装CMS时,出现了无法连接数据库的错误。我尝试扫描端口3306,并向我显示它已打开,因此mysql正在运行。 为什么两个Docker容器彼此看不到? 这是我的docker-compose文件: 问题答案: 要连接到数据库,请使用您作为主机名提供的链接/别名。因此,您的CMS可以使用主机

  • 我的docker版本是1.13.1。我正试图从我的docker容器连接到redis-server,但我遇到了拒绝连接的错误。详细的日志如下: 原因:redis.clients.jedis.exceptions.jedisconnectionException:java.net.Connection:redis.clients.jedis.Connection(Connection.java:207