<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[Joopi - Docker]]></title>
		<link>https://forum.hermann-splitthoff.de/</link>
		<description><![CDATA[Joopi - https://forum.hermann-splitthoff.de]]></description>
		<pubDate>Thu, 23 Apr 2026 10:23:36 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[Docker neues handling 20221105]]></title>
			<link>https://forum.hermann-splitthoff.de/showthread.php?tid=1379</link>
			<pubDate>Sat, 23 Nov 2024 19:57:17 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.hermann-splitthoff.de/member.php?action=profile&uid=1">Joopi</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.hermann-splitthoff.de/showthread.php?tid=1379</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b"><span style="color: #0074d9;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Neue Erkenntnisse</span></span></span><br />
<br />
Heute, am 05.11.2022, habe ich mich wieder intensiver mit Docker und dessen Möglichkeiten für mich befasst.<br />
<br />
Im Moment möchte ich hier nur einige Befehl hineinkopieren, die wichtig sind.<br />
<br />
In dem Docker-Projektordner kann der Container so gestartet werden, dass man ein Volume erstellt, welche Daten vom Host im Container zur Verfügung stellt.<br />
Es können naütrlich auch Ordner als Volumes zur Verfügung gestellt werden, die außerhalb des Projektordners liegen. Dann muss er eingebunden werden wie im zweiten Befehl.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker run -it --name ubuntu -v "&#36;(pwd):/home" ubuntu:22.04 bash</code></div></div><br />
oder<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker run -it --name ubuntu -v "/media/django/webserver/dockerdaten/ubuntu2204:/home" ubuntu:22.04 bash</code></div></div><br />
Ein Container, der nur einen Service zur Verfügung stellt, wie z.B. ein Webserver, sollte <span style="font-weight: bold;" class="mycode_b">detached</span> gestartet werden. Dadurch wird die Konsole wieder frei und wird nicht durch den laufenden Container blockiert. Der Webserver muss ja nur im Hintergrund laufen.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Hinweis:</span><br />
<br />
Ein Container sollte nur immer einen Prozess abbilden. Wird ein CMS und eine MySQL-Datenbank benötigt, sind zwei Container erforderlich.<br />
Diese Container können dann über eine Datei mit dem Namen <span style="font-weight: bold;" class="mycode_b">docker-compose.yaml</span> zusammengeführt werden. Die Startreihenfolge wird durch die Abhängigkeit des einen Prozess vom anderen Prozess bestimmt. Aber es laufen zwei Container!<br />
<br />
Wenn ich in einen laufenden Container einsteigen möchte, der im detached-Modus läuft, so muss sich folgenden Befehl absetzen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker attach &lt;container&gt;</code></div></div><br />
demnach<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker attach 80da9e62d78e</code></div></div><br />
Temporärer Befehl<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker run -it --name meinubuntu --network meinnetwork -v meinvolume:/home ubuntu:22.04 bash</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color">Update am 07.11.2022</span></span><br />
<br />
Heute habe ich verstanden, dass gestoppte Container nicht nutzlos sind, sondern über <br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker start --attach container-id</code></div></div><br />
wieder genutzt werden können.<br />
<br />
Man soll zwar in Containern nicht produktiv arbeiten, aber bei entsprechender Vorsicht können in den Containern Arbeitsstände *dauerhaft* zur Verfügung gestellt werden.<br />
<br />
Das sind 15 Dockerbefehle, die man im Alltag gebrauchen kann<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #9a00b2;" class="mycode_color">Docker-Befehle</span></span><br />
<ul class="mycode_list"><li><a href="https://geekflare.com/de/docker-manage-containers/#geekflare-toc-run-command" target="_blank" rel="noopener" class="mycode_url">run Command</a><br />
</li>
<li><a href="https://geekflare.com/de/docker-manage-containers/#geekflare-toc-ps-command" target="_blank" rel="noopener" class="mycode_url">ps Command</a><br />
</li>
<li><a href="https://geekflare.com/de/docker-manage-containers/#geekflare-toc-ls-command" target="_blank" rel="noopener" class="mycode_url">ls Command</a><br />
</li>
<li><a href="https://geekflare.com/de/docker-manage-containers/#geekflare-toc-stop-command" target="_blank" rel="noopener" class="mycode_url">stop Command</a><br />
</li>
<li><a href="https://geekflare.com/de/docker-manage-containers/#geekflare-toc-rm-command" target="_blank" rel="noopener" class="mycode_url">rm Command</a><br />
</li>
<li><a href="https://geekflare.com/de/docker-manage-containers/#geekflare-toc-exec-command" target="_blank" rel="noopener" class="mycode_url">exec Command</a><br />
</li>
<li><a href="https://geekflare.com/de/docker-manage-containers/#geekflare-toc-logs-command" target="_blank" rel="noopener" class="mycode_url">logs Command</a><br />
</li>
<li><a href="https://geekflare.com/de/docker-manage-containers/#geekflare-toc-cp-command" target="_blank" rel="noopener" class="mycode_url">cp Command</a><br />
</li>
<li><a href="https://geekflare.com/de/docker-manage-containers/#geekflare-toc-export-command" target="_blank" rel="noopener" class="mycode_url">export Command</a><br />
</li>
<li><a href="https://geekflare.com/de/docker-manage-containers/#geekflare-toc-inspect-command" target="_blank" rel="noopener" class="mycode_url">inspect Command</a><br />
</li>
<li><a href="https://geekflare.com/de/docker-manage-containers/#geekflare-toc-kill-command" target="_blank" rel="noopener" class="mycode_url">kill Command</a><br />
</li>
<li><a href="https://geekflare.com/de/docker-manage-containers/#geekflare-toc-stats-command" target="_blank" rel="noopener" class="mycode_url">stats Command</a><br />
</li>
<li><a href="https://geekflare.com/de/docker-manage-containers/#geekflare-toc-top-command" target="_blank" rel="noopener" class="mycode_url">top Command</a><br />
</li>
<li><a href="https://geekflare.com/de/docker-manage-containers/#geekflare-toc-rename-command" target="_blank" rel="noopener" class="mycode_url">rename Command</a><br />
</li>
<li><a href="https://geekflare.com/de/docker-manage-containers/#geekflare-toc-diff-command" target="_blank" rel="noopener" class="mycode_url">diff Command</a><br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #9a00b2;" class="mycode_color">Optionen</span></span><br />
<br />
Beim run-Befehl wird die Option <span style="font-weight: bold;" class="mycode_b">-it</span> angegeben. Diese Option steht für:<br />
<ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">-i</span> = interaktiver Modus<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">-t</span> = Shell als Standardinput-Gerät<br />
</li>
</ul>
<br />
Wenn beim run-Befehl die Option <span style="font-weight: bold;" class="mycode_b">-d</span> angegebenn wird, so wird der Container als *dameon* gestartet und kann grundsätzlich nicht zu sehen. Will man in einem Hintergrundcontainer etwas tun, so muss mit<br />
<ul class="mycode_list"><li>docker exec (docker exec –it {container} {command})<br />
</li>
<li>docker attach (docker attach {container})<br />
</li>
</ul>
<br />
in den Container verzweigt werden.]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b"><span style="color: #0074d9;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Neue Erkenntnisse</span></span></span><br />
<br />
Heute, am 05.11.2022, habe ich mich wieder intensiver mit Docker und dessen Möglichkeiten für mich befasst.<br />
<br />
Im Moment möchte ich hier nur einige Befehl hineinkopieren, die wichtig sind.<br />
<br />
In dem Docker-Projektordner kann der Container so gestartet werden, dass man ein Volume erstellt, welche Daten vom Host im Container zur Verfügung stellt.<br />
Es können naütrlich auch Ordner als Volumes zur Verfügung gestellt werden, die außerhalb des Projektordners liegen. Dann muss er eingebunden werden wie im zweiten Befehl.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker run -it --name ubuntu -v "&#36;(pwd):/home" ubuntu:22.04 bash</code></div></div><br />
oder<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker run -it --name ubuntu -v "/media/django/webserver/dockerdaten/ubuntu2204:/home" ubuntu:22.04 bash</code></div></div><br />
Ein Container, der nur einen Service zur Verfügung stellt, wie z.B. ein Webserver, sollte <span style="font-weight: bold;" class="mycode_b">detached</span> gestartet werden. Dadurch wird die Konsole wieder frei und wird nicht durch den laufenden Container blockiert. Der Webserver muss ja nur im Hintergrund laufen.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Hinweis:</span><br />
<br />
Ein Container sollte nur immer einen Prozess abbilden. Wird ein CMS und eine MySQL-Datenbank benötigt, sind zwei Container erforderlich.<br />
Diese Container können dann über eine Datei mit dem Namen <span style="font-weight: bold;" class="mycode_b">docker-compose.yaml</span> zusammengeführt werden. Die Startreihenfolge wird durch die Abhängigkeit des einen Prozess vom anderen Prozess bestimmt. Aber es laufen zwei Container!<br />
<br />
Wenn ich in einen laufenden Container einsteigen möchte, der im detached-Modus läuft, so muss sich folgenden Befehl absetzen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker attach &lt;container&gt;</code></div></div><br />
demnach<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker attach 80da9e62d78e</code></div></div><br />
Temporärer Befehl<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker run -it --name meinubuntu --network meinnetwork -v meinvolume:/home ubuntu:22.04 bash</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color">Update am 07.11.2022</span></span><br />
<br />
Heute habe ich verstanden, dass gestoppte Container nicht nutzlos sind, sondern über <br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker start --attach container-id</code></div></div><br />
wieder genutzt werden können.<br />
<br />
Man soll zwar in Containern nicht produktiv arbeiten, aber bei entsprechender Vorsicht können in den Containern Arbeitsstände *dauerhaft* zur Verfügung gestellt werden.<br />
<br />
Das sind 15 Dockerbefehle, die man im Alltag gebrauchen kann<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #9a00b2;" class="mycode_color">Docker-Befehle</span></span><br />
<ul class="mycode_list"><li><a href="https://geekflare.com/de/docker-manage-containers/#geekflare-toc-run-command" target="_blank" rel="noopener" class="mycode_url">run Command</a><br />
</li>
<li><a href="https://geekflare.com/de/docker-manage-containers/#geekflare-toc-ps-command" target="_blank" rel="noopener" class="mycode_url">ps Command</a><br />
</li>
<li><a href="https://geekflare.com/de/docker-manage-containers/#geekflare-toc-ls-command" target="_blank" rel="noopener" class="mycode_url">ls Command</a><br />
</li>
<li><a href="https://geekflare.com/de/docker-manage-containers/#geekflare-toc-stop-command" target="_blank" rel="noopener" class="mycode_url">stop Command</a><br />
</li>
<li><a href="https://geekflare.com/de/docker-manage-containers/#geekflare-toc-rm-command" target="_blank" rel="noopener" class="mycode_url">rm Command</a><br />
</li>
<li><a href="https://geekflare.com/de/docker-manage-containers/#geekflare-toc-exec-command" target="_blank" rel="noopener" class="mycode_url">exec Command</a><br />
</li>
<li><a href="https://geekflare.com/de/docker-manage-containers/#geekflare-toc-logs-command" target="_blank" rel="noopener" class="mycode_url">logs Command</a><br />
</li>
<li><a href="https://geekflare.com/de/docker-manage-containers/#geekflare-toc-cp-command" target="_blank" rel="noopener" class="mycode_url">cp Command</a><br />
</li>
<li><a href="https://geekflare.com/de/docker-manage-containers/#geekflare-toc-export-command" target="_blank" rel="noopener" class="mycode_url">export Command</a><br />
</li>
<li><a href="https://geekflare.com/de/docker-manage-containers/#geekflare-toc-inspect-command" target="_blank" rel="noopener" class="mycode_url">inspect Command</a><br />
</li>
<li><a href="https://geekflare.com/de/docker-manage-containers/#geekflare-toc-kill-command" target="_blank" rel="noopener" class="mycode_url">kill Command</a><br />
</li>
<li><a href="https://geekflare.com/de/docker-manage-containers/#geekflare-toc-stats-command" target="_blank" rel="noopener" class="mycode_url">stats Command</a><br />
</li>
<li><a href="https://geekflare.com/de/docker-manage-containers/#geekflare-toc-top-command" target="_blank" rel="noopener" class="mycode_url">top Command</a><br />
</li>
<li><a href="https://geekflare.com/de/docker-manage-containers/#geekflare-toc-rename-command" target="_blank" rel="noopener" class="mycode_url">rename Command</a><br />
</li>
<li><a href="https://geekflare.com/de/docker-manage-containers/#geekflare-toc-diff-command" target="_blank" rel="noopener" class="mycode_url">diff Command</a><br />
</li>
</ul>
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #9a00b2;" class="mycode_color">Optionen</span></span><br />
<br />
Beim run-Befehl wird die Option <span style="font-weight: bold;" class="mycode_b">-it</span> angegeben. Diese Option steht für:<br />
<ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">-i</span> = interaktiver Modus<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">-t</span> = Shell als Standardinput-Gerät<br />
</li>
</ul>
<br />
Wenn beim run-Befehl die Option <span style="font-weight: bold;" class="mycode_b">-d</span> angegebenn wird, so wird der Container als *dameon* gestartet und kann grundsätzlich nicht zu sehen. Will man in einem Hintergrundcontainer etwas tun, so muss mit<br />
<ul class="mycode_list"><li>docker exec (docker exec –it {container} {command})<br />
</li>
<li>docker attach (docker attach {container})<br />
</li>
</ul>
<br />
in den Container verzweigt werden.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Docker handling compose]]></title>
			<link>https://forum.hermann-splitthoff.de/showthread.php?tid=1378</link>
			<pubDate>Sat, 23 Nov 2024 19:55:51 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.hermann-splitthoff.de/member.php?action=profile&uid=1">Joopi</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.hermann-splitthoff.de/showthread.php?tid=1378</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b"><span style="color: #0074d9;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Infos zum Handling von Docker-Compose</span></span></span><br />
<br />
Wenn das Docker-Compose-File genutzt wird, entfallen einige Aktionen auf der Konsole. Das Stoppen und Löschen von Containern ist nicht notwendig.<br />
<br />
Zum Schluss bleibt im Grunde genommen nur das Image übrig, welches beim neuerlichen Start von Docker-Compose wieder genutzt wird.<br />
<br />
Damit Docker-Compose (separat zu installieren) arbeiten kann, muss im Dockerdatenordner diese Datei liegen (andere Dateinamen sind nicht möglich):<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>docker-compose.yaml</blockquote>
<br />
Der Start erfolgt so als detached Ausführung:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker-compose up -d</code></div></div><br />
oder <br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker-compse -f dateiname.yaml up -d</code></div></div><br />
Das Stoppen erfolgt so:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker-compose stop</code></div></div><br />
Das Herunterfahren erfolgt so:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker-compose down</code></div></div><br />
Sobald Docker-Compose heruntergefahren ist, werden die Container und Netzwerkverbindungen scheinbar beendet und gelöscht.<br />
<br />
Das ist der Ablauf in der Konsole, um meine vorherige Behauptung zu untermauern:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>user@user:/media/django/webserver/dockerdaten&#36; sudo docker-compose down<br />
Removing dockerdaten_meinghost_1 ... done<br />
Removing network dockerdaten_default<br />
user@user:/media/django/webserver/dockerdaten&#36; sudo docker ps -a<br />
CONTAINER ID  IMAGE    COMMAND  CREATED  STATUS    PORTS    NAMES<br />
user@user:/media/django/webserver/dockerdaten&#36; sudo docker container ls -a<br />
CONTAINER ID  IMAGE    COMMAND  CREATED  STATUS    PORTS    NAMES<br />
user@user:/media/django/webserver/dockerdaten&#36; sudo docker image ls<br />
REPOSITORY  TAG      IMAGE ID      CREATED        SIZE<br />
ghost        4        b05a58075ef6  19 hours ago  448MB</code></div></div>]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b"><span style="color: #0074d9;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Infos zum Handling von Docker-Compose</span></span></span><br />
<br />
Wenn das Docker-Compose-File genutzt wird, entfallen einige Aktionen auf der Konsole. Das Stoppen und Löschen von Containern ist nicht notwendig.<br />
<br />
Zum Schluss bleibt im Grunde genommen nur das Image übrig, welches beim neuerlichen Start von Docker-Compose wieder genutzt wird.<br />
<br />
Damit Docker-Compose (separat zu installieren) arbeiten kann, muss im Dockerdatenordner diese Datei liegen (andere Dateinamen sind nicht möglich):<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>docker-compose.yaml</blockquote>
<br />
Der Start erfolgt so als detached Ausführung:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker-compose up -d</code></div></div><br />
oder <br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker-compse -f dateiname.yaml up -d</code></div></div><br />
Das Stoppen erfolgt so:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker-compose stop</code></div></div><br />
Das Herunterfahren erfolgt so:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker-compose down</code></div></div><br />
Sobald Docker-Compose heruntergefahren ist, werden die Container und Netzwerkverbindungen scheinbar beendet und gelöscht.<br />
<br />
Das ist der Ablauf in der Konsole, um meine vorherige Behauptung zu untermauern:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>user@user:/media/django/webserver/dockerdaten&#36; sudo docker-compose down<br />
Removing dockerdaten_meinghost_1 ... done<br />
Removing network dockerdaten_default<br />
user@user:/media/django/webserver/dockerdaten&#36; sudo docker ps -a<br />
CONTAINER ID  IMAGE    COMMAND  CREATED  STATUS    PORTS    NAMES<br />
user@user:/media/django/webserver/dockerdaten&#36; sudo docker container ls -a<br />
CONTAINER ID  IMAGE    COMMAND  CREATED  STATUS    PORTS    NAMES<br />
user@user:/media/django/webserver/dockerdaten&#36; sudo docker image ls<br />
REPOSITORY  TAG      IMAGE ID      CREATED        SIZE<br />
ghost        4        b05a58075ef6  19 hours ago  448MB</code></div></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Docker images Nutzung]]></title>
			<link>https://forum.hermann-splitthoff.de/showthread.php?tid=1377</link>
			<pubDate>Sat, 23 Nov 2024 19:54:26 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.hermann-splitthoff.de/member.php?action=profile&uid=1">Joopi</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.hermann-splitthoff.de/showthread.php?tid=1377</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b"><span style="color: #0074d9;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Hinweise zur Nutzung von Docker Images</span></span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: medium;" class="mycode_size">CouchBase</span></span></span><br />
