Lorsque vous avez besoin de dépanner ou de jeter un coup d'œil rapide dans un conteneur Docker, SSH est une excellente option. SSH vous permet de vous connecter rapidement à un conteneur en cours d'exécution et de voir ce qui se passe. Mais la connexion à un conteneur Docker implique d'abord une configuration, et vous avez plusieurs options différentes.
Dans ce didacticiel, vous apprendrez à vous connecter en SSH aux conteneurs Docker à l'aide de docker run
commande et un Dockerfile.
Commençons !
Prérequis
Si vous souhaitez suivre étape par étape, assurez-vous d'avoir les éléments suivants :
- Un hôte Linux. Ce didacticiel utilise Ubuntu 18.04.5 LTS.
- Docker installé sur l'hôte Linux. Ce didacticiel utilise Docker v19.03.8.
Démarrer un conteneur et SSH dans les conteneurs Docker avec docker run
L'docker run
command est une commande Docker qui exécute une commande lorsqu'un nouveau conteneur apparaît pour la première fois. Utilisation de docker run
, vous pouvez lancer une session SSH interactive vers un conteneur en suivant les étapes ci-dessous.
Avant de commencer cette section, assurez-vous d'avoir téléchargé et disponible une image Docker. Ce tutoriel utilise la dernière image Ubuntu Docker disponible sur Docker Hub.
Pour SSH dans les conteneurs Docker avec docker run
:
1. Ouvrez un terminal sur votre machine locale.
2. Exécutez l'docker run
commande fournissant :
- Le
name
du conteneur à exécuter (ubuntu_container_ssh
) - Le
i
drapeau indiquant que vous souhaitez ouvrir une session SSH interactive vers le conteneur. Lei
flag ne ferme pas la session SSH même si le conteneur n'est pas attaché. - Le
t
flag alloue un pseudo-TTY qui peut être utilisé pour exécuter des commandes de manière interactive. - L'image de base à partir de laquelle créer le conteneur (
ubuntu
).
# Creating the container named ubuntu_container_ssh and start a Bash session.
sudo docker run --name ubuntu_container_ssh -i -t ubuntu
À ce stade, vous êtes connecté en SSH au conteneur et pouvez exécuter toutes les commandes que vous souhaitez.
3. Ensuite, exécutez n'importe quelle commande, telle que touch
commande. La commande tactile créera un nouveau dossier nommé myfolder
dans le tmp répertoire, comme indiqué ci-dessous.
touch /tmp/myfolder
Vous pouvez maintenant exécuter toutes les commandes que vous souhaitez !
Enfin, lorsque vous avez terminé d'exécuter les commandes, tapez exit
pour fermer la session.
SSH dans l'exécution de conteneurs Docker avec docker exec
Dans la section précédente, vous avez appris à exécuter des commandes SSH lors du démarrage d'un nouveau conteneur Docker. Mais que se passe-t-il si vous avez besoin de vous connecter en SSH à des conteneurs Docker déjà en cours d'exécution ? Vous exécutez le docker exec
commande.
Le docker exec
La commande crée un shell Bash dans un conteneur en cours d'exécution et constitue un excellent moyen d'envoyer des commandes SSH dans un conteneur.
Avant de commencer cette section, assurez-vous d'avoir téléchargé et disponible une image Docker. Ce didacticiel utilise la dernière image NGINX Docker disponible sur Docker Hub.
Pour SSH dans un conteneur Docker en cours d'exécution avec docker exec
:
1. Ouvrez un terminal sur votre machine locale.
2. Ensuite, exécutez le docker run
commande pour démarrer le conteneur. Assurez-vous de spécifier le -d
flag pour exécuter le conteneur en arrière-plan afin de le maintenir actif jusqu'à ce que vous le supprimiez. La commande ci-dessous démarre un conteneur appelé nginx-testing
.
sudo docker run --name nginx-testing -d nginx
3. Maintenant, exécutez la commande docker ps pour vérifier que le conteneur est en cours d'exécution. Le docker ps
La commande listera tous les conteneurs en cours d'exécution sur l'hôte Docker.
4. Enfin, exécutez docker exec
, comme indiqué ci-dessous, à SSH dans le conteneur en cours d'exécution appelé nginx-testing
. Dans l'extrait de code ci-dessous :
docker exec
la commande s'exécute (/bin/bash
) pour obtenir un shell Bash dans le conteneur.-it
flag vous permet d'exécuter un conteneur en mode interactif, c'est-à-dire que vous pouvez exécuter des commandes à l'intérieur du conteneur pendant qu'il est toujours en cours d'exécution.nginx-testing
est le nom du conteneur.
sudo docker exec -it nginx-testing /bin/bash
Configuration d'un serveur OpenSSH et connexion avec un Dockerfile
Jusqu'à présent, le didacticiel supposait que vous vous connectiez à un conteneur sur lequel un serveur SSH était déjà installé. Mais que se passe-t-il si ce n'est pas le cas ? OpenSSH n'est peut-être pas déjà installé sur l'image que vous utilisez et vous devez d'abord la configurer ?
À l'aide d'un Dockerfile, vous pouvez configurer toutes les tâches nécessaires non seulement pour SSH dans les conteneurs Docker, mais également pour configurer un serveur OpenSSH à partir de zéro.
En supposant que votre terminal local est toujours ouvert :
1. Créez éventuellement un répertoire pour stocker le Dockerfile. Ce tutoriel utilisera le ~/DockerFileContainerTest répertoire.
2. Ouvrez votre éditeur de texte préféré, copiez/collez le Dockerfile ci-dessous à l'intérieur et enregistrez le fichier sous Dockerfile à l'intérieur de ~/DockerFileContainerTest annuaire. Ce Dockerfile contient toutes les commandes et configurations pour créer une nouvelle image Docker au-dessus de n'importe quelle image de base et configurer OpenSSH.
Le DockerFile ci-dessous contient diverses étapes/instructions qui permettront de créer le conteneur :
FROM
– Définit leubuntu:16.04
image de base à utiliser.RUN
– Exécute les commandes dans un nouveau calque en haut de l'image de base.CMD
– CMD vous permet d'exécuter les commandes. Il existe deux manières d'exécuter les commandes soit via exec, soit en utilisant des formats shell.
EXPOSE
– Informe Docker que le conteneur écoute sur les ports réseau spécifiés lors de l'exécution. Le contenant sera exposé sur le pot22
.
# Instruction for Dockerfile to create a new image on top of the base image (ubuntu)
FROM ubuntu:16.04
RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:mypassword' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN sed '[email protected]\s*required\s*[email protected] optional [email protected]' -i /etc/pam.d/sshd
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
3. Ensuite, exécutez la docker build
commande pour créer l'image Docker. Le t
flag marque l'image sshd_container
et.
permet à Docker de sélectionner tous les fichiers nécessaires dans le répertoire de travail actuel.
# Building the docker Image
sudo docker build -t sshd_tagged_image .
4. Maintenant, exécutez les docker images
commande pour inspecter l'image créée. Notez le RÉPOSITOIRE attribut. Cet attribut est le tag créé avec le -t
drapeau à l'étape précédente.
5. Exécutez docker run
pour créer et exécuter le conteneur à partir de l'image en indiquant à Docker d'exécuter l'image en arrière-plan (-d
),
La commande ci-dessous demande à Docker de créer et d'exécuter le conteneur appelé test_sshd_container
en arrière-plan (-d
), en utilisant le sshd_tagged_image
image nouvellement construite que vous avez créée à l'étape 3 et pour publier tous les ports définis dans le Dockerfile en tant que ports aléatoires.
# Running the container using the newly built image
docker run -d -P --name test_sshd_container sshd_tagged_image
Après l'exécution réussie de la commande Docker run, vous verrez que l'ID du conteneur est généré ci-dessous.
6. Exécutez docker port
pour vérifier la connectivité SSH entre l'hôte Docker et le conteneur. Le docker port
liste de commandes les mappages de port ou un mappage spécifique pour le conteneur.
sudo docker port test_sshd_container
Vous devriez voir la sortie de 22/TCP → 0.0.0.0:32769
, ce qui indique que le port 22 du conteneur est mappé sur le port externe 32769
.
7. Ensuite, recherchez l'adresse IP du conteneur. Pour ce faire, exécutez le docker inspect
commande. L'docker inspect
la commande interroge les informations Docker et restitue les résultats dans un tableau JSON à l'aide d'un format
paramètre.
Vous verrez le format
l'argument de paramètre ci-dessous utilise la range
attribut pour trouver l'adresse IP du conteneur en cochant NetworkSettings
→Networks
→ IPAddress
.
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' test_sshd_container
8. Enfin, maintenant que vous avez l'adresse IP sur laquelle vous connecter en SSH, essayez de vous connecter en SSH au conteneur, et cela devrait fonctionner !
ssh [email protected]
Conclusion
Vous montrez maintenant quelques façons de vous connecter en SSH à un conteneur Docker en utilisant différentes approches. En utilisant l'une de ces approches, vous devriez être en mesure de dépanner et de gérer vos conteneurs.
Avec ces nouvelles connaissances, comment prévoyez-vous de vous connecter en SSH à votre conteneur maintenant ?