web-dev-qa-db-fra.com

Comment SSH dans Docker?

J'aimerais créer le flux d'infrastructure suivant:

Comment cela peut-il être réalisé avec Docker?

72
Kamil Lelonek

Premièrement, vous devez installer un serveur SSH dans les images sur lesquelles vous souhaitez ssh-in. Vous pouvez utiliser une image de base pour tout votre conteneur avec le serveur ssh installé. Ensuite, vous devez uniquement exécuter chaque conteneur mappant le port ssh (valeur par défaut 22) sur l'un des ports de l'hôte (serveur distant à votre image), à ​​l'aide de -p <hostPort>:<containerPort>. c'est à dire:

docker run -p 52022:22 container1 
docker run -p 53022:22 container2

Ensuite, si les ports 52022 et 53022 de l'hôte sont accessibles de l'extérieur, vous pouvez directement ssh aux conteneurs en utilisant l'adresse IP de l'hôte (serveur distant) spécifiant le port dans ssh avec -p <port>. C'est à dire.:

ssh -p 52022 myuser@RemoteServer -> SSH à container1

ssh -p 53022 myuser@RemoteServer -> SSH à container2

58
Javier Cortejoso

Remarque : cette réponse promeut un outil que j'ai écrit.

La réponse sélectionnée ici suggère d'installer un serveur SSH dans chaque image. Conceptuellement, ce n'est pas la bonne approche ( https://docs.docker.com/articles/dockerfile_best-practices/ ).

J'ai créé un serveur SSH conteneurisé que vous pouvez "coller" à n'importe quel conteneur en cours d'exécution. De cette façon, vous pouvez créer des compositions avec chaque conteneur. La seule exigence est que le conteneur ait bash.

L'exemple suivant démarre un serveur SSH exposé sur le port 2222 de la machine locale.

$ docker run -d -p 2222:22 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e CONTAINER=my-container -e AUTH_MECHANISM=noAuth \
  jeroenpeeters/docker-ssh

$ ssh -p 2222 localhost

Pour plus de pointeurs et de documentation, voir: https://github.com/jeroenpeeters/docker-ssh

Non seulement cela défait l’idée d’un processus par conteneur, mais c’est aussi une approche fastidieuse lorsqu’on utilise des images de Docker Hub, car elles ne contiennent souvent pas (et ne devraient pas) de serveur SSH.

36
Jeroen Peeters

Ces fichiers ouvriront avec succès sshd et le service afin que vous puissiez ssh en local. (vous utilisez cyberduck n'est-ce pas?)

Dockerfile

FROM swiftdocker/Swift
MAINTAINER Nobody

RUN apt-get update && apt-get -y install openssh-server supervisor
RUN mkdir /var/run/sshd
RUN echo 'root:password' | chpasswd
RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf

EXPOSE 22
CMD ["/usr/bin/supervisord"]

supervisord.conf

[supervisord]
nodaemon=true

[program:sshd]
command=/usr/sbin/sshd -D

construire/exécuter le démon de démarrage/sauter dans Shell.

docker build -t Swift3-ssh .  
docker run -p 2222:22 -i -t Swift3-ssh
docker ps # find container id
docker exec -i -t <containerid> /bin/bash

enter image description here

12
johndpope

Je suppose que c'est possible. Il vous suffit d'installer un serveur SSH dans chaque conteneur et d'exposer un port sur l'hôte. Le principal inconvénient serait de maintenir/de garder en mémoire la cartographie port à conteneur.

Cependant, je me demande pourquoi vous voudriez faire cela. SSH'ng dans les conteneurs devrait être assez rare pour que ce ne soit pas une corvée de ssh pour l'hôte puis utilisez docker exec pour entrer dans le conteneur.

10
Adrian Mouat

Créer une image de menu fixe avec openssh-server préinstallé:

Dockerfile

FROM ubuntu:16.04

RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:screencast' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

Construisez l'image en utilisant:

$ docker build -t eg_sshd .

Exécutez un conteneur test_sshd:

$ docker run -d -P --name test_sshd eg_sshd
$ docker port test_sshd 22

0.0.0.0:49154

Ssh à votre conteneur:

$ ssh [email protected] -p 49154
# The password is ``screencast``.
root@f38c87f2a42d:/#

Source: https://docs.docker.com/engine/examples/running_ssh_service/#build-an-eg_sshd-image

8
username