<br />
<a href="https://hub.docker.com/_/couchbase" target="_blank" rel="noopener" class="mycode_url">CouchBase auf Docker Hub</a><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Step - 1</span>: Run Couchbase Server docker container<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker run -d --name db -p 8091-8094:8091-8094 -p 11210:11210 couchbase</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Step - 2</span>: Next, visit <a href="http://localhost:8091" target="_blank" rel="noopener" class="mycode_url">http://localhost:8091</a> on the host machine to see the Web Console to start Couchbase Server setup.<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: medium;" class="mycode_size">CouchDB</span></span></span><br />
<br />
<a href="https://hub.docker.com/_/couchdb" target="_blank" rel="noopener" class="mycode_url">CouchDB auf Docker Hub</a><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>user@user:~&#36; sudo docker run -d --name my-couchdb couchdb:latest<br />
ead0a152cfefc65ef3921534134b94d7a72cdea59dd876e231f10b5e6ac16de9</code></div></div><br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: large;" class="mycode_size">MongoDB</span></span></span><br />
<br />
<a href="https://hub.docker.com/_/mongo" target="_blank" rel="noopener" class="mycode_url">MongoDB auf Docker Hub</a><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker run --name mymongo -d mongo:5.0.2-focal<br />
eb6ed078e31adca5550c4a242033aa147c29c4bcd7c0b70e8a46cd1b6b919d25</code></div></div><br />
Die für MongoDB gültigen TAG sind hier:<br />
<br />
<a href="https://github.com/docker-library/docs/blob/master/mongo/README.md#supported-tags-and-respective-dockerfile-links" target="_blank" rel="noopener" class="mycode_url">Supported tags and respective Dockerfile links</a><br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Ghost</span></span></span><br />
<br />
<a href="https://hub.docker.com/_/ghost" target="_blank" rel="noopener" class="mycode_url">Ghost - free blogging plattform</a><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker run -d --name myghost ghost<br />
06b77297a1e2fb0871aef98139127ea559e74c764d971e7ac00033a50129ddfe</code></div></div><br />
Will man Zugang im Browser haben, dann ist folgender Befehl erforderlich:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker run -d --name some-ghost -e url=http://localhost:3001 -p 3001:2368 ghost</code></div></div><br />
Im Browser ist dann das einzugeben: <a href="http://localhost:3001" target="_blank" rel="noopener" class="mycode_url">http://localhost:3001</a><br />
<br />
und für den Adminzugang ist das einzugeben: <a href="http://localhost:3001/ghost" target="_blank" rel="noopener" class="mycode_url">http://localhost:3001/ghost</a><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Container löschen und neu erstellen</span><br />
<br />
Sobald der Container beendet ist, kann er gelöscht werden, da man nur mit einem neuen run-Befehl den Container später über den gewünschten Port im Browser ansprechen kann. Daher ist es wichtig, dass Anwenderdaten nicht im Container, sondern in einem Volumen gespeichert werden.<br />
<br />
Das ist der Ablauf, um einen laufenden Container zu beenden und dann wieder später nutzbar zu machen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>user@user:~&#36; sudo docker stop meinghost<br />
[sudo] Passwort für django: <br />
meinghost<br />
user@user:~&#36; sudo docker container rm meinghost<br />
meinghost<br />
user@user:~&#36; sudo docker run -d --name meinghost -e url=http://localhost:3001 -p 3001:2368 -v /media/django/webserver/dockerdaten/ghost:/var/lib/ghost/content ghost<br />
7cb325446ab4ab7476dfe274b3a90dc5dca7ee281f4b3d66ed3583f6e56b3171</code></div></div><br />
Im Standard nutzt Ghost SQLite als Datenbank. Die Einbindung von MySQL ist aber auch möglich und auf der Ghost-Dockerseite beschrieben.<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Golang</span></span></span><br />
<br />
<a href="https://hub.docker.com/_/golang" target="_blank" rel="noopener" class="mycode_url">golang Official Image Go (golang) is a general purpose, higher-level, imperative programming language.</a><br />
<br />
Es ist wohl ein DockerFile notwendig, um dieses Image im Container laufen lassen zu können.]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b"><span style="color: #0074d9;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Hinweise zur Nutzung von Docker Images</span></span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: medium;" class="mycode_size">CouchBase</span></span></span><br />
<br />
<a href="https://hub.docker.com/_/couchbase" target="_blank" rel="noopener" class="mycode_url">CouchBase auf Docker Hub</a><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Step - 1</span>: Run Couchbase Server docker container<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker run -d --name db -p 8091-8094:8091-8094 -p 11210:11210 couchbase</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Step - 2</span>: Next, visit <a href="http://localhost:8091" target="_blank" rel="noopener" class="mycode_url">http://localhost:8091</a> on the host machine to see the Web Console to start Couchbase Server setup.<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: medium;" class="mycode_size">CouchDB</span></span></span><br />
<br />
<a href="https://hub.docker.com/_/couchdb" target="_blank" rel="noopener" class="mycode_url">CouchDB auf Docker Hub</a><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>user@user:~&#36; sudo docker run -d --name my-couchdb couchdb:latest<br />
ead0a152cfefc65ef3921534134b94d7a72cdea59dd876e231f10b5e6ac16de9</code></div></div><br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: large;" class="mycode_size">MongoDB</span></span></span><br />
<br />
<a href="https://hub.docker.com/_/mongo" target="_blank" rel="noopener" class="mycode_url">MongoDB auf Docker Hub</a><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker run --name mymongo -d mongo:5.0.2-focal<br />
eb6ed078e31adca5550c4a242033aa147c29c4bcd7c0b70e8a46cd1b6b919d25</code></div></div><br />
Die für MongoDB gültigen TAG sind hier:<br />
<br />
<a href="https://github.com/docker-library/docs/blob/master/mongo/README.md#supported-tags-and-respective-dockerfile-links" target="_blank" rel="noopener" class="mycode_url">Supported tags and respective Dockerfile links</a><br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Ghost</span></span></span><br />
<br />
<a href="https://hub.docker.com/_/ghost" target="_blank" rel="noopener" class="mycode_url">Ghost - free blogging plattform</a><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker run -d --name myghost ghost<br />
06b77297a1e2fb0871aef98139127ea559e74c764d971e7ac00033a50129ddfe</code></div></div><br />
Will man Zugang im Browser haben, dann ist folgender Befehl erforderlich:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker run -d --name some-ghost -e url=http://localhost:3001 -p 3001:2368 ghost</code></div></div><br />
Im Browser ist dann das einzugeben: <a href="http://localhost:3001" target="_blank" rel="noopener" class="mycode_url">http://localhost:3001</a><br />
<br />
und für den Adminzugang ist das einzugeben: <a href="http://localhost:3001/ghost" target="_blank" rel="noopener" class="mycode_url">http://localhost:3001/ghost</a><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Container löschen und neu erstellen</span><br />
<br />
Sobald der Container beendet ist, kann er gelöscht werden, da man nur mit einem neuen run-Befehl den Container später über den gewünschten Port im Browser ansprechen kann. Daher ist es wichtig, dass Anwenderdaten nicht im Container, sondern in einem Volumen gespeichert werden.<br />
<br />
Das ist der Ablauf, um einen laufenden Container zu beenden und dann wieder später nutzbar zu machen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>user@user:~&#36; sudo docker stop meinghost<br />
[sudo] Passwort für django: <br />
meinghost<br />
user@user:~&#36; sudo docker container rm meinghost<br />
meinghost<br />
user@user:~&#36; sudo docker run -d --name meinghost -e url=http://localhost:3001 -p 3001:2368 -v /media/django/webserver/dockerdaten/ghost:/var/lib/ghost/content ghost<br />
7cb325446ab4ab7476dfe274b3a90dc5dca7ee281f4b3d66ed3583f6e56b3171</code></div></div><br />
Im Standard nutzt Ghost SQLite als Datenbank. Die Einbindung von MySQL ist aber auch möglich und auf der Ghost-Dockerseite beschrieben.<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Golang</span></span></span><br />
<br />
<a href="https://hub.docker.com/_/golang" target="_blank" rel="noopener" class="mycode_url">golang Official Image Go (golang) is a general purpose, higher-level, imperative programming language.</a><br />
<br />
Es ist wohl ein DockerFile notwendig, um dieses Image im Container laufen lassen zu können.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Docker img installieren]]></title>
			<link>https://forum.hermann-splitthoff.de/showthread.php?tid=1376</link>
			<pubDate>Sat, 23 Nov 2024 19:53:11 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.hermann-splitthoff.de/member.php?action=profile&uid=1">Joopi</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.hermann-splitthoff.de/showthread.php?tid=1376</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b"><span style="color: #0074d9;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Sammlung von Docker IMG</span></span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Die Docker-Grundlagen</span><br />
<br />
<a href="https://alexandernaumov.de/artikel/docker-grundlagen" target="_blank" rel="noopener" class="mycode_url">Docker Grundlagen</a><br />
<a href="https://www.claranet.de/blog/wie-funktionieren-docker-container" target="_blank" rel="noopener" class="mycode_url">Wie funktionieren Docker Container?</a><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Achtung:</span><br />
Docker IMG haben nur Leserechte.<br />
<br />
Will man mit Docker arbeiten und Daten verändern, müssen die Container ran. Darin kann man arbeiten.<br />
<br />
Ein Container entsteht immer aus einem Image. Es beinhaltet alle Komponenten, um eine Anwendung plattformunabhängig auszuführen.<br />
<br />
<hr class="mycode_hr" />
Eine Bash ausführen in einem Container:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker run -it ubuntu bash</code></div></div>]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b"><span style="color: #0074d9;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Sammlung von Docker IMG</span></span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Die Docker-Grundlagen</span><br />
<br />
<a href="https://alexandernaumov.de/artikel/docker-grundlagen" target="_blank" rel="noopener" class="mycode_url">Docker Grundlagen</a><br />
<a href="https://www.claranet.de/blog/wie-funktionieren-docker-container" target="_blank" rel="noopener" class="mycode_url">Wie funktionieren Docker Container?</a><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Achtung:</span><br />
Docker IMG haben nur Leserechte.<br />
<br />
Will man mit Docker arbeiten und Daten verändern, müssen die Container ran. Darin kann man arbeiten.<br />
<br />
Ein Container entsteht immer aus einem Image. Es beinhaltet alle Komponenten, um eine Anwendung plattformunabhängig auszuführen.<br />
<br />
<hr class="mycode_hr" />
Eine Bash ausführen in einem Container:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker run -it ubuntu bash</code></div></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Docker Eigene Daten]]></title>
			<link>https://forum.hermann-splitthoff.de/showthread.php?tid=1375</link>
			<pubDate>Sat, 23 Nov 2024 19:52:09 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.hermann-splitthoff.de/member.php?action=profile&uid=1">Joopi</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.hermann-splitthoff.de/showthread.php?tid=1375</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b"><span style="color: #0074d9;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Eigene Daten in Docker-Container erstellen und speichern</span></span></span><br />
<br />
Ich habe versucht herauszufinden, ob man Daten in einem Docker-Container erstellen und speichen kann. Und ob diese Daten später noch vorhanden sind, wenn der Container gestoppt (nicht gelöscht) wurde.<br />
<br />
Dazu habe ich mir ein Ubuntu als Betriebssystem heruntergeladen und via <span style="font-weight: bold;" class="mycode_b">apt-get</span> ein Upate und ein Upgrade gemacht. Das war notwendig, um danach den Editor <span style="font-weight: bold;" class="mycode_b">nano</span> zu installieren.<br />
<br />
Zwar hatte ich eine Datei im Home-Verzeichnis via <span style="font-weight: bold;" class="mycode_b">touch</span> erstellt, jedoch hatte ich keinen Zugriff auf einen Editor. Komisch eigentlich.<br />
<br />
Mit <span style="font-weight: bold;" class="mycode_b">nano</span> konnte ich die erstellte Datei dann ganz normal bearbeiten und speichern.<br />
<br />
Dann habe ich dne Container mit <span style="font-weight: bold;" class="mycode_b">exit</span> verlassen und mit <span style="font-weight: bold;" class="mycode_b">stop</span> den Container gestoppt.<br />
<br />
Und dann habe ich mit <span style="font-weight: bold;" class="mycode_b">start</span> den Container wieder gestartet und mich mit <span style="font-weight: bold;" class="mycode_b">exec</span> wieder in den Container eingeloggt.<br />
<br />
Die vorher erstellte Datei und der Inhalt waren vorhanden. Somit kann man die Container durchaus produktiv nutzen. Es muss aber Möglichkeiten geben, wie man eine Sicherung der Daten außerhalb des Containers anlegen kann. Ich meine dieses im Heise-Tutorial gesehen zu haben.<br />
<br />
<hr class="mycode_hr" />
Mit Docker habe ich nun den ganzen Abend probiert und habe mit CouchBase eine NoSQL-Datenbank im Container laufen. Das ist nicht schlecht. Leider kann ich MongoDB nicht starten, da ich mit dem TAG nicht klarkomme. Das muss ich morgen mal ausprobieren.]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b"><span style="color: #0074d9;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Eigene Daten in Docker-Container erstellen und speichern</span></span></span><br />
<br />
Ich habe versucht herauszufinden, ob man Daten in einem Docker-Container erstellen und speichen kann. Und ob diese Daten später noch vorhanden sind, wenn der Container gestoppt (nicht gelöscht) wurde.<br />
<br />
Dazu habe ich mir ein Ubuntu als Betriebssystem heruntergeladen und via <span style="font-weight: bold;" class="mycode_b">apt-get</span> ein Upate und ein Upgrade gemacht. Das war notwendig, um danach den Editor <span style="font-weight: bold;" class="mycode_b">nano</span> zu installieren.<br />
<br />
Zwar hatte ich eine Datei im Home-Verzeichnis via <span style="font-weight: bold;" class="mycode_b">touch</span> erstellt, jedoch hatte ich keinen Zugriff auf einen Editor. Komisch eigentlich.<br />
<br />
Mit <span style="font-weight: bold;" class="mycode_b">nano</span> konnte ich die erstellte Datei dann ganz normal bearbeiten und speichern.<br />
<br />
Dann habe ich dne Container mit <span style="font-weight: bold;" class="mycode_b">exit</span> verlassen und mit <span style="font-weight: bold;" class="mycode_b">stop</span> den Container gestoppt.<br />
<br />
Und dann habe ich mit <span style="font-weight: bold;" class="mycode_b">start</span> den Container wieder gestartet und mich mit <span style="font-weight: bold;" class="mycode_b">exec</span> wieder in den Container eingeloggt.<br />
<br />
Die vorher erstellte Datei und der Inhalt waren vorhanden. Somit kann man die Container durchaus produktiv nutzen. Es muss aber Möglichkeiten geben, wie man eine Sicherung der Daten außerhalb des Containers anlegen kann. Ich meine dieses im Heise-Tutorial gesehen zu haben.<br />
<br />
<hr class="mycode_hr" />
Mit Docker habe ich nun den ganzen Abend probiert und habe mit CouchBase eine NoSQL-Datenbank im Container laufen. Das ist nicht schlecht. Leider kann ich MongoDB nicht starten, da ich mit dem TAG nicht klarkomme. Das muss ich morgen mal ausprobieren.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Docker Infos Heise-Tutorial]]></title>
			<link>https://forum.hermann-splitthoff.de/showthread.php?tid=1374</link>
			<pubDate>Sat, 23 Nov 2024 19:50:29 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.hermann-splitthoff.de/member.php?action=profile&uid=1">Joopi</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.hermann-splitthoff.de/showthread.php?tid=1374</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b"><span style="color: #0074d9;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Infos aus dem 6-teiligen Heise-Tutorial</span></span></span><br />
