Ошибка ssh-контейнера Docker: ssh_exchange_identification: Соединение закрыто удаленным хостом

Ошибка ssh-контейнера Docker: ssh_exchange_identification: Соединение закрыто удаленным хостом

Я пытаюсь настроить контейнер Ubuntu, чтобы openssh-serverиметь возможность подключаться к нему по ssh с хоста. Я знаю, что это нестандартный способ, но я действительно хочу иметь ssh.

Это моеDockerfile

# Select base image
FROM ubuntu:16.04

# Set the current working directory
WORKDIR /home

# Update the system, download any packages essential for the project
RUN dpkg --add-architecture i386
RUN apt-get update && apt-get upgrade -y
RUN apt-get install -y git build-essential make gcc vim net-tools iputils-ping ca-certificates openssh-server libc6:i386 libstdc++6:i386

# Allow ssh root login
RUN echo "root:root" | chpasswd

# RUN rpl "PermitRootLogin prohibit-password" "PermitRootLogin yes" /etc/ssh/sshd_config
RUN sed -i 's/prohibit-password/yes/' /etc/ssh/sshd_config

RUN cat /etc/ssh/sshd_config
RUN mkdir /root/.ssh

RUN chown -R root:root /root/.ssh;chmod -R 700 /root/.ssh

RUN echo “StrictHostKeyChecking=no” >> /etc/ssh/ssh_config

RUN service ssh restart


# Open port 22 so linked containers can see it
EXPOSE 22

# Import any additional files into the environment (from the host)
ADD otherfile .

Я запускаю контейнер, docker run -t -d -p 2222:22но всякий раз, когда я пытаюсь подключиться к нему по ssh, я всегда получаю ошибку ssh_exchange_identification: Connection closed by remote host:

➜ ssh -v -p 2222 root@localhost /bin/bash
OpenSSH_7.9p1, LibreSSL 2.7.3
debug1: Reading configuration data /Users/giorgio/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 48: Applying options for *
debug1: /etc/ssh/ssh_config line 52: Applying options for *
debug1: Connecting to localhost port 2222.
debug1: Connection established.
debug1: identity file /Users/giorgio/.ssh/id_rsa type -1
debug1: identity file /Users/giorgio/.ssh/id_rsa-cert type -1
debug1: identity file /Users/giorgio/.ssh/id_dsa type -1
debug1: identity file /Users/giorgio/.ssh/id_dsa-cert type -1
debug1: identity file /Users/giorgio/.ssh/id_ecdsa type -1
debug1: identity file /Users/giorgio/.ssh/id_ecdsa-cert type -1
debug1: identity file /Users/giorgio/.ssh/id_ed25519 type -1
debug1: identity file /Users/giorgio/.ssh/id_ed25519-cert type -1
debug1: identity file /Users/giorgio/.ssh/id_xmss type -1
debug1: identity file /Users/giorgio/.ssh/id_xmss-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_7.9
ssh_exchange_identification: Connection closed by remote host

Кто-нибудь знает, что является причиной этой ошибки и как ее исправить?

решение1

RUN service ssh restart

Это запускает перезапуск службы ssh (на самом деле запуск) во время фазы создания образа, а не в будущем запущенном контейнере. В вас нет CMDни одного , поэтому по умолчанию используется тот(ы), которые настроены в вашем базовом образе (ENTRYPOINTDockerfileкоторый является bash)

Другими словами, при запуске контейнера не запущен демон ssh. Временным решением является запуск команды exec на запущенном контейнере:docker exec your_container_name service ssh start

Чтобы правильно исправить проблему, вам нужно указать образу, что он должен запускать sshd при создании контейнера (см.dockerize ssh-сервисв docker docs). Короче говоря:

  • удалить RUN service ssh restartстроку
  • добавьте две следующие строки
RUN mkdir /var/run/sshd
CMD ['/usr/sbin/sshd', '-D']
  • Пересоберите образ, запустите новый контейнер, подключитесь по ssh и наслаждайтесь.

Связанный контент