GNU/Linux >> Tutoriels Linux >  >> Panels >> Docker

Comment se connecter en SSH à un conteneur Docker

SSH est l'une des commandes les plus utilisées dans la boîte à outils d'un administrateur système, mais on ne la voit pas couramment aux côtés de Docker. Voici comment vous connecter en SSH à un conteneur en cours d'exécution et pourquoi vous devriez réfléchir à deux fois avant de le faire.

Devez-vous utiliser SSH avec des conteneurs Docker ?

SSH-ing dans un conteneur Docker est généralement une mauvaise pratique que vous devriez éviter. Il est presque toujours préférable d'utiliser le docker exec commande pour obtenir un shell à l'intérieur d'un conteneur.

Les nouveaux arrivants Docker peuvent être tentés d'utiliser SSH pour mettre à jour les fichiers à l'intérieur d'un conteneur. Les conteneurs sont censés être jetables, ils doivent donc être traités comme immuables après leur création, à l'exception des données persistantes stockées à l'intérieur des volumes. Créez une nouvelle image et redémarrez votre conteneur lorsque vous modifiez le code source.

Outre le processus de configuration en plusieurs étapes, l'installation de SSH dans une image Docker ajoute plusieurs packages de dépendance et expose un autre vecteur d'attaque potentiel. Sur un système avec plusieurs conteneurs actifs, vous exécuterez plusieurs processus SSH indépendants et devrez vous souvenir du port correct pour chaque conteneur.

Au lieu d'ajouter SSH à des conteneurs individuels, installez-le une fois sur l'hôte physique qui exécute Docker. Utilisez SSH pour vous connecter à votre hôte, puis exécutez docker exec -it my-container bash pour accéder aux conteneurs individuels.

Tandis que docker exec est l'approche préférée, il existe encore des scénarios où SSH pourrait être utile. Vous pouvez l'introduire comme mesure palliative à intégrer aux systèmes de déploiement hérités. Il peut également être utilisé par certains IDE et outils de construction pour fournir des capacités de rechargement en direct pendant le développement.

Installer le serveur SSH dans un conteneur Docker

Les images de base Docker les plus populaires sont intentionnellement rationalisées. Vous devrez ajouter vous-même le serveur OpenSSH, même sur des images dérivées de distributions de systèmes d'exploitation populaires.

Voici un exemple Dockerfile pour une image basée sur Debian :

RUN apt-get update && apt-get install -y openssh-server
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

ENTRYPOINT service ssh start && bash

La configuration SSH est modifiée afin que vous puissiez vous connecter en tant que root , l'utilisateur par défaut dans un conteneur Docker. Pour plus de sécurité, configurez plutôt un compte utilisateur dédié :

RUN useradd -m -s /bin/bash sshuser

Cela crée un nouvel utilisateur appelé sshuser avec un répertoire personnel (-m ). Le -s Le commutateur définit le shell de connexion par défaut de l'utilisateur sur Bash.

L'utilisation de ENTRYPOINT garantit que le service SSH démarre toujours lorsque le conteneur le fait. L'exécution est ensuite transférée à Bash en tant que processus de premier plan du conteneur. Vous pouvez le remplacer par le binaire de votre application.

Configuration de l'authentification

Ensuite, vous devez configurer un système d'authentification. Vous pouvez attribuer un mot de passe à votre sshuser compte et connectez-vous avec cela :

RUN echo "sshuser:Changeme" | changepasswd

Un moyen plus sûr consiste à configurer l'authentification par clé SSH. Vous devrez créer une paire de clés sur votre ordinateur client, puis copier la partie publique dans le conteneur. De cette façon, le démon SSH peut vérifier l'identité de votre machine lorsque vous vous connectez.

Modifiez votre Dockerfile pour configurer le .ssh dossier de configuration pour votre utilisateur. Copiez dans une clé publique depuis votre répertoire de travail, soit avec un docker cp commande ou un COPY instruction dans le Dockerfile . Dans ce dernier cas, la clé serait intégrée à l'image, visible par toute personne ayant accès.

COPY id_rsa.pub /home/sshuser/.ssh/authorized_keys
RUN chown -R sshuser:sshuser /home/sshuser/.ssh
RUN chmod 600 /home/sshuser/.ssh/authorized_keys

Cette séquence de commandes crée les authorized_keys de SSH fichier avec le id_rsa.pub clé publique dans votre répertoire de travail. Les autorisations du système de fichiers sont ajustées pour correspondre aux exigences de SSH.

Connexion au conteneur

Vous êtes maintenant prêt à vous connecter à votre conteneur. Exécutez le conteneur avec le port 22 lié à l'hôte :

docker run -p 22:22 my-image:latest

Exécution de ssh [email protected] vous donnera une coquille à l'intérieur de votre conteneur.