<br />
Erstellung eines Volums.<br />
<br />
Volums sind dafür da, um eigene Daten aufzunehmen. Damit diese nicht direkt in einen Container erfasst werden, legt man unter /usr/share zum jeweiligen Programm, z.B. nginx, ein Volume an.<br />
<br />
Die Syntax wäre in diesem Beispiel wie folgt:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker run --name my-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">some-nginx</span> = Name des Containers<br />
<span style="font-weight: bold;" class="mycode_b">-v</span> = ein Volume anhängen und deklarieren<br />
<span style="font-weight: bold;" class="mycode_b">-d</span> = Dienst läuft im Hintergrund<br />
<span style="font-weight: bold;" class="mycode_b">nginx</span> = Image<br />
<span style="font-weight: bold;" class="mycode_b">ro</span> = read only<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Hinweis:</span><br />
In einem Dockercontainer sind nur die wichtigsten Pakete enthalten. Will man eine Textdatei erstellen, aber ein Editor ist nicht verfügbar, kann man pragmatisch folgendes machen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>echo "Hallo Docker!" &gt; index.html</code></div></div><br />
Damit erstellt man eine Datei, die dann verwendet werden kann. Will man künftig mehr in dem Container machen, empfiehlt es sich, einen Editor zu installieren (und daraus dann ein eigenes Build zu machen). Das wird so aber nicht empfohlen (?). Insgesamt ist das der denkbar schlechteste Weg.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Fazit:</span><br />
Mit <span style="font-weight: bold;" class="mycode_b">docker exec</span> in einen Container zu gehen und dort Daten zu bearbeiten ist nicht gut und sollte so nicht gemacht werden.<br />
<br />
Die Anwendungsdaten werden im Container nicht gespeichert. Sobald der Container beendet wird, sind die Daten weg. Daher müssen Volumes angelegt werden, die die Anwendungsdaten speichern udn vorhalten.<br />
<br />
Um ein Volume zu erzeugen, ist folgender Befehl notwendig:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker volume create</code></div></div><br />
Dieser Befehl erzeugt einen langen Name aus Zufallszahlen/-ziffern. Man kann den Volumennamen auch vorgeben:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker volume create html</code></div></div><br />
Mit dem <span style="font-weight: bold;" class="mycode_b">ls</span>-Befehl kann ich mir die vorhandenen Volumes anzeigen lassen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker volume ls</code></div></div><br />
Das läuft analog zu den Images und den Containern.<br />
<br />
Um nun das erzeugte Volume mit dem Namen html in den nginx-Container zu bringen, wird eine zweite Instanz aufgemacht und ein weiterer Port eröffnet (nicht zwingend erforderlich, nur zur Demonstration):<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker run --name myvol-nginx -p 8081:80 -v html:/usr/share/nginx/html:ro -d nginx</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">ro</span> heißt readonly.<br />
<br />
Das erzeugte Volume liegt hier:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>/var/lib/docker/volumes</blockquote>
<br />
Dieses Verzeichnis kann ein Normaluser, selbst wenn er in der Gruppe docker ist, nicht sehen (sudo -s)<br />
<br />
<span style="font-weight: bold;" class="mycode_b">WICHTIG:</span><br />
Selbst wenn der Container zerstört wird, bleibt das Volume erhalten. Wichtig ist dann dabei, dass das Verzeichnis /usr/lib/docker gesichert wird, wenn in diesem Verzeichnis Nutzer- und  Anwendungsdaten für die weitere Verarbeitung gespeichert werden, also produktiv genutzt werden.<br />
<br />
Die Volumes müssen nicht unbedingt im Docker-Verzeichnis liegen, sondern können an jeder beliebigen Stelle gespeichert werden. Dazu wäre dann z.B. dem Volume HTML das Verzeichnis voranzustellen (Beispiel): <span style="font-weight: bold;" class="mycode_b">/home/django/dockervolume/HTML</span><br />
<br />
Die Prozesse, die innerhalb der Container laufen, müssen allerdings die Berechtigungen auf dieses Verzeichnis haben.<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color">Docker und Netzwerke</span></span><br />
<br />
Docker erzeugt ein eigenes Netzwerk: docker0<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>ifconfig docker0</code></div></div><br />
Docker hat verschiedene Netzwerke, die man sich so anzeigen lassen kann:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker network ls</code></div></div><br />
Beispiel, wie zwei Container kommunizieren.<br />
<br />
Ein Blogsystem auf Basis WordPress-Blogsystem<br />
<ul class="mycode_list"><li>Container mit Webserver und WordPress<br />
</li>
<li>Container mit Datenbank MySQL / MariaDB<br />
</li>
</ul>
<br />
Container für Datenbank:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker run --name test-mysql -e MYSQL_ROOT_PASSWWORD=meinpasswort -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wp -e MYSQL_PASSWORD=meinpasswort -d mysql:5.7</code></div></div><br />
Container für WordPress / Webserver<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker run --name wordpress --link test-mysql:test-mysql -p 8082:80 -d wordpress</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Hinweis:</span><br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>--link anstelle von --name</blockquote>
<br />
Dieser Part "<span style="font-weight: bold;" class="mycode_b">test-mysql:test-mysql</span>" bedeutet, dass der Container test-mysql auch als test-mysql angesprochen werden. Soll dieser Name dann anders lauten, müsste er angegeben werden (z.B. test-mysql:test-worpress).<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Hinweis:</span><br />
Docker hat einen eigenen DNS-Server laufen.<br />
<br />
Für das obige Beispiel würde im Browser, da wir mit WordPress arbeiten wollen, folgendes einzugebenn sein:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>localhost:8082</blockquote>
<br />
Sodann würde die Installation von WordPress erfolgen.<br />
<br />
Die Daten von WordPress werden in der Datenbank abgespeichert. WordPress und die Datenbank sind in zwei Containern aufgeteilt. Um mit den eingegebenen Daten weiter arbeiten zu können, müssten die Daten in ein Volume übertragen werden<br />
<br />
Wie das geht, weiß ich noch nicht!<br />
<br />
Wenn z.B.  WordPress vom Rest der Welt trennen möchte, dann kann das über ein eigenes Docker-Netzwerk erfolgen. Das sieht dann so aus:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker network create --driver bridge test-bridge</code></div></div><br />
Prüfen, ob das Netzwerk angelegt ist bzw. welche vorhanden sind, kann man mit:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker network ls</code></div></div><br />
Dieses neue Network kann man an den Run-Befehl für mysql hängen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker run --name test-mysql --network=test-bridge -e MYSQL_ROOT_PASSWWORD=meinpasswort -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wp -e MYSQL_PASSWORD=meinpasswort -d mysql:5.7</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Hinweis:</span><br />
<br />
Es gibt den inspect-Befehl. Dieser kann auf das Netzwerk angewandt werden. Um das neue Netzwerk zu inspizieren, ist folgendes notwendig:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker network inspect test-bridge</code></div></div><br />
Man kann also in das Netzwerk "hineinschauen".<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: medium;" class="mycode_size">Wie kann man Docker vereinfachen?</span></span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #008e02;" class="mycode_color">Contaner mit Compose einrichten</span></span><br />
<br />
Mehrere Container nebeneinander betreiben.<br />
<br />
Docker-Compose ist ein Python-Script (offizell von Docke unterstützt), mit dem vereinfacht mehrere Container aufgebaut und miteinander verbunden werden können.<br />
<br />
Ein Compose-File ist wie folgt strukturiert (Beispiel MySQL-Container)<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>version: '3'<br />
<br />
services:<br />
    db:<br />
        image: mysql:5.7<br />
        volumes:<br />
            - ./data/db/:/var/lib/mysql<br />
        restart: always<br />
        ports:<br />
            - "3306:3306"<br />
        environment:<br />
            MYSQ_ROOT_PASSWORD: secret123root</blockquote>
<br />
Die Inhalte sind quasi die gleichen wie in einem run-Befehl.<br />
<br />
Die Aussage ist, dass selbst, wenn nur ein Container laufen soll, eine Compose-File nützlich ist.<br />
<br />
Der data-Ordner des Volume liegt in dem Ordner, aus dem das Compose-File aufgerufen wird. Der Punkt weist auf die relative Lage hin. Hat mein einen eigenen Bereich auf der lokalen Festplatte eingerichtet, ruft man das File eben von dort aus auf.<br />
<br />
Für das Beispiel aus dem Netzwerkabschnitt (WordPress und MySQL) sieht das Compose-File wie folgt aus:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>version: '3'<br />
<br />
services:<br />
    db:<br />
        image: mysql:5.7<br />
        volumes:<br />
            - ./data/db/:/var/lib/mysql<br />
        restart: always<br />
        ports:<br />
            - "3306:3306"<br />
        environment:<br />
            MYSQL_ROOT_PASSWORD: secret123root<br />
            MYSQL_DATABASE: wordpress<br />
            MYSQL_USER: wordpress<br />
            MYSQL_PASSWORD: 12345wordpress54321<br />
            <br />
    wordpress:<br />
        depends_on:<br />
            - db<br />
        image: wordpress:latest<br />
        ports:<br />
            - "80:80"<br />
        restart: always<br />
        environment:<br />
            WORDPRESS_DB_HOST: db:3306<br />
            WORDPRESS_DB_USER: wordpress<br />
            WORDPRESS_DB_PASSWORD: 12345wordpress54321<br />
        working_dir: /var/www/html<br />
        volumes:<br />
            - ./data/wordpress:/var/www/html/wp-content<br />
        <br />
        portainer:<br />
            image: portainer/portainer<br />
            restart: always<br />
            ports:<br />
                mehr sehe ich nicht, scheint ein volume zu sein, ist wohl eine grafische Oberfläche gedacht, also nicht in der Konsole wichtig.</blockquote>
<br />
So wird die yml-Datei, in der das Compose-File abgespeichert wurde, ausgeführt:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker-compose up</code></div></div><ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">up</span> = starten<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">stop</span> = stoppen<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">down</span> = herunterfahren (Container werden dabei sofort gelöscht)<br />
</li>
</ul>
<br />
Damit wird wohl alles an Compose-Files gestartet.<br />
<br />
Die Ausführung dieses Befehl ist sichtbar, da die Option <span style="font-weight: bold;" class="mycode_b">-d</span> nicht mit angegeben worden ist.<br />
<br />
Ansonsten könnte man bei der Sichtbarkeit die einzelnen Aktionen sehen, die ausgeführt würde. Es gibt dann wohl, sobald der Datanbankserver oben ist mit der Installation von Wordpress im Browser.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Hinweis:</span><br />
In einer yml-Datei ist die Einrückungstiefe immer 2 Leerzeichen. Man kann auch Tabs verwenden, aber zwei Leerzeichen sind wohl Standard.<br />
<br />
Um z.B. auf der Shell in die Container mit dem exec-Befehl einzusteigen, kann folgender Befehl genutzt werden:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker-compose excec db sh</code></div></div><br />
Damit ist man im Container anstelle des komplexen Befehlaufrufes aus den Anfängen.<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: medium;" class="mycode_size">Die grafische Oberfläche für Docker</span></span></span><br />
<br />
Portainer ist eine bekannte grafische Oberfläche<br />
<br />
Sofern im Compose-File der Portainer integriert ist, kann man in der Adressezeile des Browsers über den Port 9000 die Webseite erreichen.<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>localhost:9000</blockquote>
<br />
Ich unterstelle derweil, dass das möglich ist, denn in dem Beispiel bei Heise wird mittlerweile eine echte Domain genutzt. Sollte aber auch mit localhost funktionieren.<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: medium;" class="mycode_size">Zertifikate erstellen</span></span></span><br />
<br />
Die Anwendungen, die man in Docker erstellt, kann man sind Internet bringen. Man muss dafür aber vieles beachten, um die Sicherheit zu gewährleisten. Mit Zertifikaten kann man das erreichen.<br />
<br />
Eine Grundlage ist z.B. Watchtower (wird niht mehr entwickelt, es gibt was neues) und gehört zu vorherigen Compose-File.<br />
<br />
Watchtower ein Image, welches sich um die Aktualisierung von Images kümmert, was durch Docker selber nicht geleistet wird.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>watchtower:<br />
  image: v2tec/watchtower<br />
  volumes:<br />
    - /var/run/docker.sock:/var/run/docker.sock<br />
  command: --interval 30</code></div></div><br />
Um von außen auf die Anwendung schauen zu können, wird folgendes benötigt (Revers-Server/Proxy oder so ähnlich)<br />
<br />
Für das nachfolgende Beispiel muss der WordPress-Container angepasst werden, da diese keine Ports mehr freigeben darf (wird weiter unten mit 80 und 443 gemacht):<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>wordpress:<br />
        depends_on:<br />
            - db<br />
        image: wordpress:php7.1<br />
        restart: always<br />
        environment:<br />
            WORDPRESS_DB_HOST: db:3306<br />
            WORDPRESS_DB_USER: wordpress<br />
            WORDPRESS_DB_PASSWORD: 12345wordpress54321<br />
            LETSENCRYPT_HOST: mlsjam.leipsieb.de<br />
            LETSENCRYPT_EMAIL: mls@ct.de<br />
            VIRTUAL_HOST: mlsjam.leipsieb.de<br />
            VIRTUAL_PORT: 80<br />
        working_dir: /var/www/html<br />
        volumes:<br />
            - ./data/wordpress:/var/www/html/wp-content</code></div></div><br />
Ob das auch auf localhost läuft, weiß ich derzeit nicht.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>nginxproxy:<br />
  image: jweilder/nginx-proxy<br />
  restart: unless-stopped<br />
  volumes:<br />
    - ./data/certs:/etc/nginx/certs<br />
    - ./conf:/etc/nginx/conf.d<br />
    - ./dhparam:/etc/nginx/dhparam<br />
    - ./data/vhosts:/etc/nginx/vhost.d<br />
    - ./data/html:/usr/share/nginx.html<br />
    - /var/run/docker.sock:/tmp/docker.sock<br />
  ports:<br />
    - 80:80<br />
    - 443:443<br />
  labels:<br />
    - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy"<br />
    <br />
nginxproxy_comp:<br />
  image: jrcs/letsencrypt_nginx_proxy_companion<br />
  restart: unless_stopped<br />
  depends_on:<br />
    - nginxproxy<br />
  volumes:<br />
    - ./data/certs:/etc/bginx/certs:rw<br />
    - ./conf:/etc/nginx/conf.d<br />
    - ./dhparam:/etc/nginx/dhparam<br />
    - ./data/vhosts:/etc/nginx/vhost.d<br />
    - ./data/html:/usr/share/nginx.html<br />
    - /var/run/docker.sock:/tmp/docker.sock:ro</code></div></div><br />
