⬅️ **[[$-Tools|Tools]]** *** # Docker ## Links - [Container Training](https://container.training/) - [GitHub - jpetazzo/container.training: Slides and code samples for training, tutorials, and workshops about containers.](https://github.com/jpetazzo/container.training) - [[2019-07-29 Docker-Training]] - [[2019-07-31 Kubernetes-Training]] - [GitHub - AwesomeCompose: Templates for many Applications](https://github.com/docker/awesome-compose) - [Docker Toolbox (WMware + Docker possible, without Hyper-V)](https://docs.docker.com/toolbox/toolbox_install_windows/) - [Docker Desktop (Docker Only with Hyper-V, no WMware possible yet)](https://docs.docker.com/docker-for-windows/) - Docker Dekstop using Hyper-V vs. VMware - [Docker for Windows w/ VMWare installed](https://forums.docker.com/t/docker-for-windows-w-vmware-installed/19011) - [[SOLVED] : VMware Workstation and Device/Credential Guard not compatible](https://geek2pro.wordpress.com/2017/11/30/solved-vmware-workstation-and-device-credential-guard-not-compatible/) - [Hyper-V unter Windows 10 aktivieren und deaktivieren](https://www.xcep.net/blog/hyper-v-unter-windows-10-aktivieren-und-deaktivieren/) - On: ```bcdedit /set hypervisorlaunchtype auto``` - Off: ```bcdedit /set hypervisorlaunchtype off``` - [docker run](https://docs.docker.com/engine/reference/commandline/run/) ![[Docker-Overview.png]] ## Docker Commands | Command | Beschreibung | |:-------------------------------------------------------------- |:------------------------------------------------------------ | | **Infos:** | | | `docker --version` | version | | `docker --help` | help | | **Machine:** | | | `docker-machine start/stop` | VirtualBox VM starten/stoppen | | `docker-machine ssh` | SSH Verbindung in VirtualBox VM | | `docker-machine ip default` | return your IP address | | `docker-machine ls` | Returns Toolbox VirtualBox VM Infos | | **Execute and handle Containers:** | | | `docker run hello-world` | Erstelle und führe Hello World Container aus | | `docker image ls` | image that was downloaded from Docker Hub | | `docker container ls --all` | alle Container (gestartet und gestoppt) | | `docker run --interactive --tty ubuntu bash` | Ubuntu Container und Login in VM --> interactive | | `docker run --detach --publish 8080:80 --name webserver nginx` | nginx erstellen mit Port-Forward von 8080 auf 80 in VM Imgae | | `docker container stop webserver` | Stoppen | | `docker container rm webserver` | Löschen | | `docker ps -a` | list all docker containers (running and stopped | | `docker rm -f 1 2 3` | remove container ID's 1, 2, and 3 | | `docker build -t custom-nginx docker-nginx/` | Creates an image from Dockerfile in specified folder | | **Troubleshooting:** | | | `docker logs 03-snowflake-proxy` | Show logs/output of a machine. | | `docker logs 03-snowflake-proxy -f` | refreshed logs like `tail -f` | | `docker logs 03-snowflake-proxy > snowflake.log 2>&1` | Log Ausgaben umleiten in eine Datei. | | **Maintenance** | | | `docker-compose pull` | pull Docker Images in `docker-compose.yml` files | ### Upgrade Docker Container - docker pull 1. `docker pull ghost:5` will update the image for major Version 5 2. `docker-compose up -d` will re-run the containers and uses the newest version of the image version 5 ### Upgrade [[Docker]] Container - docker-compose 1. At location of `docker-compose.yml` run `docker-compose pull` to pull newer images as it is configured with `:latest` 2. Run `docker-compose up -d` to update containers ### Docker Network macvlan > 2024-01-24 ``` docker network create -d macvlan \     --subnet=192.168.42.0/24 \     --gateway=192.168.42.1  \     -o parent=eth0 \      demo-macvlan-net docker network ls docker run --rm -itd --name alpine-macvlan-test-01 --network=demo-macvlan-net --ip=192.168.42.202 alpine:latest /bin/sh docker ps docker container inspect alpine-macvlan-test-01 ## 2. Container -> auto DHCP docker run  --rm -itd --name alpine-macvlan-test-02 \ --network=demo-macvlan-net \   alpine:latest \   /bin/sh docker ps ``` ## Docker Installation on Ubuntu ARM64 - Status: **2022-04-24** - Source: https://www.tutsmake.com/how-to-install-docker-on-ubuntu-22-04/ - Used for [[home-pi - RPi4]] ### Install Docker-CE ```Bash sudo apt install apt-transport-https ca-certificates curl software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update sudo apt-cache policy docker-ce sudo apt install docker-ce sudo systemctl status docker sudo usermod -aG docker username ``` ### Install Docker Compose ```Bash sudo apt install python3-pip sudo pip3 install docker-compose ``` ## Docker Installation on Ubuntu x86 ### Status 2023-03 https://docs.docker.com/engine/install/ubuntu/ ```sh # Set up the repository sudo apt-get update sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release sudo mkdir -m 0755 -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # Install Docker Engine sudo chmod a+r /etc/apt/keyrings/docker.gpg sudo apt-get update # Install Docker Engine, containerd, and Docker Compose sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin ``` ### Status 2022-04-24 - Status: **2022-04-24** - Source: https://thomasventurini.com/articles/install-docker-and-compose-in-ubuntu/ - Used for [[MCE - Server x86]] and [[home-server - Dell Vostro 270s]] ```Bash # Download necessary packages # add repository matching to Ubuntu Version sudo apt-get update \ && sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common \ && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - \ && sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable" \ && sudo apt-get update \ && sudo apt-get install docker-ce docker-ce-cli containerd.io sudo groupadd docker \ && sudo usermod -aG docker $USER \ && newgrp docker # this enables the group without the need of a restart sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose \ && sudo chmod +x /usr/local/bin/docker-compose ``` ## Container Evolution ![[container_evolution.svg]] ## Terminologie - **Images** – Die Vorlagen für unsere Applikationen. Diese sind die Basis für unsere Container. Mit „docker pull <image_name>“ läd man sich ein frisches Image. - **Container** – Werden aus Images erstellt und beinhalten die eigentliche Applikation. Mit „docker run <image_name>“ startet man einen neuen Container aus einem heruntergeladenem Image. Mit „docker ps“ kann man sich alle aktuell laufenden Container anzeigen lassen. - **Docker Daemon** – Der Hintergrund Dienst auf auf dem Host. Dieser ist verantwortlich für das Erstellen, Ausführen und Ausliefern der Docker Container. Der Docker Deamon ist der Prozess der auf dem Hostrechner läuft zu dem der Client connected. - **Docker-Client** – Das Befehlszeilenprogramm, das dem Benutzer erlaubt, mit dem Daemon zu interagieren. Es gibt es noch weitere Clients die mit denen man sich zu dem Docker Daemon verbinden kann. Wie z. B. Kitematic das dem Nutzer eine GUI zur Docker Administration anbietet. - **Docker Hub** – Eine Registry für Docker Images. Diese Registry kann man sich als Verzeichnis und eine Sammlung aller vorhandenen Docker Images vorstellen. Auf Docker Hub kann man auch eine private oder öffentliche Sammlung der eigenen Docker Images anlegen. Es besteht natürlich auch die Möglichkeit sich eine Firmeninterne Registry auf einem eigenen Host anzulegen, von der man Firmenintern seine Images zieht. ## Best Practices ![[Best-Practices-Docker-Container.pdf]] ## Docker - [docker-cloud-computing-steroiden](http://t3n.de/news/docker-cloud-computing-steroiden-550165/) ![Docker Architektur](Docker_01.png) Wenn man von Docker hört, wird wahrscheinlich an eine virtuelle Maschine gedacht – Docker ist aber mehr. Docker beziehungsweise der Docker-Container setzt auf einen „Linux-Container“ (LXC) auf, und erweitert diesen mit einer umfangreichen API. Dadurch ist Docker in der Lage, mit Software wie zum Beispiel Chef, Jenkins, Salt, Vagrant und Ansible zu interagieren. Docker im Vergleich zu klassischen Virtualisierung. (Grafik: Docker) Verschiedene Applikationen können sich dieselben „Dependencies“ teilen und sparen somit Speicherplatz, da innerhalb von Docker-Containern auch alternative Versionen einer Applikation gespeichert werden können. Dabei wird dann nicht zweimal die Applikation gespeichert, sondern nur einmal die Applikation selbst und die dazugehörende Veränderung zur Ursprungs-Applikation. Somit bleibt der Docker-Container sehr klein. Angenommen, ihr habt ein Container-Image mit der Größe von einem Gigabyte – bei einer Virtualisierung mit einer klassishen virtuellen Maschine hättet ihr den Speicherbedarf von einem Gigabyte mal der benötigten virtuellen Maschinenen. Mit LXC und dem Docker-Dateisystem könnt ihr hunderte Docker-Container in etwas mehr als einem Gigabyte laufen lassen – vorausgesetzt ihr nutzt dasselbe Betriebssystem. Möglich ist das durch das Ressourcenmanagement. Eine klassische virtuelle Maschine bekommt gewisse Ressourcen zugeteilt – Docker-Container sind in der Lage, die gesamte Ressource untereinander und unabhängig aufzuteilen, wie und wo sie gerade benötigt wird. ### Dockerfile [Doku: Dockerfile](https://docs.docker.com/engine/reference/builder){: .btn .btn--info .} [Doku: Dockerfile Best Practices](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/){: .btn .btn--info .} - Verwendet um Docker Image zu erstellen - sollte im Projekt-Root Verzeichnis liegen - mit `.dickerignore` Dateien für Docker ausblenden - Excape Zeichen: ``` \ or ` ``` - für Windows ist letzteres empfohlen wegen Pfaden - **Directive** kann gesetzt werden am Anfang des Dockerfile: ```# escape=` ``` | Command | Beschreibung | |:----------------------------------------------------- |:------------------------------------------------------------------------------------------------ | | `FROM` | Basis Docker Image | | `RUN <command>` | Execute a command and commit it to the image itself at **build time**. Shell from or exec form. | | `CMD` | Like command, but ran when the Image Container starts e.g. start nginx sever. | | `LABEL <key>=<value>` | adds metadata to an image using key-value pairs. | | `EXPOSE <port>/<protocol>` | listen to Port (default TCP, UDP) at runtime. Like `docker run -p 8080:80 ...`. | | `ENV <key>=<value>` | sets the environment variable | | `ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]` | copies new files, directories or remote file URLs from src to dest. see * | | `COPY` | | | `ENTRYPOINT` | configure a container that will run as an executable. | | `VOLUME` | creates a mount point holding externally mounted volumes from native host or other containers. | | `USER` | sets the user name (or UID) and optionally the user group (or GID) to use when running the image | | `WORKDIR` | sets the working directory for any following insturction | | `ARG` | defines a variable that users can pass at Image build-time | | Some more... | | - *[docker add](https://docs.docker.com/engine/reference/builder/#add) - *[Docker ADD vs Volume](https://stackoverflow.com/questions/27735706/docker-add-vs-volume) ## Docker Images [Docker HUB](https://hub.docker.com/search/?image_filter=official&type=image) Starred in Account. - Docker [[Docker-Watchtower]] - Docker [[Gradle]] - Docker [[OpenProject]] ### Get nginx running with volume 1. Start nginx 2. attach shared volume (--volume) to from `_site` to `/usr/share/nginx/html` 3. Port Forward from Host 8080 to VM 80 4. Get VirtualBox IP Adress (**Docker Toolbox only**) 5. Use its Port 6. See the page ``` docker run -it --volume="$(PWD):/srv/jekyll" --publish 4000:4000 --name jekyll jekyll/builder:3.8 jekyll serve --force_polling docker run -it --volume="/cygwinHome/git/jekyll-tobi:/srv/jekyll" --publish 4000:4000 --name jekyll jekyll/builder:3.8 jekyll serve --force_polling docker container start -i jekyll # starts container jekyll in interactive mode (evtl mit -u root if permissions issues) check: docker run -it -v "/cygwinHome/git/jekyll-tobi/_site:/use/share/nginx/html/"" -p 80:80 nginx ls -al /use/share/nginx/html/ $ docker run --detach --volume="/cygwinHome/git/jekyll-tobi/_site:/usr/share/nginx/html" --publish 8081:80 --name jekyllServer nginx acf5177323fc90c5d97f5c59a598107f20e4deae028b372954cb899d103663d8 $ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES acf5177323fc nginx "nginx -g 'daemon of…" 5 minutes ago Up 5 minutes 0.0.0.0:8081->80/tcp jekyllServer $ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS default * virtualbox Running tcp://192.168.99.100:2376 v18.09.3 $ docker-machine ip default 192.168.99.100 192.168.99.100:8081 192.168.99.100:8081/technik/tool/Bash ``` ## --deprecated-- Docker Toolbox - VirualBox vorbereiten > **Use Docker for Windows instead.** - [Quelle: How to use a directory outside C:\Users with Docker Toolbox/Docker for Windows](https://support.divio.com/local-development/docker/how-to-use-a-directory-outside-cusers-with-docker-toolboxdocker-for-windows) - Docker Toolbox expects that your data volumes will be within C:\Users. This is because Docker has limited access to the filesystem on the host computer. 1. ```docker-machine stop``` 2. VirtualBox --> Shared Folder - cygwinHome - iCloudDrive (boxcryptor) 3. ```docker-machine start``` 4. ```docker-machine ssh``` 5. ```df -h```: ``` /c/Users 930.4G 599.5G 330.9G 64% /c/Users /cygwinHome 930.4G 599.5G 330.9G 64% /cygwinHome /iCloudDrive 930.4G 599.5G 330.9G 64% /iCloudDrive ``` 6. Nun sind 3 Bereiche für Docker Toolbox verwendbar ## Issues ### --deprecated-- Docker Toolbox - localhost / IP adress The issue is that your DOCKER_HOST is not set to localhost, you will need to use the IP address of your docker-machine, since you are using Docker Toolbox: ```docker-machine ip default # should return your IP address``` See [Docker Toolbox Docs](https://docs.docker.com/toolbox/) for more information. ### --deprecated-- Docker w/o VMware 3 Links zum Thema: Docker Desktop vs. Vmware. - Hier die offizielle Diskussion: https://forums.docker.com/t/docker-for-windows-w-vmware-installed/19011 - Hier ein ausführliches HowTo um Vmware wieder zum Laufen zu bekommen (Hyper V in den Windows Features deaktivieren): https://geek2pro.wordpress.com/2017/11/30/solved-vmware-workstation-and-device-credential-guard-not-compatible/ - Hier ein kurzes HowTo um Hyper V in Windows zu aktivieren/deaktivieren: https://www.xcep.net/blog/hyper-v-unter-windows-10-aktivieren-und-deaktivieren/ # *** Related: - [[$-Automatisierung]]