Docker – własny klient ssh

Najczęściej każdy zaczyna opisywać coś od podstaw, od Hello world. Ja zacznę od pokazania jak za pomocą dwóch sposobów stworzyć własny obraz docker’a z klientem ssh i następnie stworzyć za pomocą niego kontener.

Pierwszy sposób to za pomocą pliku Dockerfile. Stworzymy jakiś katalog a w nim plik o nazwie Dockerfile o zawartości:


FROM alpine:3.3
RUN apk update && apk add openssh-client
RUN echo -e 'Host *\nUseRoaming no' >> /etc/ssh/ssh_config
ENTRYPOINT ["ssh"]

Pierwsza linijka informuję że nasz obraz będzie bazował na systemie alpine versji 3.3. Druga ma za zadanie zaktualizować listę pakietów i zainstalować klienta ssh. Trzecia to zabezpieczenie na możliwą dziurę w kliencie SSH. Ostatnia informuje że będziemy uruchamiać komendę ssh w kontenerze i będzie można przekazać parametry.

Teraz stworzymy sobię obraz za pomocą komendy:


docker bulid -t djanicki/ssh_clinet:v1 .

A teraz sprawdzmy czy się utowrzył:


# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
djanicki/ssh_clinet v1 3324198d92f5 12 hours ago 8.04 MB

Następnym krokiem będzie utworzenie kontenera który będzie się łączył do 192.168.56.102 jako root, dzięki –rm po zakończeniu sesji kontener zostanie usunięty a -it od razu będziemy mieli podłączoną konsolę:


# docker run --rm -it djanicki/ssh_clinet:v1 "root@192.168.56.102"

Sposób drugi polega na utworzeniu kontenera z konsolą, nawę go ssh_client:


# docker run --name ssh_client -it alpine:3.3 "/bin/sh"

Teraz jak już jesteśmy w konsoli kontenera to wykonany:


apk update && apk add openssh-client
echo -e 'Host *\nUseRoaming no' >> /etc/ssh/ssh_config
exit

Sprawdźmy czy powstał nasz kontener:


# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2aa92627e828 alpine:3.3 "/bin/sh" 3 minutes ago Exited (0) About a minute ago ssh_client

Teraz utwórzmy sobie obraz na podstawie tego kontenera:


# docker commit --change='ENTRYPOINT ["ssh"]' ssh_client djanicki/ssh_clinet:v2

Teraz mamy dwa obrazy:


# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
djanicki/ssh_clinet v2 15d033f2abf9 5 seconds ago 8.038 MB
djanicki/ssh_clinet v1 3324198d92f5 12 hours ago 8.04 MB

Na sam koniec przykład zastosowania, mamy np. NAS w domu z możliwością docker’a, jednak nie mamy zewnętrznego IP. Dodatkowo posiadamy dostęp do serwera SSH z zewnętrznym IP.

W dokerze wykonujemy połączenie:


ssh -R PORT_ZDALNY:IP_NAS:PORT_SSH_NAS LOGIN_SSH_ZEWNETRZNE@IP_ZEWNETRZNE

Następnie jak się podłączymy po ssh z zewnętrznym IP wykonujemy:


ssh -R localhost -p PORT_ZDALNY

IMAGES