GNU/Linux >> Linux Esercitazione >  >> Panels >> Docker

Come SSH in un contenitore Docker

SSH è uno dei comandi più utilizzati nella casella degli strumenti di un amministratore di sistema, ma non è comunemente visto insieme a Docker. Ecco come puoi inserire SSH in un container in esecuzione e perché dovresti pensarci due volte prima di farlo.

Dovresti usare SSH con i contenitori Docker?

L'invio di SSH in un contenitore Docker è generalmente una cattiva pratica che dovresti evitare. È quasi sempre meglio usare docker exec comando per ottenere una shell all'interno di un contenitore.

I nuovi arrivati ​​di Docker possono essere tentati di utilizzare SSH per aggiornare i file all'interno di un container. I contenitori sono pensati per essere usa e getta, quindi dovrebbero essere trattati come immutabili dopo la creazione, ad eccezione dei dati persistenti archiviati all'interno dei volumi. Crea una nuova immagine e riavvia il contenitore quando modifichi il codice sorgente.

A parte il processo di configurazione in più fasi, l'installazione di SSH in un'immagine Docker aggiunge diversi pacchetti di dipendenze ed espone un altro potenziale vettore di attacco. Su un sistema con diversi container attivi, eseguirai più processi SSH indipendenti e dovrai ricordare la porta corretta per ogni container.

Invece di aggiungere SSH ai singoli contenitori, installalo una volta sull'host fisico che esegue Docker. Usa SSH per connetterti al tuo host, quindi esegui docker exec -it my-container bash per accedere ai singoli container.

Mentre docker exec è l'approccio preferito, ci sono ancora scenari in cui SSH potrebbe essere utile. Potresti introdurlo come misura provvisoria per l'integrazione con i sistemi di distribuzione legacy. Può anche essere utilizzato da alcuni IDE e strumenti di compilazione per fornire funzionalità di ricarica in tempo reale durante lo sviluppo.

Installazione del server SSH in un contenitore Docker

Le immagini di base Docker più popolari sono mantenute intenzionalmente ottimizzate. Dovrai aggiungere tu stesso il server OpenSSH, anche su immagini derivate da distribuzioni di sistemi operativi popolari.

Ecco un esempio Dockerfile per un'immagine basata su 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 configurazione SSH è stata modificata in modo da poter accedere come root , l'utente predefinito in un contenitore Docker. Per una maggiore sicurezza, configura invece un account utente dedicato:

RUN useradd -m -s /bin/bash sshuser

Questo crea un nuovo utente chiamato sshuser con una home directory (-m ). Il -s switch imposta la shell di accesso predefinita dell'utente su Bash.

L'uso di ENTRYPOINT assicura che il servizio SSH si avvii sempre quando lo fa il contenitore. L'esecuzione viene quindi trasferita a Bash come processo in primo piano del contenitore. Potresti sostituirlo con il file binario della tua applicazione.

Configurazione dell'autenticazione

Successivamente è necessario configurare un sistema di autenticazione. Puoi assegnare una password al tuo sshuser account e accedi con quello:

RUN echo "sshuser:Changeme" | changepasswd

Un modo più sicuro consiste nell'impostare l'autenticazione con chiave SSH. Dovrai creare una coppia di chiavi sul tuo computer client, quindi copiare la parte pubblica nel contenitore. In questo modo il demone SSH può verificare l'identità della tua macchina quando ti connetti.

Modifica il tuo Dockerfile per impostare il .ssh cartella di configurazione per il tuo utente. Copia in una chiave pubblica dalla tua directory di lavoro, sia con un docker cp comando o un COPY istruzioni nel Dockerfile . In quest'ultimo caso, la chiave verrebbe inserita nell'immagine, visibile a chiunque abbia accesso.

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

Questa sequenza di comandi crea le authorized_keys di SSH file con id_rsa.pub chiave pubblica nella directory di lavoro. Le autorizzazioni del filesystem vengono regolate per soddisfare i requisiti di SSH.

Connessione al container

Ora sei pronto per connetterti al tuo container. Esegui il container con la porta 22 associata all'host:

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

