Не удается подключиться к локальному хосту ssh в пределах установленного контейнера Docker

Я создаю образ Docker для приложения, которое требует ssh в localhost (i.e ssh user @localhost)

Я работаю на настольной машине Ubuntu и начинаю с базового контейнера ubuntu: 16.04. Ниже приведено содержание моего файла Docker:

FROM ubuntu:16.04

RUN apt-get update && apt-get install -y \
        openjdk-8-jdk \
        ssh && \
        groupadd -r custom_group && useradd -r -g custom_group -m user1

USER user1

RUN ssh-keygen -b 2048 -t rsa -f ~/.ssh/id_rsa -q -N "" && \
        cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

Затем я создаю этот контейнер с помощью команды:

docker build -t test-container .

И запустите его, используя:

docker run -it test-container

Контейнер открывается следующей подсказкой, и ключи генерируются правильно, чтобы включить ssh в localhost:

[email protected]:/$ 
[email protected]:/$ cd ~/.ssh/
[email protected]:~/.ssh$ ls
authorized_keys  id_rsa  id_rsa.pub

Затем ssh в localhost и приветствуется ошибкой:

[email protected]:~$ ssh [email protected]
ssh: connect to host localhost port 22: Cannot assign requested address

Есть ли что-то, что я делаю неправильно или какие-либо дополнительные сетевые настройки, которые необходимо настроить? Я просто хочу ssh в localhost в запущенном контейнере.

Ответ 1

Сначала вам нужно установить ssh-сервер в сценарии построения образа:

  • RUN sudo apt-get install -y openssh-server

Затем вам нужно запустить сервер SSH:

  • RUN sudo/etc/init.d/ssh start

или, возможно, даже в последних строках файла Dockerfile (для сохранения работоспособности контейнера необходимо создать один двоичный файл...)

 USER root
 CMD [ "sh", "/etc/init.d/ssh", "start"]

на хосте, чем

# init a container from an the image
run -d --name my-ssh-container-name-01 \
    -v /opt/local/dir:/opt/container/dir my-image-01

Ответ 2

Как @user2915097, указанный в комментариях к OP, это произошло из-за экземпляра ssh в контейнере, пытающегося подключиться к хосту с использованием IPv6. Принудительное соединение через IPv4 с помощью -4 решило проблему.

$ docker run -it ubuntu ssh -4 [email protected]

Ответ 3

Для Docker Compose я смог добавить следующее в мой файл .yml:

network_mode: "host"

Я считаю, что эквивалент в Docker:

--net=host