<hr class="mycode_hr" />
In meinen Tests hatte ich mehrere Male die Probleme, dass die Ports z.B. 8080 oder 8081 als belegt gekennzeichnet wurden.<br />
<br />
Um herauszufinden, welche Anwendungen die Ports belegen, natürlich können das auch laufende Container sein, ist folgender Befehl hilfereich:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo lsof -i -P -n | grep 8080</code></div></div><br />
Das Ergebnis sieht so aus:<br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.hermann-splitthoff.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a class="attachembed" href="attachment.php?aid=66" target="_blank" title="">Pasted image 20210819105406.png</a> (Größe: 49,53 KB / Downloads: 37)
<!-- end: postbit_attachments_attachment --><br />
<br />
Somit ist für mich klar, dass ich den Port 8081 nehme.<br />
<br />
Wie ich mit den Ports überhaupt umgehen muss, weiß ich selber noch nicht, wenn es sich um Webanwendungen handelt.]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b"><span style="color: #0074d9;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Infos aus dem 6-teiligen Heise-Tutorial</span></span></span><br />
<br />
Erstellung eines Volums.<br />
<br />
Volums sind dafür da, um eigene Daten aufzunehmen. Damit diese nicht direkt in einen Container erfasst werden, legt man unter /usr/share zum jeweiligen Programm, z.B. nginx, ein Volume an.<br />
<br />
Die Syntax wäre in diesem Beispiel wie folgt:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker run --name my-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">some-nginx</span> = Name des Containers<br />
<span style="font-weight: bold;" class="mycode_b">-v</span> = ein Volume anhängen und deklarieren<br />
<span style="font-weight: bold;" class="mycode_b">-d</span> = Dienst läuft im Hintergrund<br />
<span style="font-weight: bold;" class="mycode_b">nginx</span> = Image<br />
<span style="font-weight: bold;" class="mycode_b">ro</span> = read only<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Hinweis:</span><br />
In einem Dockercontainer sind nur die wichtigsten Pakete enthalten. Will man eine Textdatei erstellen, aber ein Editor ist nicht verfügbar, kann man pragmatisch folgendes machen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>echo "Hallo Docker!" &gt; index.html</code></div></div><br />
Damit erstellt man eine Datei, die dann verwendet werden kann. Will man künftig mehr in dem Container machen, empfiehlt es sich, einen Editor zu installieren (und daraus dann ein eigenes Build zu machen). Das wird so aber nicht empfohlen (?). Insgesamt ist das der denkbar schlechteste Weg.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Fazit:</span><br />
Mit <span style="font-weight: bold;" class="mycode_b">docker exec</span> in einen Container zu gehen und dort Daten zu bearbeiten ist nicht gut und sollte so nicht gemacht werden.<br />
<br />
Die Anwendungsdaten werden im Container nicht gespeichert. Sobald der Container beendet wird, sind die Daten weg. Daher müssen Volumes angelegt werden, die die Anwendungsdaten speichern udn vorhalten.<br />
<br />
Um ein Volume zu erzeugen, ist folgender Befehl notwendig:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker volume create</code></div></div><br />
Dieser Befehl erzeugt einen langen Name aus Zufallszahlen/-ziffern. Man kann den Volumennamen auch vorgeben:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker volume create html</code></div></div><br />
Mit dem <span style="font-weight: bold;" class="mycode_b">ls</span>-Befehl kann ich mir die vorhandenen Volumes anzeigen lassen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker volume ls</code></div></div><br />
Das läuft analog zu den Images und den Containern.<br />
<br />
Um nun das erzeugte Volume mit dem Namen html in den nginx-Container zu bringen, wird eine zweite Instanz aufgemacht und ein weiterer Port eröffnet (nicht zwingend erforderlich, nur zur Demonstration):<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker run --name myvol-nginx -p 8081:80 -v html:/usr/share/nginx/html:ro -d nginx</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">ro</span> heißt readonly.<br />
<br />
Das erzeugte Volume liegt hier:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>/var/lib/docker/volumes</blockquote>
<br />
Dieses Verzeichnis kann ein Normaluser, selbst wenn er in der Gruppe docker ist, nicht sehen (sudo -s)<br />
<br />
<span style="font-weight: bold;" class="mycode_b">WICHTIG:</span><br />
Selbst wenn der Container zerstört wird, bleibt das Volume erhalten. Wichtig ist dann dabei, dass das Verzeichnis /usr/lib/docker gesichert wird, wenn in diesem Verzeichnis Nutzer- und  Anwendungsdaten für die weitere Verarbeitung gespeichert werden, also produktiv genutzt werden.<br />
<br />
Die Volumes müssen nicht unbedingt im Docker-Verzeichnis liegen, sondern können an jeder beliebigen Stelle gespeichert werden. Dazu wäre dann z.B. dem Volume HTML das Verzeichnis voranzustellen (Beispiel): <span style="font-weight: bold;" class="mycode_b">/home/django/dockervolume/HTML</span><br />
<br />
Die Prozesse, die innerhalb der Container laufen, müssen allerdings die Berechtigungen auf dieses Verzeichnis haben.<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color">Docker und Netzwerke</span></span><br />
<br />
Docker erzeugt ein eigenes Netzwerk: docker0<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>ifconfig docker0</code></div></div><br />
Docker hat verschiedene Netzwerke, die man sich so anzeigen lassen kann:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker network ls</code></div></div><br />
Beispiel, wie zwei Container kommunizieren.<br />
<br />
Ein Blogsystem auf Basis WordPress-Blogsystem<br />
<ul class="mycode_list"><li>Container mit Webserver und WordPress<br />
</li>
<li>Container mit Datenbank MySQL / MariaDB<br />
</li>
</ul>
<br />
Container für Datenbank:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker run --name test-mysql -e MYSQL_ROOT_PASSWWORD=meinpasswort -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wp -e MYSQL_PASSWORD=meinpasswort -d mysql:5.7</code></div></div><br />
Container für WordPress / Webserver<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker run --name wordpress --link test-mysql:test-mysql -p 8082:80 -d wordpress</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Hinweis:</span><br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>--link anstelle von --name</blockquote>
<br />
Dieser Part "<span style="font-weight: bold;" class="mycode_b">test-mysql:test-mysql</span>" bedeutet, dass der Container test-mysql auch als test-mysql angesprochen werden. Soll dieser Name dann anders lauten, müsste er angegeben werden (z.B. test-mysql:test-worpress).<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Hinweis:</span><br />
Docker hat einen eigenen DNS-Server laufen.<br />
<br />
Für das obige Beispiel würde im Browser, da wir mit WordPress arbeiten wollen, folgendes einzugebenn sein:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>localhost:8082</blockquote>
<br />
Sodann würde die Installation von WordPress erfolgen.<br />
<br />
Die Daten von WordPress werden in der Datenbank abgespeichert. WordPress und die Datenbank sind in zwei Containern aufgeteilt. Um mit den eingegebenen Daten weiter arbeiten zu können, müssten die Daten in ein Volume übertragen werden<br />
<br />
Wie das geht, weiß ich noch nicht!<br />
<br />
Wenn z.B.  WordPress vom Rest der Welt trennen möchte, dann kann das über ein eigenes Docker-Netzwerk erfolgen. Das sieht dann so aus:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker network create --driver bridge test-bridge</code></div></div><br />
Prüfen, ob das Netzwerk angelegt ist bzw. welche vorhanden sind, kann man mit:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker network ls</code></div></div><br />
Dieses neue Network kann man an den Run-Befehl für mysql hängen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker run --name test-mysql --network=test-bridge -e MYSQL_ROOT_PASSWWORD=meinpasswort -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wp -e MYSQL_PASSWORD=meinpasswort -d mysql:5.7</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Hinweis:</span><br />
<br />
Es gibt den inspect-Befehl. Dieser kann auf das Netzwerk angewandt werden. Um das neue Netzwerk zu inspizieren, ist folgendes notwendig:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker network inspect test-bridge</code></div></div><br />
Man kann also in das Netzwerk "hineinschauen".<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: medium;" class="mycode_size">Wie kann man Docker vereinfachen?</span></span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #008e02;" class="mycode_color">Contaner mit Compose einrichten</span></span><br />
<br />
Mehrere Container nebeneinander betreiben.<br />
<br />
Docker-Compose ist ein Python-Script (offizell von Docke unterstützt), mit dem vereinfacht mehrere Container aufgebaut und miteinander verbunden werden können.<br />
<br />
Ein Compose-File ist wie folgt strukturiert (Beispiel MySQL-Container)<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>version: '3'<br />
<br />
services:<br />
    db:<br />
        image: mysql:5.7<br />
        volumes:<br />
            - ./data/db/:/var/lib/mysql<br />
        restart: always<br />
        ports:<br />
            - "3306:3306"<br />
        environment:<br />
            MYSQ_ROOT_PASSWORD: secret123root</blockquote>
<br />
Die Inhalte sind quasi die gleichen wie in einem run-Befehl.<br />
<br />
Die Aussage ist, dass selbst, wenn nur ein Container laufen soll, eine Compose-File nützlich ist.<br />
<br />
Der data-Ordner des Volume liegt in dem Ordner, aus dem das Compose-File aufgerufen wird. Der Punkt weist auf die relative Lage hin. Hat mein einen eigenen Bereich auf der lokalen Festplatte eingerichtet, ruft man das File eben von dort aus auf.<br />
<br />
Für das Beispiel aus dem Netzwerkabschnitt (WordPress und MySQL) sieht das Compose-File wie folgt aus:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>version: '3'<br />
<br />
services:<br />
    db:<br />
        image: mysql:5.7<br />
        volumes:<br />
            - ./data/db/:/var/lib/mysql<br />
        restart: always<br />
        ports:<br />
            - "3306:3306"<br />
        environment:<br />
            MYSQL_ROOT_PASSWORD: secret123root<br />
            MYSQL_DATABASE: wordpress<br />
            MYSQL_USER: wordpress<br />
            MYSQL_PASSWORD: 12345wordpress54321<br />
            <br />
    wordpress:<br />
        depends_on:<br />
            - db<br />
        image: wordpress:latest<br />
        ports:<br />
            - "80:80"<br />
        restart: always<br />
        environment:<br />
            WORDPRESS_DB_HOST: db:3306<br />
            WORDPRESS_DB_USER: wordpress<br />
            WORDPRESS_DB_PASSWORD: 12345wordpress54321<br />
        working_dir: /var/www/html<br />
        volumes:<br />
            - ./data/wordpress:/var/www/html/wp-content<br />
        <br />
        portainer:<br />
            image: portainer/portainer<br />
            restart: always<br />
            ports:<br />
                mehr sehe ich nicht, scheint ein volume zu sein, ist wohl eine grafische Oberfläche gedacht, also nicht in der Konsole wichtig.</blockquote>
<br />
So wird die yml-Datei, in der das Compose-File abgespeichert wurde, ausgeführt:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker-compose up</code></div></div><ul class="mycode_list"><li><span style="font-weight: bold;" class="mycode_b">up</span> = starten<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">stop</span> = stoppen<br />
</li>
<li><span style="font-weight: bold;" class="mycode_b">down</span> = herunterfahren (Container werden dabei sofort gelöscht)<br />
</li>
</ul>
<br />
Damit wird wohl alles an Compose-Files gestartet.<br />
<br />
Die Ausführung dieses Befehl ist sichtbar, da die Option <span style="font-weight: bold;" class="mycode_b">-d</span> nicht mit angegeben worden ist.<br />
<br />
Ansonsten könnte man bei der Sichtbarkeit die einzelnen Aktionen sehen, die ausgeführt würde. Es gibt dann wohl, sobald der Datanbankserver oben ist mit der Installation von Wordpress im Browser.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Hinweis:</span><br />
In einer yml-Datei ist die Einrückungstiefe immer 2 Leerzeichen. Man kann auch Tabs verwenden, aber zwei Leerzeichen sind wohl Standard.<br />
<br />
Um z.B. auf der Shell in die Container mit dem exec-Befehl einzusteigen, kann folgender Befehl genutzt werden:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker-compose excec db sh</code></div></div><br />
Damit ist man im Container anstelle des komplexen Befehlaufrufes aus den Anfängen.<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: medium;" class="mycode_size">Die grafische Oberfläche für Docker</span></span></span><br />
<br />
Portainer ist eine bekannte grafische Oberfläche<br />
<br />
Sofern im Compose-File der Portainer integriert ist, kann man in der Adressezeile des Browsers über den Port 9000 die Webseite erreichen.<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>localhost:9000</blockquote>
<br />
Ich unterstelle derweil, dass das möglich ist, denn in dem Beispiel bei Heise wird mittlerweile eine echte Domain genutzt. Sollte aber auch mit localhost funktionieren.<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: medium;" class="mycode_size">Zertifikate erstellen</span></span></span><br />
<br />
Die Anwendungen, die man in Docker erstellt, kann man sind Internet bringen. Man muss dafür aber vieles beachten, um die Sicherheit zu gewährleisten. Mit Zertifikaten kann man das erreichen.<br />
<br />
Eine Grundlage ist z.B. Watchtower (wird niht mehr entwickelt, es gibt was neues) und gehört zu vorherigen Compose-File.<br />
<br />
Watchtower ein Image, welches sich um die Aktualisierung von Images kümmert, was durch Docker selber nicht geleistet wird.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>watchtower:<br />
  image: v2tec/watchtower<br />
  volumes:<br />
    - /var/run/docker.sock:/var/run/docker.sock<br />
  command: --interval 30</code></div></div><br />
Um von außen auf die Anwendung schauen zu können, wird folgendes benötigt (Revers-Server/Proxy oder so ähnlich)<br />
<br />
Für das nachfolgende Beispiel muss der WordPress-Container angepasst werden, da diese keine Ports mehr freigeben darf (wird weiter unten mit 80 und 443 gemacht):<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>wordpress:<br />
        depends_on:<br />
            - db<br />
        image: wordpress:php7.1<br />
        restart: always<br />
        environment:<br />
            WORDPRESS_DB_HOST: db:3306<br />
            WORDPRESS_DB_USER: wordpress<br />
            WORDPRESS_DB_PASSWORD: 12345wordpress54321<br />
            LETSENCRYPT_HOST: mlsjam.leipsieb.de<br />
            LETSENCRYPT_EMAIL: mls@ct.de<br />
            VIRTUAL_HOST: mlsjam.leipsieb.de<br />
            VIRTUAL_PORT: 80<br />
        working_dir: /var/www/html<br />
        volumes:<br />
            - ./data/wordpress:/var/www/html/wp-content</code></div></div><br />
Ob das auch auf localhost läuft, weiß ich derzeit nicht.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>nginxproxy:<br />
  image: jweilder/nginx-proxy<br />
  restart: unless-stopped<br />
  volumes:<br />
    - ./data/certs:/etc/nginx/certs<br />
    - ./conf:/etc/nginx/conf.d<br />
    - ./dhparam:/etc/nginx/dhparam<br />
    - ./data/vhosts:/etc/nginx/vhost.d<br />
    - ./data/html:/usr/share/nginx.html<br />
    - /var/run/docker.sock:/tmp/docker.sock<br />
  ports:<br />
    - 80:80<br />
    - 443:443<br />
  labels:<br />
    - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy"<br />
    <br />
nginxproxy_comp:<br />
  image: jrcs/letsencrypt_nginx_proxy_companion<br />
  restart: unless_stopped<br />
  depends_on:<br />
    - nginxproxy<br />
  volumes:<br />
    - ./data/certs:/etc/bginx/certs:rw<br />
    - ./conf:/etc/nginx/conf.d<br />
    - ./dhparam:/etc/nginx/dhparam<br />
    - ./data/vhosts:/etc/nginx/vhost.d<br />
    - ./data/html:/usr/share/nginx.html<br />
    - /var/run/docker.sock:/tmp/docker.sock:ro</code></div></div><br />
<hr class="mycode_hr" />
In meinen Tests hatte ich mehrere Male die Probleme, dass die Ports z.B. 8080 oder 8081 als belegt gekennzeichnet wurden.<br />
<br />
Um herauszufinden, welche Anwendungen die Ports belegen, natürlich können das auch laufende Container sein, ist folgender Befehl hilfereich:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo lsof -i -P -n | grep 8080</code></div></div><br />
Das Ergebnis sieht so aus:<br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.hermann-splitthoff.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a class="attachembed" href="attachment.php?aid=66" target="_blank" title="">Pasted image 20210819105406.png</a> (Größe: 49,53 KB / Downloads: 37)
<!-- end: postbit_attachments_attachment --><br />
<br />
Somit ist für mich klar, dass ich den Port 8081 nehme.<br />
<br />
Wie ich mit den Ports überhaupt umgehen muss, weiß ich selber noch nicht, wenn es sich um Webanwendungen handelt.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Docker installieren]]></title>
			<link>https://forum.hermann-splitthoff.de/showthread.php?tid=1373</link>
			<pubDate>Sat, 23 Nov 2024 19:49:05 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.hermann-splitthoff.de/member.php?action=profile&uid=1">Joopi</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.hermann-splitthoff.de/showthread.php?tid=1373</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b"><span style="color: #0074d9;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Docker über Repository installieren für Focal</span></span></span><br />
<br />
Auf dieser Webseite habe ich die Installationsanleitung für Docker aus den Repositories für Ubuntu Focal gefunden:<br />
<br />
<a href="https://markontech.com/docker/how-to-install-docker-on-debian-ubuntu/" target="_blank" rel="noopener" class="mycode_url">Docker installation on Ubuntu Install via repository</a><br />
<br />
Und hier kommt die Anleitung als Kopie der Webseite.<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size"><span style="color: #008e02;" class="mycode_color">Docker installation on Ubuntu</span></span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #e86e04;" class="mycode_color"><span style="font-size: medium;" class="mycode_size">Install via repository</span></span></span><br />
<br />
Docker installation process on Ubuntu is practically the same as on Debian.<br />
<br />
1. Update the distro and install necessary packages:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36; sudo apt update<br />
&#36; sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common</code></div></div><br />
2. Second step is to add Docker GPG key for Docker<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36; curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -</code></div></div><br />
3. Verify the key fingerprint:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36; sudo apt-key fingerprint 0EBFCD88</code></div></div><br />
4. Add the repository:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36; sudo add-apt-repository  "deb [arch=amd64] https://download.docker.com/linux/ubuntu &#36;(lsb_release -cs) stable"</code></div></div><br />
5. Install Docker:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36; sudo apt-get update<br />
&#36; sudo apt-get install docker-ce docker-ce-cli containerd.io</code></div></div><br />
6. Start and enable the Docker:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36; sudo systemctl start docker<br />
&#36; sudo systemctl enable docker</code></div></div><br />
7.  Test Docker also with the hello container<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36; sudo docker run hello-world</code></div></div><br />
<hr class="mycode_hr" />
Da Docker das IMG nicht findet, kommt erst eine Fehlermeldung, dann aber, wenn der Download erfolgreich war, die Meldung, dass alles gut ist. Sieht dann in der Konsole so aus:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>user@user:/&#36; sudo docker run hello-world<br />
Unable to find image 'hello-world:latest' locally<br />
latest: Pulling from library/hello-world<br />
b8dfde127a29: Pull complete <br />
Digest: sha256:0fe98d7debd9049c50b597ef1f85b7c1e8cc81f59c8d623fcb2250e8bec85b38<br />
Status: Downloaded newer image for hello-world:latest<br />
<br />
Hello from Docker!<br />
This message shows that your installation appears to be working correctly.<br />
<br />
To generate this message, Docker took the following steps:<br />
1. The Docker client contacted the Docker daemon.<br />
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.<br />
    (amd64)<br />
