Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
— | linux:docker [2024/04/07 09:26] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Docker ====== | ||
+ | [[https:// | ||
+ | ===== Installation ===== | ||
+ | Quelle: [[https:// | ||
+ | |||
+ | Man holt sich den Key des Repos, installiert diesen und fügt das Repo hinzu. | ||
+ | <code bash> | ||
+ | sudo apt-get install ca-certificates curl gnupg | ||
+ | sudo install -m 0755 -d / | ||
+ | curl -fsSL https:// | ||
+ | sudo chmod a+r / | ||
+ | |||
+ | # Add the repository to Apt sources: | ||
+ | echo \ | ||
+ | "deb [arch=$(dpkg --print-architecture) signed-by=/ | ||
+ | $(. / | ||
+ | sudo tee / | ||
+ | sudo apt-get update</ | ||
+ | |||
+ | Danach wird Docker installiert. | ||
+ | <code bash> | ||
+ | |||
+ | Um die Installation und den Docker-Daemon zu testen, holt man sich den ersten Container und startet diesen. | ||
+ | <code bash> | ||
+ | |||
+ | Grundsätzlich kann man die Installation nun so belassen. Alle Benutzer können, wenn sie dies dürfen, per '' | ||
+ | Dies ist so, da der Daemon über einen Unix-Socket und nicht über einen TCP-Port erreichbar ist. Der Socket gehört dem Benutzer " | ||
+ | Soll jeder Benutzer dies machen dürfen, auch ohne '' | ||
+ | <code bash> | ||
+ | |||
+ | Hat man docker mit '' | ||
+ | <code bash> | ||
+ | sudo chown -R < | ||
+ | sudo chmod -R g+rwx / | ||
+ | |||
+ | ===== Konfiguration ===== | ||
+ | Die Konfiguration des Daemons wird mit Startparametern geregelt. | ||
+ | Diese werden normalerweise über die Datei ''/ | ||
+ | Bei Betriebssystemen mit " | ||
+ | Dazu erstellt man eine override.conf mit folgendem Befehl: | ||
+ | <code bash> | ||
+ | |||
+ | Nun setzen wir z.B. den DNS-Server welcher an die Container übergeben werden soll. | ||
+ | Der Inhalt der override.conf sieht wie folgt aus: | ||
+ | < | ||
+ | ExecStart= | ||
+ | ExecStart=/ | ||
+ | |||
+ | Die leere " | ||
+ | |||
+ | Nun noch Systemd die Änderungen mitteilen und dann den Docker-Daemon neustarten. | ||
+ | <code bash> | ||
+ | systemctl restart docker</ | ||
+ | |||
+ | Note that the empty ExecStart= is required, as systemctl only will overrule the ExecStart if it is cleared first. | ||
+ | |||
+ | ===== Autostart der Container nach Boot ===== | ||
+ | Damit die Docker Container nach einem reboot des Docker Hosts automatisch starten, können folgende Methoden angewandt werden: | ||
+ | - starten über Prozessmanager wie '' | ||
+ | - starten über Docker Restart Policies | ||
+ | |||
+ | ==== Systemd ==== | ||
+ | Quelle: [[https:// | ||
+ | Per Befehl '' | ||
+ | **docker-< | ||
+ | <code bash> | ||
+ | Description=< | ||
+ | Requires=docker.service | ||
+ | After=docker.service | ||
+ | |||
+ | [Service] | ||
+ | Restart=always | ||
+ | ExecStart=/ | ||
+ | ExecStop=/ | ||
+ | |||
+ | [Install] | ||
+ | WantedBy=local.target</ | ||
+ | |||
+ | Erklärung: | ||
+ | '' | ||
+ | '' | ||
+ | |||
+ | Nach dem Erstellen des Service diesen noch '' | ||
+ | <code bash> | ||
+ | systemctl enable docker-< | ||
+ | |||
+ | Gestartet werden kann der neue Service über die üblichen '' | ||
+ | |||
+ | ==== Restart Policies ==== | ||
+ | Quelle: [[https:// | ||
+ | |||
+ | Mit dem '' | ||
+ | <code bash> | ||
+ | |||
+ | ^ Restart Policy ^ Beschreibung ^ | ||
+ | | no | Do not automatically restart the container. (the default) | | ||
+ | | on-failure | Restart the container if it exits due to an error, which manifests as a non-zero exit code. | | ||
+ | | always | Always restart the container if it stops. If it is manually stopped, it is restarted only when Docker daemon restarts or the container itself is manually restarted. (See the second bullet listed in restart policy details) | | ||
+ | | unless-stopped | Similar to always, except that when the container is stopped (manually or otherwise), it is not restarted even after Docker daemon restarts. | | ||
+ | |||
+ | Mit foldendem Befehl kann man sehen welche Restart Policy aktuell im jew. Container gesetzt ist: | ||
+ | <code bash> | ||
+ | |||
+ | ===== Debug ===== | ||
+ | Mit der Startoption '' | ||
+ | Danach startet man die Log-Ansicht für einen Container wie folgt: | ||
+ | <code bash> | ||
+ | |||
+ | ===== RUN, ENTRYPOINT, CMD ===== | ||
+ | Die Befehle '' | ||
+ | |||
+ | Grundsätzlich können diese Befehle als Exec und Shell Format übergeben werden. | ||
+ | |||
+ | **Exec**: | ||
+ | Beispiel < | ||
+ | * Im Exec Format wir der Befehl direkt so ausgeführt. Mit '' | ||
+ | * Wenn Bash ausgeführt werden muss, so sollte dies im Exec Format geschehen. Hier lassen sich Parameter eindeutig übergeben. | ||
+ | **Shell**: | ||
+ | Beispiel < | ||
+ | * Im Shell Format wird der Befehl mit Shell (''/ | ||
+ | * kann verwendet werden um mehrere gleiche Befehlszeilen zu minimieren \\ Beispiel: < | ||
+ | nginx \ | ||
+ | mysql</ | ||
+ | |||
+ | ^ Befehl ^ Beschreibung ^ kann mehrmals \\ verwendet werden ^ | ||
+ | | RUN | * wird verwendet um Befehle beim erstellen eines Images auszuführen | ja | | ||
+ | | Entrypoint | * wird verwendet um Befehle nach dem Start des Containers auszuführen \\ * wird auch ausgeführt wenn der '' | ||
+ | | CMD | * wird verwendet um eine Standard Befehl nach dem start des Containers abzusetzen \\ * Wenn beim '' | ||
+ | ===== Konfigurationsparameter ===== | ||
+ | Mögliche Parameter für Konfigurationen können in den Reference-Docs unter docker.com eingesehen werden [[https:// | ||
+ | |||
+ | ===== Nützliche Befehle ===== | ||
+ | dem Befehl '' | ||
+ | |||
+ | ^ Parameter ^ Beschreibung ^ | ||
+ | | | | | ||
+ | | --version | zeigt die Version von Docker in Kurzfassung | | ||
+ | | version | zeigt die Version von Docker ausführlich | | ||
+ | | ps | zeigt laufende Container | | ||
+ | | build -t < | ||
+ | | run | startet ein Image | | ||
+ | | run -p 8080:80 < | ||
+ | | run -d < | ||
+ | | container ls | listet alle laufenden Container auf | | ||
+ | | container ls -a | listet alle Container auf (gestartet oder gestoppt) | | ||
+ | | container stop < | ||
+ | | container kill < | ||
+ | | container rm < | ||
+ | | container rm $(docker container ls -a -q) | löscht alle Container vom Server | | ||
+ | | image ls | zeigt vorhandene Images | | ||
+ | | image ls -a | zeigt alle Images | | ||
+ | | image rm < | ||
+ | | image rm $(docker image ls -a -q) | löscht alle Images vom Server | | ||
+ | | logs < | ||
+ | | inspect < | ||
+ | | attach < | ||
+ | | exec -it < | ||
+ | |||
+ | ===== Netzwerk ===== | ||
+ | Docker verfügt über folgende Treiber für die Netzwerkanbindung eines Containers: | ||
+ | |||
+ | ^ Treiber ^ Beschreibung ^ | ||
+ | | bridge | Das ist der Standard, wenn ein Container erstellt wird; befindet sich im NET-Netz hinter der Host Adresse | | ||
+ | | host | Nutzt die Netzwerkschnittstelle des Hosts und ist direkt an dessen IP-Adresse gebunden | | ||
+ | | overlay | Wird verwendet wenn mehrere Docker Hosts sich ein Container-Netzwerk teilen sollen | | ||
+ | | macvlan | Layer 3 Netzwerk; kann verwendet werden um Container direkt an das Netzwerk mit einer eigenen IP-Adresse anzubinden (z.B. mehrere VLANs ) \\ Es können für die Container Netzwerschnittstelle IP-Adressen oder MAC-Adressen definiert werden | | ||
+ | | iplan | ähnlich wie macvlan der nur Layer 2 | | ||
+ | |||
+ | Möchte man die IP-Adressen eines Containers ausgeben lassen, dann macht man das mit '' | ||
+ | Sollen alle IP-Adressen aller Container ausgegeben werden, so kann man diesen Befehl verwenden. | ||
+ | Hierbei muss beachtet werden, wie der Container angebunden ist, so ist der Befehl ggf. anzupassen. | ||
+ | <code bash> | ||
+ | |||
+ | ==== MACVLAN ==== | ||
+ | Bei einem macvlan Netzwerk, werden die Container direkt im Netzwerk behandelt wie jeder normale Host. Sie sind quasi mit einer eigenen Netzwerkschnittstelle im Netzwerk präsent. | ||
+ | Container können mit dem Parameter '' | ||
+ | Soll ein DHCP-Server die IP-Adressen verwalten, so muss man bedenken, dass sich die MAC-Adresse eines Containers ändert, wenn dieser oder der Docker-Daemon neugestartet wird. | ||
+ | Dies kann mit dem Parameter '' | ||
+ | |||
+ | MAC-Adressen werden vom Docker-Daemon generiert. Hier ein Auszug aus der [[https:// | ||
+ | You can set the container’s MAC address explicitly by providing a MAC address via the --mac-address parameter (format: | ||
+ | Be aware that Docker does not check if manually specified MAC addresses are unique.</ | ||
+ | |||
+ | Eine einzigartige MAC-Adresse kann sich man aber relativ leicht zusammenstellen. | ||
+ | Wie immer geben die ersten 3 Stellen der MAC-Adresse den Hersteller (also die OUI => Organizationally Unique Identifier, „organisatorisch eindeutige Kennung“) an, bei Docker ist dies aber nicht der Fall. | ||
+ | Ein Docker-Daemon hat in diesem Fall die ersten 2 Stellen generiert, es geht also nur um die letzten 4 Stellen. | ||
+ | |||
+ | Dazu nimmt man einen Dezimal / Hexadezimal Rechner und wandelt die letzten 4 Oktette der IP-Adresse des Containers um. | ||
+ | |||
+ | Beispiel: | ||
+ | generierte MAC-Adresse: | ||
+ | Hier sind die Stellen '' | ||
+ | Dies ist die IP-Adresse des Containers. | ||
+ | |||
+ | Hat man einen DCHP-Server, | ||
+ | Danach rechnet man diese in Hexadezimal um und erhält somit die eindeutige MAC-Adresse. | ||
+ | |||
+ | === Route von/zu Docker-Host === | ||
+ | Generell sind Docker Container, welche sich in einem macvlan befinden, vom Docker Host isoliert (obwohl beide vielleicht im selben Subnetz sind. | ||
+ | Damit man die Verbindung wiederherstellen kann, muss eine Netzworkbridge mit einer entspr. Route zum Container/ | ||
+ | Hier ein Beispiel (Quelle: [[https:// | ||
+ | < | ||
+ | ip addr add < | ||
+ | ip link set < | ||
+ | ip route add < | ||
+ | ===== Images und Container ===== | ||
+ | |||
+ | Images werden in Layer aufgeteilt. Einzelne Anweisungen im Dockerfile führen dazu, dass verschieden viele Layer erzeugt werden. Diese Layer sind alle schreibgeschützt. | ||
+ | Erst wenn der Container mit seinem Befehl gestartet wird, erzeugt er einen neuen eigenen letzen Layer, welcher beschrieben werden kann. | ||
+ | Dieser enthält die Daten welche zur Laufzeit hinzugekommen/ | ||
+ | |||
+ | ==== Erstellen ==== | ||
+ | Um ein Image zu erstellen, benötigt man eine Datei namens '' | ||
+ | Alle benötigten Dateien zum Erstellen eines Images, sollten sich in einem eigenen Ordner befinden. | ||
+ | |||
+ | Beispiel zum Erstellen eines Images mit Nginx und PHP: | ||
+ | <code bash> | ||
+ | cd nginx-php</ | ||
+ | |||
+ | === Konfigurationsdateien === | ||
+ | Folgende Dateien müssen erstellt und mit Inhalt gefüllt werden. | ||
+ | |||
+ | **Erklärung** | ||
+ | ^ Datei ^ Beschreibung ^ | ||
+ | | Dockerfile | * steuert das Erstellen des Images und das Startverhalten des Containers | | ||
+ | | package.list | * enthält die, in das Image, zu installierenden Pakete | | ||
+ | | startup.sh | * Startscript welches nach dem Starten des Containers ausgeführt wird \\ * hier werden die Daemons für nginx und php gestartet \\ * der letzte Befehl ist dafür da, damit das Script und somit auch der Container dauerhaft läuft | | ||
+ | | nginx.conf | * Konfiguration für nginx | | ||
+ | | my-website-conf | * Konfiguration für Webseite | | ||
+ | | fastcgi-php.conf | * Konfiguration für php und fastcgi | | ||
+ | | snakeoil.conf | * Konfiguration für die SSL Verschlüsselung mit Snakeoil Zertifikaten | | ||
+ | | ssl-cert-snakeoil.key | * SSL Zertifikat von Snakeoil | | ||
+ | | ssl-cert-snakeoil.pem | * SSL privater Schlüssel von Snakeoil | | ||
+ | | ssl-conf | * Konfiguration für SSL verschlüsselte Webseiten | | ||
+ | | dhparam.pem | * Diffie Hellmann Schlüssel | | ||
+ | | index.php | * Startseite | | ||
+ | | phpinfo.php | * PHP-Info Webseite | | ||
+ | | hallo.html | * SSL verschlüsselte Webseite | | ||
+ | |||
+ | * '' | ||
+ | |||
+ | # Define environment variable | ||
+ | ENV WWW_DIR / | ||
+ | ENV TERM xterm | ||
+ | ENV PATH / | ||
+ | ENV DEBIAN_FRONTEND noninteractive | ||
+ | # set Timezone with `--build-arg TIMEZONE=Europe/ | ||
+ | ARG TIMEZONE | ||
+ | |||
+ | # Set the working directory to / | ||
+ | WORKDIR / | ||
+ | |||
+ | # Copy files | ||
+ | ADD *.html / | ||
+ | ADD *.php / | ||
+ | ADD package.list /tmp | ||
+ | ADD timezone /etc | ||
+ | |||
+ | # Install any needed packages specified in requirements.txt | ||
+ | RUN \ | ||
+ | apt update && \ | ||
+ | apt upgrade -y && \ | ||
+ | apt install -y apt-utils && \ | ||
+ | cat / | ||
+ | |||
+ | # set Timezone | ||
+ | RUN if [ ! -z " | ||
+ | then ln -sf / | ||
+ | dpkg-reconfigure -f noninteractive tzdata; \ | ||
+ | fi | ||
+ | |||
+ | # Create directories | ||
+ | RUN mkdir -p / | ||
+ | # Install Snakeoil Cert and Key | ||
+ | ADD ssl-cert-snakeoil.pem / | ||
+ | ADD ssl-cert-snakeoil.key / | ||
+ | |||
+ | # Copy Nginx Configs | ||
+ | ADD nginx.conf /etc/nginx/ | ||
+ | ADD fastcgi-php.conf / | ||
+ | ADD snakeoil.conf / | ||
+ | ADD dhparam.pem / | ||
+ | ADD ssl-conf / | ||
+ | ADD my-website-conf / | ||
+ | ADD startup.sh / | ||
+ | RUN \ | ||
+ | ln -s / | ||
+ | unlink / | ||
+ | |||
+ | # Define mountable directories. | ||
+ | VOLUME ["/ | ||
+ | |||
+ | # Make ports 80 and 443 available | ||
+ | EXPOSE 80 | ||
+ | EXPOSE 443 | ||
+ | |||
+ | ENTRYPOINT ["/ | ||
+ | * '' | ||
+ | * '' | ||
+ | while ! pgrep nginx; do | ||
+ | service nginx start | ||
+ | sleep 1 | ||
+ | done | ||
+ | while ! pgrep php-fpm; do | ||
+ | service php7.2-fpm start | ||
+ | sleep 1 | ||
+ | done | ||
+ | tail -f / | ||
+ | * '' | ||
+ | worker_processes auto; | ||
+ | pid / | ||
+ | include / | ||
+ | |||
+ | events { | ||
+ | worker_connections 768; | ||
+ | # multi_accept on; | ||
+ | } | ||
+ | |||
+ | http { | ||
+ | |||
+ | ## | ||
+ | # Basic Settings | ||
+ | ## | ||
+ | |||
+ | sendfile on; | ||
+ | tcp_nopush on; | ||
+ | tcp_nodelay on; | ||
+ | keepalive_timeout 65; | ||
+ | types_hash_max_size 2048; | ||
+ | # server_tokens off; | ||
+ | |||
+ | # server_names_hash_bucket_size 64; | ||
+ | # server_name_in_redirect off; | ||
+ | |||
+ | include / | ||
+ | default_type application/ | ||
+ | |||
+ | ## | ||
+ | # SSL Settings | ||
+ | ## | ||
+ | |||
+ | ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE | ||
+ | ssl_prefer_server_ciphers on; | ||
+ | |||
+ | ## | ||
+ | # Logging Settings | ||
+ | ## | ||
+ | |||
+ | access_log / | ||
+ | error_log / | ||
+ | |||
+ | ## | ||
+ | # Gzip Settings | ||
+ | ## | ||
+ | |||
+ | gzip on; | ||
+ | |||
+ | ## FCGI: Detect when HTTPS is used | ||
+ | map $scheme $fastcgi_https { | ||
+ | default off; | ||
+ | https on; | ||
+ | } | ||
+ | |||
+ | upstream php { | ||
+ | server unix:/ | ||
+ | } | ||
+ | |||
+ | upstream fcgiwrap { | ||
+ | server unix:/ | ||
+ | } | ||
+ | |||
+ | ## | ||
+ | # Virtual Host Configs | ||
+ | ## | ||
+ | |||
+ | include / | ||
+ | include / | ||
+ | }</ | ||
+ | * '' | ||
+ | listen 80; | ||
+ | |||
+ | server_name _; | ||
+ | |||
+ | root / | ||
+ | index index.html index.htm index.php; | ||
+ | |||
+ | location / { | ||
+ | index index.html index.htm index.php; | ||
+ | try_files $uri $uri/ /index.php; | ||
+ | } | ||
+ | |||
+ | location ~ \.php$ { | ||
+ | include snippets/ | ||
+ | try_files $fastcgi_script_name =404; | ||
+ | } | ||
+ | |||
+ | # We don't want to allow the browsers to see .hidden linux/unix files | ||
+ | location ~ /\. { deny all; access_log off; log_not_found off; } | ||
+ | |||
+ | } | ||
+ | |||
+ | server { | ||
+ | listen 443 ssl; | ||
+ | include snippets/ | ||
+ | include / | ||
+ | |||
+ | root / | ||
+ | index index.html index.htm index.php; | ||
+ | |||
+ | server_name _; | ||
+ | |||
+ | location / { | ||
+ | index index.php; | ||
+ | try_files $uri $uri/ /index.php; | ||
+ | } | ||
+ | |||
+ | location ~ \.php$ { | ||
+ | include snippets/ | ||
+ | try_files $fastcgi_script_name =404; | ||
+ | } | ||
+ | |||
+ | # We don't want to allow the browsers to see .hidden linux/unix files | ||
+ | location ~ /\. { deny all; access_log off; log_not_found off; } | ||
+ | |||
+ | }</ | ||
+ | * '' | ||
+ | fastcgi_split_path_info ^(.+\.php)(/ | ||
+ | |||
+ | # Check that the PHP script exists before passing it | ||
+ | #try_files $fastcgi_script_name =404; | ||
+ | |||
+ | # Bypass the fact that try_files resets $fastcgi_path_info | ||
+ | # see: http:// | ||
+ | set $path_info $fastcgi_path_info; | ||
+ | fastcgi_param PATH_INFO $path_info; | ||
+ | |||
+ | fastcgi_param | ||
+ | fastcgi_param | ||
+ | fastcgi_param | ||
+ | fastcgi_param | ||
+ | fastcgi_param | ||
+ | |||
+ | fastcgi_param | ||
+ | fastcgi_param | ||
+ | fastcgi_param | ||
+ | fastcgi_param | ||
+ | fastcgi_param | ||
+ | fastcgi_param | ||
+ | fastcgi_param | ||
+ | |||
+ | fastcgi_param | ||
+ | fastcgi_param | ||
+ | |||
+ | fastcgi_param | ||
+ | fastcgi_param | ||
+ | fastcgi_param | ||
+ | fastcgi_param | ||
+ | fastcgi_param | ||
+ | |||
+ | # PHP only, required if PHP was built with --enable-force-cgi-redirect | ||
+ | fastcgi_param | ||
+ | |||
+ | fastcgi_index index.php; | ||
+ | |||
+ | fastcgi_pass unix:/ | ||
+ | fastcgi_read_timeout 240;</ | ||
+ | * '' | ||
+ | # Don't use them in a production server! | ||
+ | |||
+ | ssl_certificate / | ||
+ | ssl_certificate_key / | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | ssl_protocols TLSv1 TLSv1.1 TLSv1.2; | ||
+ | |||
+ | #HSTS Security | ||
+ | add_header Strict-Transport-Security max-age=15768000; | ||
+ | |||
+ | ssl_session_timeout 1d; | ||
+ | ssl_session_cache shared: | ||
+ | |||
+ | # openssl dhparam -out dhparam.pem 2048 | ||
+ | ssl_dhparam / | ||
+ | |||
+ | ## | ||
+ | ssl_ciphers ' | ||
+ | ssl_prefer_server_ciphers on;</ | ||
+ | * '' | ||
+ | * '' | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | * '' | ||
+ | // Zeigt alle Informationen (Standardwert ist INFO_ALL) | ||
+ | phpinfo(); | ||
+ | ?></ | ||
+ | * '' | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | === Build and Run === | ||
+ | Nun kann man das Docker-Image bauen lassen. Dazu führt man folgenden Befehl aus: | ||
+ | <code bash> | ||
+ | Mit folgendem Befehl sieht man das nun erstellte Image | ||
+ | <code bash> | ||
+ | Das Images ist nun erstellt. Nun kann man seinen Docker-Container starten. | ||
+ | <code bash> | ||
+ | Zur Erklärung der Parameter: | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | Der Container sollte nun dauerhaft laufen und die Ports 80 und 443 nach außen bereitstellen. | ||
+ | Man kann nun im Webbrowser die URL [[http://< | ||
+ | |||
+ | Der folgende Befehl zeigt alle laufenden Container. | ||
+ | <code bash> | ||
+ | |||
+ | Dieser Befehl beendet den jew. Container | ||
+ | <code bash> | ||
+ | |||
+ | |||
+ | ===== Volumes ===== | ||
+ | Damit man wegen Konfigurationsänderungen nicht ständig zum Container verbinden muss, erstellt man sich Docker-Volumes und mountet diese mit den Volumes welche im Dockerfile angegeben wurden. | ||
+ | Die Volumes werden folgendermaßen angelegt: | ||
+ | <code bash> | ||
+ | |||
+ | Der Docker Container wird dann so gestartet: | ||
+ | <code bash> | ||
+ | Zur Erklärung der Parameter: | ||
+ | * '' | ||
+ | * im Dockerfile werden Verzeichnisse im Parameter '' | ||
+ | |||
+ | ===== Docker umziehen ===== | ||
+ | Wenn Container/ | ||
+ | Laufzeitdaten können in Images oder aber auch auf Volumes liegen. | ||
+ | Weiterhin ist es absolut wichtig, dass der Container wieder so gestartet wird, wie auf dem ursprünglichen Host. | ||
+ | Man muss also den Befehl für '' | ||
+ | Darüber kann man sich sein run Befehl zusammenbasteln. | ||
+ | |||
+ | * **Volumes**: | ||
+ | * **Container**: | ||
+ | * **Image**: Wenn ein Image umzieht, beinhaltet das Tar nur die Daten des Images. Mit dem Befehl '' | ||
+ | |||
+ | * Save/Load | ||
+ | * **sichern** <code bash> | ||
+ | * **importieren** <code bash> | ||
+ | |||
+ | * Export/ | ||
+ | * **sichern** <code bash> | ||
+ | * **importieren** <code bash> | ||
+ | |||
+ | ===== Portainer ===== | ||
+ | Portainer ist ein Docker Management Tool, welches auch als Container läuft. | ||
+ | Siehe [[https:// | ||
+ | ==== Installation ==== | ||
+ | <code bash> | ||
+ | $ docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v / | ||
+ | ==== Upgrade ==== | ||
+ | <code bash> | ||
+ | docker pull portainer/ | ||
+ | docker container rm portainer</ | ||
+ | Danach einfach Portainer wie bei der Installation beschrieben, |