Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to ssh localhost within a running Docker container

Tags:

I'm building a Docker image for an application which requires to ssh into localhost (i.e ssh user@localhost)

I'm working on a Ubuntu desktop machine and started with a basic ubuntu:16.04 container. Following is the content of my Dockerfile:

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

Then I build this container using the command:

docker build -t test-container .

And run it using:

docker run -it test-container

The container opens with the following prompt and the keys are generated correctly to enable ssh into localhost:

user1@0531c0f71e0a:/$ 
user1@0531c0f71e0a:/$ cd ~/.ssh/
user1@0531c0f71e0a:~/.ssh$ ls
authorized_keys  id_rsa  id_rsa.pub

Then ssh into localhost and greeted by the error:

user1@0531c0f71e0a:~$ ssh user1@localhost
ssh: connect to host localhost port 22: Cannot assign requested address

Is there anything I'm doing wrong or any additional network settings that needs to be configured? I just want to ssh into localhost within the running container.

like image 950
Akshay Elavia Avatar asked May 31 '17 06:05

Akshay Elavia


People also ask

Can I use localhost in Docker container?

Docker provides a host network which lets containers share your host's networking stack. This approach means localhost inside a container resolves to the physical host, instead of the container itself. Now your container can reference localhost or 127.0. 0.1 directly.

Can you ssh from a Docker container?

The SSH method works fine for Docker containers, too. That said, you can SSH into a Docker container using Docker's built-in docker exec . If you do not need an interactive shell, you can also use the docker attach command to connect the host's stdin and stdout to the running container and execute remote commands.

How can you connect from the inside of your container to the localhost of your host where the container runs?

A simple solution to this in a Linux machine is to use the --network=”host” option along with the Docker run command. After that, the localhost (127.0. 0.1) in your Docker container will point to the host Linux machine.


2 Answers

First you need to install the ssh server in the image building script:

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

Then you need to start the ssh server:

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

or probably even in the last lines of the Dockerfile ( you must have one binary instantiated to keep the container running ... )

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

on the host than

# 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

like image 76
Yordan Georgiev Avatar answered Nov 08 '22 11:11

Yordan Georgiev


As @user2915097 stated in the OP comments, this was due to the ssh instance in the container was attempting to connect to the host using IPv6. Forcing connection over IPv4 using -4 solved the issue.

$ docker run -it ubuntu ssh -4 user@hostname
like image 28
sshow Avatar answered Nov 08 '22 09:11

sshow