3. The Docker daemon created a new container from that image which runs the<br />
    executable that produces the output you are currently reading.<br />
4. The Docker daemon streamed that output to the Docker client, which sent it<br />
    to your terminal.<br />
<br />
To try something more ambitious, you can run an Ubuntu container with:<br />
&#36; docker run -it ubuntu bash<br />
<br />
Share images, automate workflows, and more with a free Docker ID:<br />
https://hub.docker.com/<br />
<br />
For more examples and ideas, visit:<br />
https://docs.docker.com/get-started/</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Hello from Docker!</span>** ist die richtige Meldung zum IMG.]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b"><span style="color: #0074d9;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Docker über Repository installieren für Focal</span></span></span><br />
<br />
Auf dieser Webseite habe ich die Installationsanleitung für Docker aus den Repositories für Ubuntu Focal gefunden:<br />
<br />
<a href="https://markontech.com/docker/how-to-install-docker-on-debian-ubuntu/" target="_blank" rel="noopener" class="mycode_url">Docker installation on Ubuntu Install via repository</a><br />
<br />
Und hier kommt die Anleitung als Kopie der Webseite.<br />
<br />
<hr class="mycode_hr" />
<span style="font-weight: bold;" class="mycode_b"><span style="font-size: medium;" class="mycode_size"><span style="color: #008e02;" class="mycode_color">Docker installation on Ubuntu</span></span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #e86e04;" class="mycode_color"><span style="font-size: medium;" class="mycode_size">Install via repository</span></span></span><br />
<br />
Docker installation process on Ubuntu is practically the same as on Debian.<br />
<br />
1. Update the distro and install necessary packages:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36; sudo apt update<br />
&#36; sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common</code></div></div><br />
2. Second step is to add Docker GPG key for Docker<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36; curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -</code></div></div><br />
3. Verify the key fingerprint:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36; sudo apt-key fingerprint 0EBFCD88</code></div></div><br />
4. Add the repository:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36; sudo add-apt-repository  "deb [arch=amd64] https://download.docker.com/linux/ubuntu &#36;(lsb_release -cs) stable"</code></div></div><br />
5. Install Docker:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36; sudo apt-get update<br />
&#36; sudo apt-get install docker-ce docker-ce-cli containerd.io</code></div></div><br />
6. Start and enable the Docker:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36; sudo systemctl start docker<br />
&#36; sudo systemctl enable docker</code></div></div><br />
7.  Test Docker also with the hello container<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>&#36; sudo docker run hello-world</code></div></div><br />
<hr class="mycode_hr" />
Da Docker das IMG nicht findet, kommt erst eine Fehlermeldung, dann aber, wenn der Download erfolgreich war, die Meldung, dass alles gut ist. Sieht dann in der Konsole so aus:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>user@user:/&#36; sudo docker run hello-world<br />
Unable to find image 'hello-world:latest' locally<br />
latest: Pulling from library/hello-world<br />
b8dfde127a29: Pull complete <br />
Digest: sha256:0fe98d7debd9049c50b597ef1f85b7c1e8cc81f59c8d623fcb2250e8bec85b38<br />
Status: Downloaded newer image for hello-world:latest<br />
<br />
Hello from Docker!<br />
This message shows that your installation appears to be working correctly.<br />
<br />
To generate this message, Docker took the following steps:<br />
1. The Docker client contacted the Docker daemon.<br />
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.<br />
    (amd64)<br />
3. The Docker daemon created a new container from that image which runs the<br />
    executable that produces the output you are currently reading.<br />
4. The Docker daemon streamed that output to the Docker client, which sent it<br />
    to your terminal.<br />
<br />
To try something more ambitious, you can run an Ubuntu container with:<br />
&#36; docker run -it ubuntu bash<br />
<br />
Share images, automate workflows, and more with a free Docker ID:<br />
https://hub.docker.com/<br />
<br />
For more examples and ideas, visit:<br />
https://docs.docker.com/get-started/</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Hello from Docker!</span>** ist die richtige Meldung zum IMG.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Docker nutzen]]></title>
			<link>https://forum.hermann-splitthoff.de/showthread.php?tid=1372</link>
			<pubDate>Sat, 23 Nov 2024 19:45:25 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.hermann-splitthoff.de/member.php?action=profile&uid=1">Joopi</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.hermann-splitthoff.de/showthread.php?tid=1372</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b"><span style="color: #e82a1f;" class="mycode_color"><span style="font-size: large;" class="mycode_size">So wird Docker genutzt</span></span></span><br />
<br />
Mal wieder ein guter Link:<br />
Entfernen von Docker-Images, -Containern und -Volumen<br />
<br />
oder hier:<br />
<br />
<a href="https://docs.docker.com/engine/reference/run/" target="_blank" rel="noopener" class="mycode_url">Docker run reference</a><br />
<br />
Sobald Docker komplett incl. Engine installiert ist, kann Docker auch genutzt werden. Um Docker zu nutzen, muss man die Image-Namen wissen.  Diese sind z.B. auf dem Docker Hub zu finden.<br />
<br />
Docker-Image herunterladen<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker pull golang</code></div></div><br />
Um zu prüfen, welche Images heruntergeladen worden sind, gilt folgender Befehl:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker ps -a<br />
[sudo] Passwort für user:<br />
CONTAINER ID  IMAGE        COMMAND    CREATED        STATUS                    PORTS    NAMES<br />
3b4a2640dd52  golang        "bash"    19 hours ago  Exited (0) 19 hours ago            mystifying_wu<br />
0ee81db39223  ubuntu        "bash"    21 hours ago  Exited (0) 21 hours ago            stupefied_buck<br />
e5afa06d8d02  hello-world  "/hello"  21 hours ago  Exited (0) 21 hours ago            mystifying_bell</code></div></div><br />
Um zu prüfen, welche Container laufen, ist die Option **-a** wegzulassen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker ps<br />
CONTAINER ID  IMAGE    COMMAND  CREATED  STATUS    PORTS    NAMES</code></div></div><br />
Da noch kein Container gestartet wurde, wird auch noch nichts angezeigt, was an Containern läuft.<br />
<br />
Mit dem folgenden Befehl wird ein Container aus dem vorher heruntergeladenen Image erstellt und gestartet:<br />
<br />
Hier wäre der Dienst im Hintergrund und läuft vor sich hin (detached)<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker run -d -it --name myneuesdocker golang</code></div></div><br />
oder<br />
<br />
Hier wäre der Dienst interaktiv und benutzbar (tached)<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker run -it --name myneuesdocker golang<br />
0b2cb8ecefe8dbabb95a2078419a8585dc5b224693809a1560fff8321c429f0e</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Hinweis</span><br />
<br />
Wenn der run-Befehl ausgeführt wird, dann wird z.B. hinten nach dem Imagenamen ein Befehl angehängt, der dann ausgeführt werden soll. Wenn nichts angegeben wird, wird der Standardprozess gestartet.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel</span><br />
<br />
Ubuntu - der Aufruf des Images zur Erstellung des Container kann mit ... ubuntu bash ... enden, damit nach dem Start des Containers sofort eine Bash vorhanden ist.<br />
<br />
Es wird eine lange ID ausgegeben, wobei die ersten 12 Stellen wohl später die ID für die laufen  Container darstellen.<br />
<br />
Um zu prüfen, ob der Container läuft, ist wieder folgender Befehl abzusetzen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker ps<br />
CONTAINER ID  IMAGE    COMMAND  CREATED              STATUS              PORTS    NAMES<br />
0b2cb8ecefe8  golang    "bash"    About a minute ago  Up About a minute            myneuesdocker</code></div></div><br />
Nun wird gezeigt, welche Container laufen. In diesem Falle ist es nur der Golang-Container.<br />
<br />
Was der Name <span style="font-weight: bold;" class="mycode_b">myneuesdocker</span>, den ich selber kreiert habe, zu bedeuten hat, weiß ich noch nicht.<br />
<br />
Ich weiß auch noch nicht, wo Docker den Pull-Download ablegt und wo der Container wirklich liegt. Denn eigentlich müsste mindestens eine Datei zu finden sein. In Linux wird alles in Dateien erledigt.<br />
<br />
Um mit dem Container arbeiten zu können, ist folgender Befehl notwendig:<br />
<br />
<span style="font-weight: bold;" class="mycode_b">sudo docker exec -it myneuesdocker bash</span><br />
<span style="font-weight: bold;" class="mycode_b">root@0b2cb8ecefe8:/go#</span><br />
<br />
In diesem Falle landet man als <span style="font-weight: bold;" class="mycode_b">root</span> in einem Bash-Terminal und kann loslegen.<br />
<br />
Um zu prüfen, welche Ordner bzw. Dateien nun zur Verfügung stehen, ist nur der **ls**-Befehl notwendig:<br />
<br />
<span style="font-weight: bold;" class="mycode_b">root@0b2cb8ecefe8:/go# ls</span><br />
<span style="font-weight: bold;" class="mycode_b">bin  src</span><br />
<br />
Die Ausgabe ist sehr minimalistisch, da nur die notwendigen Abhängigkeiten erfüllt werden. Das ist eben der große Vorteil von Docker mit den Containern gegenüber den Virtualisierungstools.<br />
<br />
Um den Container zu verlassen, ist nur dies erforderlich:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>root@0b2cb8ecefe8:/go# exit<br />
exit<br />
user@user:~&#36;</code></div></div><br />
Damit ist man wieder auf der eigenen Maschine unterwegs und nicht mehr im Container. Der Container läuft aber noch und ist somit jederzeit wieder zu betreten.<br />
<br />
Um einen Container mit dem Host, also dem eigenen Computer zu verbinden, ist beim Aufruf von <span style="font-weight: bold;" class="mycode_b">run</span> der Port mitzugeben:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker run -d -t -p 80:80 --name myneuesdocker golang</code></div></div><br />
Dieser Aufruf wurde auf dem Kanal von NetworkChuck in Verbindung mit einem anderen Betriebssystem genutzt. Ob das mit meinem Beispiel auch so geht, weiß ich nicht. Aber man kann Container mit dem eigenen Betriebssystem verbinden.<br />
<br />
In dem Beispiel hat er in dem Container seine Trainingswebseite in einem Browser aufgerufen.<br />
<br />
Um einen Container zu beenden, ist folgender Befehl notwendig:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>user@user:~&#36; sudo docker stop myneuesdocker<br />
myneuesdocker</code></div></div><br />
Wenn man prüfen will, ob das Stoppen durchgeführt wurde, hilft wieder:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>user@user:~&#36; sudo docker ps<br />
CONTAINER ID  IMAGE    COMMAND  CREATED  STATUS    PORTS    NAMES</code></div></div><br />
Sollte man den Container nochmal benutzen müssen, kann man ihn wieder starten:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>user@user:~&#36; sudo docker start myneuesdocker<br />
myneuesdocker</code></div></div><br />
Die Prüfung zeigt, dass der Container wieder gestartet ist:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>user@user:~&#36; sudo docker ps<br />
CONTAINER ID  IMAGE    COMMAND  CREATED          STATUS          PORTS    NAMES<br />
0b2cb8ecefe8  golang    "bash"    54 minutes ago  Up 25 seconds            myneuesdocker</code></div></div><br />
Dieses Start und Stop ist nicht mit dem **run**-Befehl zu verwechseln, denn damit wurde das Image gestartet. Der Container wurde dann separat in einem nächsten Schritt gestartet (docker exec ...)<br />
<br />
Je nach dem mit welcher Computerausstattung man unterwegs ist, muss man die Ressourcen im Auge behalten. Auch dafür ist gesorgt und mit folgendem Befehl kann man die Speicherauslastung prüfen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker stats</code></div></div><br />
Die Ausgabe dieses Befehls zeigt die Auslastung von CPU, RAM usw.<br />
Da nur ein Container läuft, ist die Ausgabe relativ knapp:<br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.hermann-splitthoff.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a class="attachembed" href="attachment.php?aid=63" target="_blank" title="">Pasted image 20210816172422.png</a> (Größe: 10,52 KB / Downloads: 32)
<!-- end: postbit_attachments_attachment --><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>CONTAINER ID  NAME            CPU %    MEM USAGE / LIMIT  MEM %    NET I/O      BLOCK I/O  PIDS<br />
0b2cb8ecefe8  myneuesdocker  0.00%    824KiB / 62.73GiB  0.00%    12.2kB / 0B  0B / 0B    1</code></div></div><br />
<hr class="mycode_hr" />
<br />
Das Management von Images und Containern ist nicht unbedingt einfach. Über folgenden Befehl kann man sich die Hilfe anzeigen lassen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker --help</code></div></div><br />
Will man zu einzelnen Kommandos etwas wissen, muss der Befehl so aussehen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker system --help</code></div></div><br />
Damit werden dann weitere Hilfen angezeigt, was man eben machen kann.<br />
<br />
Im Laufe der Zeit werden sich vielleicht einige Images und Container ansammeln, die man nicht mehr haben will oder gebrauchen kann/möchte.<br />
<br />
Um herauszufinden, welche Images vorhanden sind, ist dieser Befehl notwendig:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker images -a<br />
REPOSITORY    TAG      IMAGE ID      CREATED        SIZE<br />
golang        latest    0821480a2b48  10 days ago    862MB<br />
ubuntu        latest    1318b700e415  2 weeks ago    72.8MB<br />
hello-world  latest    d1165f221234  5 months ago  13.3kB</code></div></div><br />
Dieser Befehl ist nicht mit der <span style="font-weight: bold;" class="mycode_b">ps</span>-Option zu verwechseln, die Container betrifft.<br />
<br />
Diese Auflistung kann dazu verwendet werden, dass Images, die nicht mehr gewünscht sind, entfernt werden (es können mehrere Images angegeben werden):<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>user@user:~&#36; sudo docker rmi hello-world<br />
Error response from daemon: conflict: unable to remove repository reference "hello-world" (must force) - container e5afa06d8d02 is using its referenced image d1165f221234</code></div></div><br />
Der Löschbefehl wurde nicht akzeptiert. Verstanden habe ich das bislang noch nicht.<br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #008e02;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Exkurs</span></span></span><br />
<br />
Das habe ich hier gefunden <a href="https://stackoverflow.com/questions/33907835/docker-error-cannot-delete-docker-container-conflict-unable-to-remove-reposito" target="_blank" rel="noopener" class="mycode_url">Docker error cannot delete docker container, conflict: unable to remove repository reference</a><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker container ls -a<br />
docker image ls<br />
docker container rm &lt;container_id&gt;<br />
docker image rm &lt;image_id&gt;</code></div></div><br />
Mit dem ersten Befehl werden alle Container gelistet.<br />
Mit dem zweiten Befehl werden alle Images gelistet.<br />
Diese Befehle sind notwendig, um die ID von Container und Images herauszufinden. Anscheinend müssen erst die Container entsorgt werden, bevor die Images gelöscht werden können.<br />
<br />
<hr class="mycode_hr" />
<br />
Nun wird zunächst ein Container (Hello-World aus der Installation) gelöscht:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>user@user:~&#36; sudo docker container rm e5afa06d8d02<br />
e5afa06d8d02</code></div></div><br />
Hiermit wird dann geprüft, ob der Container weg ist:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>user@user:~&#36; sudo docker container ls -a<br />
CONTAINER ID  IMAGE    COMMAND  CREATED        STATUS                    PORTS    NAMES<br />
0b2cb8ecefe8  golang    "bash"    2 hours ago    Up 41 minutes                      myneuesdocker<br />
3b4a2640dd52  golang    "bash"    20 hours ago  Exited (0) 20 hours ago            mystifying_wu<br />
0ee81db39223  ubuntu    "bash"    23 hours ago  Exited (0) 23 hours ago            stupefied_buck</code></div></div><br />
Sobald der Container gelöscht ist, kann auch das Images gelöscht werden:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>django@django:~&#36; sudo docker image rm d1165f221234<br />
Untagged: hello-world:latest<br />
Untagged: hello-world@sha256:0fe98d7debd9049c50b597ef1f85b7c1e8cc81f59c8d623fcb2250e8bec85b38<br />
Deleted: sha256:d1165f2212346b2bab48cb01c1e39ee8ad1be46b87873d9ca7a4e434980a7726<br />
Deleted: sha256:f22b99068db93900abe17f7f5e09ec775c2826ecfe9db961fea68293744144bd</code></div></div><br />
Und hier die Prüfung der vorhandenen Images:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>user@user:~&#36; sudo docker image ls<br />
REPOSITORY  TAG      IMAGE ID      CREATED      SIZE<br />
golang      latest    0821480a2b48  10 days ago  862MB<br />
ubuntu      latest    1318b700e415  2 weeks ago  72.8MB</code></div></div><br />
Das Image wurde tatsächlich gelöscht.<br />
<br />
<hr class="mycode_hr" />
<br />
Es gibt auch eine radikale Methode, um verwaiste Container zu entsorgen. Da muss man schon ein bisschen aufpassen, um nicht zu viel zu entsorgen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker system prune -a<br />
WARNING! This will remove:<br />
<br />
all stopped containers<br />
all networks not used by at least one container<br />
all unused images<br />
all build cache</code></div></div><br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #e82a1f;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Aus der Webseite zum Entfernen von Containern</span></span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #005dc2;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Entfernen von Containern</span></span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Entfernen von einem oder mehreren spezifischen Containern</span></span></span><br />
<br />
Verwenden Sie den Befehl <span style="font-weight: bold;" class="mycode_b">docker ps</span> mit dem Flag <span style="font-weight: bold;" class="mycode_b">-a</span>, um den Namen oder die ID der Container zu finden, die Sie entfernen möchten.<br />
<br />
Auflisten:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker ps -a</code></div></div><br />
Entfernen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker rm ID_or_Name ID_or_Name</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Entfernen eines Containers beim Beenden</span></span></span><br />
<br />
Falls Sie bei der Erstellung eines Containers wissen, dass Sie ihn nicht behalten möchten, wenn Sie damit fertig sind, können Sie `docker run --rm` ausführen, um ihn beim Beenden automatisch zu löschen.<br />
<br />
Ausführen und entfernen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker run --rm image_name</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Entfernen aller beendeten Container</span></span></span><br />
<br />
Sie können Container mit `docker ps -a` finden und anhand ihres Status filtern: erstellt, wird neu gestartet, wird ausgeführt, angehalten oder beendet. Zum Überprüfen der Liste der beendeten Container verwenden Sie das Flag `-f`, um anhand des Status zu filtern. Wenn Sie wissen, dass Sie diese Container entfernen möchten, nutzen Sie `-q`, um die IDs an den Befehl `docker rm` zu übergeben.<br />
<br />
Auflisten:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker ps -a -f status=exited</code></div></div><br />
<br />
Entfernen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker rm &#36;(docker ps -a -f status=exited -q)</code></div></div><br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #005dc2;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Löschen aller unbenutzten oder unreferenzierten Images, Container, Volumen und Netzwerke</span></span></span><br />
<br />
Docker bietet einen einzelnen Befehl zur Bereinigung beliebiger Ressourcen – Images, Container, Volumen und Netzwerke –, die unreferenziert (also nicht mit einem Container verknüpft) sind:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker system prune</code></div></div><br />
Um auch angehaltene Container und alle nicht verwendeten Images zu entfernen (nicht nur unreferenzierte Images), fügen Sie dem Befehl das Flag `-a` hinzu:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker system prune -a</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #0074d9;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Entfernen von Docker-Images</span></span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Entfernen von einem oder mehreren spezifischen Images</span></span></span><br />
<br />
Verwenden Sie den Befehl `docker images` mit dem Flag `-a`, um die ID der Images zu finden, die Sie entfernen möchten. Dadurch wird Ihnen jedes Image angezeigt, einschließlich dazwischenliegender Image-Ebenen. Wenn Sie die Images gefunden haben, die Sie löschen möchten, können Sie ihre ID oder ihr Tag `docker rmi` übergeben:<br />
<br />
Auflisten:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker images -a</code></div></div><br />
<br />
Entfernen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker rmi Image Image</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Entfernen von unreferenzierten Images</span></span></span><br />
<br />
Docker-Images bestehen aus mehreren Ebenen. Unreferenzierte Images sind Ebenen, die keine Beziehung zu getaggten Images haben. Sie dienen keinem Zweck mehr und verbrauchen Festplattenspeicher. Sie lassen sich finden, indem Sie das Filter-Flag (`-f`) mit dem Wert `dangling=true` zum Befehl `docker images` hinzufügen. Wenn Sie sicher sind, dass Sie sie löschen möchten, können Sie den Befehl `docker images purge` verwenden:<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Anmerkung:</span><br />
<br />
Wenn Sie ein Image erstellen, ohne es mit einem Tag zu versehen, wird das Image in der Liste der unreferenzierten Images angezeigt, da es keine Zuordnung zu einem getaggten Image aufweist. Sie können diese Situation vermeiden, indem Sie beim Erstellen <a href="https://docs.docker.com/engine/reference/commandline/build/#/tag-image--t" target="_blank" rel="noopener" class="mycode_url">ein Tag angeben</a>; außerdem können Sie Images mit dem Befehl <a href="https://docs.docker.com/engine/reference/commandline/tag/" target="_blank" rel="noopener" class="mycode_url">docker tag</a> im Nachhinein mit einem Tag versehen.  <br />
<br />
Auflisten:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker images -f dangling=true</code></div></div><br />
Entfernen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker images purge</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Entfernen von Images gemäß einem Muster</span></span></span><br />
<br />
Sie können alle Images finden, die mit einem Muster übereinstimmen, indem Sie eine Kombination aus <span style="font-weight: bold;" class="mycode_b">docker images</span> und <a href="https://www.digitalocean.com/community/tutorials/using-grep-regular-expressions-to-search-for-text-patterns-in-linux" target="_blank" rel="noopener" class="mycode_url">grep</a> nutzen. Wenn Sie damit zufrieden sind, können Sie sie durch <span style="font-weight: bold;" class="mycode_b">awk</span> löschen, um die IDs an `docker rmi` zu übergeben. Beachten Sie, dass diese Dienstprogramme nicht von Docker bereitgestellt werden und nicht unbedingt für alle Systeme verfügbar sind:<br />
<br />
Auflisten:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker images -a |  grep "pattern"</code></div></div><br />
Entfernen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker images -a | grep "pattern" | awk '{print &#36;3}' | xargs docker rmi</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Alle Images entfernen</span></span></span><br />
<br />
Alle Docker-Images in einem System können aufgelistet werden, indem Sie dem Befehl <span style="font-weight: bold;" class="mycode_b">docker images </span><span style="font-weight: bold;" class="mycode_b">-a</span> hinzufügen. Wenn Sie sicher sind, dass Sie alle löschen möchten, können Sie das Flag <span style="font-weight: bold;" class="mycode_b">-q</span> hinzufügen, um die Image-ID an <span style="font-weight: bold;" class="mycode_b">docker rmi</span> zu übergeben:<br />
<br />
Auflisten:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker images -a</code></div></div><br />
Entfernen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker rmi &#36;(docker images -a -q)</code></div></div><br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Noch eine Hilfe, sollte man mehrere Container laufen haben:</span></span></span><br />
<br />
If you want to cleanup docker images and containers<br />
<br />
CAUTION: this will flush everything<br />
<br />
stop all containers<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker stop &#36;(docker ps -a -q)</code></div></div><br />
remove all containers<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker rm &#36;(docker ps -a -q)</code></div></div><br />
remove all images<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker rmi -f &#36;(docker images -a -q)</code></div></div><br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Wo liegen die Docker-Images?</span></span></span><br />
<br />
Mit folgendem Befehl kann man die Docker-Infos ermitteln:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker info</code></div></div><br />
Die Ausgabe länger und die Antwort auf die Frage im letzten Teil der Ausgabe zu sehen:<br />
<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>user@user:~&#36; sudo docker info<br />
Client:<br />
Context:    default<br />
Debug Mode: false<br />
Plugins:<br />
  app: Docker App (Docker Inc., v0.9.1-beta3)<br />
  buildx: Build with BuildKit (Docker Inc., v0.6.1-docker)<br />
  scan: Docker Scan (Docker Inc., v0.8.0)<br />