Vous pouvez ignorer la liaison du port si vous vous connectez à partir de la machine qui héberge le conteneur Docker. Utiliser docker inspect pour obtenir l'adresse IP de votre conteneur, puis transmettez-la à la commande de connexion SSH.

docker inspect <id-or-name> | grep 'IPAddress' | head -n 1

Utilisez le client SSH sur votre machine pour vous connecter au conteneur :

ssh [email protected]

# OR

ssh [email protected]

Vous devrez utiliser un autre port si vous exécutez un serveur SSH distinct sur l'hôte ou si vous avez plusieurs conteneurs nécessitant le port 22. Voici comment initier une connexion lorsque SSH est lié au port 2220 :

docker run -p 22:2220 my-image:latest

ssh [email protected] -p 2220

Configuration des raccourcis de conteneur avec SSH Config

Vous pouvez manipuler votre fichier de configuration SSH pour simplifier les connexions aux conteneurs individuels. Modifier ~/.ssh/config pour définir des hôtes abrégés avec des ports préconfigurés :

Host my-container
    HostName 172.17.0.1
    Port 2220
    User sshuser

Vous pouvez maintenant exécuter ssh my-container à déposer directement dans votre contenant. Cela permet de jongler plus facilement avec plusieurs connexions sans se souvenir des adresses IP et des ports du conteneur.

Utilisez plutôt Dockssh pour simplifier la gestion des conteneurs

Le projet Dockssh va encore plus loin en fournissant un autre démon qui vous permet d'exécuter ssh [email protected] , sans aucune configuration SSH manuelle. Vous n'avez pas besoin d'installer un serveur SSH dans vos conteneurs ; Dockssh met automatiquement en proxy les connexions SSH et exécute le bon docker exec commande à la place.

Vous devez d'abord installer Redis pour stocker les données de configuration de Dockssh :

sudo apt install redis

Ensuite, définissez les conteneurs que vous souhaitez exposer en ajoutant un enregistrement Redis avec le nom du conteneur et un mot de passe pour les connexions SSH :

redis-cli set dockssh:my-container:pass "container-password-here"

Téléchargez ensuite Dockssh :

sudo curl https://github.com/alash3al/dockssh/releases/download/v1.1.0/dockssh_linux_amd64 -O /usr/local/bin/dockssh
sudo chmod +x /usr/local/bin/dockssh
sudo ufw allow 22022

# Start DockSSH server
dockssh

Vous pouvez maintenant vous connecter à votre conteneur :

ssh [email protected] -p 22022

Dockssh écoute sur le port 22022 par défaut. Le pare-feu est ouvert pour autoriser les connexions entrantes utilisant le port.

Vous serez invité à entrer le mot de passe du conteneur lorsque vous vous connecterez. Cela a été défini comme container-password-here dans notre dossier Redis ci-dessus.

L'utilisation de Dockssh facilite le SSH dans un grand nombre de conteneurs Docker. Cette approche est idéale lorsque vous vous connectez régulièrement à vos conteneurs à partir d'un hôte distant, car elle rationalise le processus en deux étapes "SSH puis docker exec ” séquence en une seule commande mémorable.

Enregistrez Dockssh en tant que service système pour une utilisation à long terme :

sudo nano /etc/systemd/system/dockssh.service
[Unit]
Description=Dockssh service
After=network.target

[Service]
type=simple
Restart=always
RestartSec=1
User=root
ExecStart=/usr/local/bin/dockssh

[Install]
WantedBy=multi-user.target

Activez le service en utilisant systemctl :

sudo systemctl enable dockssh.service
sudo systemctl start dockssh

Dockssh démarrera désormais automatiquement au démarrage de votre système.

Résumé

La combinaison de SSH avec des conteneurs Docker est largement considérée comme un anti-modèle, mais elle a toujours ses utilisations dans les environnements de développement, de test et hérités. Lorsqu'il n'y a pas d'alternative, vous pouvez ajouter le serveur SSH à votre conteneur, copier une clé publique et vous connecter via l'adresse IP du conteneur ou une liaison de port hôte.

Les administrateurs système qui souhaitent gérer à distance un grand nombre de conteneurs Docker peuvent essayer Dockssh. Il vous permet d'exécuter ssh familier commandes via un mappage transparent en arrière-plan vers docker exec , vous offrant le meilleur des deux mondes en utilisant des images non modifiées.


Docker
  1. Comment installer WordPress avec Docker

  2. Comment exécuter MySQL dans un conteneur Docker

  3. Comment monter un répertoire hôte dans un conteneur Docker

  4. Comment attribuer une adresse IP statique à un conteneur Docker

  5. Comment répertorier les conteneurs Docker

Comment exécuter PHPMyAdmin dans un conteneur Docker

Comment exécuter Grafana dans un conteneur Docker

Comment se connecter en SSH aux conteneurs Docker [étape par étape]

Comment configurer un conteneur Apache Docker

Comment exécuter des conteneurs Docker

Comment se connecter en SSH à un conteneur Docker