Esecuzione di ssh [email protected] ti darà un guscio all'interno del tuo contenitore.

Puoi saltare il binding della porta se ti connetterai dalla macchina che ospita il container Docker. Usa docker inspect per ottenere l'indirizzo IP del tuo container, quindi passalo al comando di connessione SSH.

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

Usa il client SSH sul tuo computer per connetterti al container:

ssh [email protected]

# OR

ssh [email protected]

Dovrai utilizzare una porta alternativa se stai eseguendo un server SSH separato sull'host o hai più container che richiedono la porta 22. Ecco come avviare una connessione quando SSH è associato alla porta 2220:

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

ssh [email protected] -p 2220

Impostazione di scorciatoie per container con SSH Config

Puoi manipolare il tuo file di configurazione SSH per semplificare le connessioni ai singoli contenitori. Modifica ~/.ssh/config per definire host abbreviati con porte preconfigurate:

Host my-container
    HostName 172.17.0.1
    Port 2220
    User sshuser

Ora puoi eseguire ssh my-container cadere direttamente nel tuo contenitore. In questo modo è più facile destreggiarsi tra più connessioni senza ricordare gli IP e le porte dei container.

Utilizza Dockssh per semplificare invece la gestione dei container

Il progetto Dockssh fa un ulteriore passo avanti fornendo un altro demone che ti consente di eseguire ssh [email protected] , senza alcuna configurazione SSH manuale. Non è necessario installare un server SSH nei container; Dockssh esegue automaticamente il proxy delle connessioni SSH ed esegue il corretto docker exec comando invece.

Devi prima installare Redis per archiviare i dati di configurazione di Dockssh:

sudo apt install redis

Quindi, definisci i contenitori che desideri esporre aggiungendo un record Redis con il nome del contenitore e una password per le connessioni SSH:

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

Quindi scarica 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

Ora puoi connetterti al tuo container:

ssh [email protected] -p 22022

Dockssh è in ascolto sulla porta 22022 per impostazione predefinita. Il firewall viene aperto per consentire le connessioni in entrata tramite la porta.

Ti verrà richiesta la password del contenitore quando ti connetti. Questo è stato impostato come container-password-here nel nostro record Redis sopra.

L'uso di Dockssh semplifica l'accesso SSH in un gran numero di contenitori Docker. Questo approccio è l'ideale quando ci si connette regolarmente ai container da un host remoto in quanto semplifica i due passaggi "SSH quindi docker exec ” sequenza in un unico comando memorabile.

Registra Dockssh come servizio di sistema per l'uso a lungo termine:

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

Abilita il servizio usando systemctl :

sudo systemctl enable dockssh.service
sudo systemctl start dockssh

Dockssh ora si avvierà automaticamente all'avvio del sistema.

Riepilogo

La combinazione di SSH con i container Docker è generalmente considerata un anti-pattern, ma ha ancora i suoi usi negli ambienti di sviluppo, test e legacy. Quando non ci sono alternative, puoi aggiungere il server SSH al tuo container, copiarlo in una chiave pubblica e connetterti tramite l'IP del container o un binding della porta host.

Gli amministratori di sistema che desiderano gestire in remoto un gran numero di container Docker possono provare Dockssh. Ti consente di eseguire il familiare ssh comandi tramite una perfetta mappatura dietro le quinte a docker exec , offrendoti il ​​meglio di entrambi i mondi utilizzando immagini non modificate.


Docker
  1. Come installare WordPress utilizzando Docker

  2. Come eseguire un programma all'interno di un contenitore Docker?

  3. Come eseguire MySQL in un contenitore Docker

  4. Come montare una directory host in un contenitore Docker

  5. Come assegnare un IP statico a un contenitore Docker

Come eseguire PHPMyAdmin in un contenitore Docker

Come eseguire Grafana in un contenitore Docker

Come eseguire SSH nei contenitori Docker [Passo dopo passo]

Come configurare un container Docker Apache

Come eseguire i contenitori Docker

Come SSH in un Docker Container