<br />
Server:<br />
Containers: 0<br />
  Running: 0<br />
  Paused: 0<br />
  Stopped: 0<br />
Images: 0<br />
Server Version: 20.10.8<br />
Storage Driver: overlay2<br />
  Backing Filesystem: extfs<br />
  Supports d_type: true<br />
  Native Overlay Diff: true<br />
  userxattr: false<br />
Logging Driver: json-file<br />
Cgroup Driver: cgroupfs<br />
Cgroup Version: 1<br />
Plugins:<br />
  Volume: local<br />
  Network: bridge host ipvlan macvlan null overlay<br />
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog<br />
Swarm: inactive<br />
Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc<br />
Default Runtime: runc<br />
Init Binary: docker-init<br />
containerd version: e25210fe30a0a703442421b0f60afac609f950a3<br />
runc version: v1.0.1-0-g4144b63<br />
init version: de40ad0<br />
Security Options:<br />
  apparmor<br />
  seccomp<br />
  Profile: default<br />
Kernel Version: 5.11.0-25-generic<br />
Operating System: Ubuntu 20.04.2 LTS<br />
OSType: linux<br />
Architecture: x86_64<br />
CPUs: 16<br />
Total Memory: 62.73GiB<br />
Name: django<br />
ID: RTKL:M23W:E6CV:JO3K:YVNJ:GXXS:I5XO:3UU3:R654:KJQX:AXYO:L43R<br />
Docker Root Dir: /var/lib/docker<br />
Debug Mode: false<br />
Registry: https://index.docker.io/v1/<br />
Labels:<br />
Experimental: false<br />
Insecure Registries:<br />
  127.0.0.0/8<br />
