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 "[email protected]"
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