Einführung Docker ################# Datum: 28. Juli 2022 Ziel: erste Schritte mit der Container-Anwendungsvirtualisierung "docker" Linux-Distribution: Debian 11 Installation ============ Siehe dazu hier unter https://www.rosehosting.com/blog/how-to-install-docker-on-debian-11/ Container-Abbilder suchen ========================= Um z.B. nach der Debian-artigen Distribution "devuan" zu suchen: .. highlight:: shell-session :: root@d11:~# docker search devuan NAME DESCRIPTION STARS OFFICIAL AUTOMATED vpgrp/devuan Docker images of Devuan. 3 qxip/devuan Devuan Docker base image 2 debitux/devuan Devuan GNU+Linux is a fork of Debian without… 1 [OK] dyne/devuan Devuan GNU+Linux base Docker images 1 [OK] vptech/devuan Docker images of Devuan. 1 rockyluke/devuan Docker images of Devuan. 1 dan0mau/devuan-ascii-apache2-php7.3-aws-npm-jobs 0 dan0mau/devuan-ascii-apache2-php7.3-aws-npm 0 dan0mau/devuan-ascii-jenkins-slave 0 dan0mau/devuan-ascii-gearman-server 0 markizano/devuan https://devuan.org/ 0 lpenz/devuan-beowulf-amd64 Devuan GNU/Linux beowulf/ceres for amd64 0 dan0mau/devuan-ascii-apache2-php7.1-aws 0 lpenz/devuan-beowulf-armhf-minbase Devuan GNU/Linux beowulf/ceres for armhf, mi… 0 dan0mau/devuan-ascii-apache2-php7.1-aws-npm 0 dan0mau/devuan-ascii-consul-template-haproxy 0 debitux/devuan-rdp Devuan testing distribution with openbox, te… 0 [OK] gvieri/devuan my docker images of linux "devuan" 0 sharlak/devuan Devuan Jessie base image 0 dan0mau/devuan This is a base image for Devuan jessie, simi… 0 dan0mau/devuan-ascii-consul 0 dan0mau/devuan-consul-template-haproxy 0 dan0mau/devuan-zookeeper 0 dan0mau/devuan-ascii-jenkins-slave-old 0 dan0mau/devuan-redis 0 root@d11:~# Siehe dazu auch https://docs.docker.com/engine/reference/commandline/search/ Container erstellen =================== Devuan mit sysVinit ------------------- Nach einem ersten Versuch mittels ``docker run hello-world`` laden wir uns vom soeben gefundenen Repo "dyne/devuan" das Image "beowulf" herunter, wobei daraus sogleich ein Container erstellt und an den Start gebracht wird: :: root@d11:~# docker run -it --name mydevuan dyne/devuan:beowulf bash Unable to find image 'dyne/devuan:beowulf' locally beowulf: Pulling from dyne/devuan a8cdb2b8b104: Pull complete 5186d5863148: Pull complete 32368578c07e: Pull complete f8a2a883a678: Pull complete a328eb17d430: Pull complete 031593785b54: Pull complete 28a6a8653ad0: Pull complete 5851909203bb: Pull complete 71ffbb18846f: Pull complete c3ac7f2b2c43: Pull complete 98188074ba9c: Pull complete Digest: sha256:087ca834c811bc5391633132caba9c690446f8defc7d6d84f272e69a3e4a930b Status: Downloaded newer image for dyne/devuan:beowulf [root@5a8d3d3dda62:~]# Wir befinden uns nunmehr schon im laufenden Container, wo wir uns umsehen und ein paar administrative Dinge tun: :: [root@5a8d3d3dda62:~]# ## Nachsehen, welche Distri am Start ist: [root@5a8d3d3dda62:~]# cat /etc/os-release PRETTY_NAME="Devuan GNU/Linux 3 (beowulf)" NAME="Devuan GNU/Linux" VERSION_ID="3" VERSION="3 (beowulf)" VERSION_CODENAME=beowulf ID=debian ID_LIKE=debian HOME_URL="https://www.devuan.org/" SUPPORT_URL="https://devuan.org/os/community" BUG_REPORT_URL="https://bugs.devuan.org/" [root@5a8d3d3dda62:~]# [root@5a8d3d3dda62:~]# cat /etc/issue Devuan GNU/Linux 3 \n \l [root@5a8d3d3dda62:~]# [root@5a8d3d3dda62:~]# # Pruefen, welches Init-System vorliegt: [root@5a8d3d3dda62:~]# ps -A PID TTY TIME CMD 1 pts/0 00:00:00 tini 7 pts/0 00:00:00 bash 8 pts/0 00:00:00 ps [root@5a8d3d3dda62:~]# [root@5a8d3d3dda62:~]# dpkg -l | grep init ii init-system-helpers 1.56+nmu1+devuan3 all helper tools for all init systems ii initscripts 2.93-8+devuan1 amd64 scripts for initializing and shutting down the system ii insserv 1.18.0-2 amd64 boot sequence organizer using LSB init.d script dependency information ii lsb-base 10.2019051400 all Linux Standard Base init script functionality ii ncurses-base 6.1+20181013-2+deb10u2 all basic terminal type definitions ii sysvinit-core 2.93-8+devuan1 amd64 System-V-like init utilities ii sysvinit-utils 2.93-8+devuan1 amd64 System-V-like utilities [root@5a8d3d3dda62:~]# [root@5a8d3d3dda62:~]# ## System updaten: [root@5a8d3d3dda62:~]# # >> apt-get update && apt-get -y upgrade [root@5a8d3d3dda62:~]# [root@5a8d3d3dda62:~]# date Thu Jul 28 10:03:33 UTC 2022 [root@5a8d3d3dda62:~]# [root@5a8d3d3dda62:~]# ## Zeitzone setzen: [root@5a8d3d3dda62:~]# ls -l /etc/localtime lrwxrwxrwx 1 root root 27 Jul 28 10:03 /etc/localtime -> /usr/share/zoneinfo/Etc/UTC [root@5a8d3d3dda62:~]# [root@5a8d3d3dda62:~]# ln -sf /usr/share/zoneinfo/Europe/Berlin /etc/localtime [root@5a8d3d3dda62:~]# [root@5a8d3d3dda62:~]# ls -l /etc/localtime lrwxrwxrwx 1 root root 33 Jul 28 12:06 /etc/localtime -> /usr/share/zoneinfo/Europe/Berlin [root@5a8d3d3dda62:~]# [root@5a8d3d3dda62:~]# date Thu Jul 28 12:06:15 CEST 2022 [root@5a8d3d3dda62:~]# Von einer anderen Konsole aus, die wir auf dem Debian 11 Host starten (außerhalb des Containers), zeigt sich der laufende Container nun so: :: root@d11:~# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5a8d3d3dda62 dyne/devuan:beowulf "/tini -- bash" 41 seconds ago Up 40 seconds mydevuan root@d11:~# Weitere Container ----------------- Wir wollen nun weitere Images herunterladen, die zum nutzbringenden Container werden, wobei sie dann auch sogleich an den Start gehen. Debian mit Nginx ^^^^^^^^^^^^^^^^ Hier bekommen wir den Webserver Nginx mit einem Debian-Image an den Start: .. highlight:: bash :: docker run -it --name debianwebserv nginx bash === ==================== ----- ==== Downl. Container-Namen Name aus- und vergeben des zuführende starten Images Application Tiny Core Linux ^^^^^^^^^^^^^^^ Ein heißer Tipp ist Tiny Core Linux, das besonders klein ist; es bringt als Application keine ``bash`` mit, sondern nur die einfache ``sh``: :: docker run -it --name mytinycore arkii/tinycorelinux:latest sh Debian mit System V Initialization Daemon ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Eine weitere Idee ist, nach einem Container Ausschau zu halten, der das Starten von Daemons mittels der alten SysVinit-Methode vornimmt: .. highlight:: shell-session :: root@d11:~# docker search sysvinit NAME DESCRIPTION STARS OFFICIAL AUTOMATED minimum2scp/baseimage Debian sid image with sysvinit + sshd, rsysl… 3 [OK] minimum2scp/baseimage-buster Debian buster image with sysvinit + sshd, rs… 1 sysvinit/ansible 0 sysvinit/kubia 0 minimum2scp/baseimage-stretch Debian stretch image with sysvinit + sshd, r… 0 [OK] webtatic/centos6 CentOS 6 docker images that support SysVinit… 0 root@d11:~# Wir werden dabei sogar fündig, wobei hier aber wichtig ist, unter https://registry.hub.docker.com/r/minimum2scp/baseimage-buster nachzulesen, wie der Container zu starten ist - damit der Container in den Hintergrund geht und den ssh-Daemon startet, ist speziell ``-d -p 2222:22`` von Belang: :: root@d11:~# docker run -d -p 2222:22 --name sysVssh minimum2scp/baseimage-buster d4b17ef8d33d01b7957aab3b191ebe8d861a5bc3a6225234a4cd0696c945c2ed root@d11:~# root@d11:~# # >> und schon läuft er... Mit der folgenden Zeile können wir uns auf den laufenden Container aufschalten und auf Entdeckungsreise gehen: :: root@d11:~# docker exec -it sysVssh bash root@d4b17ef8d33d:/# root@d4b17ef8d33d:/# # Im Container root@d4b17ef8d33d:/# ps -A PID TTY TIME CMD 1 ? 00:00:00 init 512 ? 00:00:00 rsyslogd 537 ? 00:00:00 cron 546 ? 00:00:00 sshd 561 pts/0 00:00:00 bash 567 pts/0 00:00:00 ps root@d4b17ef8d33d:/# root@d4b17ef8d33d:/# root@d4b17ef8d33d:/# runlevel N 2 root@d4b17ef8d33d:/# root@d4b17ef8d33d:/# ls -l /sbin/init -rwxr-xr-x 1 root root 53016 Feb 15 2019 /sbin/init root@d4b17ef8d33d:/# root@d4b17ef8d33d:/# ls -l /sbin/telinit lrwxrwxrwx 1 root root 4 Feb 15 2019 /sbin/telinit -> init root@d4b17ef8d33d:/# root@d4b17ef8d33d:/# telinit 1 # <<<< telinit bewirkt, dass 'exit' ausgeführt wird root@d4b17ef8d33d:/# exit root@d11:~# root@d11:~# root@d11:~# # Wir schalten uns wieder auf: root@d11:~# docker exec -it sysVssh bash root@d4b17ef8d33d:/# root@d4b17ef8d33d:/# runlevel S 2 root@d4b17ef8d33d:/# Wie in oben genannten Link zu lesen ist, kann ein Login mittels .. highlight:: bash :: ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p 2222 debian@localhost erfolgen. Das Passwort des Benutzers 'debian' lautet ebenfalls 'debian', er kann ``sudo`` ohne Passworteingabe benutzen. Tests / Kontrolle ================= Grundlegender Funktionstest: :: docker version docker run hello-world Vorhandene Abbilder auflisten: :: docker image ls Laufende Container auflisten: :: docker container ls Alle Container auflisten, auch die gestoppt sind: :: docker container ls -a Laufende Container mitsamt "total file Size" auflisten: :: docker ps -s Container verwalten =================== Container löschen: :: docker rm tinycorelinux Container stoppen: :: docker stop mydevuan Container im Hintergrund starten: :: docker start mydevuan Im Hintergrund laufenden Container "mydevuan" eine ``bash`` als Anwendung ausführen, die sich allerdings interaktiv im Terminal zeigen soll: :: docker exec -it mydevuan bash Hyperlinks ========== Weitere gute Links zu Grundlagen, Tipps und Tricks: - https://de.wikipedia.org/wiki/Docker_(Software) - https://lerneprogrammieren.de/docker/ - https://pages.cms.hu-berlin.de/cms-webtech/gitlab-documentation/docs/docker-einfuehrung/ - https://epcced.github.io/2020-12-08-Containers-Online/03-running-containers/index.html - https://www.digitalocean.com/community/tutorials/how-to-use-docker-exec-to-run-commands-in-a-docker-container - https://nickjanetakis.com/blog/docker-tip-61-difference-betweeen-docker-create-start-and-run - https://de.ilert.com/blog/docker-spickzettel - https://www.ionos.de/digitalguide/server/knowhow/docker-container-volumes/