Live Restore Enabled: false</code></div></div><br />
Der <span style="font-weight: bold;" class="mycode_b">docker-root-ordner</span> liegt hier:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>/var/lib/docker</blockquote>
<br />
<span style="font-weight: bold;" class="mycode_b">docker</span> ist ein Ordner, der mit einem Schloss versehen ist:<br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.hermann-splitthoff.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a class="attachembed" href="attachment.php?aid=64" target="_blank" title="">Pasted image 20210816181843.png</a> (Größe: 48,83 KB / Downloads: 33)
<!-- end: postbit_attachments_attachment --><br />
<br />
Die Images und Container werden in diesem Pfad abgespeichert, aber nicht namtlich erkennbar, sondern mit SHA256-Codenamen. Somit sind diese Dateien außerhalb der Einflussnahme durch den User, also durch mich. Ich kann nur das Management betreiben. So sieht der Ordner im Midnight-Commander aus:<br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.hermann-splitthoff.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a class="attachembed" href="attachment.php?aid=65" target="_blank" title="">Pasted image 20210816182255.png</a> (Größe: 50,4 KB / Downloads: 38)
<!-- end: postbit_attachments_attachment --><br />
<br />
Somit kann ich nun am 16.08.2021 in das echte Handling von Docker einsteigen.<br />
<br />
Docker kann nur Serversoftware verarbeiten. Grafische Oberflächen kann Docker nicht darstellen und war auch nicht Sinn und Zweck für die Entwicklung dieses Tools. Die möglichen Betriebssystem, die in Docker laufen, sind also immer nur die Serverversionen, nie die Desktop-Versionen.<br />
<br />
Damit der Normaluser mit Docker arbeiten kann, ist er zur Gruppe Docker hinzuzufügen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo usermod -aG docker django</code></div></div><br />
<br />
Nach einer Neuanmeldung ist die Gruppenzuordnung aktiv.<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #008e02;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Exkurs</span></span></span><br />
<br />
Im Normalfall wird erst der Pull-Befehl und dann der Run-Befehl ausgeführt. Man kann aber auch direkt den Run-Befehl ausführen. Wird das Images nicht gefunden, wird es heruntergeladen. Also wird der Pull-Befeh implizit ausgeführt.<br />
<br />
<hr class="mycode_hr" />
<br />
Die Option <span style="font-weight: bold;" class="mycode_b">-d</span> im Run-Befehl sorgt dafür, dass der Container im Hintergrund läuft.<br />
<br />
Die Option <span style="font-weight: bold;" class="mycode_b">-p 8080:80</span> sorgt dafür, dass man innerhalb des Container einen nach außen geöffneten Port zur Verfügung hat. Bei Webserver, die später im Webbrowser ausgeführt werden, oder bei anderen Webanwendungen (z.B. Ghost) ist das notwendig. Im Browser wäre anzugeben: <span style="font-weight: bold;" class="mycode_b">localhost:8080</span><br />
<br />
Die wichtigsten Befehle nochmal zusammengefasst:<br />
<ul class="mycode_list"><li>docker pull imagename<br />
</li>
<li>docker ps<br />
</li>
<li>docker ps -a (zeigt auch laufende Container)<br />
</li>
<li>docker run -d -t --name **platzname** imagename<br />
</li>
<li>docker exec -it **platzname** bash oder sh (wo der Container laufen soll)<br />
</li>
<li>exit (aus Container aussteigen)<br />
</li>
<li>docker stop **platzname** (Container stoppen)<br />
</li>
<li>docker start **platzname** (Container starten)<br />
</li>
<li>docker info<br />
</li>
<li>docker stats<br />
</li>
<li>docker --help<br />
</li>
<li>docker command --help<br />
</li>
<li>docker images -a<br />
</li>
<li>docker container ls -a<br />
</li>
<li>docker image ls<br />
</li>
<li>docker volume ls<br />
</li>
<li>docker container rm ID-Container oder Name<br />
</li>
<li>docker image rm ID-Image oder Name<br />
</li>
<li>docker system prune -a (mit Vorsicht, alles alle Container, die unbenutzt sind.<br />
</li>
<li>docker run --rm image_name (Vorsicht: beim Beenden wird der Container direkt wieder gelöscht) <br />
</li>
</ul>
<br />
<hr class="mycode_hr" />
<br />
Eigene Daten sollte man nicht in den Container kopieren, sondern via Volumes bereitstellen, die dann vom Container genutzt werden. Da ist z.B. für einen Webserver gut, der in einem Container läuft und die HTML-Seiten liegen dann im Volume.<br />
<br />
<hr class="mycode_hr" />
<br />
Zwar läuft z.B. ein Webserver in einem Container, aber gleichzeitig wird er auch vom Host, also vom eigenen Computer erkannt. Mit folgendem Befehl kann man prüfen, ob z.B. nginx ausgeführt wird, der in eiinem Container läuft:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>ps axu | grep nginx</code></div></div>]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b"><span style="color: #e82a1f;" class="mycode_color"><span style="font-size: large;" class="mycode_size">So wird Docker genutzt</span></span></span><br />
<br />
Mal wieder ein guter Link:<br />
Entfernen von Docker-Images, -Containern und -Volumen<br />
<br />
oder hier:<br />
<br />
<a href="https://docs.docker.com/engine/reference/run/" target="_blank" rel="noopener" class="mycode_url">Docker run reference</a><br />
<br />
Sobald Docker komplett incl. Engine installiert ist, kann Docker auch genutzt werden. Um Docker zu nutzen, muss man die Image-Namen wissen.  Diese sind z.B. auf dem Docker Hub zu finden.<br />
<br />
Docker-Image herunterladen<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker pull golang</code></div></div><br />
Um zu prüfen, welche Images heruntergeladen worden sind, gilt folgender Befehl:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker ps -a<br />
[sudo] Passwort für user:<br />
CONTAINER ID  IMAGE        COMMAND    CREATED        STATUS                    PORTS    NAMES<br />
3b4a2640dd52  golang        "bash"    19 hours ago  Exited (0) 19 hours ago            mystifying_wu<br />
0ee81db39223  ubuntu        "bash"    21 hours ago  Exited (0) 21 hours ago            stupefied_buck<br />
e5afa06d8d02  hello-world  "/hello"  21 hours ago  Exited (0) 21 hours ago            mystifying_bell</code></div></div><br />
Um zu prüfen, welche Container laufen, ist die Option **-a** wegzulassen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker ps<br />
CONTAINER ID  IMAGE    COMMAND  CREATED  STATUS    PORTS    NAMES</code></div></div><br />
Da noch kein Container gestartet wurde, wird auch noch nichts angezeigt, was an Containern läuft.<br />
<br />
Mit dem folgenden Befehl wird ein Container aus dem vorher heruntergeladenen Image erstellt und gestartet:<br />
<br />
Hier wäre der Dienst im Hintergrund und läuft vor sich hin (detached)<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker run -d -it --name myneuesdocker golang</code></div></div><br />
oder<br />
<br />
Hier wäre der Dienst interaktiv und benutzbar (tached)<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker run -it --name myneuesdocker golang<br />
0b2cb8ecefe8dbabb95a2078419a8585dc5b224693809a1560fff8321c429f0e</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b">Hinweis</span><br />
<br />
Wenn der run-Befehl ausgeführt wird, dann wird z.B. hinten nach dem Imagenamen ein Befehl angehängt, der dann ausgeführt werden soll. Wenn nichts angegeben wird, wird der Standardprozess gestartet.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Beispiel</span><br />
<br />
Ubuntu - der Aufruf des Images zur Erstellung des Container kann mit ... ubuntu bash ... enden, damit nach dem Start des Containers sofort eine Bash vorhanden ist.<br />
<br />
Es wird eine lange ID ausgegeben, wobei die ersten 12 Stellen wohl später die ID für die laufen  Container darstellen.<br />
<br />
Um zu prüfen, ob der Container läuft, ist wieder folgender Befehl abzusetzen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker ps<br />
CONTAINER ID  IMAGE    COMMAND  CREATED              STATUS              PORTS    NAMES<br />
0b2cb8ecefe8  golang    "bash"    About a minute ago  Up About a minute            myneuesdocker</code></div></div><br />
Nun wird gezeigt, welche Container laufen. In diesem Falle ist es nur der Golang-Container.<br />
<br />
Was der Name <span style="font-weight: bold;" class="mycode_b">myneuesdocker</span>, den ich selber kreiert habe, zu bedeuten hat, weiß ich noch nicht.<br />
<br />
Ich weiß auch noch nicht, wo Docker den Pull-Download ablegt und wo der Container wirklich liegt. Denn eigentlich müsste mindestens eine Datei zu finden sein. In Linux wird alles in Dateien erledigt.<br />
<br />
Um mit dem Container arbeiten zu können, ist folgender Befehl notwendig:<br />
<br />
<span style="font-weight: bold;" class="mycode_b">sudo docker exec -it myneuesdocker bash</span><br />
<span style="font-weight: bold;" class="mycode_b">root@0b2cb8ecefe8:/go#</span><br />
<br />
In diesem Falle landet man als <span style="font-weight: bold;" class="mycode_b">root</span> in einem Bash-Terminal und kann loslegen.<br />
<br />
Um zu prüfen, welche Ordner bzw. Dateien nun zur Verfügung stehen, ist nur der **ls**-Befehl notwendig:<br />
<br />
<span style="font-weight: bold;" class="mycode_b">root@0b2cb8ecefe8:/go# ls</span><br />
<span style="font-weight: bold;" class="mycode_b">bin  src</span><br />
<br />
Die Ausgabe ist sehr minimalistisch, da nur die notwendigen Abhängigkeiten erfüllt werden. Das ist eben der große Vorteil von Docker mit den Containern gegenüber den Virtualisierungstools.<br />
<br />
Um den Container zu verlassen, ist nur dies erforderlich:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>root@0b2cb8ecefe8:/go# exit<br />
exit<br />
user@user:~&#36;</code></div></div><br />
Damit ist man wieder auf der eigenen Maschine unterwegs und nicht mehr im Container. Der Container läuft aber noch und ist somit jederzeit wieder zu betreten.<br />
<br />
Um einen Container mit dem Host, also dem eigenen Computer zu verbinden, ist beim Aufruf von <span style="font-weight: bold;" class="mycode_b">run</span> der Port mitzugeben:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker run -d -t -p 80:80 --name myneuesdocker golang</code></div></div><br />
Dieser Aufruf wurde auf dem Kanal von NetworkChuck in Verbindung mit einem anderen Betriebssystem genutzt. Ob das mit meinem Beispiel auch so geht, weiß ich nicht. Aber man kann Container mit dem eigenen Betriebssystem verbinden.<br />
<br />
In dem Beispiel hat er in dem Container seine Trainingswebseite in einem Browser aufgerufen.<br />
<br />
Um einen Container zu beenden, ist folgender Befehl notwendig:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>user@user:~&#36; sudo docker stop myneuesdocker<br />
myneuesdocker</code></div></div><br />
Wenn man prüfen will, ob das Stoppen durchgeführt wurde, hilft wieder:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>user@user:~&#36; sudo docker ps<br />
CONTAINER ID  IMAGE    COMMAND  CREATED  STATUS    PORTS    NAMES</code></div></div><br />
Sollte man den Container nochmal benutzen müssen, kann man ihn wieder starten:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>user@user:~&#36; sudo docker start myneuesdocker<br />
myneuesdocker</code></div></div><br />
Die Prüfung zeigt, dass der Container wieder gestartet ist:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>user@user:~&#36; sudo docker ps<br />
CONTAINER ID  IMAGE    COMMAND  CREATED          STATUS          PORTS    NAMES<br />
0b2cb8ecefe8  golang    "bash"    54 minutes ago  Up 25 seconds            myneuesdocker</code></div></div><br />
Dieses Start und Stop ist nicht mit dem **run**-Befehl zu verwechseln, denn damit wurde das Image gestartet. Der Container wurde dann separat in einem nächsten Schritt gestartet (docker exec ...)<br />
<br />
Je nach dem mit welcher Computerausstattung man unterwegs ist, muss man die Ressourcen im Auge behalten. Auch dafür ist gesorgt und mit folgendem Befehl kann man die Speicherauslastung prüfen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker stats</code></div></div><br />
Die Ausgabe dieses Befehls zeigt die Auslastung von CPU, RAM usw.<br />
Da nur ein Container läuft, ist die Ausgabe relativ knapp:<br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.hermann-splitthoff.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a class="attachembed" href="attachment.php?aid=63" target="_blank" title="">Pasted image 20210816172422.png</a> (Größe: 10,52 KB / Downloads: 32)
<!-- end: postbit_attachments_attachment --><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>CONTAINER ID  NAME            CPU %    MEM USAGE / LIMIT  MEM %    NET I/O      BLOCK I/O  PIDS<br />
0b2cb8ecefe8  myneuesdocker  0.00%    824KiB / 62.73GiB  0.00%    12.2kB / 0B  0B / 0B    1</code></div></div><br />
<hr class="mycode_hr" />
<br />
Das Management von Images und Containern ist nicht unbedingt einfach. Über folgenden Befehl kann man sich die Hilfe anzeigen lassen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker --help</code></div></div><br />
Will man zu einzelnen Kommandos etwas wissen, muss der Befehl so aussehen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker system --help</code></div></div><br />
Damit werden dann weitere Hilfen angezeigt, was man eben machen kann.<br />
<br />
Im Laufe der Zeit werden sich vielleicht einige Images und Container ansammeln, die man nicht mehr haben will oder gebrauchen kann/möchte.<br />
<br />
Um herauszufinden, welche Images vorhanden sind, ist dieser Befehl notwendig:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker images -a<br />
REPOSITORY    TAG      IMAGE ID      CREATED        SIZE<br />
golang        latest    0821480a2b48  10 days ago    862MB<br />
ubuntu        latest    1318b700e415  2 weeks ago    72.8MB<br />
hello-world  latest    d1165f221234  5 months ago  13.3kB</code></div></div><br />
Dieser Befehl ist nicht mit der <span style="font-weight: bold;" class="mycode_b">ps</span>-Option zu verwechseln, die Container betrifft.<br />
<br />
Diese Auflistung kann dazu verwendet werden, dass Images, die nicht mehr gewünscht sind, entfernt werden (es können mehrere Images angegeben werden):<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>user@user:~&#36; sudo docker rmi hello-world<br />
Error response from daemon: conflict: unable to remove repository reference "hello-world" (must force) - container e5afa06d8d02 is using its referenced image d1165f221234</code></div></div><br />
Der Löschbefehl wurde nicht akzeptiert. Verstanden habe ich das bislang noch nicht.<br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #008e02;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Exkurs</span></span></span><br />
<br />
Das habe ich hier gefunden <a href="https://stackoverflow.com/questions/33907835/docker-error-cannot-delete-docker-container-conflict-unable-to-remove-reposito" target="_blank" rel="noopener" class="mycode_url">Docker error cannot delete docker container, conflict: unable to remove repository reference</a><br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker container ls -a<br />
docker image ls<br />
docker container rm &lt;container_id&gt;<br />
docker image rm &lt;image_id&gt;</code></div></div><br />
Mit dem ersten Befehl werden alle Container gelistet.<br />
Mit dem zweiten Befehl werden alle Images gelistet.<br />
Diese Befehle sind notwendig, um die ID von Container und Images herauszufinden. Anscheinend müssen erst die Container entsorgt werden, bevor die Images gelöscht werden können.<br />
<br />
<hr class="mycode_hr" />
<br />
Nun wird zunächst ein Container (Hello-World aus der Installation) gelöscht:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>user@user:~&#36; sudo docker container rm e5afa06d8d02<br />
e5afa06d8d02</code></div></div><br />
Hiermit wird dann geprüft, ob der Container weg ist:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>user@user:~&#36; sudo docker container ls -a<br />
CONTAINER ID  IMAGE    COMMAND  CREATED        STATUS                    PORTS    NAMES<br />
0b2cb8ecefe8  golang    "bash"    2 hours ago    Up 41 minutes                      myneuesdocker<br />
3b4a2640dd52  golang    "bash"    20 hours ago  Exited (0) 20 hours ago            mystifying_wu<br />
0ee81db39223  ubuntu    "bash"    23 hours ago  Exited (0) 23 hours ago            stupefied_buck</code></div></div><br />
Sobald der Container gelöscht ist, kann auch das Images gelöscht werden:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>django@django:~&#36; sudo docker image rm d1165f221234<br />
Untagged: hello-world:latest<br />
Untagged: hello-world@sha256:0fe98d7debd9049c50b597ef1f85b7c1e8cc81f59c8d623fcb2250e8bec85b38<br />
Deleted: sha256:d1165f2212346b2bab48cb01c1e39ee8ad1be46b87873d9ca7a4e434980a7726<br />
Deleted: sha256:f22b99068db93900abe17f7f5e09ec775c2826ecfe9db961fea68293744144bd</code></div></div><br />
Und hier die Prüfung der vorhandenen Images:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>user@user:~&#36; sudo docker image ls<br />
REPOSITORY  TAG      IMAGE ID      CREATED      SIZE<br />
golang      latest    0821480a2b48  10 days ago  862MB<br />
ubuntu      latest    1318b700e415  2 weeks ago  72.8MB</code></div></div><br />
Das Image wurde tatsächlich gelöscht.<br />
<br />
<hr class="mycode_hr" />
<br />
Es gibt auch eine radikale Methode, um verwaiste Container zu entsorgen. Da muss man schon ein bisschen aufpassen, um nicht zu viel zu entsorgen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker system prune -a<br />
WARNING! This will remove:<br />
<br />
all stopped containers<br />
all networks not used by at least one container<br />
all unused images<br />
all build cache</code></div></div><br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #e82a1f;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Aus der Webseite zum Entfernen von Containern</span></span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #005dc2;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Entfernen von Containern</span></span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Entfernen von einem oder mehreren spezifischen Containern</span></span></span><br />
<br />
Verwenden Sie den Befehl <span style="font-weight: bold;" class="mycode_b">docker ps</span> mit dem Flag <span style="font-weight: bold;" class="mycode_b">-a</span>, um den Namen oder die ID der Container zu finden, die Sie entfernen möchten.<br />
<br />
Auflisten:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker ps -a</code></div></div><br />
Entfernen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker rm ID_or_Name ID_or_Name</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Entfernen eines Containers beim Beenden</span></span></span><br />
<br />
Falls Sie bei der Erstellung eines Containers wissen, dass Sie ihn nicht behalten möchten, wenn Sie damit fertig sind, können Sie `docker run --rm` ausführen, um ihn beim Beenden automatisch zu löschen.<br />
<br />
Ausführen und entfernen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker run --rm image_name</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Entfernen aller beendeten Container</span></span></span><br />
<br />
Sie können Container mit `docker ps -a` finden und anhand ihres Status filtern: erstellt, wird neu gestartet, wird ausgeführt, angehalten oder beendet. Zum Überprüfen der Liste der beendeten Container verwenden Sie das Flag `-f`, um anhand des Status zu filtern. Wenn Sie wissen, dass Sie diese Container entfernen möchten, nutzen Sie `-q`, um die IDs an den Befehl `docker rm` zu übergeben.<br />
<br />
Auflisten:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker ps -a -f status=exited</code></div></div><br />
<br />
Entfernen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker rm &#36;(docker ps -a -f status=exited -q)</code></div></div><br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #005dc2;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Löschen aller unbenutzten oder unreferenzierten Images, Container, Volumen und Netzwerke</span></span></span><br />
<br />
Docker bietet einen einzelnen Befehl zur Bereinigung beliebiger Ressourcen – Images, Container, Volumen und Netzwerke –, die unreferenziert (also nicht mit einem Container verknüpft) sind:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker system prune</code></div></div><br />
Um auch angehaltene Container und alle nicht verwendeten Images zu entfernen (nicht nur unreferenzierte Images), fügen Sie dem Befehl das Flag `-a` hinzu:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker system prune -a</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #0074d9;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Entfernen von Docker-Images</span></span></span><br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Entfernen von einem oder mehreren spezifischen Images</span></span></span><br />
<br />
Verwenden Sie den Befehl `docker images` mit dem Flag `-a`, um die ID der Images zu finden, die Sie entfernen möchten. Dadurch wird Ihnen jedes Image angezeigt, einschließlich dazwischenliegender Image-Ebenen. Wenn Sie die Images gefunden haben, die Sie löschen möchten, können Sie ihre ID oder ihr Tag `docker rmi` übergeben:<br />
<br />
Auflisten:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker images -a</code></div></div><br />
<br />
Entfernen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker rmi Image Image</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Entfernen von unreferenzierten Images</span></span></span><br />
<br />
Docker-Images bestehen aus mehreren Ebenen. Unreferenzierte Images sind Ebenen, die keine Beziehung zu getaggten Images haben. Sie dienen keinem Zweck mehr und verbrauchen Festplattenspeicher. Sie lassen sich finden, indem Sie das Filter-Flag (`-f`) mit dem Wert `dangling=true` zum Befehl `docker images` hinzufügen. Wenn Sie sicher sind, dass Sie sie löschen möchten, können Sie den Befehl `docker images purge` verwenden:<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Anmerkung:</span><br />
<br />
Wenn Sie ein Image erstellen, ohne es mit einem Tag zu versehen, wird das Image in der Liste der unreferenzierten Images angezeigt, da es keine Zuordnung zu einem getaggten Image aufweist. Sie können diese Situation vermeiden, indem Sie beim Erstellen <a href="https://docs.docker.com/engine/reference/commandline/build/#/tag-image--t" target="_blank" rel="noopener" class="mycode_url">ein Tag angeben</a>; außerdem können Sie Images mit dem Befehl <a href="https://docs.docker.com/engine/reference/commandline/tag/" target="_blank" rel="noopener" class="mycode_url">docker tag</a> im Nachhinein mit einem Tag versehen.  <br />
<br />
Auflisten:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker images -f dangling=true</code></div></div><br />
Entfernen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker images purge</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Entfernen von Images gemäß einem Muster</span></span></span><br />
<br />
Sie können alle Images finden, die mit einem Muster übereinstimmen, indem Sie eine Kombination aus <span style="font-weight: bold;" class="mycode_b">docker images</span> und <a href="https://www.digitalocean.com/community/tutorials/using-grep-regular-expressions-to-search-for-text-patterns-in-linux" target="_blank" rel="noopener" class="mycode_url">grep</a> nutzen. Wenn Sie damit zufrieden sind, können Sie sie durch <span style="font-weight: bold;" class="mycode_b">awk</span> löschen, um die IDs an `docker rmi` zu übergeben. Beachten Sie, dass diese Dienstprogramme nicht von Docker bereitgestellt werden und nicht unbedingt für alle Systeme verfügbar sind:<br />
<br />
Auflisten:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker images -a |  grep "pattern"</code></div></div><br />
Entfernen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker images -a | grep "pattern" | awk '{print &#36;3}' | xargs docker rmi</code></div></div><br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Alle Images entfernen</span></span></span><br />
<br />
Alle Docker-Images in einem System können aufgelistet werden, indem Sie dem Befehl <span style="font-weight: bold;" class="mycode_b">docker images </span><span style="font-weight: bold;" class="mycode_b">-a</span> hinzufügen. Wenn Sie sicher sind, dass Sie alle löschen möchten, können Sie das Flag <span style="font-weight: bold;" class="mycode_b">-q</span> hinzufügen, um die Image-ID an <span style="font-weight: bold;" class="mycode_b">docker rmi</span> zu übergeben:<br />
<br />
Auflisten:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker images -a</code></div></div><br />
Entfernen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker rmi &#36;(docker images -a -q)</code></div></div><br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Noch eine Hilfe, sollte man mehrere Container laufen haben:</span></span></span><br />
<br />
If you want to cleanup docker images and containers<br />
<br />
CAUTION: this will flush everything<br />
<br />
stop all containers<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker stop &#36;(docker ps -a -q)</code></div></div><br />
remove all containers<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker rm &#36;(docker ps -a -q)</code></div></div><br />
remove all images<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker rmi -f &#36;(docker images -a -q)</code></div></div><br />
<br />
<hr class="mycode_hr" />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #c10300;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Wo liegen die Docker-Images?</span></span></span><br />
<br />
Mit folgendem Befehl kann man die Docker-Infos ermitteln:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo docker info</code></div></div><br />
Die Ausgabe länger und die Antwort auf die Frage im letzten Teil der Ausgabe zu sehen:<br />
<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>user@user:~&#36; sudo docker info<br />
Client:<br />
Context:    default<br />
Debug Mode: false<br />
Plugins:<br />
  app: Docker App (Docker Inc., v0.9.1-beta3)<br />
  buildx: Build with BuildKit (Docker Inc., v0.6.1-docker)<br />
  scan: Docker Scan (Docker Inc., v0.8.0)<br />
<br />
Server:<br />
Containers: 0<br />
  Running: 0<br />
  Paused: 0<br />
  Stopped: 0<br />
Images: 0<br />
Server Version: 20.10.8<br />
Storage Driver: overlay2<br />
  Backing Filesystem: extfs<br />
  Supports d_type: true<br />
  Native Overlay Diff: true<br />
  userxattr: false<br />
Logging Driver: json-file<br />
Cgroup Driver: cgroupfs<br />
Cgroup Version: 1<br />
Plugins:<br />
  Volume: local<br />
  Network: bridge host ipvlan macvlan null overlay<br />
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog<br />
Swarm: inactive<br />
Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc<br />
Default Runtime: runc<br />
Init Binary: docker-init<br />
containerd version: e25210fe30a0a703442421b0f60afac609f950a3<br />
runc version: v1.0.1-0-g4144b63<br />
init version: de40ad0<br />
Security Options:<br />
  apparmor<br />
  seccomp<br />
  Profile: default<br />
Kernel Version: 5.11.0-25-generic<br />
Operating System: Ubuntu 20.04.2 LTS<br />
OSType: linux<br />
Architecture: x86_64<br />
CPUs: 16<br />
Total Memory: 62.73GiB<br />
Name: django<br />
ID: RTKL:M23W:E6CV:JO3K:YVNJ:GXXS:I5XO:3UU3:R654:KJQX:AXYO:L43R<br />
Docker Root Dir: /var/lib/docker<br />
Debug Mode: false<br />
Registry: https://index.docker.io/v1/<br />
Labels:<br />
Experimental: false<br />
Insecure Registries:<br />
  127.0.0.0/8<br />
Live Restore Enabled: false</code></div></div><br />
Der <span style="font-weight: bold;" class="mycode_b">docker-root-ordner</span> liegt hier:<br />
<br />
<blockquote class="mycode_quote"><cite>Zitat:</cite>/var/lib/docker</blockquote>
<br />
<span style="font-weight: bold;" class="mycode_b">docker</span> ist ein Ordner, der mit einem Schloss versehen ist:<br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.hermann-splitthoff.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a class="attachembed" href="attachment.php?aid=64" target="_blank" title="">Pasted image 20210816181843.png</a> (Größe: 48,83 KB / Downloads: 33)
<!-- end: postbit_attachments_attachment --><br />
<br />
Die Images und Container werden in diesem Pfad abgespeichert, aber nicht namtlich erkennbar, sondern mit SHA256-Codenamen. Somit sind diese Dateien außerhalb der Einflussnahme durch den User, also durch mich. Ich kann nur das Management betreiben. So sieht der Ordner im Midnight-Commander aus:<br />
<br />
<!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://forum.hermann-splitthoff.de/images/attachtypes/image.png" title="PNG Image" border="0" alt=".png" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a class="attachembed" href="attachment.php?aid=65" target="_blank" title="">Pasted image 20210816182255.png</a> (Größe: 50,4 KB / Downloads: 38)
<!-- end: postbit_attachments_attachment --><br />
<br />
Somit kann ich nun am 16.08.2021 in das echte Handling von Docker einsteigen.<br />
<br />
Docker kann nur Serversoftware verarbeiten. Grafische Oberflächen kann Docker nicht darstellen und war auch nicht Sinn und Zweck für die Entwicklung dieses Tools. Die möglichen Betriebssystem, die in Docker laufen, sind also immer nur die Serverversionen, nie die Desktop-Versionen.<br />
<br />
Damit der Normaluser mit Docker arbeiten kann, ist er zur Gruppe Docker hinzuzufügen:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>sudo usermod -aG docker django</code></div></div><br />
<br />
Nach einer Neuanmeldung ist die Gruppenzuordnung aktiv.<br />
<br />
<span style="font-weight: bold;" class="mycode_b"><span style="color: #008e02;" class="mycode_color"><span style="font-size: large;" class="mycode_size">Exkurs</span></span></span><br />
<br />
Im Normalfall wird erst der Pull-Befehl und dann der Run-Befehl ausgeführt. Man kann aber auch direkt den Run-Befehl ausführen. Wird das Images nicht gefunden, wird es heruntergeladen. Also wird der Pull-Befeh implizit ausgeführt.<br />
<br />
<hr class="mycode_hr" />
<br />
Die Option <span style="font-weight: bold;" class="mycode_b">-d</span> im Run-Befehl sorgt dafür, dass der Container im Hintergrund läuft.<br />
<br />
Die Option <span style="font-weight: bold;" class="mycode_b">-p 8080:80</span> sorgt dafür, dass man innerhalb des Container einen nach außen geöffneten Port zur Verfügung hat. Bei Webserver, die später im Webbrowser ausgeführt werden, oder bei anderen Webanwendungen (z.B. Ghost) ist das notwendig. Im Browser wäre anzugeben: <span style="font-weight: bold;" class="mycode_b">localhost:8080</span><br />
<br />
Die wichtigsten Befehle nochmal zusammengefasst:<br />
<ul class="mycode_list"><li>docker pull imagename<br />
</li>
<li>docker ps<br />
</li>
<li>docker ps -a (zeigt auch laufende Container)<br />
</li>
<li>docker run -d -t --name **platzname** imagename<br />
</li>
<li>docker exec -it **platzname** bash oder sh (wo der Container laufen soll)<br />
</li>
<li>exit (aus Container aussteigen)<br />
</li>
<li>docker stop **platzname** (Container stoppen)<br />
</li>
<li>docker start **platzname** (Container starten)<br />
</li>
<li>docker info<br />
</li>
<li>docker stats<br />
</li>
<li>docker --help<br />
</li>
<li>docker command --help<br />
</li>
<li>docker images -a<br />
</li>
<li>docker container ls -a<br />
</li>
<li>docker image ls<br />
</li>
<li>docker volume ls<br />
</li>
<li>docker container rm ID-Container oder Name<br />
</li>
<li>docker image rm ID-Image oder Name<br />
</li>
<li>docker system prune -a (mit Vorsicht, alles alle Container, die unbenutzt sind.<br />
</li>
<li>docker run --rm image_name (Vorsicht: beim Beenden wird der Container direkt wieder gelöscht) <br />
</li>
</ul>
<br />
<hr class="mycode_hr" />
<br />
Eigene Daten sollte man nicht in den Container kopieren, sondern via Volumes bereitstellen, die dann vom Container genutzt werden. Da ist z.B. für einen Webserver gut, der in einem Container läuft und die HTML-Seiten liegen dann im Volume.<br />
<br />
<hr class="mycode_hr" />
<br />
Zwar läuft z.B. ein Webserver in einem Container, aber gleichzeitig wird er auch vom Host, also vom eigenen Computer erkannt. Mit folgendem Befehl kann man prüfen, ob z.B. nginx ausgeführt wird, der in eiinem Container läuft:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>ps axu | grep nginx</code></div></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Das Docker-MOC]]></title>
			<link>https://forum.hermann-splitthoff.de/showthread.php?tid=1371</link>
			<pubDate>Sat, 23 Nov 2024 19:43:45 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.hermann-splitthoff.de/member.php?action=profile&uid=1">Joopi</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.hermann-splitthoff.de/showthread.php?tid=1371</guid>
			<description><![CDATA[<span style="font-weight: bold;" class="mycode_b"><span style="color: #005dc2;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size">Das MOC für Docker</span></span></span><br />
<br />
Meine eigenen Aufzeichnungen zum Handling von Docker. Sehr unvollständig, weil neben dem Erlernen einfach mitgeschrieben.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Hinweis</span><br />
<br />
Am 06.11.2022 habe ich den Ablageort der Docker-Images von **/var/lib/docker** nach **/media/django/virtualbox/dockerworld/docker** verändert.<br />
Der Grund ist und war, dass die separate SSD mehr Platz für solche Dateien hat.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">ACHTUNG</span><br />
<br />
Beim Run-Befehl von Docker bedeutet die Option <span style="font-weight: bold;" class="mycode_b">-v</span> nicht die Hinzunahme eines Volumes, sondern eines <span style="font-weight: bold;" class="mycode_b">Bind-Mounts</span>.<br />
Ein Volume wird anders angegeben.<br />
Ein Volume ist auch ein Ordner, aber ein leerer Ordner, der von Docker später verwaltet wird.<br />
<br />
Ein Volum wird erstellt mit<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker volume create my_volume</code></div></div><br />
und kann angeschaut werden mit:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker volume ls</code></div></div><br />
Die Volumes liegen dort, wo auch die Images abgelebt werden (/var/lib/docker oder an veränderter Stelle)<br />
<br />
Beim Weiterreichen des Volumes ist die gleiche Schreibweise zu nutzen wie vom Bind-Mount, also mit der Option <span style="font-weight: bold;" class="mycode_b">-v</span>.<br />
<br />
Scripte und Beschreibungen<br />
<br />
<a href="https://forum.hermann-splitthoff.de/showthread.php?tid=1372" target="_blank" rel="noopener" class="mycode_url">Docker nutzen</a><br />
<a href="https://forum.hermann-splitthoff.de/showthread.php?tid=1373" target="_blank" rel="noopener" class="mycode_url">Docker installieren</a><br />
<a href="https://forum.hermann-splitthoff.de/showthread.php?tid=1374" target="_blank" rel="noopener" class="mycode_url">Docker Infos Heise-Tutorial</a><br />
<a href="https://forum.hermann-splitthoff.de/showthread.php?tid=1375" target="_blank" rel="noopener" class="mycode_url">Docker Eigene Daten</a><br />
<a href="https://forum.hermann-splitthoff.de/showthread.php?tid=1376" target="_blank" rel="noopener" class="mycode_url">Docker img installieren</a><br />
<a href="https://forum.hermann-splitthoff.de/showthread.php?tid=1377" target="_blank" rel="noopener" class="mycode_url">Docker images Nutzung</a><br />
<a href="https://forum.hermann-splitthoff.de/showthread.php?tid=1378" target="_blank" rel="noopener" class="mycode_url">Docker handling compose</a><br />
<a href="https://forum.hermann-splitthoff.de/showthread.php?tid=1379" target="_blank" rel="noopener" class="mycode_url">Docker neues handling 20221105</a>]]></description>
			<content:encoded><![CDATA[<span style="font-weight: bold;" class="mycode_b"><span style="color: #005dc2;" class="mycode_color"><span style="font-size: x-large;" class="mycode_size">Das MOC für Docker</span></span></span><br />
<br />
Meine eigenen Aufzeichnungen zum Handling von Docker. Sehr unvollständig, weil neben dem Erlernen einfach mitgeschrieben.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Hinweis</span><br />
<br />
Am 06.11.2022 habe ich den Ablageort der Docker-Images von **/var/lib/docker** nach **/media/django/virtualbox/dockerworld/docker** verändert.<br />
Der Grund ist und war, dass die separate SSD mehr Platz für solche Dateien hat.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">ACHTUNG</span><br />
<br />
Beim Run-Befehl von Docker bedeutet die Option <span style="font-weight: bold;" class="mycode_b">-v</span> nicht die Hinzunahme eines Volumes, sondern eines <span style="font-weight: bold;" class="mycode_b">Bind-Mounts</span>.<br />
Ein Volume wird anders angegeben.<br />
Ein Volume ist auch ein Ordner, aber ein leerer Ordner, der von Docker später verwaltet wird.<br />
<br />
Ein Volum wird erstellt mit<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker volume create my_volume</code></div></div><br />
und kann angeschaut werden mit:<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>docker volume ls</code></div></div><br />
Die Volumes liegen dort, wo auch die Images abgelebt werden (/var/lib/docker oder an veränderter Stelle)<br />
<br />
Beim Weiterreichen des Volumes ist die gleiche Schreibweise zu nutzen wie vom Bind-Mount, also mit der Option <span style="font-weight: bold;" class="mycode_b">-v</span>.<br />
<br />
Scripte und Beschreibungen<br />
<br />
<a href="https://forum.hermann-splitthoff.de/showthread.php?tid=1372" target="_blank" rel="noopener" class="mycode_url">Docker nutzen</a><br />
<a href="https://forum.hermann-splitthoff.de/showthread.php?tid=1373" target="_blank" rel="noopener" class="mycode_url">Docker installieren</a><br />
<a href="https://forum.hermann-splitthoff.de/showthread.php?tid=1374" target="_blank" rel="noopener" class="mycode_url">Docker Infos Heise-Tutorial</a><br />
<a href="https://forum.hermann-splitthoff.de/showthread.php?tid=1375" target="_blank" rel="noopener" class="mycode_url">Docker Eigene Daten</a><br />
<a href="https://forum.hermann-splitthoff.de/showthread.php?tid=1376" target="_blank" rel="noopener" class="mycode_url">Docker img installieren</a><br />
<a href="https://forum.hermann-splitthoff.de/showthread.php?tid=1377" target="_blank" rel="noopener" class="mycode_url">Docker images Nutzung</a><br />
<a href="https://forum.hermann-splitthoff.de/showthread.php?tid=1378" target="_blank" rel="noopener" class="mycode_url">Docker handling compose</a><br />
<a href="https://forum.hermann-splitthoff.de/showthread.php?tid=1379" target="_blank" rel="noopener" class="mycode_url">Docker neues handling 20221105</a>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Dockerfile]]></title>
			<link>https://forum.hermann-splitthoff.de/showthread.php?tid=1369</link>
			<pubDate>Sat, 23 Nov 2024 19:21:05 +0100</pubDate>
			<dc:creator><![CDATA[<a href="https://forum.hermann-splitthoff.de/member.php?action=profile&uid=1">Joopi</a>]]></dc:creator>
			<guid isPermaLink="false">https://forum.hermann-splitthoff.de/showthread.php?tid=1369</guid>
			<description><![CDATA[Von Zeit zu Zeit befasse ich mich mit Docker, allerdings ohne durchschlagenden Erfolg. Es fehlt mir an Möglichkeiten und auch an Phantasie.<br />
<br />
In meinen Dokumentationen habe ich noch eine Notiz gefunden, die sich mit der Erstellung von Dockerfiles befasst. Diese möchte ich nicht verlieren, also archiviere ich das Thema hier.<br />
<br />
Da ich mich auch mit DOCKER-SAP befassen will, erscheint mir dieses Forum gut für die Sammlung von Informationen zu sein.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code># Zugrundliegendes Image<br />
# steht so in der requirements.txt<br />
FROM python:3.7-slim<br />
<br />
# Mir ist noch nicht klar, ob das in DIR im Container sein wird.<br />
WORKDIR /app<br />
<br />
# Kopieren der Requirements - alle Dateien im aktuellen Verzeichnis kopieren (der Punkt ist das aktuelle Verzeichnis<br />
ADD . /app<br />
<br />
# Installieren der Requirements<br />
# --trusted-host sollte tunlichst immer dabei sein (muss aber nicht)<br />
RUN pip install --trusted-host pypi.python.org -r requirements.txt<br />
<br />
#Port 80 (Webanwendung) veröffentlichen<br />
EXPOSE 80<br />
<br />
# app.py ist die erstellte Flask-App<br />
CMD ["pyhton", "app.py"]</code></div></div>]]></description>
			<content:encoded><![CDATA[Von Zeit zu Zeit befasse ich mich mit Docker, allerdings ohne durchschlagenden Erfolg. Es fehlt mir an Möglichkeiten und auch an Phantasie.<br />
<br />
In meinen Dokumentationen habe ich noch eine Notiz gefunden, die sich mit der Erstellung von Dockerfiles befasst. Diese möchte ich nicht verlieren, also archiviere ich das Thema hier.<br />
<br />
Da ich mich auch mit DOCKER-SAP befassen will, erscheint mir dieses Forum gut für die Sammlung von Informationen zu sein.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code># Zugrundliegendes Image<br />
# steht so in der requirements.txt<br />
FROM python:3.7-slim<br />
<br />
# Mir ist noch nicht klar, ob das in DIR im Container sein wird.<br />
WORKDIR /app<br />
<br />
# Kopieren der Requirements - alle Dateien im aktuellen Verzeichnis kopieren (der Punkt ist das aktuelle Verzeichnis<br />
ADD . /app<br />
<br />
# Installieren der Requirements<br />
# --trusted-host sollte tunlichst immer dabei sein (muss aber nicht)<br />
RUN pip install --trusted-host pypi.python.org -r requirements.txt<br />
<br />
#Port 80 (Webanwendung) veröffentlichen<br />
EXPOSE 80<br />
<br />
# app.py ist die erstellte Flask-App<br />
CMD ["pyhton", "app.py"]</code></div></div>]]></content:encoded>
		</item>
	</channel>
</rss>