<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://ccwiki.digitalcampusvorarlberg.at/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Drlue</id>
	<title>CCWiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://ccwiki.digitalcampusvorarlberg.at/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Drlue"/>
	<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php/Spezial:Beitr%C3%A4ge/Drlue"/>
	<updated>2026-04-14T05:25:48Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Datenbanken_Loesungen&amp;diff=3569</id>
		<title>Datenbanken Loesungen</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Datenbanken_Loesungen&amp;diff=3569"/>
		<updated>2024-05-02T11:53:12Z</updated>

		<summary type="html">&lt;p&gt;Drlue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die meisten Übungsbeispiele gelöst, hauptsächlich mit &#039;&#039;&#039;JOIN&#039;&#039;&#039; nicht mit &#039;&#039;&#039;WHERE&#039;&#039;&#039;. Fügt die &#039;&#039;&#039;WHERE&#039;&#039;&#039; Queries, wenn möglich hinzu. Gibts bessere Lösung, dann rein damit!!!&lt;br /&gt;
&lt;br /&gt;
 Wie viele Einwohner hat Österreich?&lt;br /&gt;
{{SQLML|code=&lt;br /&gt;
SELECT Population FROM Country WHERE NAME = &#039;Austria&#039;;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 Wie viele Einwohner hat der Kontinent Europa?&lt;br /&gt;
{{SQLML|code=&lt;br /&gt;
SELECT SUM(Country.Population) AS EuropePopulation FROM Continent, Encompasses, Country&lt;br /&gt;
WHERE Continent.Name = Encompasses.Continent&lt;br /&gt;
AND Encompasses.Country = Country.Code&lt;br /&gt;
AND Continent.Name = &#039;Europe&#039;;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Welche Flüsse fließen durch Österreich?&lt;br /&gt;
{{SQLML|code=&lt;br /&gt;
SELECT Country.Name, River.Name FROM Country, Geo_river, River&lt;br /&gt;
WHERE Country.Code = Geo_river.Country&lt;br /&gt;
AND Geo_river.River = River.Name&lt;br /&gt;
AND Country.Name = &#039;Austria&#039;;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 Welche Flüsse fließen durch Europa (nur den Flussnamen)?&lt;br /&gt;
&lt;br /&gt;
{{SQLML|code=  &lt;br /&gt;
SELECT river.Name from continent, encompasses, country, province, geo_river, river&lt;br /&gt;
WHERE &lt;br /&gt;
continent.Name = encompasses.Continent&lt;br /&gt;
AND encompasses.Country = country.Code&lt;br /&gt;
AND country.Code = province.Country&lt;br /&gt;
AND province.Name = geo_river.Province&lt;br /&gt;
AND river.Name = geo_river.River&lt;br /&gt;
AND continent.Name like &#039;Europe&#039;&lt;br /&gt;
GROUP BY river.Name&lt;br /&gt;
ORDER by river.Name&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{SQLML|code=&lt;br /&gt;
SELECT river.Name FROM continent&lt;br /&gt;
INNER JOIN encompasses ON continent.Name = encompasses.Continent&lt;br /&gt;
INNER JOIN country ON country.Code = encompasses.Country&lt;br /&gt;
INNER JOIN province ON province.Country = country.Code&lt;br /&gt;
INNER JOIN geo_river ON geo_river.Province = province.Name&lt;br /&gt;
INNER JOIN river ON river.Name = geo_river.River&lt;br /&gt;
WHERE continent.Name like &#039;Europe&#039;&lt;br /&gt;
GROUP BY river.Name&lt;br /&gt;
ORDER BY river.Name&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Wie viel Prozent der Menschen leben im Kontinent Europa?&lt;br /&gt;
&lt;br /&gt;
{{SQLML|code=&lt;br /&gt;
SELECT SUM(Country.Population), CAST(100.0 as DOUBLE)/(SELECT SUM(Population) FROM Country) * SUM(Country.Population) AS Percentage&lt;br /&gt;
FROM Continent&lt;br /&gt;
INNER JOIN Encompasses ON Continent.Name = Encompasses.Continent&lt;br /&gt;
INNER JOIN Country ON Encompasses.Country = Country.Code&lt;br /&gt;
WHERE Continent.Name = &#039;Europe&#039;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 Alle Länder die mit einem A anfangen&lt;br /&gt;
&lt;br /&gt;
{{SQLML|code=&lt;br /&gt;
SELECT * FROM country WHERE name like &#039;A%&#039;;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Alle Länder die mit einem A anfangen und deren Bundesländer mit Einwohnerzahl, sortiert nach Einwohnerzahl&lt;br /&gt;
&lt;br /&gt;
{{SQLML|code=&lt;br /&gt;
SELECT country.name, province.name as provincename, province.population FROM country&lt;br /&gt;
INNER JOIN province ON country.code = province.country&lt;br /&gt;
ORDER BY country.name, province.Population desc;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Alle Flüsse die durch Europa fließen (nur Flüsse und deren Länge), sortiert nach Länge&lt;br /&gt;
&lt;br /&gt;
{{SQLML|code=&lt;br /&gt;
SELECT DISTINCT river.name, river.length FROM river&lt;br /&gt;
INNER JOIN geo_river ON geo_river.River = river.name&lt;br /&gt;
INNER JOIN encompasses ON encompasses.Country = geo_river.Country&lt;br /&gt;
WHERE encompasses.Continent like &#039;Europe&#039;&lt;br /&gt;
ORDER BY river.Length DESC;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Alle Inseln im Pazifik mit &amp;gt;50% islamischem Bekenntnis&lt;br /&gt;
&lt;br /&gt;
{{SQLML|code=&lt;br /&gt;
SELECT country.Name, island.name, religion.Percentage FROM island, islandin, geo_island, religion, country&lt;br /&gt;
WHERE&lt;br /&gt;
island.Name = islandin.Island AND&lt;br /&gt;
islandin.Sea like &#039;Pacific%&#039; AND&lt;br /&gt;
geo_island.Island = island.name AND&lt;br /&gt;
geo_island.Country = religion.Country AND&lt;br /&gt;
country.code = geo_island.country AND&lt;br /&gt;
religion.Percentage &amp;gt; 0 AND&lt;br /&gt;
religion.Name = &#039;Roman catholic&#039;;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Alle 3000er, welche in einem Land sind, welches zu mindestens 60% römisch Katholisch ist&lt;br /&gt;
&lt;br /&gt;
{{SQLML|code=&lt;br /&gt;
SELECT DISTINCT m.name, m.Height, c.Name FROM mountain as m&lt;br /&gt;
INNER JOIN geo_mountain as ge ON ge.Mountain = m.Name&lt;br /&gt;
INNER JOIN country as c ON c.Code = ge.Country&lt;br /&gt;
INNER JOIN religion as rrr ON rrr.Country = c.Code&lt;br /&gt;
WHERE m.Height &amp;gt;= 3000 AND rrr.Percentage &amp;gt;= 60 AND rrr.Name = &#039;Roman Catholic&#039;&lt;br /&gt;
ORDER by m.height DESC;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Alle Länder mit mindestens einem See mit mindestens 100 Meter Tiefe und mindestens einem Berg mit mindestens 1500 Höhenmeter&lt;br /&gt;
&lt;br /&gt;
{{SQLML|code=&lt;br /&gt;
SELECT country.name, lake.name as lake, lake.depth, mountain.name, mountain.height, geo_lake.Province, geo_mountain.Province FROM lake&lt;br /&gt;
INNER JOIN geo_lake ON geo_lake.Lake = lake.Name&lt;br /&gt;
INNER JOIN geo_mountain ON geo_mountain.Country = geo_lake.Country&lt;br /&gt;
INNER JOIN country ON country.Code = geo_lake.Country&lt;br /&gt;
INNER JOIN mountain ON mountain.Name = geo_mountain.Mountain&lt;br /&gt;
WHERE mountain.Height &amp;gt;= 1500 and lake.Depth &amp;gt;= 100;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Einwohnerzahl pro Religion&lt;br /&gt;
&lt;br /&gt;
{{SQLML|code=&lt;br /&gt;
SELECT religion.name, sum(country.population * religion.Percentage/100)/1000000 as people FROM religion&lt;br /&gt;
INNER JOIN country ON country.code = religion.country&lt;br /&gt;
GROUP BY religion.Name order by people desc;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 Alle Länder, nur die Namen und die Meere dazu (keine Null Werte)&lt;br /&gt;
&lt;br /&gt;
{{SQLML|code=&lt;br /&gt;
SELECT distinct country.Name, sea.Name FROM country&lt;br /&gt;
INNER JOIN province ON country.Code = province.Country&lt;br /&gt;
INNER JOIN geo_sea ON province.Name = geo_sea.Province&lt;br /&gt;
INNER JOIN sea ON geo_sea.Sea = sea.Name&lt;br /&gt;
ORDER BY country.Name;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 Alle Länder, nur die Namen, und wenn sie haben, das Meer dazu&lt;br /&gt;
&lt;br /&gt;
{{SQLML|code=&lt;br /&gt;
SELECT country.name, geo_sea.Sea FROM country&lt;br /&gt;
LEFT JOIN geo_sea ON country.code = geo_sea.country;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{SQLML|code=&lt;br /&gt;
SELECT distinct country.Name, sea.Name &amp;quot;Sea Name&amp;quot; FROM country&lt;br /&gt;
LEFT OUTER JOIN geo_sea ON geo_sea.Country = country.Code&lt;br /&gt;
LEFT OUTER JOIN sea ON sea.Name = geo_sea.Sea&lt;br /&gt;
ORDER BY country.Name&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 Das Unabhängigkeitsdatum von Ländern die eine Wüste haben und die ethnische Gruppe &#039;&#039;&#039;African&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{SQLML|code=&lt;br /&gt;
SELECT DISTINCT country.name, politics.Independence, ethnicgroup.name, religion.Name, religion.Percentage FROM country&lt;br /&gt;
INNER JOIN geo_desert ON geo_desert.Country = country.code&lt;br /&gt;
INNER JOIN politics ON politics.Country = country.code&lt;br /&gt;
INNER JOIN ethnicgroup ON ethnicgroup.country = country.code&lt;br /&gt;
INNER JOIN religion ON religion.Country = country.Code&lt;br /&gt;
WHERE politics.Independence IS NOT NULL AND ethnicgroup.name like &#039;African&#039;;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 Welche Länder haben genau 3 Städte? Welche Länder sind dies?&lt;br /&gt;
&lt;br /&gt;
{{SQLML|code=&lt;br /&gt;
WITH sub as (SELECT count(*) AS anzahl, country.Name from country, city WHERE&lt;br /&gt;
country.Code = city.Country&lt;br /&gt;
GROUP BY country.Code)&lt;br /&gt;
SELECT Name FROM sub WHERE anzahl = 3&lt;br /&gt;
}}&lt;br /&gt;
 &lt;br /&gt;
 Welches sind die 3 größten Städte von Amerika (Kontinent)?&lt;br /&gt;
&lt;br /&gt;
{{SQLML|code=&lt;br /&gt;
SELECT city.Name, city.Population FROM continent, encompasses, country, city&lt;br /&gt;
WHERE continent.Name = encompasses.Continent&lt;br /&gt;
AND encompasses.Country = country.Code&lt;br /&gt;
AND city.Country = country.Code&lt;br /&gt;
AND continent.Name = &amp;quot;America&amp;quot;&lt;br /&gt;
ORDER BY city.population DESC&lt;br /&gt;
LIMIT 3&lt;br /&gt;
}}&lt;br /&gt;
 &lt;br /&gt;
 Was ist der größte Berg von Österreich? Wie hoch ist er?&lt;br /&gt;
 &lt;br /&gt;
{{SQLML|code=&lt;br /&gt;
SELECT mountain.Name, mountain.Height FROM country, geo_mountain, mountain&lt;br /&gt;
WHERE country.Code = geo_mountain.Country&lt;br /&gt;
AND geo_mountain.Mountain = mountain.Name&lt;br /&gt;
AND country.Name = &amp;quot;Austria&amp;quot;&lt;br /&gt;
ORDER BY mountain.Height DESC&lt;br /&gt;
LIMIT 1&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 Was ist der größte Berg von Europa? Wie hoch ist er?&lt;br /&gt;
 &lt;br /&gt;
 Was ist der größte Berg pro Kontinent? Wie hoch sind diese?&lt;br /&gt;
&lt;br /&gt;
{{SQLML|code=&lt;br /&gt;
-- https://stackoverflow.com/questions/7745609/sql-select-only-rows-with-max-value-on-a-column&lt;br /&gt;
WITH maxMountains as (SELECT continent.Name as continent, mountain.Name, mountain.Height,&lt;br /&gt;
RANK() OVER (PARTITION BY continent.Name ORDER BY mountain.Height DESC) AS areaRank from continent, encompasses, country, geo_mountain, mountain&lt;br /&gt;
WHERE continent.Name = encompasses.Continent&lt;br /&gt;
AND encompasses.Country = country.Code&lt;br /&gt;
AND geo_mountain.country = country.Code&lt;br /&gt;
AND mountain.Name = geo_mountain.mountain&lt;br /&gt;
ORDER BY continent.Name, mountain.Height)&lt;br /&gt;
SELECT * from maxMountains WHERE areaRank = 1;&lt;br /&gt;
}}&lt;br /&gt;
 &lt;br /&gt;
 Welches Land hat am meisten anerkannte Religionen? Wie viel sind es?&lt;br /&gt;
 &lt;br /&gt;
 Welche Organisationen haben deren Hauptsitz in Österreich? Wie viele Mitglieder haben diese Organisationen?&lt;br /&gt;
 &lt;br /&gt;
 Was sind die Top 10 Sprachen? Wie viele native Speaker sprechen diese Sprache?&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=DCV_2024_03/DB_%C3%9Cbungen&amp;diff=3568</id>
		<title>DCV 2024 03/DB Übungen</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=DCV_2024_03/DB_%C3%9Cbungen&amp;diff=3568"/>
		<updated>2024-05-02T05:46:38Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Überblick */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Im folgenden finden sich Übungen für das Thema Datenbanken. Weiters soll direkt ein Überblick über die Themen erfolgen. Als &#039;&#039;&#039;D&#039;&#039;&#039;aten&#039;&#039;&#039;B&#039;&#039;&#039;ank&#039;&#039;&#039;M&#039;&#039;&#039;anagement &#039;&#039;&#039;S&#039;&#039;&#039;ystem wird &#039;&#039;&#039;MySQL&#039;&#039;&#039;[https://www.mysql.com/de/] verwendet&lt;br /&gt;
&lt;br /&gt;
= Überblick =&lt;br /&gt;
Ein grundlegendes Verständnis folgender Begriffe soll erlangt werden. Diese sind nicht chronologisch geordnet.&lt;br /&gt;
===== SQL Queries =====&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
* Daten Abfragen&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{SQLML|code=&lt;br /&gt;
USE mondial;&lt;br /&gt;
SELECT * from City limit 5;&lt;br /&gt;
&lt;br /&gt;
-- Zeigt alle Spalten, alle Zeilen aus den country Tabelle&lt;br /&gt;
SELECT * FROM mondial.country;&lt;br /&gt;
&lt;br /&gt;
-- Konstant als Text&lt;br /&gt;
SELECT &#039;Hello World!&#039; Greeting;&lt;br /&gt;
&lt;br /&gt;
-- Zeigt alle Spalten, erste 5 Zeilen aus den country Tabelle&lt;br /&gt;
SELECT * FROM mondial.country limit 5;&lt;br /&gt;
&lt;br /&gt;
-- Zeigt die Spalten Name und Capital der erste 5 Zeilen aus den country Tabelle&lt;br /&gt;
SELECT Name, Capital FROM mondial.country limit 5;&lt;br /&gt;
&lt;br /&gt;
-- Zeigt die Spalten Name und Capital mit eigenen Namen&lt;br /&gt;
SELECT Name Land, Capital Hauptstadt FROM mondial.country limit 5;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter auf Name&lt;br /&gt;
SELECT Name, Capital FROM mondial.country WHERE Name = &#039;Austria&#039;;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter auf Population&lt;br /&gt;
SELECT Name, Capital FROM mondial.country WHERE Population &amp;lt; 1000000;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter auf Population&lt;br /&gt;
SELECT Name, Capital, Population FROM mondial.country WHERE Population BETWEEN 1000000 AND 2000000;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter auf Name beginnend mit A&lt;br /&gt;
SELECT Name, Capital, Population FROM mondial.country WHERE Name LIKE &#039;A%&#039;;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter auf Name am Ende mit A&lt;br /&gt;
SELECT Name, Capital, Population FROM mondial.country WHERE Name LIKE &#039;%A&#039;;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter mit NOT Operator&lt;br /&gt;
SELECT Name, Capital, Population FROM mondial.country WHERE Name NOT LIKE &#039;A%&#039;;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter mit OR Operator&lt;br /&gt;
SELECT Name, Capital, Population FROM mondial.country WHERE Name LIKE &#039;A%&#039; OR Population &amp;lt; 1000000;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter mit AND Operator&lt;br /&gt;
SELECT Name, Capital, Population FROM mondial.country WHERE Name LIKE &#039;A%&#039; AND Population &amp;lt; 1000000;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tabellen verknüpfen mit &#039;&#039;&#039;WHERE&#039;&#039;&#039; und &#039;&#039;&#039;INNER JOIN&#039;&#039;&#039;&lt;br /&gt;
* Unterschied zwischen &#039;&#039;&#039;INNER JOIN&#039;&#039;&#039; und &#039;&#039;&#039;LEFT OUTER JOIN&#039;&#039;&#039; und &#039;&#039;&#039;RIGHT OUTER JOIN&#039;&#039;&#039;&lt;br /&gt;
* Einfügen mittels &#039;&#039;&#039;INSERT&#039;&#039;&#039;&lt;br /&gt;
* Löschen mittels &#039;&#039;&#039;DELETE&#039;&#039;&#039;&lt;br /&gt;
* Aktualisieren mittels &#039;&#039;&#039;UPDATE&#039;&#039;&#039;&lt;br /&gt;
===== &#039;&#039;&#039;E&#039;&#039;&#039;ntity &#039;&#039;&#039;R&#039;&#039;&#039;elation Diagramme erstellen (&#039;&#039;&#039;Chen Notation&#039;&#039;&#039;) =====&lt;br /&gt;
===== Implementieren des &#039;&#039;&#039;ER&#039;&#039;&#039; Diagramms in &#039;&#039;&#039;MySQL&#039;&#039;&#039; =====&lt;br /&gt;
===== Primär- und Fremdschlüssel =====&lt;br /&gt;
* Erstellen von Fremdschlüssel &#039;&#039;&#039;Constraints&#039;&#039;&#039;&lt;br /&gt;
===== Anbindung an die Datenbank mittels &#039;&#039;&#039;JDBC&#039;&#039;&#039; in &#039;&#039;&#039;Java&#039;&#039;&#039; =====&lt;br /&gt;
* Verbindung zur Datenbank herstellen&lt;br /&gt;
* Daten anlegen&lt;br /&gt;
* Daten abrufen&lt;br /&gt;
* Daten löschen&lt;br /&gt;
&lt;br /&gt;
= Übungen =&lt;br /&gt;
&lt;br /&gt;
Als Voraussetzung wird eine funktionierende &#039;&#039;&#039;MySQL&#039;&#039;&#039; installation mit &#039;&#039;&#039;MySQL Workbench&#039;&#039;&#039; vorausgesetzt. &#039;&#039;&#039;MySQL Workbench&#039;&#039;&#039; ist ein grafisches Tool um mit &#039;&#039;&#039;MySQL&#039;&#039;&#039; zu arbeiten.&lt;br /&gt;
&lt;br /&gt;
Der Download für beide Tools findet sich [https://dev.mysql.com/get/Downloads/MySQLInstaller/mysql-installer-community-8.0.37.0.msi hier].&lt;br /&gt;
* Add Product&lt;br /&gt;
* MySQL Server hinzufügen&lt;br /&gt;
* MySQL Workbench hinzufügen&lt;br /&gt;
&lt;br /&gt;
Für den Bereich &#039;&#039;&#039;S&#039;&#039;&#039;tructured &#039;&#039;&#039;Q&#039;&#039;&#039;uery &#039;&#039;&#039;L&#039;&#039;&#039;anguage wird weiters vorausgesetzt dass eine &#039;&#039;&#039;Datenbank&#039;&#039;&#039; mit folgenden Inhalten existiert:&lt;br /&gt;
 Ein großer Dank geht an die Uni Göttingen für die Bereitstellung der &#039;&#039;&#039;Mondial&#039;&#039;&#039;&amp;lt;ref name=&amp;quot;göttingen&amp;quot;&amp;gt;https://www.dbis.informatik.uni-goettingen.de/Mondial/&amp;lt;/ref&amp;gt; Datenbank&lt;br /&gt;
* [[Datei:Mondial-schema-mysql.zip]]&lt;br /&gt;
* [[Datei:Mondial-inputs-mysql.zip]]&lt;br /&gt;
&lt;br /&gt;
# Zuerst MySQL Workbench öffnen, mit dem DBMS verbinden.&lt;br /&gt;
# File -&amp;gt; Open Sql Script -&amp;gt; Schema auswählen (zuerst das zip entpacken)&lt;br /&gt;
# Mit dem Blitz ausführen&lt;br /&gt;
## Tritt ein Fehler auf &amp;gt;&amp;gt;,ORACLE&amp;lt;&amp;lt; aus der ersten Zeile entfernen&lt;br /&gt;
# File -&amp;gt; Open Sql Script -&amp;gt; Input auswählen (zuerst das zip entpacken)&lt;br /&gt;
# Mit dem Blitz ausführen&lt;br /&gt;
# Nun sollte die Datenbank Mondial existieren und es geht weiter mit den übungen zu SQL Abfragen&lt;br /&gt;
&lt;br /&gt;
== SQL Abfragen ==&lt;br /&gt;
Verschiedene Abfragen um Tabellen zu verbinden. Verwende für die Abfragen die &#039;&#039;&#039;Mondial&#039;&#039;&#039; Datenbank.&lt;br /&gt;
[[Datei:ER-Mondial.jpg|mini|none|600px|Mondial ER Diagramm&amp;lt;ref&amp;gt;https://www.dbis.informatik.uni-goettingen.de/Mondial/mondial-abh.pdf&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
[[Datei:Mondial Abhängingkeiten.jpg|mini|none|400px|Mondial Abhängigkeiten&amp;lt;ref name=&amp;quot;göttingen&amp;quot;/&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe SQL Queries ====&lt;br /&gt;
 Wie viele Einwohner hat Österreich?&lt;br /&gt;
&lt;br /&gt;
 Wie viele Einwohner hat der Kontinent Europa?&lt;br /&gt;
&lt;br /&gt;
 Welche Flüsse fließen durch Österreich?&lt;br /&gt;
&lt;br /&gt;
 Welche Flüsse fließen durch Europa (nur den Flussnamen)?&lt;br /&gt;
&lt;br /&gt;
 Wie viel Prozent der Menschen leben im Kontinent Europa?&lt;br /&gt;
&lt;br /&gt;
 Alle Länder die mit einem A anfangen&lt;br /&gt;
&lt;br /&gt;
 Alle Länder die mit einem A anfangen und deren Bundesländer mit Einwohnerzahl, sortiert nach Einwohnerzahl&lt;br /&gt;
&lt;br /&gt;
 Alle Flüsse die durch Europa fließen (nur Flüsse und deren Länge), sortiert nach Länge&lt;br /&gt;
&lt;br /&gt;
 Alle Inseln im Pazifik mit &amp;gt;50% islamischem Bekenntnis&lt;br /&gt;
&lt;br /&gt;
 Alle 3000er, welche in einem Land sind, welches zu mindestens 60% römisch Katholisch ist&lt;br /&gt;
&lt;br /&gt;
 Alle Länder mit mindestens einem See mit mindestens 100 Meter Tiefe und mindestens einem Berg mit mindestens 1500 Höhenmeter&lt;br /&gt;
&lt;br /&gt;
 Einwohnerzahl pro Religion&lt;br /&gt;
&lt;br /&gt;
 Alle Länder, nur die Namen und die Meere dazu (keine Null Werte)&lt;br /&gt;
&lt;br /&gt;
 Alle Länder, nur die Namen, und wenn sie haben, das Meer dazu&lt;br /&gt;
&lt;br /&gt;
 Das Unabhängigkeitsdatum von Ländern die eine Wüste haben und die ethnische Gruppe &#039;&#039;&#039;African&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 Welche Länder haben genau 3 Städte? Welche Länder sind dies?&lt;br /&gt;
&lt;br /&gt;
 Welches sind die 3 größten Städte von Amerika (Kontinent)?&lt;br /&gt;
&lt;br /&gt;
 Was ist der größte Berg von Österreich? Wie hoch ist er?&lt;br /&gt;
&lt;br /&gt;
 Was ist der größte Berg von Europa? Wie hoch ist er?&lt;br /&gt;
&lt;br /&gt;
 Was ist der größte Berg pro Kontinent? Wie hoch sind diese?&lt;br /&gt;
&lt;br /&gt;
 Welches Land hat am meisten anerkannte Religionen? Wie viel sind es?&lt;br /&gt;
&lt;br /&gt;
 Welche Organisationen haben deren Hauptsitz in Österreich? Wie viele Mitglieder haben diese Organisationen?&lt;br /&gt;
&lt;br /&gt;
 Was sind die Top 10 Sprachen? Wie viele native Speaker sprechen diese Sprache?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create, Read, Update, Delete ==&lt;br /&gt;
Erstelle eine Objekt-Klasse für ein Land und erstelle für jede Aufgabe eine eigene &#039;&#039;&#039;Methode&#039;&#039;&#039; die...&lt;br /&gt;
* ein neues Land erstellt und in die Datenbank einfügt.&lt;br /&gt;
* ein bestimmtes Land in der Datenbank findet.&lt;br /&gt;
* ein bestimmtest Attribut eines Landes verändert.&lt;br /&gt;
* ein bestimmtes Land aus der Datenbank löscht.&lt;br /&gt;
&lt;br /&gt;
=== Bonus Aufgabe ===&lt;br /&gt;
*Erweitere dein Programm mit einer Console-Eingabe und teste deine Methoden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ER Entwurf ==&lt;br /&gt;
Für den Entwurf von &#039;&#039;&#039;E&#039;&#039;&#039;ntity &#039;&#039;&#039;R&#039;&#039;&#039;elationship Modellen gibt es mehrere Möglichkeiten. Soll von einem bestehenden Datenbestand (in unnormalisierter Form) ein Datenbankmodell abgeleitet werden, so können die [https://www.datenbanken-verstehen.de/datenmodellierung/normalisierung/ Normalformen] angewandt werden, auf diese werden wir hier jedoch nicht eingehen. Wird ein ER-Modell direkt anhand einer Problemstellung entworfen, so ist diese bei korrektem Entwurf, inhärent normalisiert.&lt;br /&gt;
&lt;br /&gt;
Für die ER-Modellierung gibt es verschiedene Notationen:&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Chen-Notation Chen Notation und modifizierte Chen Notation]&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Min-Max-Notation Min/Max Notation]&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Für die folgenden ER-Modelle soll die Chen Notation angewendet werden, diese ist am einfachsten und am wenigsten fehleranfällig. Nach der ER-Modellierung kann direkt ein logischer Entwurf abgeleitet werden, welcher dann &amp;quot;direkt&amp;quot; in die Datenbank übertragen werden kann.&lt;br /&gt;
&lt;br /&gt;
 Als Zeichenprogramm zum Datenbank Entwurf eignet sich [http://dia-installer.de/ Dia]&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
Im folgenden finden sich einige Beispiele zur Übung des ER-Entwurfs. Es ist dabei sehr wichtig aus der textuellen Problemstellung herauszufinden was Teil des ER-Entwurfs ist, und was zum logischen Teil der Anwendung gehört und somit nichts mit dem Entwurf zu tun hat. Weiters ist es sehr wichtig, etwaige Lücken in der Problemstellung zu erkennen und auszufüllen.&lt;br /&gt;
&lt;br /&gt;
Für jedes Beispiel gilt:&lt;br /&gt;
* ER-Entwurf erstellen (inklusive aller wichtigen Attribute)&lt;br /&gt;
* Logischer Entwurf (Entweder in textueller oder tabellarischer Form)&lt;br /&gt;
&lt;br /&gt;
==== Übungsfirma ====&lt;br /&gt;
Eine Firma hat mehrere Mitarbeiter, diese arbeiten in einer Abteilung. Ein Mitarbeiter hat einen Vorgesetzten, dieser ist selbst wieder ein Mitarbeiter. Weiters gibt es Projekte an denen mehrere Mitarbeiter beteiligt sind, Mitarbeiter selbst können auch an mehreren Projekten mitarbeiten.&lt;br /&gt;
&lt;br /&gt;
==== Übungsfirma2 ====&lt;br /&gt;
Ergänze den Entwurf aus dem vorhergehenden Beispiel so, dass Mitarbeiter in einem gewissen Zeitraum an einem Projekt arbeiten können.&lt;br /&gt;
&lt;br /&gt;
 [[Datei:Uebungsfirma all.zip|mini|]] Enthält ER-Entwurf, logischer Entwurf, SQL Statements&lt;br /&gt;
[[Datei:Uebungsfirma.png|mini|none|400px|ER-Diagramm Übungsfirma]]&lt;br /&gt;
&lt;br /&gt;
==== Zoo ====&lt;br /&gt;
Mehrere in ganz Deutschland verteilte Zoos sollen mittels einer Datenbank verwaltet werden. Die Tiere werden von Pflegern gepflegt und befinden sich in Gehegen. Außerdem bekommen die Tiere eine spezielle Futtermischung, welche von Lieferanten geliefert wird.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Zoo all.zip|mini]]&lt;br /&gt;
[[Datei:Zoo.png|mini|none|400px|Zoo ER-Diagramm]]&lt;br /&gt;
&lt;br /&gt;
==== Druckerproduzent ====&lt;br /&gt;
Eine Firma, die Drucker herstellt, benötigt eine Datenbank zur Verwaltung ihrer Geschäftsprozesse. Die Firma hat mehrere Abteilungen, wie zum Beispiel Lager, Fertigung, Vertrieb. Zur Herstellung der Drucker werden Zukaufteile benötigt, die also nicht in der Fertigung selbst hergestellt werden. Der Fabrikleiter möchte auch einen Überblick über die Mitarbeiter mit allen relevanten Daten haben.&lt;br /&gt;
&lt;br /&gt;
==== Restaurant ====&lt;br /&gt;
Sie besitzen ein Restaurant, natürlich haben Sie Angestellte die entweder Koch, Kellner oder Lieferant sein können, überlegen Sie sich die nötigen Attribute selbst. Kunden können bei Ihnen im Restaurant bestellen und dort essen, Sie bieten aber auch das Angebot die Bestellung nach Hause zu liefern. Der Kellner ist für die Bearbeitung der Bestellung zuständig und teilt die Kunden zu den jeweiligen Tischen ein.&lt;br /&gt;
&lt;br /&gt;
==== Ferienhausverwaltung ====&lt;br /&gt;
Eine Ferienhausvermietung braucht ein Datenbanksystem für die Verwaltung der Buchungen. Zwischen zwei Buchungen muss immer eine Reinigungskraft das gesamte Haus reinigen und auf Schäden kontrollieren. Für diese Reinigung und Kontrolle braucht die Reinigungskraft zwischen 3-6 Stunden, je nach Größe / Kategorie bzw. Nächtigungspreis des Hauses. Die Ferienhäuser werden demnach in drei Klassen unterteilt.&lt;br /&gt;
* &amp;lt; 150 € / Nacht (Reinigung &amp;amp; Kontrolle: 3 Stunden)&lt;br /&gt;
* &amp;lt; 500 € / Nacht (Reinigung &amp;amp; Kontrolle: 5 Stunden)&lt;br /&gt;
* &amp;gt; 500 € / Nacht (Reinigung &amp;amp; Kontrolle: 6 Stunden)&lt;br /&gt;
Bei Schäden muss das Haus für die Zeit, bis der Schaden repariert wurde, gesperrt werden.&lt;br /&gt;
Die Ferienhäuser haben zwischen ein und vier Stockwerke (inkl. Keller), sowie unterschiedliche Ausstattungen (Bsp. Garten, WLAN, Balkon, ...).&lt;br /&gt;
Fügen Sie weitere Attribute (Bsp. Quadratmeter) hinzu, welche Sie für wichtig erachten.&lt;br /&gt;
&lt;br /&gt;
== Datenbank Anwendung ==&lt;br /&gt;
Im folgenden soll in mehreren Schritten eine Datenbank Anwendung modelliert und erstellt werden. Diese Anwendung soll ein einfaches Zahlungssystem mit Überweisung und Bankomat beeinhalten.&lt;br /&gt;
* Kunden sollen angelegt werden&lt;br /&gt;
* Es sollen Konten angelegt werden&lt;br /&gt;
* Konten sollen Geld überweisen/einzahlen und überweisen können&lt;br /&gt;
* Jede Transaktion soll gespeichert werden mit Betrag, Quelle, Ziel und Datum&lt;br /&gt;
* Der Kontostand soll aufgrund aller vorhergehenden Transaktion berechnet werden&lt;br /&gt;
* Der Kunde soll Geld einzahlen und abheben können&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe: &#039;&#039;&#039;E&#039;&#039;&#039;ntity &#039;&#039;&#039;R&#039;&#039;&#039;elation (ER) Diagramm erstellen ====&lt;br /&gt;
Entwirf ein korrektes &#039;&#039;&#039;ER&#039;&#039;&#039; Diagramm für die Datenbankanwendung, zumindest sollen die Tabellen &#039;&#039;&#039;Kunde&#039;&#039;&#039;, &#039;&#039;&#039;Konto&#039;&#039;&#039; und &#039;&#039;&#039;Transaktion&#039;&#039;&#039; enthalten sein. Achte auf die korrekte Beziehung zwischen den Tabellen.&lt;br /&gt;
* Ein Kunde kann mehrere Konten haben&lt;br /&gt;
* Ein Konto kann mehrere Kunden haben, diese haben dann eine unterschiedliche Rolle (Besitzer, Zeichnungsberechtigt, etc...)&lt;br /&gt;
* Eine Transaktion muss ein Quell- und ein Zielkonto haben&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe: Anlegen der Datenbank in MySQL ====&lt;br /&gt;
Implementiere das erstellte &#039;&#039;&#039;ER&#039;&#039;&#039; Diagramm in MySQL. Achte auf das Anlegen von korrekten &#039;&#039;&#039;Primär-&#039;&#039;&#039; und &#039;&#039;&#039;Fremdschlüsseln.&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe: Verbinden der Datenbank (JDBC) in Java ====&lt;br /&gt;
Verbinde dich über die &#039;&#039;&#039;JDBC&#039;&#039;&#039; Schnittstelle in Java mit der angelegten Datenbank. Das Anlegen einer Testdatenbank kann sehr hilfreich sein um Tests zu schreiben.&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe: Kunden/Konten und Transaktionen in Java anlegen und abrufen ====&lt;br /&gt;
Erstelle die Modelle für deine Tabellen in Java und ermögliche über Methoden das &#039;&#039;&#039;Erstellen&#039;&#039;&#039;, &#039;&#039;&#039;Aktualisieren&#039;&#039;&#039;, &#039;&#039;&#039;Lesen&#039;&#039;&#039; und &#039;&#039;&#039;Löschen.&lt;br /&gt;
 &#039;&#039;&#039;C&#039;&#039;&#039;reate &#039;&#039;&#039;R&#039;&#039;&#039;ead &#039;&#039;&#039;U&#039;&#039;&#039;pdate &#039;&#039;&#039;D&#039;&#039;&#039;elete&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe: (Kommandozeilenanwendung) für den Bankomat erstellen ====&lt;br /&gt;
Erstelle ein Userinterface für die Bankomat Anwendung.&lt;br /&gt;
* Der Benutzer soll authentifiziert werden&lt;br /&gt;
* Es soll eine entsprechende Auswahl an Konten angezeigt werden&lt;br /&gt;
* Einzahlen/Auszahlen soll möglich sein&lt;br /&gt;
* Überweisung an anderes Konto&lt;br /&gt;
&lt;br /&gt;
= Quellen =&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=DCV_2024_03/DB_%C3%9Cbungen&amp;diff=3567</id>
		<title>DCV 2024 03/DB Übungen</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=DCV_2024_03/DB_%C3%9Cbungen&amp;diff=3567"/>
		<updated>2024-05-02T05:45:32Z</updated>

		<summary type="html">&lt;p&gt;Drlue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Im folgenden finden sich Übungen für das Thema Datenbanken. Weiters soll direkt ein Überblick über die Themen erfolgen. Als &#039;&#039;&#039;D&#039;&#039;&#039;aten&#039;&#039;&#039;B&#039;&#039;&#039;ank&#039;&#039;&#039;M&#039;&#039;&#039;anagement &#039;&#039;&#039;S&#039;&#039;&#039;ystem wird &#039;&#039;&#039;MySQL&#039;&#039;&#039;[https://www.mysql.com/de/] verwendet&lt;br /&gt;
&lt;br /&gt;
= Überblick =&lt;br /&gt;
Ein grundlegendes Verständnis folgender Begriffe soll erlangt werden. Diese sind nicht chronologisch geordnet.&lt;br /&gt;
===== &#039;&#039;&#039;E&#039;&#039;&#039;ntity &#039;&#039;&#039;R&#039;&#039;&#039;elation Diagramme erstellen (&#039;&#039;&#039;Chen Notation&#039;&#039;&#039;) =====&lt;br /&gt;
===== Implementieren des &#039;&#039;&#039;ER&#039;&#039;&#039; Diagramms in &#039;&#039;&#039;MySQL&#039;&#039;&#039; =====&lt;br /&gt;
===== Primär- und Fremdschlüssel =====&lt;br /&gt;
* Erstellen von Fremdschlüssel &#039;&#039;&#039;Constraints&#039;&#039;&#039;&lt;br /&gt;
===== SQL Queries =====&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
* Daten Abfragen&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{SQLML|code=&lt;br /&gt;
USE mondial;&lt;br /&gt;
SELECT * from City limit 5;&lt;br /&gt;
&lt;br /&gt;
-- Zeigt alle Spalten, alle Zeilen aus den country Tabelle&lt;br /&gt;
SELECT * FROM mondial.country;&lt;br /&gt;
&lt;br /&gt;
-- Konstant als Text&lt;br /&gt;
SELECT &#039;Hello World!&#039; Greeting;&lt;br /&gt;
&lt;br /&gt;
-- Zeigt alle Spalten, erste 5 Zeilen aus den country Tabelle&lt;br /&gt;
SELECT * FROM mondial.country limit 5;&lt;br /&gt;
&lt;br /&gt;
-- Zeigt die Spalten Name und Capital der erste 5 Zeilen aus den country Tabelle&lt;br /&gt;
SELECT Name, Capital FROM mondial.country limit 5;&lt;br /&gt;
&lt;br /&gt;
-- Zeigt die Spalten Name und Capital mit eigenen Namen&lt;br /&gt;
SELECT Name Land, Capital Hauptstadt FROM mondial.country limit 5;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter auf Name&lt;br /&gt;
SELECT Name, Capital FROM mondial.country WHERE Name = &#039;Austria&#039;;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter auf Population&lt;br /&gt;
SELECT Name, Capital FROM mondial.country WHERE Population &amp;lt; 1000000;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter auf Population&lt;br /&gt;
SELECT Name, Capital, Population FROM mondial.country WHERE Population BETWEEN 1000000 AND 2000000;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter auf Name beginnend mit A&lt;br /&gt;
SELECT Name, Capital, Population FROM mondial.country WHERE Name LIKE &#039;A%&#039;;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter auf Name am Ende mit A&lt;br /&gt;
SELECT Name, Capital, Population FROM mondial.country WHERE Name LIKE &#039;%A&#039;;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter mit NOT Operator&lt;br /&gt;
SELECT Name, Capital, Population FROM mondial.country WHERE Name NOT LIKE &#039;A%&#039;;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter mit OR Operator&lt;br /&gt;
SELECT Name, Capital, Population FROM mondial.country WHERE Name LIKE &#039;A%&#039; OR Population &amp;lt; 1000000;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter mit AND Operator&lt;br /&gt;
SELECT Name, Capital, Population FROM mondial.country WHERE Name LIKE &#039;A%&#039; AND Population &amp;lt; 1000000;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tabellen verknüpfen mit &#039;&#039;&#039;WHERE&#039;&#039;&#039; und &#039;&#039;&#039;INNER JOIN&#039;&#039;&#039;&lt;br /&gt;
* Unterschied zwischen &#039;&#039;&#039;INNER JOIN&#039;&#039;&#039; und &#039;&#039;&#039;LEFT OUTER JOIN&#039;&#039;&#039; und &#039;&#039;&#039;RIGHT OUTER JOIN&#039;&#039;&#039;&lt;br /&gt;
* Einfügen mittels &#039;&#039;&#039;INSERT&#039;&#039;&#039;&lt;br /&gt;
* Löschen mittels &#039;&#039;&#039;DELETE&#039;&#039;&#039;&lt;br /&gt;
* Aktualisieren mittels &#039;&#039;&#039;UPDATE&#039;&#039;&#039;&lt;br /&gt;
===== Anbindung an die Datenbank mittels &#039;&#039;&#039;JDBC&#039;&#039;&#039; in &#039;&#039;&#039;Java&#039;&#039;&#039; =====&lt;br /&gt;
* Verbindung zur Datenbank herstellen&lt;br /&gt;
* Daten anlegen&lt;br /&gt;
* Daten abrufen&lt;br /&gt;
* Daten löschen&lt;br /&gt;
&lt;br /&gt;
= Übungen =&lt;br /&gt;
&lt;br /&gt;
Als Voraussetzung wird eine funktionierende &#039;&#039;&#039;MySQL&#039;&#039;&#039; installation mit &#039;&#039;&#039;MySQL Workbench&#039;&#039;&#039; vorausgesetzt. &#039;&#039;&#039;MySQL Workbench&#039;&#039;&#039; ist ein grafisches Tool um mit &#039;&#039;&#039;MySQL&#039;&#039;&#039; zu arbeiten.&lt;br /&gt;
&lt;br /&gt;
Der Download für beide Tools findet sich [https://dev.mysql.com/get/Downloads/MySQLInstaller/mysql-installer-community-8.0.37.0.msi hier].&lt;br /&gt;
* Add Product&lt;br /&gt;
* MySQL Server hinzufügen&lt;br /&gt;
* MySQL Workbench hinzufügen&lt;br /&gt;
&lt;br /&gt;
Für den Bereich &#039;&#039;&#039;S&#039;&#039;&#039;tructured &#039;&#039;&#039;Q&#039;&#039;&#039;uery &#039;&#039;&#039;L&#039;&#039;&#039;anguage wird weiters vorausgesetzt dass eine &#039;&#039;&#039;Datenbank&#039;&#039;&#039; mit folgenden Inhalten existiert:&lt;br /&gt;
 Ein großer Dank geht an die Uni Göttingen für die Bereitstellung der &#039;&#039;&#039;Mondial&#039;&#039;&#039;&amp;lt;ref name=&amp;quot;göttingen&amp;quot;&amp;gt;https://www.dbis.informatik.uni-goettingen.de/Mondial/&amp;lt;/ref&amp;gt; Datenbank&lt;br /&gt;
* [[Datei:Mondial-schema-mysql.zip]]&lt;br /&gt;
* [[Datei:Mondial-inputs-mysql.zip]]&lt;br /&gt;
&lt;br /&gt;
# Zuerst MySQL Workbench öffnen, mit dem DBMS verbinden.&lt;br /&gt;
# File -&amp;gt; Open Sql Script -&amp;gt; Schema auswählen (zuerst das zip entpacken)&lt;br /&gt;
# Mit dem Blitz ausführen&lt;br /&gt;
## Tritt ein Fehler auf &amp;gt;&amp;gt;,ORACLE&amp;lt;&amp;lt; aus der ersten Zeile entfernen&lt;br /&gt;
# File -&amp;gt; Open Sql Script -&amp;gt; Input auswählen (zuerst das zip entpacken)&lt;br /&gt;
# Mit dem Blitz ausführen&lt;br /&gt;
# Nun sollte die Datenbank Mondial existieren und es geht weiter mit den übungen zu SQL Abfragen&lt;br /&gt;
&lt;br /&gt;
== SQL Abfragen ==&lt;br /&gt;
Verschiedene Abfragen um Tabellen zu verbinden. Verwende für die Abfragen die &#039;&#039;&#039;Mondial&#039;&#039;&#039; Datenbank.&lt;br /&gt;
[[Datei:ER-Mondial.jpg|mini|none|600px|Mondial ER Diagramm&amp;lt;ref&amp;gt;https://www.dbis.informatik.uni-goettingen.de/Mondial/mondial-abh.pdf&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
[[Datei:Mondial Abhängingkeiten.jpg|mini|none|400px|Mondial Abhängigkeiten&amp;lt;ref name=&amp;quot;göttingen&amp;quot;/&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe SQL Queries ====&lt;br /&gt;
 Wie viele Einwohner hat Österreich?&lt;br /&gt;
&lt;br /&gt;
 Wie viele Einwohner hat der Kontinent Europa?&lt;br /&gt;
&lt;br /&gt;
 Welche Flüsse fließen durch Österreich?&lt;br /&gt;
&lt;br /&gt;
 Welche Flüsse fließen durch Europa (nur den Flussnamen)?&lt;br /&gt;
&lt;br /&gt;
 Wie viel Prozent der Menschen leben im Kontinent Europa?&lt;br /&gt;
&lt;br /&gt;
 Alle Länder die mit einem A anfangen&lt;br /&gt;
&lt;br /&gt;
 Alle Länder die mit einem A anfangen und deren Bundesländer mit Einwohnerzahl, sortiert nach Einwohnerzahl&lt;br /&gt;
&lt;br /&gt;
 Alle Flüsse die durch Europa fließen (nur Flüsse und deren Länge), sortiert nach Länge&lt;br /&gt;
&lt;br /&gt;
 Alle Inseln im Pazifik mit &amp;gt;50% islamischem Bekenntnis&lt;br /&gt;
&lt;br /&gt;
 Alle 3000er, welche in einem Land sind, welches zu mindestens 60% römisch Katholisch ist&lt;br /&gt;
&lt;br /&gt;
 Alle Länder mit mindestens einem See mit mindestens 100 Meter Tiefe und mindestens einem Berg mit mindestens 1500 Höhenmeter&lt;br /&gt;
&lt;br /&gt;
 Einwohnerzahl pro Religion&lt;br /&gt;
&lt;br /&gt;
 Alle Länder, nur die Namen und die Meere dazu (keine Null Werte)&lt;br /&gt;
&lt;br /&gt;
 Alle Länder, nur die Namen, und wenn sie haben, das Meer dazu&lt;br /&gt;
&lt;br /&gt;
 Das Unabhängigkeitsdatum von Ländern die eine Wüste haben und die ethnische Gruppe &#039;&#039;&#039;African&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 Welche Länder haben genau 3 Städte? Welche Länder sind dies?&lt;br /&gt;
&lt;br /&gt;
 Welches sind die 3 größten Städte von Amerika (Kontinent)?&lt;br /&gt;
&lt;br /&gt;
 Was ist der größte Berg von Österreich? Wie hoch ist er?&lt;br /&gt;
&lt;br /&gt;
 Was ist der größte Berg von Europa? Wie hoch ist er?&lt;br /&gt;
&lt;br /&gt;
 Was ist der größte Berg pro Kontinent? Wie hoch sind diese?&lt;br /&gt;
&lt;br /&gt;
 Welches Land hat am meisten anerkannte Religionen? Wie viel sind es?&lt;br /&gt;
&lt;br /&gt;
 Welche Organisationen haben deren Hauptsitz in Österreich? Wie viele Mitglieder haben diese Organisationen?&lt;br /&gt;
&lt;br /&gt;
 Was sind die Top 10 Sprachen? Wie viele native Speaker sprechen diese Sprache?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create, Read, Update, Delete ==&lt;br /&gt;
Erstelle eine Objekt-Klasse für ein Land und erstelle für jede Aufgabe eine eigene &#039;&#039;&#039;Methode&#039;&#039;&#039; die...&lt;br /&gt;
* ein neues Land erstellt und in die Datenbank einfügt.&lt;br /&gt;
* ein bestimmtes Land in der Datenbank findet.&lt;br /&gt;
* ein bestimmtest Attribut eines Landes verändert.&lt;br /&gt;
* ein bestimmtes Land aus der Datenbank löscht.&lt;br /&gt;
&lt;br /&gt;
=== Bonus Aufgabe ===&lt;br /&gt;
*Erweitere dein Programm mit einer Console-Eingabe und teste deine Methoden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ER Entwurf ==&lt;br /&gt;
Für den Entwurf von &#039;&#039;&#039;E&#039;&#039;&#039;ntity &#039;&#039;&#039;R&#039;&#039;&#039;elationship Modellen gibt es mehrere Möglichkeiten. Soll von einem bestehenden Datenbestand (in unnormalisierter Form) ein Datenbankmodell abgeleitet werden, so können die [https://www.datenbanken-verstehen.de/datenmodellierung/normalisierung/ Normalformen] angewandt werden, auf diese werden wir hier jedoch nicht eingehen. Wird ein ER-Modell direkt anhand einer Problemstellung entworfen, so ist diese bei korrektem Entwurf, inhärent normalisiert.&lt;br /&gt;
&lt;br /&gt;
Für die ER-Modellierung gibt es verschiedene Notationen:&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Chen-Notation Chen Notation und modifizierte Chen Notation]&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Min-Max-Notation Min/Max Notation]&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Für die folgenden ER-Modelle soll die Chen Notation angewendet werden, diese ist am einfachsten und am wenigsten fehleranfällig. Nach der ER-Modellierung kann direkt ein logischer Entwurf abgeleitet werden, welcher dann &amp;quot;direkt&amp;quot; in die Datenbank übertragen werden kann.&lt;br /&gt;
&lt;br /&gt;
 Als Zeichenprogramm zum Datenbank Entwurf eignet sich [http://dia-installer.de/ Dia]&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
Im folgenden finden sich einige Beispiele zur Übung des ER-Entwurfs. Es ist dabei sehr wichtig aus der textuellen Problemstellung herauszufinden was Teil des ER-Entwurfs ist, und was zum logischen Teil der Anwendung gehört und somit nichts mit dem Entwurf zu tun hat. Weiters ist es sehr wichtig, etwaige Lücken in der Problemstellung zu erkennen und auszufüllen.&lt;br /&gt;
&lt;br /&gt;
Für jedes Beispiel gilt:&lt;br /&gt;
* ER-Entwurf erstellen (inklusive aller wichtigen Attribute)&lt;br /&gt;
* Logischer Entwurf (Entweder in textueller oder tabellarischer Form)&lt;br /&gt;
&lt;br /&gt;
==== Übungsfirma ====&lt;br /&gt;
Eine Firma hat mehrere Mitarbeiter, diese arbeiten in einer Abteilung. Ein Mitarbeiter hat einen Vorgesetzten, dieser ist selbst wieder ein Mitarbeiter. Weiters gibt es Projekte an denen mehrere Mitarbeiter beteiligt sind, Mitarbeiter selbst können auch an mehreren Projekten mitarbeiten.&lt;br /&gt;
&lt;br /&gt;
==== Übungsfirma2 ====&lt;br /&gt;
Ergänze den Entwurf aus dem vorhergehenden Beispiel so, dass Mitarbeiter in einem gewissen Zeitraum an einem Projekt arbeiten können.&lt;br /&gt;
&lt;br /&gt;
 [[Datei:Uebungsfirma all.zip|mini|]] Enthält ER-Entwurf, logischer Entwurf, SQL Statements&lt;br /&gt;
[[Datei:Uebungsfirma.png|mini|none|400px|ER-Diagramm Übungsfirma]]&lt;br /&gt;
&lt;br /&gt;
==== Zoo ====&lt;br /&gt;
Mehrere in ganz Deutschland verteilte Zoos sollen mittels einer Datenbank verwaltet werden. Die Tiere werden von Pflegern gepflegt und befinden sich in Gehegen. Außerdem bekommen die Tiere eine spezielle Futtermischung, welche von Lieferanten geliefert wird.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Zoo all.zip|mini]]&lt;br /&gt;
[[Datei:Zoo.png|mini|none|400px|Zoo ER-Diagramm]]&lt;br /&gt;
&lt;br /&gt;
==== Druckerproduzent ====&lt;br /&gt;
Eine Firma, die Drucker herstellt, benötigt eine Datenbank zur Verwaltung ihrer Geschäftsprozesse. Die Firma hat mehrere Abteilungen, wie zum Beispiel Lager, Fertigung, Vertrieb. Zur Herstellung der Drucker werden Zukaufteile benötigt, die also nicht in der Fertigung selbst hergestellt werden. Der Fabrikleiter möchte auch einen Überblick über die Mitarbeiter mit allen relevanten Daten haben.&lt;br /&gt;
&lt;br /&gt;
==== Restaurant ====&lt;br /&gt;
Sie besitzen ein Restaurant, natürlich haben Sie Angestellte die entweder Koch, Kellner oder Lieferant sein können, überlegen Sie sich die nötigen Attribute selbst. Kunden können bei Ihnen im Restaurant bestellen und dort essen, Sie bieten aber auch das Angebot die Bestellung nach Hause zu liefern. Der Kellner ist für die Bearbeitung der Bestellung zuständig und teilt die Kunden zu den jeweiligen Tischen ein.&lt;br /&gt;
&lt;br /&gt;
==== Ferienhausverwaltung ====&lt;br /&gt;
Eine Ferienhausvermietung braucht ein Datenbanksystem für die Verwaltung der Buchungen. Zwischen zwei Buchungen muss immer eine Reinigungskraft das gesamte Haus reinigen und auf Schäden kontrollieren. Für diese Reinigung und Kontrolle braucht die Reinigungskraft zwischen 3-6 Stunden, je nach Größe / Kategorie bzw. Nächtigungspreis des Hauses. Die Ferienhäuser werden demnach in drei Klassen unterteilt.&lt;br /&gt;
* &amp;lt; 150 € / Nacht (Reinigung &amp;amp; Kontrolle: 3 Stunden)&lt;br /&gt;
* &amp;lt; 500 € / Nacht (Reinigung &amp;amp; Kontrolle: 5 Stunden)&lt;br /&gt;
* &amp;gt; 500 € / Nacht (Reinigung &amp;amp; Kontrolle: 6 Stunden)&lt;br /&gt;
Bei Schäden muss das Haus für die Zeit, bis der Schaden repariert wurde, gesperrt werden.&lt;br /&gt;
Die Ferienhäuser haben zwischen ein und vier Stockwerke (inkl. Keller), sowie unterschiedliche Ausstattungen (Bsp. Garten, WLAN, Balkon, ...).&lt;br /&gt;
Fügen Sie weitere Attribute (Bsp. Quadratmeter) hinzu, welche Sie für wichtig erachten.&lt;br /&gt;
&lt;br /&gt;
== Datenbank Anwendung ==&lt;br /&gt;
Im folgenden soll in mehreren Schritten eine Datenbank Anwendung modelliert und erstellt werden. Diese Anwendung soll ein einfaches Zahlungssystem mit Überweisung und Bankomat beeinhalten.&lt;br /&gt;
* Kunden sollen angelegt werden&lt;br /&gt;
* Es sollen Konten angelegt werden&lt;br /&gt;
* Konten sollen Geld überweisen/einzahlen und überweisen können&lt;br /&gt;
* Jede Transaktion soll gespeichert werden mit Betrag, Quelle, Ziel und Datum&lt;br /&gt;
* Der Kontostand soll aufgrund aller vorhergehenden Transaktion berechnet werden&lt;br /&gt;
* Der Kunde soll Geld einzahlen und abheben können&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe: &#039;&#039;&#039;E&#039;&#039;&#039;ntity &#039;&#039;&#039;R&#039;&#039;&#039;elation (ER) Diagramm erstellen ====&lt;br /&gt;
Entwirf ein korrektes &#039;&#039;&#039;ER&#039;&#039;&#039; Diagramm für die Datenbankanwendung, zumindest sollen die Tabellen &#039;&#039;&#039;Kunde&#039;&#039;&#039;, &#039;&#039;&#039;Konto&#039;&#039;&#039; und &#039;&#039;&#039;Transaktion&#039;&#039;&#039; enthalten sein. Achte auf die korrekte Beziehung zwischen den Tabellen.&lt;br /&gt;
* Ein Kunde kann mehrere Konten haben&lt;br /&gt;
* Ein Konto kann mehrere Kunden haben, diese haben dann eine unterschiedliche Rolle (Besitzer, Zeichnungsberechtigt, etc...)&lt;br /&gt;
* Eine Transaktion muss ein Quell- und ein Zielkonto haben&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe: Anlegen der Datenbank in MySQL ====&lt;br /&gt;
Implementiere das erstellte &#039;&#039;&#039;ER&#039;&#039;&#039; Diagramm in MySQL. Achte auf das Anlegen von korrekten &#039;&#039;&#039;Primär-&#039;&#039;&#039; und &#039;&#039;&#039;Fremdschlüsseln.&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe: Verbinden der Datenbank (JDBC) in Java ====&lt;br /&gt;
Verbinde dich über die &#039;&#039;&#039;JDBC&#039;&#039;&#039; Schnittstelle in Java mit der angelegten Datenbank. Das Anlegen einer Testdatenbank kann sehr hilfreich sein um Tests zu schreiben.&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe: Kunden/Konten und Transaktionen in Java anlegen und abrufen ====&lt;br /&gt;
Erstelle die Modelle für deine Tabellen in Java und ermögliche über Methoden das &#039;&#039;&#039;Erstellen&#039;&#039;&#039;, &#039;&#039;&#039;Aktualisieren&#039;&#039;&#039;, &#039;&#039;&#039;Lesen&#039;&#039;&#039; und &#039;&#039;&#039;Löschen.&lt;br /&gt;
 &#039;&#039;&#039;C&#039;&#039;&#039;reate &#039;&#039;&#039;R&#039;&#039;&#039;ead &#039;&#039;&#039;U&#039;&#039;&#039;pdate &#039;&#039;&#039;D&#039;&#039;&#039;elete&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe: (Kommandozeilenanwendung) für den Bankomat erstellen ====&lt;br /&gt;
Erstelle ein Userinterface für die Bankomat Anwendung.&lt;br /&gt;
* Der Benutzer soll authentifiziert werden&lt;br /&gt;
* Es soll eine entsprechende Auswahl an Konten angezeigt werden&lt;br /&gt;
* Einzahlen/Auszahlen soll möglich sein&lt;br /&gt;
* Überweisung an anderes Konto&lt;br /&gt;
&lt;br /&gt;
= Quellen =&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=DCV_2024_03/DB_%C3%9Cbungen&amp;diff=3566</id>
		<title>DCV 2024 03/DB Übungen</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=DCV_2024_03/DB_%C3%9Cbungen&amp;diff=3566"/>
		<updated>2024-05-02T05:26:42Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Übungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Im folgenden finden sich Übungen für das Thema Datenbanken. Weiters soll direkt ein Überblick über die Themen erfolgen. Als &#039;&#039;&#039;D&#039;&#039;&#039;aten&#039;&#039;&#039;B&#039;&#039;&#039;ank&#039;&#039;&#039;M&#039;&#039;&#039;anagement &#039;&#039;&#039;S&#039;&#039;&#039;ystem wird &#039;&#039;&#039;MySQL&#039;&#039;&#039;[https://www.mysql.com/de/] verwendet&lt;br /&gt;
&lt;br /&gt;
= Überblick =&lt;br /&gt;
Ein grundlegendes Verständnis folgender Begriffe soll erlangt werden. Diese sind nicht chronologisch geordnet.&lt;br /&gt;
* &#039;&#039;&#039;E&#039;&#039;&#039;ntity &#039;&#039;&#039;R&#039;&#039;&#039;elation Diagramme erstellen (&#039;&#039;&#039;Chen Notation&#039;&#039;&#039;)&lt;br /&gt;
* Implementieren des &#039;&#039;&#039;ER&#039;&#039;&#039; Diagramms in &#039;&#039;&#039;MySQL&#039;&#039;&#039;&lt;br /&gt;
* Primär- und Fremdschlüssel&lt;br /&gt;
** Erstellen von Fremdschlüssel &#039;&#039;&#039;Constraints&#039;&#039;&#039;&lt;br /&gt;
* SQL Queries&lt;br /&gt;
** Daten Abfragen&lt;br /&gt;
{{SQLML|code=&lt;br /&gt;
USE mondial;&lt;br /&gt;
SELECT * from City limit 5;&lt;br /&gt;
&lt;br /&gt;
-- Zeigt alle Spalten, alle Zeilen aus den country Tabelle&lt;br /&gt;
SELECT * FROM mondial.country;&lt;br /&gt;
&lt;br /&gt;
-- Konstant als Text&lt;br /&gt;
SELECT &#039;Hello World!&#039; Greeting;&lt;br /&gt;
&lt;br /&gt;
-- Zeigt alle Spalten, erste 5 Zeilen aus den country Tabelle&lt;br /&gt;
SELECT * FROM mondial.country limit 5;&lt;br /&gt;
&lt;br /&gt;
-- Zeigt die Spalten Name und Capital der erste 5 Zeilen aus den country Tabelle&lt;br /&gt;
SELECT Name, Capital FROM mondial.country limit 5;&lt;br /&gt;
&lt;br /&gt;
-- Zeigt die Spalten Name und Capital mit eigenen Namen&lt;br /&gt;
SELECT Name Land, Capital Hauptstadt FROM mondial.country limit 5;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter auf Name&lt;br /&gt;
SELECT Name, Capital FROM mondial.country WHERE Name = &#039;Austria&#039;;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter auf Population&lt;br /&gt;
SELECT Name, Capital FROM mondial.country WHERE Population &amp;lt; 1000000;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter auf Population&lt;br /&gt;
SELECT Name, Capital, Population FROM mondial.country WHERE Population BETWEEN 1000000 AND 2000000;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter auf Name beginnend mit A&lt;br /&gt;
SELECT Name, Capital, Population FROM mondial.country WHERE Name LIKE &#039;A%&#039;;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter auf Name am Ende mit A&lt;br /&gt;
SELECT Name, Capital, Population FROM mondial.country WHERE Name LIKE &#039;%A&#039;;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter mit NOT Operator&lt;br /&gt;
SELECT Name, Capital, Population FROM mondial.country WHERE Name NOT LIKE &#039;A%&#039;;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter mit OR Operator&lt;br /&gt;
SELECT Name, Capital, Population FROM mondial.country WHERE Name LIKE &#039;A%&#039; OR Population &amp;lt; 1000000;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter mit AND Operator&lt;br /&gt;
SELECT Name, Capital, Population FROM mondial.country WHERE Name LIKE &#039;A%&#039; AND Population &amp;lt; 1000000;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
** Tabellen verknüpfen mit &#039;&#039;&#039;WHERE&#039;&#039;&#039; und &#039;&#039;&#039;INNER JOIN&#039;&#039;&#039;&lt;br /&gt;
** Unterschied zwischen &#039;&#039;&#039;INNER JOIN&#039;&#039;&#039; und &#039;&#039;&#039;LEFT OUTER JOIN&#039;&#039;&#039; und &#039;&#039;&#039;RIGHT OUTER JOIN&#039;&#039;&#039;&lt;br /&gt;
** Einfügen mittels &#039;&#039;&#039;INSERT&#039;&#039;&#039;&lt;br /&gt;
** Löschen mittels &#039;&#039;&#039;DELETE&#039;&#039;&#039;&lt;br /&gt;
** Aktualisieren mittels &#039;&#039;&#039;UPDATE&#039;&#039;&#039;&lt;br /&gt;
* Anbindung an die Datenbank mittels &#039;&#039;&#039;JDBC&#039;&#039;&#039; in &#039;&#039;&#039;Java&#039;&#039;&#039;&lt;br /&gt;
** Verbindung zur Datenbank herstellen&lt;br /&gt;
** Daten anlegen&lt;br /&gt;
** Daten abrufen&lt;br /&gt;
** Daten löschen&lt;br /&gt;
&lt;br /&gt;
= Übungen =&lt;br /&gt;
&lt;br /&gt;
Als Voraussetzung wird eine funktionierende &#039;&#039;&#039;MySQL&#039;&#039;&#039; installation mit &#039;&#039;&#039;MySQL Workbench&#039;&#039;&#039; vorausgesetzt. &#039;&#039;&#039;MySQL Workbench&#039;&#039;&#039; ist ein grafisches Tool um mit &#039;&#039;&#039;MySQL&#039;&#039;&#039; zu arbeiten.&lt;br /&gt;
&lt;br /&gt;
Der Download für beide Tools findet sich [https://dev.mysql.com/get/Downloads/MySQLInstaller/mysql-installer-community-8.0.37.0.msi hier].&lt;br /&gt;
* Add Product&lt;br /&gt;
* MySQL Server hinzufügen&lt;br /&gt;
* MySQL Workbench hinzufügen&lt;br /&gt;
&lt;br /&gt;
Für den Bereich &#039;&#039;&#039;S&#039;&#039;&#039;tructured &#039;&#039;&#039;Q&#039;&#039;&#039;uery &#039;&#039;&#039;L&#039;&#039;&#039;anguage wird weiters vorausgesetzt dass eine &#039;&#039;&#039;Datenbank&#039;&#039;&#039; mit folgenden Inhalten existiert:&lt;br /&gt;
 Ein großer Dank geht an die Uni Göttingen für die Bereitstellung der &#039;&#039;&#039;Mondial&#039;&#039;&#039;&amp;lt;ref name=&amp;quot;göttingen&amp;quot;&amp;gt;https://www.dbis.informatik.uni-goettingen.de/Mondial/&amp;lt;/ref&amp;gt; Datenbank&lt;br /&gt;
* [[Datei:Mondial-schema-mysql.zip]]&lt;br /&gt;
* [[Datei:Mondial-inputs-mysql.zip]]&lt;br /&gt;
&lt;br /&gt;
# Zuerst MySQL Workbench öffnen, mit dem DBMS verbinden.&lt;br /&gt;
# File -&amp;gt; Open Sql Script -&amp;gt; Schema auswählen (zuerst das zip entpacken)&lt;br /&gt;
# Mit dem Blitz ausführen&lt;br /&gt;
## Tritt ein Fehler auf &amp;gt;&amp;gt;,ORACLE&amp;lt;&amp;lt; aus der ersten Zeile entfernen&lt;br /&gt;
# File -&amp;gt; Open Sql Script -&amp;gt; Input auswählen (zuerst das zip entpacken)&lt;br /&gt;
# Mit dem Blitz ausführen&lt;br /&gt;
# Nun sollte die Datenbank Mondial existieren und es geht weiter mit den übungen zu SQL Abfragen&lt;br /&gt;
&lt;br /&gt;
== SQL Abfragen ==&lt;br /&gt;
Verschiedene Abfragen um Tabellen zu verbinden. Verwende für die Abfragen die &#039;&#039;&#039;Mondial&#039;&#039;&#039; Datenbank.&lt;br /&gt;
[[Datei:ER-Mondial.jpg|mini|none|600px|Mondial ER Diagramm&amp;lt;ref&amp;gt;https://www.dbis.informatik.uni-goettingen.de/Mondial/mondial-abh.pdf&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
[[Datei:Mondial Abhängingkeiten.jpg|mini|none|400px|Mondial Abhängigkeiten&amp;lt;ref name=&amp;quot;göttingen&amp;quot;/&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe SQL Queries ====&lt;br /&gt;
 Wie viele Einwohner hat Österreich?&lt;br /&gt;
&lt;br /&gt;
 Wie viele Einwohner hat der Kontinent Europa?&lt;br /&gt;
&lt;br /&gt;
 Welche Flüsse fließen durch Österreich?&lt;br /&gt;
&lt;br /&gt;
 Welche Flüsse fließen durch Europa (nur den Flussnamen)?&lt;br /&gt;
&lt;br /&gt;
 Wie viel Prozent der Menschen leben im Kontinent Europa?&lt;br /&gt;
&lt;br /&gt;
 Alle Länder die mit einem A anfangen&lt;br /&gt;
&lt;br /&gt;
 Alle Länder die mit einem A anfangen und deren Bundesländer mit Einwohnerzahl, sortiert nach Einwohnerzahl&lt;br /&gt;
&lt;br /&gt;
 Alle Flüsse die durch Europa fließen (nur Flüsse und deren Länge), sortiert nach Länge&lt;br /&gt;
&lt;br /&gt;
 Alle Inseln im Pazifik mit &amp;gt;50% islamischem Bekenntnis&lt;br /&gt;
&lt;br /&gt;
 Alle 3000er, welche in einem Land sind, welches zu mindestens 60% römisch Katholisch ist&lt;br /&gt;
&lt;br /&gt;
 Alle Länder mit mindestens einem See mit mindestens 100 Meter Tiefe und mindestens einem Berg mit mindestens 1500 Höhenmeter&lt;br /&gt;
&lt;br /&gt;
 Einwohnerzahl pro Religion&lt;br /&gt;
&lt;br /&gt;
 Alle Länder, nur die Namen und die Meere dazu (keine Null Werte)&lt;br /&gt;
&lt;br /&gt;
 Alle Länder, nur die Namen, und wenn sie haben, das Meer dazu&lt;br /&gt;
&lt;br /&gt;
 Das Unabhängigkeitsdatum von Ländern die eine Wüste haben und die ethnische Gruppe &#039;&#039;&#039;African&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 Welche Länder haben genau 3 Städte? Welche Länder sind dies?&lt;br /&gt;
&lt;br /&gt;
 Welches sind die 3 größten Städte von Amerika (Kontinent)?&lt;br /&gt;
&lt;br /&gt;
 Was ist der größte Berg von Österreich? Wie hoch ist er?&lt;br /&gt;
&lt;br /&gt;
 Was ist der größte Berg von Europa? Wie hoch ist er?&lt;br /&gt;
&lt;br /&gt;
 Was ist der größte Berg pro Kontinent? Wie hoch sind diese?&lt;br /&gt;
&lt;br /&gt;
 Welches Land hat am meisten anerkannte Religionen? Wie viel sind es?&lt;br /&gt;
&lt;br /&gt;
 Welche Organisationen haben deren Hauptsitz in Österreich? Wie viele Mitglieder haben diese Organisationen?&lt;br /&gt;
&lt;br /&gt;
 Was sind die Top 10 Sprachen? Wie viele native Speaker sprechen diese Sprache?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create, Read, Update, Delete ==&lt;br /&gt;
Erstelle eine Objekt-Klasse für ein Land und erstelle für jede Aufgabe eine eigene &#039;&#039;&#039;Methode&#039;&#039;&#039; die...&lt;br /&gt;
* ein neues Land erstellt und in die Datenbank einfügt.&lt;br /&gt;
* ein bestimmtes Land in der Datenbank findet.&lt;br /&gt;
* ein bestimmtest Attribut eines Landes verändert.&lt;br /&gt;
* ein bestimmtes Land aus der Datenbank löscht.&lt;br /&gt;
&lt;br /&gt;
=== Bonus Aufgabe ===&lt;br /&gt;
*Erweitere dein Programm mit einer Console-Eingabe und teste deine Methoden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ER Entwurf ==&lt;br /&gt;
Für den Entwurf von &#039;&#039;&#039;E&#039;&#039;&#039;ntity &#039;&#039;&#039;R&#039;&#039;&#039;elationship Modellen gibt es mehrere Möglichkeiten. Soll von einem bestehenden Datenbestand (in unnormalisierter Form) ein Datenbankmodell abgeleitet werden, so können die [https://www.datenbanken-verstehen.de/datenmodellierung/normalisierung/ Normalformen] angewandt werden, auf diese werden wir hier jedoch nicht eingehen. Wird ein ER-Modell direkt anhand einer Problemstellung entworfen, so ist diese bei korrektem Entwurf, inhärent normalisiert.&lt;br /&gt;
&lt;br /&gt;
Für die ER-Modellierung gibt es verschiedene Notationen:&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Chen-Notation Chen Notation und modifizierte Chen Notation]&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Min-Max-Notation Min/Max Notation]&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Für die folgenden ER-Modelle soll die Chen Notation angewendet werden, diese ist am einfachsten und am wenigsten fehleranfällig. Nach der ER-Modellierung kann direkt ein logischer Entwurf abgeleitet werden, welcher dann &amp;quot;direkt&amp;quot; in die Datenbank übertragen werden kann.&lt;br /&gt;
&lt;br /&gt;
 Als Zeichenprogramm zum Datenbank Entwurf eignet sich [http://dia-installer.de/ Dia]&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
Im folgenden finden sich einige Beispiele zur Übung des ER-Entwurfs. Es ist dabei sehr wichtig aus der textuellen Problemstellung herauszufinden was Teil des ER-Entwurfs ist, und was zum logischen Teil der Anwendung gehört und somit nichts mit dem Entwurf zu tun hat. Weiters ist es sehr wichtig, etwaige Lücken in der Problemstellung zu erkennen und auszufüllen.&lt;br /&gt;
&lt;br /&gt;
Für jedes Beispiel gilt:&lt;br /&gt;
* ER-Entwurf erstellen (inklusive aller wichtigen Attribute)&lt;br /&gt;
* Logischer Entwurf (Entweder in textueller oder tabellarischer Form)&lt;br /&gt;
&lt;br /&gt;
==== Übungsfirma ====&lt;br /&gt;
Eine Firma hat mehrere Mitarbeiter, diese arbeiten in einer Abteilung. Ein Mitarbeiter hat einen Vorgesetzten, dieser ist selbst wieder ein Mitarbeiter. Weiters gibt es Projekte an denen mehrere Mitarbeiter beteiligt sind, Mitarbeiter selbst können auch an mehreren Projekten mitarbeiten.&lt;br /&gt;
&lt;br /&gt;
==== Übungsfirma2 ====&lt;br /&gt;
Ergänze den Entwurf aus dem vorhergehenden Beispiel so, dass Mitarbeiter in einem gewissen Zeitraum an einem Projekt arbeiten können.&lt;br /&gt;
&lt;br /&gt;
 [[Datei:Uebungsfirma all.zip|mini|]] Enthält ER-Entwurf, logischer Entwurf, SQL Statements&lt;br /&gt;
[[Datei:Uebungsfirma.png|mini|none|400px|ER-Diagramm Übungsfirma]]&lt;br /&gt;
&lt;br /&gt;
==== Zoo ====&lt;br /&gt;
Mehrere in ganz Deutschland verteilte Zoos sollen mittels einer Datenbank verwaltet werden. Die Tiere werden von Pflegern gepflegt und befinden sich in Gehegen. Außerdem bekommen die Tiere eine spezielle Futtermischung, welche von Lieferanten geliefert wird.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Zoo all.zip|mini]]&lt;br /&gt;
[[Datei:Zoo.png|mini|none|400px|Zoo ER-Diagramm]]&lt;br /&gt;
&lt;br /&gt;
==== Druckerproduzent ====&lt;br /&gt;
Eine Firma, die Drucker herstellt, benötigt eine Datenbank zur Verwaltung ihrer Geschäftsprozesse. Die Firma hat mehrere Abteilungen, wie zum Beispiel Lager, Fertigung, Vertrieb. Zur Herstellung der Drucker werden Zukaufteile benötigt, die also nicht in der Fertigung selbst hergestellt werden. Der Fabrikleiter möchte auch einen Überblick über die Mitarbeiter mit allen relevanten Daten haben.&lt;br /&gt;
&lt;br /&gt;
==== Restaurant ====&lt;br /&gt;
Sie besitzen ein Restaurant, natürlich haben Sie Angestellte die entweder Koch, Kellner oder Lieferant sein können, überlegen Sie sich die nötigen Attribute selbst. Kunden können bei Ihnen im Restaurant bestellen und dort essen, Sie bieten aber auch das Angebot die Bestellung nach Hause zu liefern. Der Kellner ist für die Bearbeitung der Bestellung zuständig und teilt die Kunden zu den jeweiligen Tischen ein.&lt;br /&gt;
&lt;br /&gt;
==== Ferienhausverwaltung ====&lt;br /&gt;
Eine Ferienhausvermietung braucht ein Datenbanksystem für die Verwaltung der Buchungen. Zwischen zwei Buchungen muss immer eine Reinigungskraft das gesamte Haus reinigen und auf Schäden kontrollieren. Für diese Reinigung und Kontrolle braucht die Reinigungskraft zwischen 3-6 Stunden, je nach Größe / Kategorie bzw. Nächtigungspreis des Hauses. Die Ferienhäuser werden demnach in drei Klassen unterteilt.&lt;br /&gt;
* &amp;lt; 150 € / Nacht (Reinigung &amp;amp; Kontrolle: 3 Stunden)&lt;br /&gt;
* &amp;lt; 500 € / Nacht (Reinigung &amp;amp; Kontrolle: 5 Stunden)&lt;br /&gt;
* &amp;gt; 500 € / Nacht (Reinigung &amp;amp; Kontrolle: 6 Stunden)&lt;br /&gt;
Bei Schäden muss das Haus für die Zeit, bis der Schaden repariert wurde, gesperrt werden.&lt;br /&gt;
Die Ferienhäuser haben zwischen ein und vier Stockwerke (inkl. Keller), sowie unterschiedliche Ausstattungen (Bsp. Garten, WLAN, Balkon, ...).&lt;br /&gt;
Fügen Sie weitere Attribute (Bsp. Quadratmeter) hinzu, welche Sie für wichtig erachten.&lt;br /&gt;
&lt;br /&gt;
== Datenbank Anwendung ==&lt;br /&gt;
Im folgenden soll in mehreren Schritten eine Datenbank Anwendung modelliert und erstellt werden. Diese Anwendung soll ein einfaches Zahlungssystem mit Überweisung und Bankomat beeinhalten.&lt;br /&gt;
* Kunden sollen angelegt werden&lt;br /&gt;
* Es sollen Konten angelegt werden&lt;br /&gt;
* Konten sollen Geld überweisen/einzahlen und überweisen können&lt;br /&gt;
* Jede Transaktion soll gespeichert werden mit Betrag, Quelle, Ziel und Datum&lt;br /&gt;
* Der Kontostand soll aufgrund aller vorhergehenden Transaktion berechnet werden&lt;br /&gt;
* Der Kunde soll Geld einzahlen und abheben können&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe: &#039;&#039;&#039;E&#039;&#039;&#039;ntity &#039;&#039;&#039;R&#039;&#039;&#039;elation (ER) Diagramm erstellen ====&lt;br /&gt;
Entwirf ein korrektes &#039;&#039;&#039;ER&#039;&#039;&#039; Diagramm für die Datenbankanwendung, zumindest sollen die Tabellen &#039;&#039;&#039;Kunde&#039;&#039;&#039;, &#039;&#039;&#039;Konto&#039;&#039;&#039; und &#039;&#039;&#039;Transaktion&#039;&#039;&#039; enthalten sein. Achte auf die korrekte Beziehung zwischen den Tabellen.&lt;br /&gt;
* Ein Kunde kann mehrere Konten haben&lt;br /&gt;
* Ein Konto kann mehrere Kunden haben, diese haben dann eine unterschiedliche Rolle (Besitzer, Zeichnungsberechtigt, etc...)&lt;br /&gt;
* Eine Transaktion muss ein Quell- und ein Zielkonto haben&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe: Anlegen der Datenbank in MySQL ====&lt;br /&gt;
Implementiere das erstellte &#039;&#039;&#039;ER&#039;&#039;&#039; Diagramm in MySQL. Achte auf das Anlegen von korrekten &#039;&#039;&#039;Primär-&#039;&#039;&#039; und &#039;&#039;&#039;Fremdschlüsseln.&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe: Verbinden der Datenbank (JDBC) in Java ====&lt;br /&gt;
Verbinde dich über die &#039;&#039;&#039;JDBC&#039;&#039;&#039; Schnittstelle in Java mit der angelegten Datenbank. Das Anlegen einer Testdatenbank kann sehr hilfreich sein um Tests zu schreiben.&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe: Kunden/Konten und Transaktionen in Java anlegen und abrufen ====&lt;br /&gt;
Erstelle die Modelle für deine Tabellen in Java und ermögliche über Methoden das &#039;&#039;&#039;Erstellen&#039;&#039;&#039;, &#039;&#039;&#039;Aktualisieren&#039;&#039;&#039;, &#039;&#039;&#039;Lesen&#039;&#039;&#039; und &#039;&#039;&#039;Löschen.&lt;br /&gt;
 &#039;&#039;&#039;C&#039;&#039;&#039;reate &#039;&#039;&#039;R&#039;&#039;&#039;ead &#039;&#039;&#039;U&#039;&#039;&#039;pdate &#039;&#039;&#039;D&#039;&#039;&#039;elete&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe: (Kommandozeilenanwendung) für den Bankomat erstellen ====&lt;br /&gt;
Erstelle ein Userinterface für die Bankomat Anwendung.&lt;br /&gt;
* Der Benutzer soll authentifiziert werden&lt;br /&gt;
* Es soll eine entsprechende Auswahl an Konten angezeigt werden&lt;br /&gt;
* Einzahlen/Auszahlen soll möglich sein&lt;br /&gt;
* Überweisung an anderes Konto&lt;br /&gt;
&lt;br /&gt;
= Quellen =&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=DCV_2024_03/DB_%C3%9Cbungen&amp;diff=3565</id>
		<title>DCV 2024 03/DB Übungen</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=DCV_2024_03/DB_%C3%9Cbungen&amp;diff=3565"/>
		<updated>2024-05-02T05:24:25Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Überblick */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Im folgenden finden sich Übungen für das Thema Datenbanken. Weiters soll direkt ein Überblick über die Themen erfolgen. Als &#039;&#039;&#039;D&#039;&#039;&#039;aten&#039;&#039;&#039;B&#039;&#039;&#039;ank&#039;&#039;&#039;M&#039;&#039;&#039;anagement &#039;&#039;&#039;S&#039;&#039;&#039;ystem wird &#039;&#039;&#039;MySQL&#039;&#039;&#039;[https://www.mysql.com/de/] verwendet&lt;br /&gt;
&lt;br /&gt;
= Überblick =&lt;br /&gt;
Ein grundlegendes Verständnis folgender Begriffe soll erlangt werden. Diese sind nicht chronologisch geordnet.&lt;br /&gt;
* &#039;&#039;&#039;E&#039;&#039;&#039;ntity &#039;&#039;&#039;R&#039;&#039;&#039;elation Diagramme erstellen (&#039;&#039;&#039;Chen Notation&#039;&#039;&#039;)&lt;br /&gt;
* Implementieren des &#039;&#039;&#039;ER&#039;&#039;&#039; Diagramms in &#039;&#039;&#039;MySQL&#039;&#039;&#039;&lt;br /&gt;
* Primär- und Fremdschlüssel&lt;br /&gt;
** Erstellen von Fremdschlüssel &#039;&#039;&#039;Constraints&#039;&#039;&#039;&lt;br /&gt;
* SQL Queries&lt;br /&gt;
** Daten Abfragen&lt;br /&gt;
{{SQLML|code=&lt;br /&gt;
USE mondial;&lt;br /&gt;
SELECT * from City limit 5;&lt;br /&gt;
&lt;br /&gt;
-- Zeigt alle Spalten, alle Zeilen aus den country Tabelle&lt;br /&gt;
SELECT * FROM mondial.country;&lt;br /&gt;
&lt;br /&gt;
-- Konstant als Text&lt;br /&gt;
SELECT &#039;Hello World!&#039; Greeting;&lt;br /&gt;
&lt;br /&gt;
-- Zeigt alle Spalten, erste 5 Zeilen aus den country Tabelle&lt;br /&gt;
SELECT * FROM mondial.country limit 5;&lt;br /&gt;
&lt;br /&gt;
-- Zeigt die Spalten Name und Capital der erste 5 Zeilen aus den country Tabelle&lt;br /&gt;
SELECT Name, Capital FROM mondial.country limit 5;&lt;br /&gt;
&lt;br /&gt;
-- Zeigt die Spalten Name und Capital mit eigenen Namen&lt;br /&gt;
SELECT Name Land, Capital Hauptstadt FROM mondial.country limit 5;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter auf Name&lt;br /&gt;
SELECT Name, Capital FROM mondial.country WHERE Name = &#039;Austria&#039;;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter auf Population&lt;br /&gt;
SELECT Name, Capital FROM mondial.country WHERE Population &amp;lt; 1000000;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter auf Population&lt;br /&gt;
SELECT Name, Capital, Population FROM mondial.country WHERE Population BETWEEN 1000000 AND 2000000;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter auf Name beginnend mit A&lt;br /&gt;
SELECT Name, Capital, Population FROM mondial.country WHERE Name LIKE &#039;A%&#039;;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter auf Name am Ende mit A&lt;br /&gt;
SELECT Name, Capital, Population FROM mondial.country WHERE Name LIKE &#039;%A&#039;;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter mit NOT Operator&lt;br /&gt;
SELECT Name, Capital, Population FROM mondial.country WHERE Name NOT LIKE &#039;A%&#039;;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter mit OR Operator&lt;br /&gt;
SELECT Name, Capital, Population FROM mondial.country WHERE Name LIKE &#039;A%&#039; OR Population &amp;lt; 1000000;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter mit AND Operator&lt;br /&gt;
SELECT Name, Capital, Population FROM mondial.country WHERE Name LIKE &#039;A%&#039; AND Population &amp;lt; 1000000;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
** Tabellen verknüpfen mit &#039;&#039;&#039;WHERE&#039;&#039;&#039; und &#039;&#039;&#039;INNER JOIN&#039;&#039;&#039;&lt;br /&gt;
** Unterschied zwischen &#039;&#039;&#039;INNER JOIN&#039;&#039;&#039; und &#039;&#039;&#039;LEFT OUTER JOIN&#039;&#039;&#039; und &#039;&#039;&#039;RIGHT OUTER JOIN&#039;&#039;&#039;&lt;br /&gt;
** Einfügen mittels &#039;&#039;&#039;INSERT&#039;&#039;&#039;&lt;br /&gt;
** Löschen mittels &#039;&#039;&#039;DELETE&#039;&#039;&#039;&lt;br /&gt;
** Aktualisieren mittels &#039;&#039;&#039;UPDATE&#039;&#039;&#039;&lt;br /&gt;
* Anbindung an die Datenbank mittels &#039;&#039;&#039;JDBC&#039;&#039;&#039; in &#039;&#039;&#039;Java&#039;&#039;&#039;&lt;br /&gt;
** Verbindung zur Datenbank herstellen&lt;br /&gt;
** Daten anlegen&lt;br /&gt;
** Daten abrufen&lt;br /&gt;
** Daten löschen&lt;br /&gt;
&lt;br /&gt;
= Übungen =&lt;br /&gt;
&lt;br /&gt;
Als Voraussetzung wird eine funktionierende &#039;&#039;&#039;MySQL&#039;&#039;&#039; installation mit &#039;&#039;&#039;MySQL Workbench&#039;&#039;&#039; vorausgesetzt. &#039;&#039;&#039;MySQL Workbench&#039;&#039;&#039; ist ein grafisches Tool um mit &#039;&#039;&#039;MySQL&#039;&#039;&#039; zu arbeiten.&lt;br /&gt;
&lt;br /&gt;
Der Download für beide Tools findet sich [https://dev.mysql.com/get/Downloads/MySQLInstaller/mysql-installer-community-8.0.27.1.msi hier].&lt;br /&gt;
* Add Product&lt;br /&gt;
* MySQL Server hinzufügen&lt;br /&gt;
* MySQL Workbench hinzufügen&lt;br /&gt;
&lt;br /&gt;
Für den Bereich &#039;&#039;&#039;S&#039;&#039;&#039;tructured &#039;&#039;&#039;Q&#039;&#039;&#039;uery &#039;&#039;&#039;L&#039;&#039;&#039;anguage wird weiters vorausgesetzt dass eine &#039;&#039;&#039;Datenbank&#039;&#039;&#039; mit folgenden Inhalten existiert:&lt;br /&gt;
 Ein großer Dank geht an die Uni Göttingen für die Bereitstellung der &#039;&#039;&#039;Mondial&#039;&#039;&#039;&amp;lt;ref name=&amp;quot;göttingen&amp;quot;&amp;gt;https://www.dbis.informatik.uni-goettingen.de/Mondial/&amp;lt;/ref&amp;gt; Datenbank&lt;br /&gt;
* [[Datei:Mondial-schema-mysql.zip]]&lt;br /&gt;
* [[Datei:Mondial-inputs-mysql.zip]]&lt;br /&gt;
&lt;br /&gt;
# Zuerst MySQL Workbench öffnen, mit dem DBMS verbinden.&lt;br /&gt;
# File -&amp;gt; Open Sql Script -&amp;gt; Schema auswählen (zuerst das zip entpacken)&lt;br /&gt;
# Mit dem Blitz ausführen&lt;br /&gt;
## Tritt ein Fehler auf &amp;gt;&amp;gt;,ORACLE&amp;lt;&amp;lt; aus der ersten Zeile entfernen&lt;br /&gt;
# File -&amp;gt; Open Sql Script -&amp;gt; Input auswählen (zuerst das zip entpacken)&lt;br /&gt;
# Mit dem Blitz ausführen&lt;br /&gt;
# Nun sollte die Datenbank Mondial existieren und es geht weiter mit den übungen zu SQL Abfragen&lt;br /&gt;
&lt;br /&gt;
== SQL Abfragen ==&lt;br /&gt;
Verschiedene Abfragen um Tabellen zu verbinden. Verwende für die Abfragen die &#039;&#039;&#039;Mondial&#039;&#039;&#039; Datenbank.&lt;br /&gt;
[[Datei:ER-Mondial.jpg|mini|none|600px|Mondial ER Diagramm&amp;lt;ref&amp;gt;https://www.dbis.informatik.uni-goettingen.de/Mondial/mondial-abh.pdf&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
[[Datei:Mondial Abhängingkeiten.jpg|mini|none|400px|Mondial Abhängigkeiten&amp;lt;ref name=&amp;quot;göttingen&amp;quot;/&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe SQL Queries ====&lt;br /&gt;
 Wie viele Einwohner hat Österreich?&lt;br /&gt;
&lt;br /&gt;
 Wie viele Einwohner hat der Kontinent Europa?&lt;br /&gt;
&lt;br /&gt;
 Welche Flüsse fließen durch Österreich?&lt;br /&gt;
&lt;br /&gt;
 Welche Flüsse fließen durch Europa (nur den Flussnamen)?&lt;br /&gt;
&lt;br /&gt;
 Wie viel Prozent der Menschen leben im Kontinent Europa?&lt;br /&gt;
&lt;br /&gt;
 Alle Länder die mit einem A anfangen&lt;br /&gt;
&lt;br /&gt;
 Alle Länder die mit einem A anfangen und deren Bundesländer mit Einwohnerzahl, sortiert nach Einwohnerzahl&lt;br /&gt;
&lt;br /&gt;
 Alle Flüsse die durch Europa fließen (nur Flüsse und deren Länge), sortiert nach Länge&lt;br /&gt;
&lt;br /&gt;
 Alle Inseln im Pazifik mit &amp;gt;50% islamischem Bekenntnis&lt;br /&gt;
&lt;br /&gt;
 Alle 3000er, welche in einem Land sind, welches zu mindestens 60% römisch Katholisch ist&lt;br /&gt;
&lt;br /&gt;
 Alle Länder mit mindestens einem See mit mindestens 100 Meter Tiefe und mindestens einem Berg mit mindestens 1500 Höhenmeter&lt;br /&gt;
&lt;br /&gt;
 Einwohnerzahl pro Religion&lt;br /&gt;
&lt;br /&gt;
 Alle Länder, nur die Namen und die Meere dazu (keine Null Werte)&lt;br /&gt;
&lt;br /&gt;
 Alle Länder, nur die Namen, und wenn sie haben, das Meer dazu&lt;br /&gt;
&lt;br /&gt;
 Das Unabhängigkeitsdatum von Ländern die eine Wüste haben und die ethnische Gruppe &#039;&#039;&#039;African&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 Welche Länder haben genau 3 Städte? Welche Länder sind dies?&lt;br /&gt;
&lt;br /&gt;
 Welches sind die 3 größten Städte von Amerika (Kontinent)?&lt;br /&gt;
&lt;br /&gt;
 Was ist der größte Berg von Österreich? Wie hoch ist er?&lt;br /&gt;
&lt;br /&gt;
 Was ist der größte Berg von Europa? Wie hoch ist er?&lt;br /&gt;
&lt;br /&gt;
 Was ist der größte Berg pro Kontinent? Wie hoch sind diese?&lt;br /&gt;
&lt;br /&gt;
 Welches Land hat am meisten anerkannte Religionen? Wie viel sind es?&lt;br /&gt;
&lt;br /&gt;
 Welche Organisationen haben deren Hauptsitz in Österreich? Wie viele Mitglieder haben diese Organisationen?&lt;br /&gt;
&lt;br /&gt;
 Was sind die Top 10 Sprachen? Wie viele native Speaker sprechen diese Sprache?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create, Read, Update, Delete ==&lt;br /&gt;
Erstelle eine Objekt-Klasse für ein Land und erstelle für jede Aufgabe eine eigene &#039;&#039;&#039;Methode&#039;&#039;&#039; die...&lt;br /&gt;
* ein neues Land erstellt und in die Datenbank einfügt.&lt;br /&gt;
* ein bestimmtes Land in der Datenbank findet.&lt;br /&gt;
* ein bestimmtest Attribut eines Landes verändert.&lt;br /&gt;
* ein bestimmtes Land aus der Datenbank löscht.&lt;br /&gt;
&lt;br /&gt;
=== Bonus Aufgabe ===&lt;br /&gt;
*Erweitere dein Programm mit einer Console-Eingabe und teste deine Methoden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ER Entwurf ==&lt;br /&gt;
Für den Entwurf von &#039;&#039;&#039;E&#039;&#039;&#039;ntity &#039;&#039;&#039;R&#039;&#039;&#039;elationship Modellen gibt es mehrere Möglichkeiten. Soll von einem bestehenden Datenbestand (in unnormalisierter Form) ein Datenbankmodell abgeleitet werden, so können die [https://www.datenbanken-verstehen.de/datenmodellierung/normalisierung/ Normalformen] angewandt werden, auf diese werden wir hier jedoch nicht eingehen. Wird ein ER-Modell direkt anhand einer Problemstellung entworfen, so ist diese bei korrektem Entwurf, inhärent normalisiert.&lt;br /&gt;
&lt;br /&gt;
Für die ER-Modellierung gibt es verschiedene Notationen:&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Chen-Notation Chen Notation und modifizierte Chen Notation]&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Min-Max-Notation Min/Max Notation]&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Für die folgenden ER-Modelle soll die Chen Notation angewendet werden, diese ist am einfachsten und am wenigsten fehleranfällig. Nach der ER-Modellierung kann direkt ein logischer Entwurf abgeleitet werden, welcher dann &amp;quot;direkt&amp;quot; in die Datenbank übertragen werden kann.&lt;br /&gt;
&lt;br /&gt;
 Als Zeichenprogramm zum Datenbank Entwurf eignet sich [http://dia-installer.de/ Dia]&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
Im folgenden finden sich einige Beispiele zur Übung des ER-Entwurfs. Es ist dabei sehr wichtig aus der textuellen Problemstellung herauszufinden was Teil des ER-Entwurfs ist, und was zum logischen Teil der Anwendung gehört und somit nichts mit dem Entwurf zu tun hat. Weiters ist es sehr wichtig, etwaige Lücken in der Problemstellung zu erkennen und auszufüllen.&lt;br /&gt;
&lt;br /&gt;
Für jedes Beispiel gilt:&lt;br /&gt;
* ER-Entwurf erstellen (inklusive aller wichtigen Attribute)&lt;br /&gt;
* Logischer Entwurf (Entweder in textueller oder tabellarischer Form)&lt;br /&gt;
&lt;br /&gt;
==== Übungsfirma ====&lt;br /&gt;
Eine Firma hat mehrere Mitarbeiter, diese arbeiten in einer Abteilung. Ein Mitarbeiter hat einen Vorgesetzten, dieser ist selbst wieder ein Mitarbeiter. Weiters gibt es Projekte an denen mehrere Mitarbeiter beteiligt sind, Mitarbeiter selbst können auch an mehreren Projekten mitarbeiten.&lt;br /&gt;
&lt;br /&gt;
==== Übungsfirma2 ====&lt;br /&gt;
Ergänze den Entwurf aus dem vorhergehenden Beispiel so, dass Mitarbeiter in einem gewissen Zeitraum an einem Projekt arbeiten können.&lt;br /&gt;
&lt;br /&gt;
 [[Datei:Uebungsfirma all.zip|mini|]] Enthält ER-Entwurf, logischer Entwurf, SQL Statements&lt;br /&gt;
[[Datei:Uebungsfirma.png|mini|none|400px|ER-Diagramm Übungsfirma]]&lt;br /&gt;
&lt;br /&gt;
==== Zoo ====&lt;br /&gt;
Mehrere in ganz Deutschland verteilte Zoos sollen mittels einer Datenbank verwaltet werden. Die Tiere werden von Pflegern gepflegt und befinden sich in Gehegen. Außerdem bekommen die Tiere eine spezielle Futtermischung, welche von Lieferanten geliefert wird.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Zoo all.zip|mini]]&lt;br /&gt;
[[Datei:Zoo.png|mini|none|400px|Zoo ER-Diagramm]]&lt;br /&gt;
&lt;br /&gt;
==== Druckerproduzent ====&lt;br /&gt;
Eine Firma, die Drucker herstellt, benötigt eine Datenbank zur Verwaltung ihrer Geschäftsprozesse. Die Firma hat mehrere Abteilungen, wie zum Beispiel Lager, Fertigung, Vertrieb. Zur Herstellung der Drucker werden Zukaufteile benötigt, die also nicht in der Fertigung selbst hergestellt werden. Der Fabrikleiter möchte auch einen Überblick über die Mitarbeiter mit allen relevanten Daten haben.&lt;br /&gt;
&lt;br /&gt;
==== Restaurant ====&lt;br /&gt;
Sie besitzen ein Restaurant, natürlich haben Sie Angestellte die entweder Koch, Kellner oder Lieferant sein können, überlegen Sie sich die nötigen Attribute selbst. Kunden können bei Ihnen im Restaurant bestellen und dort essen, Sie bieten aber auch das Angebot die Bestellung nach Hause zu liefern. Der Kellner ist für die Bearbeitung der Bestellung zuständig und teilt die Kunden zu den jeweiligen Tischen ein.&lt;br /&gt;
&lt;br /&gt;
==== Ferienhausverwaltung ====&lt;br /&gt;
Eine Ferienhausvermietung braucht ein Datenbanksystem für die Verwaltung der Buchungen. Zwischen zwei Buchungen muss immer eine Reinigungskraft das gesamte Haus reinigen und auf Schäden kontrollieren. Für diese Reinigung und Kontrolle braucht die Reinigungskraft zwischen 3-6 Stunden, je nach Größe / Kategorie bzw. Nächtigungspreis des Hauses. Die Ferienhäuser werden demnach in drei Klassen unterteilt.&lt;br /&gt;
* &amp;lt; 150 € / Nacht (Reinigung &amp;amp; Kontrolle: 3 Stunden)&lt;br /&gt;
* &amp;lt; 500 € / Nacht (Reinigung &amp;amp; Kontrolle: 5 Stunden)&lt;br /&gt;
* &amp;gt; 500 € / Nacht (Reinigung &amp;amp; Kontrolle: 6 Stunden)&lt;br /&gt;
Bei Schäden muss das Haus für die Zeit, bis der Schaden repariert wurde, gesperrt werden.&lt;br /&gt;
Die Ferienhäuser haben zwischen ein und vier Stockwerke (inkl. Keller), sowie unterschiedliche Ausstattungen (Bsp. Garten, WLAN, Balkon, ...).&lt;br /&gt;
Fügen Sie weitere Attribute (Bsp. Quadratmeter) hinzu, welche Sie für wichtig erachten.&lt;br /&gt;
&lt;br /&gt;
== Datenbank Anwendung ==&lt;br /&gt;
Im folgenden soll in mehreren Schritten eine Datenbank Anwendung modelliert und erstellt werden. Diese Anwendung soll ein einfaches Zahlungssystem mit Überweisung und Bankomat beeinhalten.&lt;br /&gt;
* Kunden sollen angelegt werden&lt;br /&gt;
* Es sollen Konten angelegt werden&lt;br /&gt;
* Konten sollen Geld überweisen/einzahlen und überweisen können&lt;br /&gt;
* Jede Transaktion soll gespeichert werden mit Betrag, Quelle, Ziel und Datum&lt;br /&gt;
* Der Kontostand soll aufgrund aller vorhergehenden Transaktion berechnet werden&lt;br /&gt;
* Der Kunde soll Geld einzahlen und abheben können&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe: &#039;&#039;&#039;E&#039;&#039;&#039;ntity &#039;&#039;&#039;R&#039;&#039;&#039;elation (ER) Diagramm erstellen ====&lt;br /&gt;
Entwirf ein korrektes &#039;&#039;&#039;ER&#039;&#039;&#039; Diagramm für die Datenbankanwendung, zumindest sollen die Tabellen &#039;&#039;&#039;Kunde&#039;&#039;&#039;, &#039;&#039;&#039;Konto&#039;&#039;&#039; und &#039;&#039;&#039;Transaktion&#039;&#039;&#039; enthalten sein. Achte auf die korrekte Beziehung zwischen den Tabellen.&lt;br /&gt;
* Ein Kunde kann mehrere Konten haben&lt;br /&gt;
* Ein Konto kann mehrere Kunden haben, diese haben dann eine unterschiedliche Rolle (Besitzer, Zeichnungsberechtigt, etc...)&lt;br /&gt;
* Eine Transaktion muss ein Quell- und ein Zielkonto haben&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe: Anlegen der Datenbank in MySQL ====&lt;br /&gt;
Implementiere das erstellte &#039;&#039;&#039;ER&#039;&#039;&#039; Diagramm in MySQL. Achte auf das Anlegen von korrekten &#039;&#039;&#039;Primär-&#039;&#039;&#039; und &#039;&#039;&#039;Fremdschlüsseln.&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe: Verbinden der Datenbank (JDBC) in Java ====&lt;br /&gt;
Verbinde dich über die &#039;&#039;&#039;JDBC&#039;&#039;&#039; Schnittstelle in Java mit der angelegten Datenbank. Das Anlegen einer Testdatenbank kann sehr hilfreich sein um Tests zu schreiben.&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe: Kunden/Konten und Transaktionen in Java anlegen und abrufen ====&lt;br /&gt;
Erstelle die Modelle für deine Tabellen in Java und ermögliche über Methoden das &#039;&#039;&#039;Erstellen&#039;&#039;&#039;, &#039;&#039;&#039;Aktualisieren&#039;&#039;&#039;, &#039;&#039;&#039;Lesen&#039;&#039;&#039; und &#039;&#039;&#039;Löschen.&lt;br /&gt;
 &#039;&#039;&#039;C&#039;&#039;&#039;reate &#039;&#039;&#039;R&#039;&#039;&#039;ead &#039;&#039;&#039;U&#039;&#039;&#039;pdate &#039;&#039;&#039;D&#039;&#039;&#039;elete&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe: (Kommandozeilenanwendung) für den Bankomat erstellen ====&lt;br /&gt;
Erstelle ein Userinterface für die Bankomat Anwendung.&lt;br /&gt;
* Der Benutzer soll authentifiziert werden&lt;br /&gt;
* Es soll eine entsprechende Auswahl an Konten angezeigt werden&lt;br /&gt;
* Einzahlen/Auszahlen soll möglich sein&lt;br /&gt;
* Überweisung an anderes Konto&lt;br /&gt;
&lt;br /&gt;
= Quellen =&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=DCV_2024_03/DB_%C3%9Cbungen&amp;diff=3564</id>
		<title>DCV 2024 03/DB Übungen</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=DCV_2024_03/DB_%C3%9Cbungen&amp;diff=3564"/>
		<updated>2024-05-02T05:20:15Z</updated>

		<summary type="html">&lt;p&gt;Drlue: Die Seite wurde neu angelegt: „Im folgenden finden sich Übungen für das Thema Datenbanken. Weiters soll direkt ein Überblick über die Themen erfolgen. Als &amp;#039;&amp;#039;&amp;#039;D&amp;#039;&amp;#039;&amp;#039;aten&amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;ank&amp;#039;&amp;#039;&amp;#039;M&amp;#039;&amp;#039;&amp;#039;anagement &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039;ystem wird &amp;#039;&amp;#039;&amp;#039;MySQL&amp;#039;&amp;#039;&amp;#039;[https://www.mysql.com/de/] verwendet  = Überblick = Ein grundlegendes Verständnis folgender Begriffe soll erlangt werden. Diese sind nicht chronologisch geordnet. * &amp;#039;&amp;#039;&amp;#039;E&amp;#039;&amp;#039;&amp;#039;ntity &amp;#039;&amp;#039;&amp;#039;R&amp;#039;&amp;#039;&amp;#039;elation Diagramme erstellen (&amp;#039;&amp;#039;&amp;#039;Chen Notation&amp;#039;&amp;#039;&amp;#039;) * Implementieren des &amp;#039;&amp;#039;&amp;#039;ER…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Im folgenden finden sich Übungen für das Thema Datenbanken. Weiters soll direkt ein Überblick über die Themen erfolgen. Als &#039;&#039;&#039;D&#039;&#039;&#039;aten&#039;&#039;&#039;B&#039;&#039;&#039;ank&#039;&#039;&#039;M&#039;&#039;&#039;anagement &#039;&#039;&#039;S&#039;&#039;&#039;ystem wird &#039;&#039;&#039;MySQL&#039;&#039;&#039;[https://www.mysql.com/de/] verwendet&lt;br /&gt;
&lt;br /&gt;
= Überblick =&lt;br /&gt;
Ein grundlegendes Verständnis folgender Begriffe soll erlangt werden. Diese sind nicht chronologisch geordnet.&lt;br /&gt;
* &#039;&#039;&#039;E&#039;&#039;&#039;ntity &#039;&#039;&#039;R&#039;&#039;&#039;elation Diagramme erstellen (&#039;&#039;&#039;Chen Notation&#039;&#039;&#039;)&lt;br /&gt;
* Implementieren des &#039;&#039;&#039;ER&#039;&#039;&#039; Diagramms in &#039;&#039;&#039;MySQL&#039;&#039;&#039;&lt;br /&gt;
* Primär- und Fremdschlüssel&lt;br /&gt;
** Erstellen von Fremdschlüssel &#039;&#039;&#039;Constraints&#039;&#039;&#039;&lt;br /&gt;
* SQL Queries&lt;br /&gt;
** Daten Abfragen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
USE mondial;&lt;br /&gt;
SELECT * from City limit 5;&lt;br /&gt;
&lt;br /&gt;
-- Zeigt alle Spalten, alle Zeilen aus den country Tabelle&lt;br /&gt;
SELECT * FROM mondial.country;&lt;br /&gt;
&lt;br /&gt;
-- Konstant als Text&lt;br /&gt;
SELECT &#039;Hello World!&#039; Greeting;&lt;br /&gt;
&lt;br /&gt;
-- Zeigt alle Spalten, erste 5 Zeilen aus den country Tabelle&lt;br /&gt;
SELECT * FROM mondial.country limit 5;&lt;br /&gt;
&lt;br /&gt;
-- Zeigt die Spalten Name und Capital der erste 5 Zeilen aus den country Tabelle&lt;br /&gt;
SELECT Name, Capital FROM mondial.country limit 5;&lt;br /&gt;
&lt;br /&gt;
-- Zeigt die Spalten Name und Capital mit eigenen Namen&lt;br /&gt;
SELECT Name Land, Capital Hauptstadt FROM mondial.country limit 5;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter auf Name&lt;br /&gt;
SELECT Name, Capital FROM mondial.country WHERE Name = &#039;Austria&#039;;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter auf Population&lt;br /&gt;
SELECT Name, Capital FROM mondial.country WHERE Population &amp;lt; 1000000;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter auf Population&lt;br /&gt;
SELECT Name, Capital, Population FROM mondial.country WHERE Population BETWEEN 1000000 AND 2000000;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter auf Name beginnend mit A&lt;br /&gt;
SELECT Name, Capital, Population FROM mondial.country WHERE Name LIKE &#039;A%&#039;;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter auf Name am Ende mit A&lt;br /&gt;
SELECT Name, Capital, Population FROM mondial.country WHERE Name LIKE &#039;%A&#039;;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter mit NOT Operator&lt;br /&gt;
SELECT Name, Capital, Population FROM mondial.country WHERE Name NOT LIKE &#039;A%&#039;;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter mit OR Operator&lt;br /&gt;
SELECT Name, Capital, Population FROM mondial.country WHERE Name LIKE &#039;A%&#039; OR Population &amp;lt; 1000000;&lt;br /&gt;
&lt;br /&gt;
-- Abfrage mit Filter mit AND Operator&lt;br /&gt;
SELECT Name, Capital, Population FROM mondial.country WHERE Name LIKE &#039;A%&#039; AND Population &amp;lt; 1000000;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
** Tabellen verknüpfen mit &#039;&#039;&#039;WHERE&#039;&#039;&#039; und &#039;&#039;&#039;INNER JOIN&#039;&#039;&#039;&lt;br /&gt;
** Unterschied zwischen &#039;&#039;&#039;INNER JOIN&#039;&#039;&#039; und &#039;&#039;&#039;LEFT OUTER JOIN&#039;&#039;&#039; und &#039;&#039;&#039;RIGHT OUTER JOIN&#039;&#039;&#039;&lt;br /&gt;
** Einfügen mittels &#039;&#039;&#039;INSERT&#039;&#039;&#039;&lt;br /&gt;
** Löschen mittels &#039;&#039;&#039;DELETE&#039;&#039;&#039;&lt;br /&gt;
** Aktualisieren mittels &#039;&#039;&#039;UPDATE&#039;&#039;&#039;&lt;br /&gt;
* Anbindung an die Datenbank mittels &#039;&#039;&#039;JDBC&#039;&#039;&#039; in &#039;&#039;&#039;Java&#039;&#039;&#039;&lt;br /&gt;
** Verbindung zur Datenbank herstellen&lt;br /&gt;
** Daten anlegen&lt;br /&gt;
** Daten abrufen&lt;br /&gt;
** Daten löschen&lt;br /&gt;
&lt;br /&gt;
= Übungen =&lt;br /&gt;
&lt;br /&gt;
Als Voraussetzung wird eine funktionierende &#039;&#039;&#039;MySQL&#039;&#039;&#039; installation mit &#039;&#039;&#039;MySQL Workbench&#039;&#039;&#039; vorausgesetzt. &#039;&#039;&#039;MySQL Workbench&#039;&#039;&#039; ist ein grafisches Tool um mit &#039;&#039;&#039;MySQL&#039;&#039;&#039; zu arbeiten.&lt;br /&gt;
&lt;br /&gt;
Der Download für beide Tools findet sich [https://dev.mysql.com/get/Downloads/MySQLInstaller/mysql-installer-community-8.0.27.1.msi hier].&lt;br /&gt;
* Add Product&lt;br /&gt;
* MySQL Server hinzufügen&lt;br /&gt;
* MySQL Workbench hinzufügen&lt;br /&gt;
&lt;br /&gt;
Für den Bereich &#039;&#039;&#039;S&#039;&#039;&#039;tructured &#039;&#039;&#039;Q&#039;&#039;&#039;uery &#039;&#039;&#039;L&#039;&#039;&#039;anguage wird weiters vorausgesetzt dass eine &#039;&#039;&#039;Datenbank&#039;&#039;&#039; mit folgenden Inhalten existiert:&lt;br /&gt;
 Ein großer Dank geht an die Uni Göttingen für die Bereitstellung der &#039;&#039;&#039;Mondial&#039;&#039;&#039;&amp;lt;ref name=&amp;quot;göttingen&amp;quot;&amp;gt;https://www.dbis.informatik.uni-goettingen.de/Mondial/&amp;lt;/ref&amp;gt; Datenbank&lt;br /&gt;
* [[Datei:Mondial-schema-mysql.zip]]&lt;br /&gt;
* [[Datei:Mondial-inputs-mysql.zip]]&lt;br /&gt;
&lt;br /&gt;
# Zuerst MySQL Workbench öffnen, mit dem DBMS verbinden.&lt;br /&gt;
# File -&amp;gt; Open Sql Script -&amp;gt; Schema auswählen (zuerst das zip entpacken)&lt;br /&gt;
# Mit dem Blitz ausführen&lt;br /&gt;
## Tritt ein Fehler auf &amp;gt;&amp;gt;,ORACLE&amp;lt;&amp;lt; aus der ersten Zeile entfernen&lt;br /&gt;
# File -&amp;gt; Open Sql Script -&amp;gt; Input auswählen (zuerst das zip entpacken)&lt;br /&gt;
# Mit dem Blitz ausführen&lt;br /&gt;
# Nun sollte die Datenbank Mondial existieren und es geht weiter mit den übungen zu SQL Abfragen&lt;br /&gt;
&lt;br /&gt;
== SQL Abfragen ==&lt;br /&gt;
Verschiedene Abfragen um Tabellen zu verbinden. Verwende für die Abfragen die &#039;&#039;&#039;Mondial&#039;&#039;&#039; Datenbank.&lt;br /&gt;
[[Datei:ER-Mondial.jpg|mini|none|600px|Mondial ER Diagramm&amp;lt;ref&amp;gt;https://www.dbis.informatik.uni-goettingen.de/Mondial/mondial-abh.pdf&amp;lt;/ref&amp;gt;]]&lt;br /&gt;
[[Datei:Mondial Abhängingkeiten.jpg|mini|none|400px|Mondial Abhängigkeiten&amp;lt;ref name=&amp;quot;göttingen&amp;quot;/&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe SQL Queries ====&lt;br /&gt;
 Wie viele Einwohner hat Österreich?&lt;br /&gt;
&lt;br /&gt;
 Wie viele Einwohner hat der Kontinent Europa?&lt;br /&gt;
&lt;br /&gt;
 Welche Flüsse fließen durch Österreich?&lt;br /&gt;
&lt;br /&gt;
 Welche Flüsse fließen durch Europa (nur den Flussnamen)?&lt;br /&gt;
&lt;br /&gt;
 Wie viel Prozent der Menschen leben im Kontinent Europa?&lt;br /&gt;
&lt;br /&gt;
 Alle Länder die mit einem A anfangen&lt;br /&gt;
&lt;br /&gt;
 Alle Länder die mit einem A anfangen und deren Bundesländer mit Einwohnerzahl, sortiert nach Einwohnerzahl&lt;br /&gt;
&lt;br /&gt;
 Alle Flüsse die durch Europa fließen (nur Flüsse und deren Länge), sortiert nach Länge&lt;br /&gt;
&lt;br /&gt;
 Alle Inseln im Pazifik mit &amp;gt;50% islamischem Bekenntnis&lt;br /&gt;
&lt;br /&gt;
 Alle 3000er, welche in einem Land sind, welches zu mindestens 60% römisch Katholisch ist&lt;br /&gt;
&lt;br /&gt;
 Alle Länder mit mindestens einem See mit mindestens 100 Meter Tiefe und mindestens einem Berg mit mindestens 1500 Höhenmeter&lt;br /&gt;
&lt;br /&gt;
 Einwohnerzahl pro Religion&lt;br /&gt;
&lt;br /&gt;
 Alle Länder, nur die Namen und die Meere dazu (keine Null Werte)&lt;br /&gt;
&lt;br /&gt;
 Alle Länder, nur die Namen, und wenn sie haben, das Meer dazu&lt;br /&gt;
&lt;br /&gt;
 Das Unabhängigkeitsdatum von Ländern die eine Wüste haben und die ethnische Gruppe &#039;&#039;&#039;African&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 Welche Länder haben genau 3 Städte? Welche Länder sind dies?&lt;br /&gt;
&lt;br /&gt;
 Welches sind die 3 größten Städte von Amerika (Kontinent)?&lt;br /&gt;
&lt;br /&gt;
 Was ist der größte Berg von Österreich? Wie hoch ist er?&lt;br /&gt;
&lt;br /&gt;
 Was ist der größte Berg von Europa? Wie hoch ist er?&lt;br /&gt;
&lt;br /&gt;
 Was ist der größte Berg pro Kontinent? Wie hoch sind diese?&lt;br /&gt;
&lt;br /&gt;
 Welches Land hat am meisten anerkannte Religionen? Wie viel sind es?&lt;br /&gt;
&lt;br /&gt;
 Welche Organisationen haben deren Hauptsitz in Österreich? Wie viele Mitglieder haben diese Organisationen?&lt;br /&gt;
&lt;br /&gt;
 Was sind die Top 10 Sprachen? Wie viele native Speaker sprechen diese Sprache?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create, Read, Update, Delete ==&lt;br /&gt;
Erstelle eine Objekt-Klasse für ein Land und erstelle für jede Aufgabe eine eigene &#039;&#039;&#039;Methode&#039;&#039;&#039; die...&lt;br /&gt;
* ein neues Land erstellt und in die Datenbank einfügt.&lt;br /&gt;
* ein bestimmtes Land in der Datenbank findet.&lt;br /&gt;
* ein bestimmtest Attribut eines Landes verändert.&lt;br /&gt;
* ein bestimmtes Land aus der Datenbank löscht.&lt;br /&gt;
&lt;br /&gt;
=== Bonus Aufgabe ===&lt;br /&gt;
*Erweitere dein Programm mit einer Console-Eingabe und teste deine Methoden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ER Entwurf ==&lt;br /&gt;
Für den Entwurf von &#039;&#039;&#039;E&#039;&#039;&#039;ntity &#039;&#039;&#039;R&#039;&#039;&#039;elationship Modellen gibt es mehrere Möglichkeiten. Soll von einem bestehenden Datenbestand (in unnormalisierter Form) ein Datenbankmodell abgeleitet werden, so können die [https://www.datenbanken-verstehen.de/datenmodellierung/normalisierung/ Normalformen] angewandt werden, auf diese werden wir hier jedoch nicht eingehen. Wird ein ER-Modell direkt anhand einer Problemstellung entworfen, so ist diese bei korrektem Entwurf, inhärent normalisiert.&lt;br /&gt;
&lt;br /&gt;
Für die ER-Modellierung gibt es verschiedene Notationen:&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Chen-Notation Chen Notation und modifizierte Chen Notation]&lt;br /&gt;
* [https://de.wikipedia.org/wiki/Min-Max-Notation Min/Max Notation]&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Für die folgenden ER-Modelle soll die Chen Notation angewendet werden, diese ist am einfachsten und am wenigsten fehleranfällig. Nach der ER-Modellierung kann direkt ein logischer Entwurf abgeleitet werden, welcher dann &amp;quot;direkt&amp;quot; in die Datenbank übertragen werden kann.&lt;br /&gt;
&lt;br /&gt;
 Als Zeichenprogramm zum Datenbank Entwurf eignet sich [http://dia-installer.de/ Dia]&lt;br /&gt;
&lt;br /&gt;
=== Beispiele ===&lt;br /&gt;
Im folgenden finden sich einige Beispiele zur Übung des ER-Entwurfs. Es ist dabei sehr wichtig aus der textuellen Problemstellung herauszufinden was Teil des ER-Entwurfs ist, und was zum logischen Teil der Anwendung gehört und somit nichts mit dem Entwurf zu tun hat. Weiters ist es sehr wichtig, etwaige Lücken in der Problemstellung zu erkennen und auszufüllen.&lt;br /&gt;
&lt;br /&gt;
Für jedes Beispiel gilt:&lt;br /&gt;
* ER-Entwurf erstellen (inklusive aller wichtigen Attribute)&lt;br /&gt;
* Logischer Entwurf (Entweder in textueller oder tabellarischer Form)&lt;br /&gt;
&lt;br /&gt;
==== Übungsfirma ====&lt;br /&gt;
Eine Firma hat mehrere Mitarbeiter, diese arbeiten in einer Abteilung. Ein Mitarbeiter hat einen Vorgesetzten, dieser ist selbst wieder ein Mitarbeiter. Weiters gibt es Projekte an denen mehrere Mitarbeiter beteiligt sind, Mitarbeiter selbst können auch an mehreren Projekten mitarbeiten.&lt;br /&gt;
&lt;br /&gt;
==== Übungsfirma2 ====&lt;br /&gt;
Ergänze den Entwurf aus dem vorhergehenden Beispiel so, dass Mitarbeiter in einem gewissen Zeitraum an einem Projekt arbeiten können.&lt;br /&gt;
&lt;br /&gt;
 [[Datei:Uebungsfirma all.zip|mini|]] Enthält ER-Entwurf, logischer Entwurf, SQL Statements&lt;br /&gt;
[[Datei:Uebungsfirma.png|mini|none|400px|ER-Diagramm Übungsfirma]]&lt;br /&gt;
&lt;br /&gt;
==== Zoo ====&lt;br /&gt;
Mehrere in ganz Deutschland verteilte Zoos sollen mittels einer Datenbank verwaltet werden. Die Tiere werden von Pflegern gepflegt und befinden sich in Gehegen. Außerdem bekommen die Tiere eine spezielle Futtermischung, welche von Lieferanten geliefert wird.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Zoo all.zip|mini]]&lt;br /&gt;
[[Datei:Zoo.png|mini|none|400px|Zoo ER-Diagramm]]&lt;br /&gt;
&lt;br /&gt;
==== Druckerproduzent ====&lt;br /&gt;
Eine Firma, die Drucker herstellt, benötigt eine Datenbank zur Verwaltung ihrer Geschäftsprozesse. Die Firma hat mehrere Abteilungen, wie zum Beispiel Lager, Fertigung, Vertrieb. Zur Herstellung der Drucker werden Zukaufteile benötigt, die also nicht in der Fertigung selbst hergestellt werden. Der Fabrikleiter möchte auch einen Überblick über die Mitarbeiter mit allen relevanten Daten haben.&lt;br /&gt;
&lt;br /&gt;
==== Restaurant ====&lt;br /&gt;
Sie besitzen ein Restaurant, natürlich haben Sie Angestellte die entweder Koch, Kellner oder Lieferant sein können, überlegen Sie sich die nötigen Attribute selbst. Kunden können bei Ihnen im Restaurant bestellen und dort essen, Sie bieten aber auch das Angebot die Bestellung nach Hause zu liefern. Der Kellner ist für die Bearbeitung der Bestellung zuständig und teilt die Kunden zu den jeweiligen Tischen ein.&lt;br /&gt;
&lt;br /&gt;
==== Ferienhausverwaltung ====&lt;br /&gt;
Eine Ferienhausvermietung braucht ein Datenbanksystem für die Verwaltung der Buchungen. Zwischen zwei Buchungen muss immer eine Reinigungskraft das gesamte Haus reinigen und auf Schäden kontrollieren. Für diese Reinigung und Kontrolle braucht die Reinigungskraft zwischen 3-6 Stunden, je nach Größe / Kategorie bzw. Nächtigungspreis des Hauses. Die Ferienhäuser werden demnach in drei Klassen unterteilt.&lt;br /&gt;
* &amp;lt; 150 € / Nacht (Reinigung &amp;amp; Kontrolle: 3 Stunden)&lt;br /&gt;
* &amp;lt; 500 € / Nacht (Reinigung &amp;amp; Kontrolle: 5 Stunden)&lt;br /&gt;
* &amp;gt; 500 € / Nacht (Reinigung &amp;amp; Kontrolle: 6 Stunden)&lt;br /&gt;
Bei Schäden muss das Haus für die Zeit, bis der Schaden repariert wurde, gesperrt werden.&lt;br /&gt;
Die Ferienhäuser haben zwischen ein und vier Stockwerke (inkl. Keller), sowie unterschiedliche Ausstattungen (Bsp. Garten, WLAN, Balkon, ...).&lt;br /&gt;
Fügen Sie weitere Attribute (Bsp. Quadratmeter) hinzu, welche Sie für wichtig erachten.&lt;br /&gt;
&lt;br /&gt;
== Datenbank Anwendung ==&lt;br /&gt;
Im folgenden soll in mehreren Schritten eine Datenbank Anwendung modelliert und erstellt werden. Diese Anwendung soll ein einfaches Zahlungssystem mit Überweisung und Bankomat beeinhalten.&lt;br /&gt;
* Kunden sollen angelegt werden&lt;br /&gt;
* Es sollen Konten angelegt werden&lt;br /&gt;
* Konten sollen Geld überweisen/einzahlen und überweisen können&lt;br /&gt;
* Jede Transaktion soll gespeichert werden mit Betrag, Quelle, Ziel und Datum&lt;br /&gt;
* Der Kontostand soll aufgrund aller vorhergehenden Transaktion berechnet werden&lt;br /&gt;
* Der Kunde soll Geld einzahlen und abheben können&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe: &#039;&#039;&#039;E&#039;&#039;&#039;ntity &#039;&#039;&#039;R&#039;&#039;&#039;elation (ER) Diagramm erstellen ====&lt;br /&gt;
Entwirf ein korrektes &#039;&#039;&#039;ER&#039;&#039;&#039; Diagramm für die Datenbankanwendung, zumindest sollen die Tabellen &#039;&#039;&#039;Kunde&#039;&#039;&#039;, &#039;&#039;&#039;Konto&#039;&#039;&#039; und &#039;&#039;&#039;Transaktion&#039;&#039;&#039; enthalten sein. Achte auf die korrekte Beziehung zwischen den Tabellen.&lt;br /&gt;
* Ein Kunde kann mehrere Konten haben&lt;br /&gt;
* Ein Konto kann mehrere Kunden haben, diese haben dann eine unterschiedliche Rolle (Besitzer, Zeichnungsberechtigt, etc...)&lt;br /&gt;
* Eine Transaktion muss ein Quell- und ein Zielkonto haben&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe: Anlegen der Datenbank in MySQL ====&lt;br /&gt;
Implementiere das erstellte &#039;&#039;&#039;ER&#039;&#039;&#039; Diagramm in MySQL. Achte auf das Anlegen von korrekten &#039;&#039;&#039;Primär-&#039;&#039;&#039; und &#039;&#039;&#039;Fremdschlüsseln.&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe: Verbinden der Datenbank (JDBC) in Java ====&lt;br /&gt;
Verbinde dich über die &#039;&#039;&#039;JDBC&#039;&#039;&#039; Schnittstelle in Java mit der angelegten Datenbank. Das Anlegen einer Testdatenbank kann sehr hilfreich sein um Tests zu schreiben.&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe: Kunden/Konten und Transaktionen in Java anlegen und abrufen ====&lt;br /&gt;
Erstelle die Modelle für deine Tabellen in Java und ermögliche über Methoden das &#039;&#039;&#039;Erstellen&#039;&#039;&#039;, &#039;&#039;&#039;Aktualisieren&#039;&#039;&#039;, &#039;&#039;&#039;Lesen&#039;&#039;&#039; und &#039;&#039;&#039;Löschen.&lt;br /&gt;
 &#039;&#039;&#039;C&#039;&#039;&#039;reate &#039;&#039;&#039;R&#039;&#039;&#039;ead &#039;&#039;&#039;U&#039;&#039;&#039;pdate &#039;&#039;&#039;D&#039;&#039;&#039;elete&lt;br /&gt;
&lt;br /&gt;
==== Aufgabe: (Kommandozeilenanwendung) für den Bankomat erstellen ====&lt;br /&gt;
Erstelle ein Userinterface für die Bankomat Anwendung.&lt;br /&gt;
* Der Benutzer soll authentifiziert werden&lt;br /&gt;
* Es soll eine entsprechende Auswahl an Konten angezeigt werden&lt;br /&gt;
* Einzahlen/Auszahlen soll möglich sein&lt;br /&gt;
* Überweisung an anderes Konto&lt;br /&gt;
&lt;br /&gt;
= Quellen =&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=DCV_2024_03&amp;diff=3563</id>
		<title>DCV 2024 03</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=DCV_2024_03&amp;diff=3563"/>
		<updated>2024-05-02T05:19:28Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Objektorientierte Programmierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== [[DCV_2024_03/Allgemeines|Allgemeines]] ==&lt;br /&gt;
&lt;br /&gt;
== [[DCV_2024_03/Protokoll|Protokoll]] ==&lt;br /&gt;
&lt;br /&gt;
== Strukturierte Programmierung ==&lt;br /&gt;
* [[DCV_2024_03/Strukturierte_Programmierung_Uebungen|Übungen zur strukturierten Programmierung]]&lt;br /&gt;
* [[DCV_2024_03/Uebungen_Osterferien|Uebungen Osterferien]]&lt;br /&gt;
&lt;br /&gt;
== Objektorientierte Programmierung ==&lt;br /&gt;
* [[DCV_2024_03/Objekt_Orientierte_Programmierung_Übungen|Übungen objektorientierte]]&lt;br /&gt;
* [[DCV_2024_03/OOP_Selbsttest|OOP Selbsttest für den 1. Mai]]&lt;br /&gt;
&lt;br /&gt;
== Datenbanken ==&lt;br /&gt;
* [[DCV_2024_03/DB_Übungen|Datenbank Übungen]]&lt;br /&gt;
&lt;br /&gt;
== GIT ==&lt;br /&gt;
* [[DCV_2022_03/Git|Git]]&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Image&amp;diff=3552</id>
		<title>Docker 2024 04/Image</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Image&amp;diff=3552"/>
		<updated>2024-04-19T17:38:49Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Image erstellen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Docker Images bilden die Grundlage um Container zu erstellen. Diese können selbst erstellt werden oder über eine &#039;&#039;&#039;Registry&#039;&#039;&#039; geholt werden.&lt;br /&gt;
&lt;br /&gt;
Um ein Image zu erstellen wird ein &#039;&#039;&#039;Dockerfile&#039;&#039;&#039; benötigt. Dieses hat standardmäßig den Dateinamen &#039;&#039;&#039;Dockerfile&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 Bezüglich der Namenskonvention finden sich [https://docs.docker.com/reference/cli/docker/image/tag/ hier]&amp;lt;ref&amp;gt;https://docs.docker.com/reference/cli/docker/image/tag/&amp;lt;/ref&amp;gt; weitere Informationen.&lt;br /&gt;
&lt;br /&gt;
 Dockerfiles können auch Mehrstufig (multi-stage) aufgebaut sein. Z.b.: Eine Build Stage und eine Stage für das eigentliche Image. Siehe [https://docs.docker.com/build/building/multi-stage/ hier]&amp;lt;ref&amp;gt;https://docs.docker.com/build/building/multi-stage/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aufbau des Dockerfiles ===&lt;br /&gt;
==== Baseimage ====&lt;br /&gt;
Jedes Dockerfile wird von einem Baseimage abgeleitet. Dies kann ein eigens erstelltes Image sein, wie bereits in den vorhergehenden Kapiteln gezeigt wurde. Oder es kann eines der populären Baseimages verwendet werden:&lt;br /&gt;
* Ubuntu&lt;br /&gt;
* Alpine&lt;br /&gt;
* Busybox&lt;br /&gt;
&lt;br /&gt;
Diese unterscheiden sich maßgeblich durch ihren Funktionsumfang (welche Tools bereits installiert sind). Dadurch verändert sich natürlich die Größe des selbst erstellten Images. Am besten wird das Baseimage gewählt  mit dem man am meisten Erfahrung hat.&lt;br /&gt;
&lt;br /&gt;
 Es sei angemerkt, dass das Baseimage auch selbst erstellt werden kann (warum auch immer). Siehe [https://docs.docker.com/build/building/base-images/ hier]&amp;lt;ref&amp;gt;https://docs.docker.com/build/building/base-images/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dockerfile&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
FROM ubuntu:22.04&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Dies stellt bereits ein gültiges Image dar. Die Sinnhaftigkeit sei jedoch in Frage gestellt.&lt;br /&gt;
&lt;br /&gt;
==== Command und Entrypoint ====&lt;br /&gt;
Im Regelfall soll ein Container auch eine Applikation ausführen, ansonsten wird dieser direkt nach dem Starten gestoppt.&lt;br /&gt;
&lt;br /&gt;
Hierfür gibt es zwei verschiedene Möglichkeiten:&lt;br /&gt;
* &#039;&#039;&#039;CMD&#039;&#039;&#039;&lt;br /&gt;
** Kann durch {{BSL|docker run [container] [new command]}} ersetzt werden&lt;br /&gt;
** Kann in abgeleitetem Image durch {{BSL|ENTRYPOINT}} oder {{BSL|CMD}} ersetzt werden&lt;br /&gt;
* &#039;&#039;&#039;ENTRYPOINT&#039;&#039;&#039;&lt;br /&gt;
** Es können über {{BSL|docker run [container] [new command]}} Parameter für den Entrypoint hinzugefügt werden&lt;br /&gt;
** Kann in abgeleitetem Image ersetzt werden, dies scheint aber keine &#039;&#039;&#039;best practice&#039;&#039;&#039; zu sein&lt;br /&gt;
&lt;br /&gt;
 Mittels Entrypoint kann sichergestellt werden, dass eine gewisse Applikation gestartet wird, in jedem Fall.&lt;br /&gt;
&lt;br /&gt;
Der Entrypoint kann in einem abgeleiteten Image ebenfalls ersetzt werden. Die Vorgehensweise ist aber etwas sonderbar:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
ENTRYPOINT [&amp;quot;/usr/bin/env&amp;quot;]&lt;br /&gt;
CMD [&amp;quot;...&amp;quot;]&lt;br /&gt;
}}&amp;lt;ref&amp;gt;https://stackoverflow.com/questions/41207522/docker-override-or-remove-entrypoint-from-a-base-image&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dockerfile - CMD&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
FROM ubuntu:22.04&lt;br /&gt;
CMD [&amp;quot;ls&amp;quot;, &amp;quot;-l&amp;quot;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker build . -t image_basics_1:1.0&lt;br /&gt;
# CMD des Dockerfiles verwenden&lt;br /&gt;
docker run --rm image_basics_1:1.0&lt;br /&gt;
# CMD des Dockerfiles überschreiben&lt;br /&gt;
docker run --rm image_basics_1:1.0 echo hallo&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dockerfile - ENTRYPOINT&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
FROM ubuntu:22.04&lt;br /&gt;
ENTRYPOINT [&amp;quot;ls&amp;quot;, &amp;quot;-l&amp;quot;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker build . -t image_basics_2:1.0&lt;br /&gt;
# ENTRYPOINT des Dockerfiles verwenden&lt;br /&gt;
docker run --rm image_basics_2:1.0&lt;br /&gt;
# ENTRYPOINT des Dockerfiles ergänzen&lt;br /&gt;
docker run --rm image_basics_2:1.0 -a&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Weitere Befehle ====&lt;br /&gt;
* &#039;&#039;&#039;RUN&#039;&#039;&#039; - Befehl ausführen&lt;br /&gt;
* &#039;&#039;&#039;COPY&#039;&#039;&#039; - Dateien/Ordner vom Host kopieren&lt;br /&gt;
* &#039;&#039;&#039;WORKDIR&#039;&#039;&#039; - Das Arbeitsverzeichnis wechseln&lt;br /&gt;
* &#039;&#039;&#039;USER&#039;&#039;&#039; - Benutzer wechseln (dieser muss über useradd erstellt werden)&lt;br /&gt;
* &#039;&#039;&#039;EXPOSE&#039;&#039;&#039; - Exponierten Port festlegen, siehe {{BSL|docker run -p [Portnummer]}}, der Sinn erschließt sich mir nicht&lt;br /&gt;
* &#039;&#039;&#039;ARG&#039;&#039;&#039; - Umgebungsvariable nur gültig während des Build Prozesses&amp;lt;ref name=&amp;quot;docker_arg_and_env&amp;quot;&amp;gt;https://vsupalov.com/docker-arg-env-variable-guide/&amp;lt;/ref&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;ENV&#039;&#039;&#039; - Umgebungsvariable gültig während des Build Prozesses und zur Laufzeit&amp;lt;ref name=&amp;quot;docker_arg_and_env&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 1) Bestehende Anwendung ===&lt;br /&gt;
Im folgenden soll aus einer bestehenden Anwendung ein Image erstellt werden. Es handelt sich um eine &#039;&#039;&#039;node.js&#039;&#039;&#039; &#039;&#039;&#039;Express&#039;&#039;&#039; Client/Server Webanwendung.&lt;br /&gt;
* Der &#039;&#039;&#039;Port&#039;&#039;&#039; soll während der Buildprozesses und beim Starten konfigurierbar sein&lt;br /&gt;
** &#039;&#039;Standard: 10000&#039;&#039;&lt;br /&gt;
* Das &#039;&#039;&#039;Loglevel&#039;&#039;&#039; soll während der Buildprozesses und beim Starten konfigurierbar sein&lt;br /&gt;
** &#039;&#039;Standard: console&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 Der Datenbankordner in der gebauten Anwendung kann gemounted werden und findet sich unter {{BSL|dist/database/}}&lt;br /&gt;
&lt;br /&gt;
Das Repository der Anwendung findet sich [https://gitlab.drlue.at/dockerschulung/demoapp.git hier]&amp;lt;ref&amp;gt;https://gitlab.drlue.at/dockerschulung/demoapp.git&amp;lt;/ref&amp;gt; und kann geklont werden.&lt;br /&gt;
&lt;br /&gt;
==== Dockerfile ====&lt;br /&gt;
Inhalt in Datei &#039;&#039;&#039;Dockerfile&#039;&#039;&#039;, [[Docker_2024_04/Containers#Beispiel_5):_Node_Webserver|teilweise von hier]]&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Baseimage&lt;br /&gt;
FROM ubuntu:22.04&lt;br /&gt;
#Don&#039;t ask questions apt&lt;br /&gt;
ARG DEBIAN_FRONTEND=noninteractive&lt;br /&gt;
#Update apt&lt;br /&gt;
RUN apt-get update&lt;br /&gt;
#Install curl&lt;br /&gt;
RUN apt-get -y install curl&lt;br /&gt;
#Add new nodejs version to apt repository&lt;br /&gt;
RUN curl -sL https://deb.nodesource.com/setup_lts.x {{!}} bash -&lt;br /&gt;
#Update apt again&lt;br /&gt;
RUN apt-get update&lt;br /&gt;
#Install nodejs&lt;br /&gt;
RUN apt-get -y install nodejs&lt;br /&gt;
#Copy application to image&lt;br /&gt;
COPY demoapp /app&lt;br /&gt;
#Change directory&lt;br /&gt;
WORKDIR /app&lt;br /&gt;
#Build application&lt;br /&gt;
RUN npm install&lt;br /&gt;
RUN npm run build&lt;br /&gt;
&lt;br /&gt;
#Arguments with default values (can be configured when building: --build-arg PORT=[0-9]* --build-arg JET_LOGGER_MODE=[off{{!}}console{{!}}file{{!}}custom]&lt;br /&gt;
ARG PORT=10000&lt;br /&gt;
ARG JET_LOGGER_MODE=console&lt;br /&gt;
&lt;br /&gt;
#Environment (can be overwritten when starting the image: -e PORT=[0-9]* -e JET_LOGGER_MODE=[off{{!}}console{{!}}file{{!}}custom]&lt;br /&gt;
ENV PORT=${PORT}&lt;br /&gt;
ENV JET_LOGGER_MODE=${JET_LOGGER_MODE}&lt;br /&gt;
CMD [&amp;quot;npm&amp;quot;, &amp;quot;start&amp;quot;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Image erstellen ====&lt;br /&gt;
Ohne Build Argumente&lt;br /&gt;
{{BML|code=docker build . -t image_example1:1.0}}&lt;br /&gt;
Mit Build Argumenten&lt;br /&gt;
{{BML|code=docker build --build-arg PORT=80 --build-arg JET_LOGGER_MODE=off. -t image_example1:1.0}}&lt;br /&gt;
&lt;br /&gt;
==== Image verwenden ====&lt;br /&gt;
Ohne Umgebungsvariablen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Starten&lt;br /&gt;
docker run --rm --name example_app -d -p 9000:10000 image_example1:1.0&lt;br /&gt;
#Logs folgen&lt;br /&gt;
docker logs -f example_app&lt;br /&gt;
#Stoppen&lt;br /&gt;
docker container stop example_app&lt;br /&gt;
}}&lt;br /&gt;
Mit Umgebungsvariablen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Starten&lt;br /&gt;
docker run --rm --name example_app -e PORT=15000 -e JET_LOGGER_MODE=off -d -p 80:15000 image_example1:1.0&lt;br /&gt;
#Logs folgen&lt;br /&gt;
docker logs -f example_app&lt;br /&gt;
#Stoppen&lt;br /&gt;
docker container stop example_app&lt;br /&gt;
}}&lt;br /&gt;
Persistieren der Datenbank&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Volume erstellen&lt;br /&gt;
docker volume create example_app_data&lt;br /&gt;
#Starten&lt;br /&gt;
docker run --rm --name example_app -v example_app_data:/app/dist/database/ -d -p 80:10000 image_example1:1.0&lt;br /&gt;
#Daten modifizieren&lt;br /&gt;
...&lt;br /&gt;
#Container stoppen&lt;br /&gt;
docker container stop example_app&lt;br /&gt;
#Container starten&lt;br /&gt;
docker container start example_app&lt;br /&gt;
#Daten sind da&lt;br /&gt;
...&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Datei:Dockerschulung_2024_04.odp&amp;diff=3551</id>
		<title>Datei:Dockerschulung 2024 04.odp</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Datei:Dockerschulung_2024_04.odp&amp;diff=3551"/>
		<updated>2024-04-19T17:37:50Z</updated>

		<summary type="html">&lt;p&gt;Drlue: Drlue lud eine neue Version von Datei:Dockerschulung 2024 04.odp hoch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Einführungspräsentation&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Docker_Compose&amp;diff=3550</id>
		<title>Docker 2024 04/Docker Compose</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Docker_Compose&amp;diff=3550"/>
		<updated>2024-04-19T05:46:33Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Beispiel 1) Erster Container */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Docker Compose&#039;&#039;&#039; bietet eine komfortable Möglichkeit &#039;&#039;&#039;Images&#039;&#039;&#039; zu bauen und &#039;&#039;&#039;Container&#039;&#039;&#039; bzw. &#039;&#039;&#039;Container&#039;&#039;&#039; im &#039;&#039;&#039;Serviceverbund&#039;&#039;&#039; zu starten. Die Erstellung von &#039;&#039;&#039;Volumes&#039;&#039;&#039; und &#039;&#039;&#039;Networks&#039;&#039;&#039; wird stark erleichtert. Zudem muss der oft Komplexe {{BSL|docker run}} Befehl nicht abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden einige der zuvor erstellten Beispiele mit &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; nachgebaut.&lt;br /&gt;
&lt;br /&gt;
 Der Standard Name für &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; Dateien ist docker-compose.yml.&lt;br /&gt;
 &lt;br /&gt;
 Mit dem Parameter {{BSL|-f}} kann jedoch direkt eine &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; Datei angegeben werden.&lt;br /&gt;
 &lt;br /&gt;
 Z.b.: {{BSL|docker-compose -f service1.yml}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 1) Erster Container ===&lt;br /&gt;
Beispiel siehe [[Docker_2024_04/Containers#Beispiel_1):_Erster_Container_start|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  ubuntu:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: ubuntu&lt;br /&gt;
    #Used image&lt;br /&gt;
    image: ubuntu:22.04&lt;br /&gt;
    #Command to run&lt;br /&gt;
    command: [&amp;quot;bash&amp;quot;]&lt;br /&gt;
    #Parameter -it&lt;br /&gt;
    stdin_open: true &lt;br /&gt;
    tty: true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service &#039;&#039;&#039;detached&#039;&#039;&#039; starten:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose up -d&lt;br /&gt;
}}&lt;br /&gt;
Mit Service verbinden und schließen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
Der Container ist nun im &#039;&#039;&#039;Exited State&#039;&#039;&#039; {{BSL|docker ps -a}}. Der Container wird mit folgendem Kommando korrekt gelöscht, bzw. auch gestoppt sofern dieser gestartet ist. Es werden so ebenfalls alle erstellten Netzwerke gelöscht.  Wird &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; verwendet so wird nicht Standardmäßig das bridge Netzwerk &#039;&#039;&#039;bridge&#039;&#039;&#039; verwendet. &lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose down&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 2) Node Webserver (bestehendes Image, Folder Mount) ===&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Beispiel_5):_Node_Webserver|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  node_webserver:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: example5&lt;br /&gt;
    #Used image&lt;br /&gt;
    image: example5:1.0&lt;br /&gt;
    #Folder/Volume mount -v&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./http:/var/www&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:5000&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service starten&lt;br /&gt;
{{BML|code=docker compose up -d}}&lt;br /&gt;
Logs einsehen&lt;br /&gt;
{{BML|code=docker compose logs [service name optional]}}&lt;br /&gt;
Ressourcen einsehen&lt;br /&gt;
{{BML|code=docker compose stats [service name optional]}}&lt;br /&gt;
Informationen einsehen&lt;br /&gt;
{{BML|code=docker compose ps [service name optional]}}&lt;br /&gt;
Webserver testen [http://localhost:8000 http://localhost:8000]&lt;br /&gt;
&lt;br /&gt;
Service beenden&lt;br /&gt;
{{BML|code=docker compose down}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 3) Node Webserver (existing Image, Volume Mount) ===&lt;br /&gt;
Beispiel siehe [[Docker_2024_04/Containers#Beispiel_5.1):_Node_Webserver_Using_Named_Volume|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  node_webserver:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: example5&lt;br /&gt;
    #Used image&lt;br /&gt;
    image: example5:1.0&lt;br /&gt;
    #Folder/Volume mount -v&lt;br /&gt;
    volumes:&lt;br /&gt;
      - www:/var/www&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:5000&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  www:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das Volume wird automatisch erstellt und bleibt auch nach {{BSL|docker compose down}} erhalten.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 4) Node Webserver (building Image) ===&lt;br /&gt;
Inhalt &#039;&#039;&#039;Dockerfile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Dockerfile|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  node_webserver:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: node_webserver&lt;br /&gt;
    #Build image&lt;br /&gt;
    build:&lt;br /&gt;
      context: .&lt;br /&gt;
    image: example5:1.0&lt;br /&gt;
    #Folder/Volume mount -v&lt;br /&gt;
    volumes:&lt;br /&gt;
      - www:/var/www&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:5000&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  www:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Löschen des bestehenden Images:&lt;br /&gt;
{{BML|code=docker image example5:1.0}}&lt;br /&gt;
Das starten des Services erstellt automatisch das Image bzw. die Images:&lt;br /&gt;
{{BML|code=docker compose up -d}}&lt;br /&gt;
Das oder die Images können auch explizit gebaut werden:&lt;br /&gt;
{{BML|code=docker compose build}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 5) Networking ===&lt;br /&gt;
Beispiel siehe [[Docker_2024_04/Networking#Beispiel_4):_Komplexeres_Beispiel|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;Dockerfile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Siehe [[Docker_2024_04/Networking#Dockerfile|hier]]&lt;br /&gt;
 Folgend werden &#039;&#039;&#039;Bridge&#039;&#039;&#039; Netzwerke verwendet. Es können verschiedene Treiber angegeben werden, siehe [https://docs.docker.com/compose/networking/ hier]&amp;lt;ref&amp;gt;https://docs.docker.com/compose/networking/&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Das &#039;&#039;&#039;Host Network&#039;&#039;&#039; kann über den Parameter {{BSL|network_mode: host}} verwendet werden.&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  app:&lt;br /&gt;
    container_name: app&lt;br /&gt;
    hostname: app&lt;br /&gt;
    build:&lt;br /&gt;
      context: .&lt;br /&gt;
    image: networking_example2:1.0&lt;br /&gt;
    #Use networks&lt;br /&gt;
    networks:&lt;br /&gt;
      - tier1&lt;br /&gt;
      - tier2&lt;br /&gt;
    #Depends on database&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - db&lt;br /&gt;
&lt;br /&gt;
  db:&lt;br /&gt;
    container_name: database&lt;br /&gt;
    hostname: db&lt;br /&gt;
    image: networking_example2:1.0&lt;br /&gt;
    networks:&lt;br /&gt;
      - tier2&lt;br /&gt;
&lt;br /&gt;
  reverseproxy:&lt;br /&gt;
    container_name: reverseproxy&lt;br /&gt;
    hostname: reverseproxy&lt;br /&gt;
    image: networking_example2:1.0&lt;br /&gt;
    networks:&lt;br /&gt;
      - tier1&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - app&lt;br /&gt;
&lt;br /&gt;
networks:&lt;br /&gt;
  tier1:&lt;br /&gt;
  tier2:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Services starten:&lt;br /&gt;
{{BML|code=docker compose up -d}}&lt;br /&gt;
&lt;br /&gt;
 Die Netzwerk funktionalität kann wie [[Docker_2024_04/Networking#Beispiel_4):_Komplexeres_Beispiel|hier]] bereits erläutert wurde, getestet werden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 6) Restarting ===&lt;br /&gt;
Wird die im Service gestartete Anwendung beendet, so kann definiert werden ob der Service neu gestartet werden soll. Weiter Informationen finden sich [https://www.baeldung.com/ops/docker-compose-restart-policies hier]&amp;lt;ref&amp;gt;https://www.baeldung.com/ops/docker-compose-restart-policies&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Folgendes Kommando bietet sich für ein eigenes Terminal an {{BSL|watch -n 0.1 -c &amp;quot;docker ps -a&amp;quot;}} um den Container Status zu überwachen.&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  ubuntu:&lt;br /&gt;
    container_name: ubuntu&lt;br /&gt;
    image: ubuntu:22.04&lt;br /&gt;
    command: [&amp;quot;bash&amp;quot;]&lt;br /&gt;
    stdin_open: true &lt;br /&gt;
    tty: true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service &#039;&#039;&#039;detached&#039;&#039;&#039; starten:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose up -d&lt;br /&gt;
}}&lt;br /&gt;
Mit Service verbinden und schließen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
Der Service wurde beendet und ist im &#039;&#039;&#039;Exited State&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  ubuntu:&lt;br /&gt;
    #Container always restarts after application terminates&lt;br /&gt;
    restart: always&lt;br /&gt;
    container_name: ubuntu&lt;br /&gt;
    image: ubuntu:22.04&lt;br /&gt;
    command: [&amp;quot;bash&amp;quot;]&lt;br /&gt;
    stdin_open: true &lt;br /&gt;
    tty: true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service &#039;&#039;&#039;detached&#039;&#039;&#039; starten:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose up -d&lt;br /&gt;
}}&lt;br /&gt;
Mit Service verbinden und schließen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
Der Service wurde beendet und ist im &#039;&#039;&#039;Exited State&#039;&#039;&#039;, wird jedoch neu gestartet.&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Docker_Compose&amp;diff=3549</id>
		<title>Docker 2024 04/Docker Compose</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Docker_Compose&amp;diff=3549"/>
		<updated>2024-04-19T05:46:11Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Beispiel 5) Networking */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Docker Compose&#039;&#039;&#039; bietet eine komfortable Möglichkeit &#039;&#039;&#039;Images&#039;&#039;&#039; zu bauen und &#039;&#039;&#039;Container&#039;&#039;&#039; bzw. &#039;&#039;&#039;Container&#039;&#039;&#039; im &#039;&#039;&#039;Serviceverbund&#039;&#039;&#039; zu starten. Die Erstellung von &#039;&#039;&#039;Volumes&#039;&#039;&#039; und &#039;&#039;&#039;Networks&#039;&#039;&#039; wird stark erleichtert. Zudem muss der oft Komplexe {{BSL|docker run}} Befehl nicht abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden einige der zuvor erstellten Beispiele mit &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; nachgebaut.&lt;br /&gt;
&lt;br /&gt;
 Der Standard Name für &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; Dateien ist docker-compose.yml.&lt;br /&gt;
 &lt;br /&gt;
 Mit dem Parameter {{BSL|-f}} kann jedoch direkt eine &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; Datei angegeben werden.&lt;br /&gt;
 &lt;br /&gt;
 Z.b.: {{BSL|docker-compose -f service1.yml}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 1) Erster Container ===&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Beispiel_1):_Erster_Container_start|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  ubuntu:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: ubuntu&lt;br /&gt;
    #Used image&lt;br /&gt;
    image: ubuntu:22.04&lt;br /&gt;
    #Command to run&lt;br /&gt;
    command: [&amp;quot;bash&amp;quot;]&lt;br /&gt;
    #Parameter -it&lt;br /&gt;
    stdin_open: true &lt;br /&gt;
    tty: true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service &#039;&#039;&#039;detached&#039;&#039;&#039; starten:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose up -d&lt;br /&gt;
}}&lt;br /&gt;
Mit Service verbinden und schließen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
Der Container ist nun im &#039;&#039;&#039;Exited State&#039;&#039;&#039; {{BSL|docker ps -a}}. Der Container wird mit folgendem Kommando korrekt gelöscht, bzw. auch gestoppt sofern dieser gestartet ist. Es werden so ebenfalls alle erstellten Netzwerke gelöscht.  Wird &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; verwendet so wird nicht Standardmäßig das bridge Netzwerk &#039;&#039;&#039;bridge&#039;&#039;&#039; verwendet. &lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose down&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 2) Node Webserver (bestehendes Image, Folder Mount) ===&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Beispiel_5):_Node_Webserver|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  node_webserver:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: example5&lt;br /&gt;
    #Used image&lt;br /&gt;
    image: example5:1.0&lt;br /&gt;
    #Folder/Volume mount -v&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./http:/var/www&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:5000&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service starten&lt;br /&gt;
{{BML|code=docker compose up -d}}&lt;br /&gt;
Logs einsehen&lt;br /&gt;
{{BML|code=docker compose logs [service name optional]}}&lt;br /&gt;
Ressourcen einsehen&lt;br /&gt;
{{BML|code=docker compose stats [service name optional]}}&lt;br /&gt;
Informationen einsehen&lt;br /&gt;
{{BML|code=docker compose ps [service name optional]}}&lt;br /&gt;
Webserver testen [http://localhost:8000 http://localhost:8000]&lt;br /&gt;
&lt;br /&gt;
Service beenden&lt;br /&gt;
{{BML|code=docker compose down}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 3) Node Webserver (existing Image, Volume Mount) ===&lt;br /&gt;
Beispiel siehe [[Docker_2024_04/Containers#Beispiel_5.1):_Node_Webserver_Using_Named_Volume|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  node_webserver:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: example5&lt;br /&gt;
    #Used image&lt;br /&gt;
    image: example5:1.0&lt;br /&gt;
    #Folder/Volume mount -v&lt;br /&gt;
    volumes:&lt;br /&gt;
      - www:/var/www&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:5000&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  www:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das Volume wird automatisch erstellt und bleibt auch nach {{BSL|docker compose down}} erhalten.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 4) Node Webserver (building Image) ===&lt;br /&gt;
Inhalt &#039;&#039;&#039;Dockerfile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Dockerfile|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  node_webserver:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: node_webserver&lt;br /&gt;
    #Build image&lt;br /&gt;
    build:&lt;br /&gt;
      context: .&lt;br /&gt;
    image: example5:1.0&lt;br /&gt;
    #Folder/Volume mount -v&lt;br /&gt;
    volumes:&lt;br /&gt;
      - www:/var/www&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:5000&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  www:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Löschen des bestehenden Images:&lt;br /&gt;
{{BML|code=docker image example5:1.0}}&lt;br /&gt;
Das starten des Services erstellt automatisch das Image bzw. die Images:&lt;br /&gt;
{{BML|code=docker compose up -d}}&lt;br /&gt;
Das oder die Images können auch explizit gebaut werden:&lt;br /&gt;
{{BML|code=docker compose build}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 5) Networking ===&lt;br /&gt;
Beispiel siehe [[Docker_2024_04/Networking#Beispiel_4):_Komplexeres_Beispiel|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;Dockerfile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Siehe [[Docker_2024_04/Networking#Dockerfile|hier]]&lt;br /&gt;
 Folgend werden &#039;&#039;&#039;Bridge&#039;&#039;&#039; Netzwerke verwendet. Es können verschiedene Treiber angegeben werden, siehe [https://docs.docker.com/compose/networking/ hier]&amp;lt;ref&amp;gt;https://docs.docker.com/compose/networking/&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Das &#039;&#039;&#039;Host Network&#039;&#039;&#039; kann über den Parameter {{BSL|network_mode: host}} verwendet werden.&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  app:&lt;br /&gt;
    container_name: app&lt;br /&gt;
    hostname: app&lt;br /&gt;
    build:&lt;br /&gt;
      context: .&lt;br /&gt;
    image: networking_example2:1.0&lt;br /&gt;
    #Use networks&lt;br /&gt;
    networks:&lt;br /&gt;
      - tier1&lt;br /&gt;
      - tier2&lt;br /&gt;
    #Depends on database&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - db&lt;br /&gt;
&lt;br /&gt;
  db:&lt;br /&gt;
    container_name: database&lt;br /&gt;
    hostname: db&lt;br /&gt;
    image: networking_example2:1.0&lt;br /&gt;
    networks:&lt;br /&gt;
      - tier2&lt;br /&gt;
&lt;br /&gt;
  reverseproxy:&lt;br /&gt;
    container_name: reverseproxy&lt;br /&gt;
    hostname: reverseproxy&lt;br /&gt;
    image: networking_example2:1.0&lt;br /&gt;
    networks:&lt;br /&gt;
      - tier1&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - app&lt;br /&gt;
&lt;br /&gt;
networks:&lt;br /&gt;
  tier1:&lt;br /&gt;
  tier2:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Services starten:&lt;br /&gt;
{{BML|code=docker compose up -d}}&lt;br /&gt;
&lt;br /&gt;
 Die Netzwerk funktionalität kann wie [[Docker_2024_04/Networking#Beispiel_4):_Komplexeres_Beispiel|hier]] bereits erläutert wurde, getestet werden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 6) Restarting ===&lt;br /&gt;
Wird die im Service gestartete Anwendung beendet, so kann definiert werden ob der Service neu gestartet werden soll. Weiter Informationen finden sich [https://www.baeldung.com/ops/docker-compose-restart-policies hier]&amp;lt;ref&amp;gt;https://www.baeldung.com/ops/docker-compose-restart-policies&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Folgendes Kommando bietet sich für ein eigenes Terminal an {{BSL|watch -n 0.1 -c &amp;quot;docker ps -a&amp;quot;}} um den Container Status zu überwachen.&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  ubuntu:&lt;br /&gt;
    container_name: ubuntu&lt;br /&gt;
    image: ubuntu:22.04&lt;br /&gt;
    command: [&amp;quot;bash&amp;quot;]&lt;br /&gt;
    stdin_open: true &lt;br /&gt;
    tty: true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service &#039;&#039;&#039;detached&#039;&#039;&#039; starten:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose up -d&lt;br /&gt;
}}&lt;br /&gt;
Mit Service verbinden und schließen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
Der Service wurde beendet und ist im &#039;&#039;&#039;Exited State&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  ubuntu:&lt;br /&gt;
    #Container always restarts after application terminates&lt;br /&gt;
    restart: always&lt;br /&gt;
    container_name: ubuntu&lt;br /&gt;
    image: ubuntu:22.04&lt;br /&gt;
    command: [&amp;quot;bash&amp;quot;]&lt;br /&gt;
    stdin_open: true &lt;br /&gt;
    tty: true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service &#039;&#039;&#039;detached&#039;&#039;&#039; starten:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose up -d&lt;br /&gt;
}}&lt;br /&gt;
Mit Service verbinden und schließen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
Der Service wurde beendet und ist im &#039;&#039;&#039;Exited State&#039;&#039;&#039;, wird jedoch neu gestartet.&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Docker_Compose&amp;diff=3548</id>
		<title>Docker 2024 04/Docker Compose</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Docker_Compose&amp;diff=3548"/>
		<updated>2024-04-19T05:45:57Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Beispiel 3) Node Webserver (existing Image, Volume Mount) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Docker Compose&#039;&#039;&#039; bietet eine komfortable Möglichkeit &#039;&#039;&#039;Images&#039;&#039;&#039; zu bauen und &#039;&#039;&#039;Container&#039;&#039;&#039; bzw. &#039;&#039;&#039;Container&#039;&#039;&#039; im &#039;&#039;&#039;Serviceverbund&#039;&#039;&#039; zu starten. Die Erstellung von &#039;&#039;&#039;Volumes&#039;&#039;&#039; und &#039;&#039;&#039;Networks&#039;&#039;&#039; wird stark erleichtert. Zudem muss der oft Komplexe {{BSL|docker run}} Befehl nicht abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden einige der zuvor erstellten Beispiele mit &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; nachgebaut.&lt;br /&gt;
&lt;br /&gt;
 Der Standard Name für &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; Dateien ist docker-compose.yml.&lt;br /&gt;
 &lt;br /&gt;
 Mit dem Parameter {{BSL|-f}} kann jedoch direkt eine &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; Datei angegeben werden.&lt;br /&gt;
 &lt;br /&gt;
 Z.b.: {{BSL|docker-compose -f service1.yml}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 1) Erster Container ===&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Beispiel_1):_Erster_Container_start|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  ubuntu:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: ubuntu&lt;br /&gt;
    #Used image&lt;br /&gt;
    image: ubuntu:22.04&lt;br /&gt;
    #Command to run&lt;br /&gt;
    command: [&amp;quot;bash&amp;quot;]&lt;br /&gt;
    #Parameter -it&lt;br /&gt;
    stdin_open: true &lt;br /&gt;
    tty: true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service &#039;&#039;&#039;detached&#039;&#039;&#039; starten:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose up -d&lt;br /&gt;
}}&lt;br /&gt;
Mit Service verbinden und schließen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
Der Container ist nun im &#039;&#039;&#039;Exited State&#039;&#039;&#039; {{BSL|docker ps -a}}. Der Container wird mit folgendem Kommando korrekt gelöscht, bzw. auch gestoppt sofern dieser gestartet ist. Es werden so ebenfalls alle erstellten Netzwerke gelöscht.  Wird &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; verwendet so wird nicht Standardmäßig das bridge Netzwerk &#039;&#039;&#039;bridge&#039;&#039;&#039; verwendet. &lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose down&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 2) Node Webserver (bestehendes Image, Folder Mount) ===&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Beispiel_5):_Node_Webserver|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  node_webserver:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: example5&lt;br /&gt;
    #Used image&lt;br /&gt;
    image: example5:1.0&lt;br /&gt;
    #Folder/Volume mount -v&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./http:/var/www&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:5000&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service starten&lt;br /&gt;
{{BML|code=docker compose up -d}}&lt;br /&gt;
Logs einsehen&lt;br /&gt;
{{BML|code=docker compose logs [service name optional]}}&lt;br /&gt;
Ressourcen einsehen&lt;br /&gt;
{{BML|code=docker compose stats [service name optional]}}&lt;br /&gt;
Informationen einsehen&lt;br /&gt;
{{BML|code=docker compose ps [service name optional]}}&lt;br /&gt;
Webserver testen [http://localhost:8000 http://localhost:8000]&lt;br /&gt;
&lt;br /&gt;
Service beenden&lt;br /&gt;
{{BML|code=docker compose down}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 3) Node Webserver (existing Image, Volume Mount) ===&lt;br /&gt;
Beispiel siehe [[Docker_2024_04/Containers#Beispiel_5.1):_Node_Webserver_Using_Named_Volume|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  node_webserver:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: example5&lt;br /&gt;
    #Used image&lt;br /&gt;
    image: example5:1.0&lt;br /&gt;
    #Folder/Volume mount -v&lt;br /&gt;
    volumes:&lt;br /&gt;
      - www:/var/www&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:5000&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  www:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das Volume wird automatisch erstellt und bleibt auch nach {{BSL|docker compose down}} erhalten.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 4) Node Webserver (building Image) ===&lt;br /&gt;
Inhalt &#039;&#039;&#039;Dockerfile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Dockerfile|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  node_webserver:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: node_webserver&lt;br /&gt;
    #Build image&lt;br /&gt;
    build:&lt;br /&gt;
      context: .&lt;br /&gt;
    image: example5:1.0&lt;br /&gt;
    #Folder/Volume mount -v&lt;br /&gt;
    volumes:&lt;br /&gt;
      - www:/var/www&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:5000&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  www:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Löschen des bestehenden Images:&lt;br /&gt;
{{BML|code=docker image example5:1.0}}&lt;br /&gt;
Das starten des Services erstellt automatisch das Image bzw. die Images:&lt;br /&gt;
{{BML|code=docker compose up -d}}&lt;br /&gt;
Das oder die Images können auch explizit gebaut werden:&lt;br /&gt;
{{BML|code=docker compose build}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 5) Networking ===&lt;br /&gt;
Siehe [[Docker_2024_04/Networking#Beispiel_4):_Komplexeres_Beispiel|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;Dockerfile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Siehe [[Docker_2024_04/Networking#Dockerfile|hier]]&lt;br /&gt;
 Folgend werden &#039;&#039;&#039;Bridge&#039;&#039;&#039; Netzwerke verwendet. Es können verschiedene Treiber angegeben werden, siehe [https://docs.docker.com/compose/networking/ hier]&amp;lt;ref&amp;gt;https://docs.docker.com/compose/networking/&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Das &#039;&#039;&#039;Host Network&#039;&#039;&#039; kann über den Parameter {{BSL|network_mode: host}} verwendet werden.&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  app:&lt;br /&gt;
    container_name: app&lt;br /&gt;
    hostname: app&lt;br /&gt;
    build:&lt;br /&gt;
      context: .&lt;br /&gt;
    image: networking_example2:1.0&lt;br /&gt;
    #Use networks&lt;br /&gt;
    networks:&lt;br /&gt;
      - tier1&lt;br /&gt;
      - tier2&lt;br /&gt;
    #Depends on database&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - db&lt;br /&gt;
&lt;br /&gt;
  db:&lt;br /&gt;
    container_name: database&lt;br /&gt;
    hostname: db&lt;br /&gt;
    image: networking_example2:1.0&lt;br /&gt;
    networks:&lt;br /&gt;
      - tier2&lt;br /&gt;
&lt;br /&gt;
  reverseproxy:&lt;br /&gt;
    container_name: reverseproxy&lt;br /&gt;
    hostname: reverseproxy&lt;br /&gt;
    image: networking_example2:1.0&lt;br /&gt;
    networks:&lt;br /&gt;
      - tier1&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - app&lt;br /&gt;
&lt;br /&gt;
networks:&lt;br /&gt;
  tier1:&lt;br /&gt;
  tier2:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Services starten:&lt;br /&gt;
{{BML|code=docker compose up -d}}&lt;br /&gt;
&lt;br /&gt;
 Die Netzwerk funktionalität kann wie [[Docker_2024_04/Networking#Beispiel_4):_Komplexeres_Beispiel|hier]] bereits erläutert wurde, getestet werden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 6) Restarting ===&lt;br /&gt;
Wird die im Service gestartete Anwendung beendet, so kann definiert werden ob der Service neu gestartet werden soll. Weiter Informationen finden sich [https://www.baeldung.com/ops/docker-compose-restart-policies hier]&amp;lt;ref&amp;gt;https://www.baeldung.com/ops/docker-compose-restart-policies&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Folgendes Kommando bietet sich für ein eigenes Terminal an {{BSL|watch -n 0.1 -c &amp;quot;docker ps -a&amp;quot;}} um den Container Status zu überwachen.&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  ubuntu:&lt;br /&gt;
    container_name: ubuntu&lt;br /&gt;
    image: ubuntu:22.04&lt;br /&gt;
    command: [&amp;quot;bash&amp;quot;]&lt;br /&gt;
    stdin_open: true &lt;br /&gt;
    tty: true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service &#039;&#039;&#039;detached&#039;&#039;&#039; starten:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose up -d&lt;br /&gt;
}}&lt;br /&gt;
Mit Service verbinden und schließen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
Der Service wurde beendet und ist im &#039;&#039;&#039;Exited State&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  ubuntu:&lt;br /&gt;
    #Container always restarts after application terminates&lt;br /&gt;
    restart: always&lt;br /&gt;
    container_name: ubuntu&lt;br /&gt;
    image: ubuntu:22.04&lt;br /&gt;
    command: [&amp;quot;bash&amp;quot;]&lt;br /&gt;
    stdin_open: true &lt;br /&gt;
    tty: true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service &#039;&#039;&#039;detached&#039;&#039;&#039; starten:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose up -d&lt;br /&gt;
}}&lt;br /&gt;
Mit Service verbinden und schließen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
Der Service wurde beendet und ist im &#039;&#039;&#039;Exited State&#039;&#039;&#039;, wird jedoch neu gestartet.&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Docker_Compose&amp;diff=3547</id>
		<title>Docker 2024 04/Docker Compose</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Docker_Compose&amp;diff=3547"/>
		<updated>2024-04-19T05:45:03Z</updated>

		<summary type="html">&lt;p&gt;Drlue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Docker Compose&#039;&#039;&#039; bietet eine komfortable Möglichkeit &#039;&#039;&#039;Images&#039;&#039;&#039; zu bauen und &#039;&#039;&#039;Container&#039;&#039;&#039; bzw. &#039;&#039;&#039;Container&#039;&#039;&#039; im &#039;&#039;&#039;Serviceverbund&#039;&#039;&#039; zu starten. Die Erstellung von &#039;&#039;&#039;Volumes&#039;&#039;&#039; und &#039;&#039;&#039;Networks&#039;&#039;&#039; wird stark erleichtert. Zudem muss der oft Komplexe {{BSL|docker run}} Befehl nicht abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden einige der zuvor erstellten Beispiele mit &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; nachgebaut.&lt;br /&gt;
&lt;br /&gt;
 Der Standard Name für &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; Dateien ist docker-compose.yml.&lt;br /&gt;
 &lt;br /&gt;
 Mit dem Parameter {{BSL|-f}} kann jedoch direkt eine &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; Datei angegeben werden.&lt;br /&gt;
 &lt;br /&gt;
 Z.b.: {{BSL|docker-compose -f service1.yml}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 1) Erster Container ===&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Beispiel_1):_Erster_Container_start|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  ubuntu:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: ubuntu&lt;br /&gt;
    #Used image&lt;br /&gt;
    image: ubuntu:22.04&lt;br /&gt;
    #Command to run&lt;br /&gt;
    command: [&amp;quot;bash&amp;quot;]&lt;br /&gt;
    #Parameter -it&lt;br /&gt;
    stdin_open: true &lt;br /&gt;
    tty: true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service &#039;&#039;&#039;detached&#039;&#039;&#039; starten:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose up -d&lt;br /&gt;
}}&lt;br /&gt;
Mit Service verbinden und schließen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
Der Container ist nun im &#039;&#039;&#039;Exited State&#039;&#039;&#039; {{BSL|docker ps -a}}. Der Container wird mit folgendem Kommando korrekt gelöscht, bzw. auch gestoppt sofern dieser gestartet ist. Es werden so ebenfalls alle erstellten Netzwerke gelöscht.  Wird &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; verwendet so wird nicht Standardmäßig das bridge Netzwerk &#039;&#039;&#039;bridge&#039;&#039;&#039; verwendet. &lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose down&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 2) Node Webserver (bestehendes Image, Folder Mount) ===&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Beispiel_5):_Node_Webserver|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  node_webserver:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: example5&lt;br /&gt;
    #Used image&lt;br /&gt;
    image: example5:1.0&lt;br /&gt;
    #Folder/Volume mount -v&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./http:/var/www&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:5000&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service starten&lt;br /&gt;
{{BML|code=docker compose up -d}}&lt;br /&gt;
Logs einsehen&lt;br /&gt;
{{BML|code=docker compose logs [service name optional]}}&lt;br /&gt;
Ressourcen einsehen&lt;br /&gt;
{{BML|code=docker compose stats [service name optional]}}&lt;br /&gt;
Informationen einsehen&lt;br /&gt;
{{BML|code=docker compose ps [service name optional]}}&lt;br /&gt;
Webserver testen [http://localhost:8000 http://localhost:8000]&lt;br /&gt;
&lt;br /&gt;
Service beenden&lt;br /&gt;
{{BML|code=docker compose down}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 3) Node Webserver (existing Image, Volume Mount) ===&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Beispiel_5.1):_Node_Webserver_Using_Named_Volume|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  node_webserver:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: example5&lt;br /&gt;
    #Used image&lt;br /&gt;
    image: example5:1.0&lt;br /&gt;
    #Folder/Volume mount -v&lt;br /&gt;
    volumes:&lt;br /&gt;
      - www:/var/www&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:5000&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  www:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das Volume wird automatisch erstellt und bleibt auch nach {{BSL|docker compose down}} erhalten.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 4) Node Webserver (building Image) ===&lt;br /&gt;
Inhalt &#039;&#039;&#039;Dockerfile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Dockerfile|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  node_webserver:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: node_webserver&lt;br /&gt;
    #Build image&lt;br /&gt;
    build:&lt;br /&gt;
      context: .&lt;br /&gt;
    image: example5:1.0&lt;br /&gt;
    #Folder/Volume mount -v&lt;br /&gt;
    volumes:&lt;br /&gt;
      - www:/var/www&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:5000&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  www:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Löschen des bestehenden Images:&lt;br /&gt;
{{BML|code=docker image example5:1.0}}&lt;br /&gt;
Das starten des Services erstellt automatisch das Image bzw. die Images:&lt;br /&gt;
{{BML|code=docker compose up -d}}&lt;br /&gt;
Das oder die Images können auch explizit gebaut werden:&lt;br /&gt;
{{BML|code=docker compose build}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 5) Networking ===&lt;br /&gt;
Siehe [[Docker_2024_04/Networking#Beispiel_4):_Komplexeres_Beispiel|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;Dockerfile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Siehe [[Docker_2024_04/Networking#Dockerfile|hier]]&lt;br /&gt;
 Folgend werden &#039;&#039;&#039;Bridge&#039;&#039;&#039; Netzwerke verwendet. Es können verschiedene Treiber angegeben werden, siehe [https://docs.docker.com/compose/networking/ hier]&amp;lt;ref&amp;gt;https://docs.docker.com/compose/networking/&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Das &#039;&#039;&#039;Host Network&#039;&#039;&#039; kann über den Parameter {{BSL|network_mode: host}} verwendet werden.&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  app:&lt;br /&gt;
    container_name: app&lt;br /&gt;
    hostname: app&lt;br /&gt;
    build:&lt;br /&gt;
      context: .&lt;br /&gt;
    image: networking_example2:1.0&lt;br /&gt;
    #Use networks&lt;br /&gt;
    networks:&lt;br /&gt;
      - tier1&lt;br /&gt;
      - tier2&lt;br /&gt;
    #Depends on database&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - db&lt;br /&gt;
&lt;br /&gt;
  db:&lt;br /&gt;
    container_name: database&lt;br /&gt;
    hostname: db&lt;br /&gt;
    image: networking_example2:1.0&lt;br /&gt;
    networks:&lt;br /&gt;
      - tier2&lt;br /&gt;
&lt;br /&gt;
  reverseproxy:&lt;br /&gt;
    container_name: reverseproxy&lt;br /&gt;
    hostname: reverseproxy&lt;br /&gt;
    image: networking_example2:1.0&lt;br /&gt;
    networks:&lt;br /&gt;
      - tier1&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - app&lt;br /&gt;
&lt;br /&gt;
networks:&lt;br /&gt;
  tier1:&lt;br /&gt;
  tier2:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Services starten:&lt;br /&gt;
{{BML|code=docker compose up -d}}&lt;br /&gt;
&lt;br /&gt;
 Die Netzwerk funktionalität kann wie [[Docker_2024_04/Networking#Beispiel_4):_Komplexeres_Beispiel|hier]] bereits erläutert wurde, getestet werden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 6) Restarting ===&lt;br /&gt;
Wird die im Service gestartete Anwendung beendet, so kann definiert werden ob der Service neu gestartet werden soll. Weiter Informationen finden sich [https://www.baeldung.com/ops/docker-compose-restart-policies hier]&amp;lt;ref&amp;gt;https://www.baeldung.com/ops/docker-compose-restart-policies&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Folgendes Kommando bietet sich für ein eigenes Terminal an {{BSL|watch -n 0.1 -c &amp;quot;docker ps -a&amp;quot;}} um den Container Status zu überwachen.&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  ubuntu:&lt;br /&gt;
    container_name: ubuntu&lt;br /&gt;
    image: ubuntu:22.04&lt;br /&gt;
    command: [&amp;quot;bash&amp;quot;]&lt;br /&gt;
    stdin_open: true &lt;br /&gt;
    tty: true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service &#039;&#039;&#039;detached&#039;&#039;&#039; starten:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose up -d&lt;br /&gt;
}}&lt;br /&gt;
Mit Service verbinden und schließen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
Der Service wurde beendet und ist im &#039;&#039;&#039;Exited State&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  ubuntu:&lt;br /&gt;
    #Container always restarts after application terminates&lt;br /&gt;
    restart: always&lt;br /&gt;
    container_name: ubuntu&lt;br /&gt;
    image: ubuntu:22.04&lt;br /&gt;
    command: [&amp;quot;bash&amp;quot;]&lt;br /&gt;
    stdin_open: true &lt;br /&gt;
    tty: true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service &#039;&#039;&#039;detached&#039;&#039;&#039; starten:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose up -d&lt;br /&gt;
}}&lt;br /&gt;
Mit Service verbinden und schließen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
Der Service wurde beendet und ist im &#039;&#039;&#039;Exited State&#039;&#039;&#039;, wird jedoch neu gestartet.&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Resource_Restriction&amp;diff=3546</id>
		<title>Docker 2024 04/Resource Restriction</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Resource_Restriction&amp;diff=3546"/>
		<updated>2024-04-19T05:41:39Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Testimage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Im folgenden soll die Limitierung der Ressourcen für Container erläutert werden, diese Informationen Beziehen sich auf das Host System GNU/Linux.&lt;br /&gt;
&lt;br /&gt;
 Eine Liste der Option zur Ressourcen Limitierung von CPU, Memory, GPU und Disk IO findet sich [https://docs.docker.com/engine/reference/run/ hier]&amp;lt;ref&amp;gt;https://docs.docker.com/engine/reference/run/&amp;lt;/ref&amp;gt; und [https://docs.docker.com/config/containers/resource_constraints/ hier]&amp;lt;ref&amp;gt;https://docs.docker.com/config/containers/resource_constraints&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 Während aller Tests {{BSL|docker stats}} in eigenem Terminal öffnen.&lt;br /&gt;
&lt;br /&gt;
=== Testimage ===&lt;br /&gt;
Folgendes Image bietet einige Anwendungen um die Ressourcenlimitierung zu prüfen.&lt;br /&gt;
==== Dockerfile ====&lt;br /&gt;
Inhalt in Datei &#039;&#039;&#039;Dockerfile&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
FROM ubuntu:22.04&lt;br /&gt;
ARG DEBIAN_FRONTEND=noninteractive&lt;br /&gt;
RUN apt-get update&lt;br /&gt;
RUN apt-get install -y -y memtester pv stress-ng net-tools iproute2 netcat dnsutils curl iputils-ping tcpdump iperf3&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Image erstellen ====&lt;br /&gt;
{{BML|code=docker build . -t resource_limiting_base:1.0}}&lt;br /&gt;
&lt;br /&gt;
=== Memory ===&lt;br /&gt;
512mb RAM, keine Möglichkeit zum swappen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker run --memory 512m --memory-swap 512m --rm -it resource_limiting_base:1.0 bash&lt;br /&gt;
# tail will be filled with up to 3000mb at a rate of 100mb/s&lt;br /&gt;
head -c 3000m /dev/zero {{!}} pv -L 100m {{!}} tail&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
512mb RAM, 1gb swap Speicher&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker run --memory 512m --memory-swap 1536m --rm -it resource_limiting_base:1.0 bash&lt;br /&gt;
# tail will be filled with up to 3000mb at a rate of 100mb/s&lt;br /&gt;
head -c 3000m /dev/zero {{!}} pv -L 100m {{!}} tail&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== CPU ===&lt;br /&gt;
1 Kern&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker run --cpus 1 --rm -it resource_limiting_base:1.0 bash&lt;br /&gt;
# stress-ng cpu test (16 cores) for 10 seconds&lt;br /&gt;
stress-ng --cpu 16 --timeout 10s&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
2 Kerne&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker run --cpus 2 --rm -it resource_limiting_base:1.0 bash&lt;br /&gt;
# stress-ng cpu test (16 cores) for 10 seconds&lt;br /&gt;
stress-ng --cpu 16 --timeout 10s&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
0.5 Kerne&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker run --cpus 0.5 --rm -it resource_limiting_base:1.0 bash&lt;br /&gt;
# stress-ng cpu test (16 cores) for 10 seconds&lt;br /&gt;
stress-ng --cpu 16 --timeout 10s&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Disk IO ===&lt;br /&gt;
50mb/s lesen, 10mb/s schreiben&lt;br /&gt;
 &#039;&#039;&#039;/dev/sda&#039;&#039;&#039; ist hierbei nur ein Beispiel. Je nachdem wohin geschrieben wird, muss das entsprechende Device gefunden werden.&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker run --device-write-bps /dev/sda:10mb --device-read-bps /dev/sda:30mb --rm -it resource_limiting_base:1.0 bash&lt;br /&gt;
# Write 100mb to /tmp/data (no cache)&lt;br /&gt;
dd if=/dev/zero bs=1M count=100 of=/tmp/data oflag=direct&lt;br /&gt;
# Read 100mb from /tmp/data (no cache)&lt;br /&gt;
dd if=/tmp/data bs=1M of=/dev/null iflag=direct&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Network ===&lt;br /&gt;
An dieser Stelle werden wir nicht weiter darauf eingehen, es gestaltet sich nicht so einfach wie die zuvor genannten Limitierungen. Weitere Informationen finden sich [https://hechao.li/2023/08/28/container-bandwidth-limit/ hier]&amp;lt;ref&amp;gt;https://hechao.li/2023/08/28/container-bandwidth-limit&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Storage ===&lt;br /&gt;
Wie beim Netzwerk limitieren ist es nicht so einfach zu realisieren. Eine Möglichkeit bietet das [https://de.wikipedia.org/wiki/XFS XFS]&amp;lt;ref&amp;gt;https://de.wikipedia.org/wiki/XFS&amp;lt;/ref&amp;gt; Dateisystem. Mittels z.B.: &#039;&#039;&#039;pquota&#039;&#039;&#039; kann dies auf &#039;&#039;&#039;Volume&#039;&#039;&#039; oder auch auf &#039;&#039;&#039;Folder Mount&#039;&#039;&#039; ebene realisiert werden. Siehe [https://docs.oracle.com/en/operating-systems/oracle-linux/6/admin/ol_quoset_xfs.html hier]&amp;lt;ref&amp;gt;https://docs.oracle.com/en/operating-systems/oracle-linux/6/admin/ol_quoset_xfs.html&amp;lt;/ref&amp;gt; und [https://docs.oracle.com/en/operating-systems/oracle-linux/6/adminsg/ol_prjquo_xfs.html hier]&amp;lt;ref&amp;gt;https://docs.oracle.com/en/operating-systems/oracle-linux/6/adminsg/ol_prjquo_xfs.html&amp;lt;/ref&amp;gt;&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Image&amp;diff=3545</id>
		<title>Docker 2024 04/Image</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Image&amp;diff=3545"/>
		<updated>2024-04-19T05:40:27Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Using Image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Docker Images bilden die Grundlage um Container zu erstellen. Diese können selbst erstellt werden oder über eine &#039;&#039;&#039;Registry&#039;&#039;&#039; geholt werden.&lt;br /&gt;
&lt;br /&gt;
Um ein Image zu erstellen wird ein &#039;&#039;&#039;Dockerfile&#039;&#039;&#039; benötigt. Dieses hat standardmäßig den Dateinamen &#039;&#039;&#039;Dockerfile&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 Bezüglich der Namenskonvention finden sich [https://docs.docker.com/reference/cli/docker/image/tag/ hier]&amp;lt;ref&amp;gt;https://docs.docker.com/reference/cli/docker/image/tag/&amp;lt;/ref&amp;gt; weitere Informationen.&lt;br /&gt;
&lt;br /&gt;
 Dockerfiles können auch Mehrstufig (multi-stage) aufgebaut sein. Z.b.: Eine Build Stage und eine Stage für das eigentliche Image. Siehe [https://docs.docker.com/build/building/multi-stage/ hier]&amp;lt;ref&amp;gt;https://docs.docker.com/build/building/multi-stage/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aufbau des Dockerfiles ===&lt;br /&gt;
==== Baseimage ====&lt;br /&gt;
Jedes Dockerfile wird von einem Baseimage abgeleitet. Dies kann ein eigens erstelltes Image sein, wie bereits in den vorhergehenden Kapiteln gezeigt wurde. Oder es kann eines der populären Baseimages verwendet werden:&lt;br /&gt;
* Ubuntu&lt;br /&gt;
* Alpine&lt;br /&gt;
* Busybox&lt;br /&gt;
&lt;br /&gt;
Diese unterscheiden sich maßgeblich durch ihren Funktionsumfang (welche Tools bereits installiert sind). Dadurch verändert sich natürlich die Größe des selbst erstellten Images. Am besten wird das Baseimage gewählt  mit dem man am meisten Erfahrung hat.&lt;br /&gt;
&lt;br /&gt;
 Es sei angemerkt, dass das Baseimage auch selbst erstellt werden kann (warum auch immer). Siehe [https://docs.docker.com/build/building/base-images/ hier]&amp;lt;ref&amp;gt;https://docs.docker.com/build/building/base-images/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dockerfile&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
FROM ubuntu:22.04&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Dies stellt bereits ein gültiges Image dar. Die Sinnhaftigkeit sei jedoch in Frage gestellt.&lt;br /&gt;
&lt;br /&gt;
==== Command und Entrypoint ====&lt;br /&gt;
Im Regelfall soll ein Container auch eine Applikation ausführen, ansonsten wird dieser direkt nach dem Starten gestoppt.&lt;br /&gt;
&lt;br /&gt;
Hierfür gibt es zwei verschiedene Möglichkeiten:&lt;br /&gt;
* &#039;&#039;&#039;CMD&#039;&#039;&#039;&lt;br /&gt;
** Kann durch {{BSL|docker run [container] [new command]}} ersetzt werden&lt;br /&gt;
** Kann in abgeleitetem Image durch {{BSL|ENTRYPOINT}} oder {{BSL|CMD}} ersetzt werden&lt;br /&gt;
* &#039;&#039;&#039;ENTRYPOINT&#039;&#039;&#039;&lt;br /&gt;
** Es können über {{BSL|docker run [container] [new command]}} Parameter für den Entrypoint hinzugefügt werden&lt;br /&gt;
** Kann in abgeleitetem Image ersetzt werden, dies scheint aber keine &#039;&#039;&#039;best practice&#039;&#039;&#039; zu sein&lt;br /&gt;
&lt;br /&gt;
 Mittels Entrypoint kann sichergestellt werden, dass eine gewisse Applikation gestartet wird, in jedem Fall.&lt;br /&gt;
&lt;br /&gt;
Der Entrypoint kann in einem abgeleiteten Image ebenfalls ersetzt werden. Die Vorgehensweise ist aber etwas sonderbar:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
ENTRYPOINT [&amp;quot;/usr/bin/env&amp;quot;]&lt;br /&gt;
CMD [&amp;quot;...&amp;quot;]&lt;br /&gt;
}}&amp;lt;ref&amp;gt;https://stackoverflow.com/questions/41207522/docker-override-or-remove-entrypoint-from-a-base-image&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dockerfile - CMD&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
FROM ubuntu:22.04&lt;br /&gt;
CMD [&amp;quot;ls&amp;quot;, &amp;quot;-l&amp;quot;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker build . -t image_basics_1:1.0&lt;br /&gt;
# CMD des Dockerfiles verwenden&lt;br /&gt;
docker run --rm image_basics_1:1.0&lt;br /&gt;
# CMD des Dockerfiles überschreiben&lt;br /&gt;
docker run --rm image_basics_1:1.0 echo hallo&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dockerfile - ENTRYPOINT&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
FROM ubuntu:22.04&lt;br /&gt;
ENTRYPOINT [&amp;quot;ls&amp;quot;, &amp;quot;-l&amp;quot;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker build . -t image_basics_2:1.0&lt;br /&gt;
# ENTRYPOINT des Dockerfiles verwenden&lt;br /&gt;
docker run --rm image_basics_2:1.0&lt;br /&gt;
# ENTRYPOINT des Dockerfiles ergänzen&lt;br /&gt;
docker run --rm image_basics_2:1.0 -a&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Weitere Befehle ====&lt;br /&gt;
* &#039;&#039;&#039;RUN&#039;&#039;&#039; - Befehl ausführen&lt;br /&gt;
* &#039;&#039;&#039;COPY&#039;&#039;&#039; - Dateien/Ordner vom Host kopieren&lt;br /&gt;
* &#039;&#039;&#039;WORKDIR&#039;&#039;&#039; - Das Arbeitsverzeichnis wechseln&lt;br /&gt;
* &#039;&#039;&#039;USER&#039;&#039;&#039; - Benutzer wechseln (dieser muss über useradd erstellt werden)&lt;br /&gt;
* &#039;&#039;&#039;EXPOSE&#039;&#039;&#039; - Exponierten Port festlegen, siehe {{BSL|docker run -p [Portnummer]}}, der Sinn erschließt sich mir nicht&lt;br /&gt;
* &#039;&#039;&#039;ARG&#039;&#039;&#039; - Umgebungsvariable nur gültig während des Build Prozesses&amp;lt;ref name=&amp;quot;docker_arg_and_env&amp;quot;&amp;gt;https://vsupalov.com/docker-arg-env-variable-guide/&amp;lt;/ref&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;ENV&#039;&#039;&#039; - Umgebungsvariable gültig während des Build Prozesses und zur Laufzeit&amp;lt;ref name=&amp;quot;docker_arg_and_env&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 1) Bestehende Anwendung ===&lt;br /&gt;
Im folgenden soll aus einer bestehenden Anwendung ein Image erstellt werden. Es handelt sich um eine &#039;&#039;&#039;node.js&#039;&#039;&#039; &#039;&#039;&#039;Express&#039;&#039;&#039; Client/Server Webanwendung.&lt;br /&gt;
* Der &#039;&#039;&#039;Port&#039;&#039;&#039; soll während der Buildprozesses und beim Starten konfigurierbar sein&lt;br /&gt;
** &#039;&#039;Standard: 10000&#039;&#039;&lt;br /&gt;
* Das &#039;&#039;&#039;Loglevel&#039;&#039;&#039; soll während der Buildprozesses und beim Starten konfigurierbar sein&lt;br /&gt;
** &#039;&#039;Standard: console&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 Der Datenbankordner in der gebauten Anwendung kann gemounted werden und findet sich unter {{BSL|dist/database/}}&lt;br /&gt;
&lt;br /&gt;
Das Repository der Anwendung findet sich [https://gitlab.drlue.at/dockerschulung/demoapp.git hier]&amp;lt;ref&amp;gt;https://gitlab.drlue.at/dockerschulung/demoapp.git&amp;lt;/ref&amp;gt; und kann geklont werden.&lt;br /&gt;
&lt;br /&gt;
==== Dockerfile ====&lt;br /&gt;
Inhalt in Datei &#039;&#039;&#039;Dockerfile&#039;&#039;&#039;, [[Docker_2024_04/Containers#Beispiel_5):_Node_Webserver|teilweise von hier]]&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Baseimage&lt;br /&gt;
FROM ubuntu:22.04&lt;br /&gt;
#Don&#039;t ask questions apt&lt;br /&gt;
ARG DEBIAN_FRONTEND=noninteractive&lt;br /&gt;
#Update apt&lt;br /&gt;
RUN apt-get update&lt;br /&gt;
#Install curl&lt;br /&gt;
RUN apt-get -y install curl&lt;br /&gt;
#Add new nodejs version to apt repository&lt;br /&gt;
RUN curl -sL https://deb.nodesource.com/setup_lts.x {{!}} bash -&lt;br /&gt;
#Update apt again&lt;br /&gt;
RUN apt-get update&lt;br /&gt;
#Install nodejs&lt;br /&gt;
RUN apt-get -y install nodejs&lt;br /&gt;
#Copy application to image&lt;br /&gt;
COPY demoapp /app&lt;br /&gt;
#Change directory&lt;br /&gt;
WORKDIR /app&lt;br /&gt;
#Build application&lt;br /&gt;
RUN npm install&lt;br /&gt;
RUN npm run build&lt;br /&gt;
&lt;br /&gt;
#Arguments with default values (can be configured when building: --build-arg PORT=[0-9]* --build-arg JET_LOGGER_MODE=[off{{!}}console{{!}}file{{!}}custom]&lt;br /&gt;
ARG PORT=10000&lt;br /&gt;
ARG JET_LOGGER_MODE=console&lt;br /&gt;
&lt;br /&gt;
#Environment (can be overwritten when starting the image: -e PORT=[0-9]* -e JET_LOGGER_MODE=[off{{!}}console{{!}}file{{!}}custom]&lt;br /&gt;
ENV PORT=${PORT}&lt;br /&gt;
ENV JET_LOGGER_MODE=${JET_LOGGER_MODE}&lt;br /&gt;
CMD [&amp;quot;npm&amp;quot;, &amp;quot;start&amp;quot;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Image erstellen ====&lt;br /&gt;
Ohne Build Argumente&lt;br /&gt;
{{BML|code=docker build . -t image_example1:1.0}}&lt;br /&gt;
Mit Build Argumenten&lt;br /&gt;
{{BML|code=docker build --build-arg PORT=80 --build-arg LOGGER=off. -t image_example1:1.0}}&lt;br /&gt;
&lt;br /&gt;
==== Image verwenden ====&lt;br /&gt;
Ohne Umgebungsvariablen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Starten&lt;br /&gt;
docker run --rm --name example_app -d -p 9000:10000 image_example1:1.0&lt;br /&gt;
#Logs folgen&lt;br /&gt;
docker logs -f example_app&lt;br /&gt;
#Stoppen&lt;br /&gt;
docker container stop example_app&lt;br /&gt;
}}&lt;br /&gt;
Mit Umgebungsvariablen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Starten&lt;br /&gt;
docker run --rm --name example_app -e PORT=15000 -e JET_LOGGER_MODE=off -d -p 80:15000 image_example1:1.0&lt;br /&gt;
#Logs folgen&lt;br /&gt;
docker logs -f example_app&lt;br /&gt;
#Stoppen&lt;br /&gt;
docker container stop example_app&lt;br /&gt;
}}&lt;br /&gt;
Persistieren der Datenbank&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Volume erstellen&lt;br /&gt;
docker volume create example_app_data&lt;br /&gt;
#Starten&lt;br /&gt;
docker run --rm --name example_app -v example_app_data:/app/dist/database/ -d -p 80:10000 image_example1:1.0&lt;br /&gt;
#Daten modifizieren&lt;br /&gt;
...&lt;br /&gt;
#Container stoppen&lt;br /&gt;
docker container stop example_app&lt;br /&gt;
#Container starten&lt;br /&gt;
docker container start example_app&lt;br /&gt;
#Daten sind da&lt;br /&gt;
...&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Image&amp;diff=3544</id>
		<title>Docker 2024 04/Image</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Image&amp;diff=3544"/>
		<updated>2024-04-19T05:40:17Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Build Image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Docker Images bilden die Grundlage um Container zu erstellen. Diese können selbst erstellt werden oder über eine &#039;&#039;&#039;Registry&#039;&#039;&#039; geholt werden.&lt;br /&gt;
&lt;br /&gt;
Um ein Image zu erstellen wird ein &#039;&#039;&#039;Dockerfile&#039;&#039;&#039; benötigt. Dieses hat standardmäßig den Dateinamen &#039;&#039;&#039;Dockerfile&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 Bezüglich der Namenskonvention finden sich [https://docs.docker.com/reference/cli/docker/image/tag/ hier]&amp;lt;ref&amp;gt;https://docs.docker.com/reference/cli/docker/image/tag/&amp;lt;/ref&amp;gt; weitere Informationen.&lt;br /&gt;
&lt;br /&gt;
 Dockerfiles können auch Mehrstufig (multi-stage) aufgebaut sein. Z.b.: Eine Build Stage und eine Stage für das eigentliche Image. Siehe [https://docs.docker.com/build/building/multi-stage/ hier]&amp;lt;ref&amp;gt;https://docs.docker.com/build/building/multi-stage/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Aufbau des Dockerfiles ===&lt;br /&gt;
==== Baseimage ====&lt;br /&gt;
Jedes Dockerfile wird von einem Baseimage abgeleitet. Dies kann ein eigens erstelltes Image sein, wie bereits in den vorhergehenden Kapiteln gezeigt wurde. Oder es kann eines der populären Baseimages verwendet werden:&lt;br /&gt;
* Ubuntu&lt;br /&gt;
* Alpine&lt;br /&gt;
* Busybox&lt;br /&gt;
&lt;br /&gt;
Diese unterscheiden sich maßgeblich durch ihren Funktionsumfang (welche Tools bereits installiert sind). Dadurch verändert sich natürlich die Größe des selbst erstellten Images. Am besten wird das Baseimage gewählt  mit dem man am meisten Erfahrung hat.&lt;br /&gt;
&lt;br /&gt;
 Es sei angemerkt, dass das Baseimage auch selbst erstellt werden kann (warum auch immer). Siehe [https://docs.docker.com/build/building/base-images/ hier]&amp;lt;ref&amp;gt;https://docs.docker.com/build/building/base-images/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dockerfile&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
FROM ubuntu:22.04&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Dies stellt bereits ein gültiges Image dar. Die Sinnhaftigkeit sei jedoch in Frage gestellt.&lt;br /&gt;
&lt;br /&gt;
==== Command und Entrypoint ====&lt;br /&gt;
Im Regelfall soll ein Container auch eine Applikation ausführen, ansonsten wird dieser direkt nach dem Starten gestoppt.&lt;br /&gt;
&lt;br /&gt;
Hierfür gibt es zwei verschiedene Möglichkeiten:&lt;br /&gt;
* &#039;&#039;&#039;CMD&#039;&#039;&#039;&lt;br /&gt;
** Kann durch {{BSL|docker run [container] [new command]}} ersetzt werden&lt;br /&gt;
** Kann in abgeleitetem Image durch {{BSL|ENTRYPOINT}} oder {{BSL|CMD}} ersetzt werden&lt;br /&gt;
* &#039;&#039;&#039;ENTRYPOINT&#039;&#039;&#039;&lt;br /&gt;
** Es können über {{BSL|docker run [container] [new command]}} Parameter für den Entrypoint hinzugefügt werden&lt;br /&gt;
** Kann in abgeleitetem Image ersetzt werden, dies scheint aber keine &#039;&#039;&#039;best practice&#039;&#039;&#039; zu sein&lt;br /&gt;
&lt;br /&gt;
 Mittels Entrypoint kann sichergestellt werden, dass eine gewisse Applikation gestartet wird, in jedem Fall.&lt;br /&gt;
&lt;br /&gt;
Der Entrypoint kann in einem abgeleiteten Image ebenfalls ersetzt werden. Die Vorgehensweise ist aber etwas sonderbar:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
ENTRYPOINT [&amp;quot;/usr/bin/env&amp;quot;]&lt;br /&gt;
CMD [&amp;quot;...&amp;quot;]&lt;br /&gt;
}}&amp;lt;ref&amp;gt;https://stackoverflow.com/questions/41207522/docker-override-or-remove-entrypoint-from-a-base-image&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dockerfile - CMD&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
FROM ubuntu:22.04&lt;br /&gt;
CMD [&amp;quot;ls&amp;quot;, &amp;quot;-l&amp;quot;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker build . -t image_basics_1:1.0&lt;br /&gt;
# CMD des Dockerfiles verwenden&lt;br /&gt;
docker run --rm image_basics_1:1.0&lt;br /&gt;
# CMD des Dockerfiles überschreiben&lt;br /&gt;
docker run --rm image_basics_1:1.0 echo hallo&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dockerfile - ENTRYPOINT&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
FROM ubuntu:22.04&lt;br /&gt;
ENTRYPOINT [&amp;quot;ls&amp;quot;, &amp;quot;-l&amp;quot;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker build . -t image_basics_2:1.0&lt;br /&gt;
# ENTRYPOINT des Dockerfiles verwenden&lt;br /&gt;
docker run --rm image_basics_2:1.0&lt;br /&gt;
# ENTRYPOINT des Dockerfiles ergänzen&lt;br /&gt;
docker run --rm image_basics_2:1.0 -a&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Weitere Befehle ====&lt;br /&gt;
* &#039;&#039;&#039;RUN&#039;&#039;&#039; - Befehl ausführen&lt;br /&gt;
* &#039;&#039;&#039;COPY&#039;&#039;&#039; - Dateien/Ordner vom Host kopieren&lt;br /&gt;
* &#039;&#039;&#039;WORKDIR&#039;&#039;&#039; - Das Arbeitsverzeichnis wechseln&lt;br /&gt;
* &#039;&#039;&#039;USER&#039;&#039;&#039; - Benutzer wechseln (dieser muss über useradd erstellt werden)&lt;br /&gt;
* &#039;&#039;&#039;EXPOSE&#039;&#039;&#039; - Exponierten Port festlegen, siehe {{BSL|docker run -p [Portnummer]}}, der Sinn erschließt sich mir nicht&lt;br /&gt;
* &#039;&#039;&#039;ARG&#039;&#039;&#039; - Umgebungsvariable nur gültig während des Build Prozesses&amp;lt;ref name=&amp;quot;docker_arg_and_env&amp;quot;&amp;gt;https://vsupalov.com/docker-arg-env-variable-guide/&amp;lt;/ref&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;ENV&#039;&#039;&#039; - Umgebungsvariable gültig während des Build Prozesses und zur Laufzeit&amp;lt;ref name=&amp;quot;docker_arg_and_env&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 1) Bestehende Anwendung ===&lt;br /&gt;
Im folgenden soll aus einer bestehenden Anwendung ein Image erstellt werden. Es handelt sich um eine &#039;&#039;&#039;node.js&#039;&#039;&#039; &#039;&#039;&#039;Express&#039;&#039;&#039; Client/Server Webanwendung.&lt;br /&gt;
* Der &#039;&#039;&#039;Port&#039;&#039;&#039; soll während der Buildprozesses und beim Starten konfigurierbar sein&lt;br /&gt;
** &#039;&#039;Standard: 10000&#039;&#039;&lt;br /&gt;
* Das &#039;&#039;&#039;Loglevel&#039;&#039;&#039; soll während der Buildprozesses und beim Starten konfigurierbar sein&lt;br /&gt;
** &#039;&#039;Standard: console&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
 Der Datenbankordner in der gebauten Anwendung kann gemounted werden und findet sich unter {{BSL|dist/database/}}&lt;br /&gt;
&lt;br /&gt;
Das Repository der Anwendung findet sich [https://gitlab.drlue.at/dockerschulung/demoapp.git hier]&amp;lt;ref&amp;gt;https://gitlab.drlue.at/dockerschulung/demoapp.git&amp;lt;/ref&amp;gt; und kann geklont werden.&lt;br /&gt;
&lt;br /&gt;
==== Dockerfile ====&lt;br /&gt;
Inhalt in Datei &#039;&#039;&#039;Dockerfile&#039;&#039;&#039;, [[Docker_2024_04/Containers#Beispiel_5):_Node_Webserver|teilweise von hier]]&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Baseimage&lt;br /&gt;
FROM ubuntu:22.04&lt;br /&gt;
#Don&#039;t ask questions apt&lt;br /&gt;
ARG DEBIAN_FRONTEND=noninteractive&lt;br /&gt;
#Update apt&lt;br /&gt;
RUN apt-get update&lt;br /&gt;
#Install curl&lt;br /&gt;
RUN apt-get -y install curl&lt;br /&gt;
#Add new nodejs version to apt repository&lt;br /&gt;
RUN curl -sL https://deb.nodesource.com/setup_lts.x {{!}} bash -&lt;br /&gt;
#Update apt again&lt;br /&gt;
RUN apt-get update&lt;br /&gt;
#Install nodejs&lt;br /&gt;
RUN apt-get -y install nodejs&lt;br /&gt;
#Copy application to image&lt;br /&gt;
COPY demoapp /app&lt;br /&gt;
#Change directory&lt;br /&gt;
WORKDIR /app&lt;br /&gt;
#Build application&lt;br /&gt;
RUN npm install&lt;br /&gt;
RUN npm run build&lt;br /&gt;
&lt;br /&gt;
#Arguments with default values (can be configured when building: --build-arg PORT=[0-9]* --build-arg JET_LOGGER_MODE=[off{{!}}console{{!}}file{{!}}custom]&lt;br /&gt;
ARG PORT=10000&lt;br /&gt;
ARG JET_LOGGER_MODE=console&lt;br /&gt;
&lt;br /&gt;
#Environment (can be overwritten when starting the image: -e PORT=[0-9]* -e JET_LOGGER_MODE=[off{{!}}console{{!}}file{{!}}custom]&lt;br /&gt;
ENV PORT=${PORT}&lt;br /&gt;
ENV JET_LOGGER_MODE=${JET_LOGGER_MODE}&lt;br /&gt;
CMD [&amp;quot;npm&amp;quot;, &amp;quot;start&amp;quot;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Image erstellen ====&lt;br /&gt;
Ohne Build Argumente&lt;br /&gt;
{{BML|code=docker build . -t image_example1:1.0}}&lt;br /&gt;
Mit Build Argumenten&lt;br /&gt;
{{BML|code=docker build --build-arg PORT=80 --build-arg LOGGER=off. -t image_example1:1.0}}&lt;br /&gt;
&lt;br /&gt;
==== Using Image ====&lt;br /&gt;
Ohne Umgebungsvariablen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Starten&lt;br /&gt;
docker run --rm --name example_app -d -p 9000:10000 image_example1:1.0&lt;br /&gt;
#Logs folgen&lt;br /&gt;
docker logs -f example_app&lt;br /&gt;
#Stoppen&lt;br /&gt;
docker container stop example_app&lt;br /&gt;
}}&lt;br /&gt;
Mit Umgebungsvariablen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Starten&lt;br /&gt;
docker run --rm --name example_app -e PORT=15000 -e JET_LOGGER_MODE=off -d -p 80:15000 image_example1:1.0&lt;br /&gt;
#Logs folgen&lt;br /&gt;
docker logs -f example_app&lt;br /&gt;
#Stoppen&lt;br /&gt;
docker container stop example_app&lt;br /&gt;
}}&lt;br /&gt;
Persistieren der Datenbank&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Volume erstellen&lt;br /&gt;
docker volume create example_app_data&lt;br /&gt;
#Starten&lt;br /&gt;
docker run --rm --name example_app -v example_app_data:/app/dist/database/ -d -p 80:10000 image_example1:1.0&lt;br /&gt;
#Daten modifizieren&lt;br /&gt;
...&lt;br /&gt;
#Container stoppen&lt;br /&gt;
docker container stop example_app&lt;br /&gt;
#Container starten&lt;br /&gt;
docker container start example_app&lt;br /&gt;
#Daten sind da&lt;br /&gt;
...&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Networking&amp;diff=3543</id>
		<title>Docker 2024 04/Networking</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Networking&amp;diff=3543"/>
		<updated>2024-04-19T05:39:09Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Beispiel 3): Container Communication Explizit Network */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Folgendes soll einen Grundlegenden Überblick über das Container Networking bieten.&lt;br /&gt;
&lt;br /&gt;
=== Netzwerk Treiber ===&lt;br /&gt;
Docker verwendet für die Netzwerkkommunikation Treiber. Folgende Treiber sind standardmäßig Verfügbar. Im folgenden werden wir uns auf die Netzwerktypen &#039;&#039;&#039;Host&#039;&#039;&#039; und &#039;&#039;&#039;Bridge&#039;&#039;&#039; beschränken.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;bridge:&#039;&#039;&#039; The default network driver. If you don&#039;t specify a driver, this is the type of network you are creating. Bridge networks are commonly used when your application runs in a container that needs to communicate with other containers on the same host.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;host:&#039;&#039;&#039; Remove network isolation between the container and the Docker host, and use the host&#039;s networking directly.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;overlay:&#039;&#039;&#039; Overlay networks connect multiple Docker daemons together and enable Swarm services and containers to communicate across nodes. This strategy removes the need to do OS-level routing.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;ipvlan:&#039;&#039;&#039; IPvlan networks give users total control over both IPv4 and IPv6 addressing. The VLAN driver builds on top of that in giving operators complete control of layer 2 VLAN tagging and even IPvlan L3 routing for users interested in underlay network integration.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;macvlan:&#039;&#039;&#039; Macvlan networks allow you to assign a MAC address to a container, making it appear as a physical device on your network. The Docker daemon routes traffic to containers by their MAC addresses. Using the macvlan driver is sometimes the best choice when dealing with legacy applications that expect to be directly connected to the physical network, rather than routed through the Docker host&#039;s network stack.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;none:&#039;&#039;&#039; Completely isolate a container from the host and other containers. none is not available for Swarm services.&lt;br /&gt;
&amp;lt;ref&amp;gt;https://docs.docker.com/network/drivers/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 1): Default Bridge ===&lt;br /&gt;
Wird ein Container über {{BSL|docker run}} ohne weitere Netzwerkkonfiguration gestartet, so verwendet dieser den &#039;&#039;&#039;bridge&#039;&#039;&#039; Netzwerktreiber.&lt;br /&gt;
&lt;br /&gt;
Dies kann anhand von folgendem Beispiel nachvollzogen werden:&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Starten eines Containers&lt;br /&gt;
docker run --name ubuntu -it --rm -d ubuntu:22.04 bash&lt;br /&gt;
#Inspizieren des Containers&lt;br /&gt;
docker inspect ubuntu&lt;br /&gt;
...&lt;br /&gt;
                    &amp;quot;NetworkID&amp;quot;: &amp;quot;026a89529e7e830967b50e7b79099229815bb1e0de6363d47f0e779873e27c70&amp;quot;,&lt;br /&gt;
...&lt;br /&gt;
#Auflisten der Docker Netzwerke&lt;br /&gt;
docker network ls&lt;br /&gt;
NETWORK ID     NAME              DRIVER    SCOPE&lt;br /&gt;
...&lt;br /&gt;
026a89529e7e   bridge            bridge    local&lt;br /&gt;
...&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Anhand der &#039;&#039;&#039;NetworkID&#039;&#039;&#039; kann nachvollzogen werden, dass der neu gestartete Container das Netzwerk mit dem Namen &#039;&#039;&#039;bridge&#039;&#039;&#039; verwendet. Hierbei handelt es sich um das &#039;&#039;&#039;default&#039;&#039;&#039; Bridge Netzwerk.&lt;br /&gt;
&lt;br /&gt;
 Daraus resultiert, dass alle Container die mit {{BSL|docker run}} ohne expliziten Netzwerk Parameter Teil dieses Netzwerks sind. Diese können auch untereinander miteinander kommunizieren.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 2): Container Communication ===&lt;br /&gt;
Im folgenden wird das vorhergehende [[Docker_2024_04/Containers#Beispiel_5):_Node_Webserver|Beispiel]] um diverse Netzwerktools erweitert.&lt;br /&gt;
==== Dockerfile ====&lt;br /&gt;
Inhalt in Datei &#039;&#039;&#039;Dockerfile&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Baseimage&lt;br /&gt;
FROM example5:1.0&lt;br /&gt;
RUN apt-get update&lt;br /&gt;
RUN apt-get install -y curl inetutils-ping iproute2&lt;br /&gt;
#Standard Webseite erstellen&lt;br /&gt;
RUN mkdir -p /var/www&lt;br /&gt;
RUN echo &amp;quot;&amp;lt;html&amp;gt;&amp;lt;h1&amp;gt;Welcome&amp;lt;/h1&amp;gt;&amp;lt;/html&amp;gt;&amp;quot; &amp;gt; /var/www/index.html&lt;br /&gt;
#Der Entrypoint aus dem Baseimage wird verwendet&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Image erstellen ====&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker build . -t networking_example2:1.0&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Container starten ====&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Container mit Hostname A&lt;br /&gt;
docker run --name networkingA --hostname A --rm -d networking_example2:1.0&lt;br /&gt;
#Container mit Hostname B&lt;br /&gt;
docker run --name networkingB --hostname B --rm -d networking_example2:1.0&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Bash in Container starten ====&lt;br /&gt;
&#039;&#039;&#039;Terminal 1 - Networking A&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Bash starten&lt;br /&gt;
docker exec -it networkingA bash&lt;br /&gt;
#IP Adresse des Containers ermitteln&lt;br /&gt;
ip addr&lt;br /&gt;
...&lt;br /&gt;
77: eth0@if78: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc noqueue state UP group default &lt;br /&gt;
    link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0&lt;br /&gt;
    inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0&lt;br /&gt;
...&lt;br /&gt;
#Container B ist erreichbar&lt;br /&gt;
ping 172.17.0.5&lt;br /&gt;
#Webseite von Container B abrufen&lt;br /&gt;
curl 172.17.0.5&lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;h1&amp;gt;Welcome&amp;lt;/h1&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
#Namensauflösung&lt;br /&gt;
ping B&lt;br /&gt;
ping: unknown host&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Terminal 2 - Terminal B&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Bash starten&lt;br /&gt;
docker exec -it networkingB bash&lt;br /&gt;
#IP Adresse des Containers ermitteln&lt;br /&gt;
ip addr&lt;br /&gt;
...&lt;br /&gt;
79: eth0@if80: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc noqueue state UP group default &lt;br /&gt;
    link/ether 02:42:ac:11:00:05 brd ff:ff:ff:ff:ff:ff link-netnsid 0&lt;br /&gt;
    inet 172.17.0.5/16 brd 172.17.255.255 scope global eth0&lt;br /&gt;
...&lt;br /&gt;
#Container A ist erreichbar&lt;br /&gt;
ping 172.17.0.4&lt;br /&gt;
#Webseite von Container A abrufen&lt;br /&gt;
curl 172.17.0.4&lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;h1&amp;gt;Welcome&amp;lt;/h1&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
#Namensauflösung&lt;br /&gt;
ping A&lt;br /&gt;
ping: unknown host&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Die DNS Auflösung über &#039;&#039;&#039;Docker DNS&#039;&#039;&#039; funktioniert &#039;&#039;&#039;NICHT&#039;&#039;&#039; im default Bridge Netzwerk.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 3): Container Kommunikation ===&lt;br /&gt;
Im folgenden wird ein Docker Bridge Netzwerk erstellt.&lt;br /&gt;
&lt;br /&gt;
==== Bridge Netzwerk erstellen ====&lt;br /&gt;
{{BSL|docker network create network_example2}}&lt;br /&gt;
&lt;br /&gt;
==== Container starten ====&lt;br /&gt;
Verwenden des Netzwerks:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Container mit Hostname A&lt;br /&gt;
docker run --name networkingA --network network_example2 --hostname A --rm -d networking_example2:1.0&lt;br /&gt;
#Container mit Hostname B&lt;br /&gt;
docker run --name networkingB --network network_example2 --hostname B --rm -d networking_example2:1.0&lt;br /&gt;
#Container mit Hostname C, als Veranschaulichung der Container Isolierung, verwendet default Bridge&lt;br /&gt;
docker run --name networkingC --hostname C --rm -d networking_example2:1.0&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Bash in Container starten ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 1 - Networking A&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Bash starten&lt;br /&gt;
docker exec -it networkingB bash&lt;br /&gt;
curl B&lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;h1&amp;gt;Welcome&amp;lt;/h1&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
#Namensauflösung&lt;br /&gt;
ping B&lt;br /&gt;
#IP ermitteln&lt;br /&gt;
ip addr&lt;br /&gt;
inet 172.21.0.2/16 brd 172.21.255.255 scope global eth0&lt;br /&gt;
#Keine Route zu C&lt;br /&gt;
ping 172.17.0.4&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 2 - Networking B&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Bash starten&lt;br /&gt;
docker exec -it networkingB bash&lt;br /&gt;
curl A&lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;h1&amp;gt;Welcome&amp;lt;/h1&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
#Namensauflösung&lt;br /&gt;
ping A&lt;br /&gt;
#IP ermitteln&lt;br /&gt;
ip addr&lt;br /&gt;
inet 172.21.0.3/16 brd 172.21.255.255 scope global eth0&lt;br /&gt;
#Keine Route zu C&lt;br /&gt;
ping 172.17.0.4&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 3 - Networking C&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Bash starten&lt;br /&gt;
docker exec -it networkingC bash&lt;br /&gt;
#IP ermitteln&lt;br /&gt;
ip addr&lt;br /&gt;
inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0&lt;br /&gt;
#Keine Route zu A oder B&lt;br /&gt;
ping 172.21.0.2&lt;br /&gt;
ping 172.21.0.3&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Wie zu sehen ist, ist der Container &#039;&#039;&#039;networkC&#039;&#039;&#039; von &#039;&#039;&#039;networkA&#039;&#039;&#039; und &#039;&#039;&#039;networkB&#039;&#039;&#039; isoliert.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 4): Komplexeres Beispiel ===&lt;br /&gt;
Als Annahme wird folgender Serviceverbund herangezogen:&lt;br /&gt;
# Reverseproxy&lt;br /&gt;
## Funktion: Übernimmt Caching und Verschlüsselung, nach außen Sichtbar, z.B.: nginx&lt;br /&gt;
## Kommunikation: Anwendung&lt;br /&gt;
# Anwendung&lt;br /&gt;
## Funktion: Liefert Webseite zurück und dient als API, z.B.: vuejs + express&lt;br /&gt;
## Kommunikation: Reverseproxy und Datenbank&lt;br /&gt;
# Datenbank&lt;br /&gt;
## Funktion: Liefert Daten für die Anwendung, z.B.: MySQL&lt;br /&gt;
## Kommunikation: Anwendung&lt;br /&gt;
&lt;br /&gt;
==== Netzwerke erstellen ====&lt;br /&gt;
Reverseproxy ---&amp;gt; Netzwerk tier1 &amp;lt;--- Anwendung ---&amp;gt; Netzwerk tier2 &amp;lt;--- Datenbank&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker network create tier1&lt;br /&gt;
docker network create tier2&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Container starten ====&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Reverseproxy&lt;br /&gt;
docker run --name reverseproxy --network tier1 --hostname reverseproxy --rm -d networking_example2:1.0&lt;br /&gt;
#App&lt;br /&gt;
docker run --name app --network tier1 --hostname app --rm -d networking_example2:1.0&lt;br /&gt;
#Netzwerk muss mit Container verbunden werden&lt;br /&gt;
docker network connect tier2 app&lt;br /&gt;
#Db&lt;br /&gt;
docker run --name db --network tier2 --hostname db --rm -d networking_example2:1.0&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 1 - Reverseproxy&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Bash starten&lt;br /&gt;
docker exec -it reverseproxy bash&lt;br /&gt;
#Erreichbarkeit&lt;br /&gt;
ping app #ok&lt;br /&gt;
ping db #not reachable&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 2 - Application&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Bash starten&lt;br /&gt;
docker exec -it app bash&lt;br /&gt;
#Erreichbarkeit&lt;br /&gt;
ping reverseproxy #ok&lt;br /&gt;
ping db #ok&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 3 - Database&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Bash starten&lt;br /&gt;
docker exec -it db bash&lt;br /&gt;
#Erreichbarkeit&lt;br /&gt;
ping reverseproxy #not ok&lt;br /&gt;
ping app #ok&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 5): Host Network ===&lt;br /&gt;
Beim Host Netzwerk entfällt die &#039;&#039;&#039;Netzwerkisolierung&#039;&#039;&#039;. dies kann für einen &#039;&#039;&#039;Loadbalancer&#039;&#039;&#039; oder &#039;&#039;&#039;Reverseproxy&#039;&#039;&#039; Sinn machen und die Konfiguration erleichtern.&lt;br /&gt;
&lt;br /&gt;
Ein gutes Beispiel stellt ein Reverseproxy dar. Der Proxy leitet Daten an verschiedene jeweils voneinander (bezogen auf die Netzwerkebene) isolierte Container weiter, welche jeweils einen anderen Port exponieren.&lt;br /&gt;
Wird ein Bridge Network für den Proxy verwendet, so muss jeder entsprechende Container teil dieses Netzwerks sein. Somit können auch alle Container untereinander kommunizieren, was unter Umständen nicht gewünscht ist. Dies würde sich dann so verhalten wie beim &#039;&#039;&#039;default&#039;&#039;&#039; &#039;&#039;&#039;Bridge&#039;&#039;&#039; Netzwerk.&lt;br /&gt;
&lt;br /&gt;
Bei Verwendung des &#039;&#039;&#039;Host Netzwerks&#039;&#039;&#039;, muss jeder Container lediglich den entsprechenden Port zum Host exponieren. Der Reverseproxy kann somit automatisch die Daten an die Ports weiterleiten.&lt;br /&gt;
&lt;br /&gt;
==== Container starten ====&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Der Host Parameter kann weggelassen werden, dieser wird vom Host übernommen&lt;br /&gt;
#Etwaige Port Weiterleitungen entfallen, bzw. werden nicht berücksichtigt&lt;br /&gt;
docker run --name networkingHost --network host --rm -d networking_example2:1.0&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Prüfen der Verbindung ====&lt;br /&gt;
{{BML|code=&lt;br /&gt;
curl http://localhost:5000&lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;h1&amp;gt;Welcome&amp;lt;/h1&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Networking&amp;diff=3542</id>
		<title>Docker 2024 04/Networking</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Networking&amp;diff=3542"/>
		<updated>2024-04-19T05:38:26Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Container Bash starten */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Folgendes soll einen Grundlegenden Überblick über das Container Networking bieten.&lt;br /&gt;
&lt;br /&gt;
=== Netzwerk Treiber ===&lt;br /&gt;
Docker verwendet für die Netzwerkkommunikation Treiber. Folgende Treiber sind standardmäßig Verfügbar. Im folgenden werden wir uns auf die Netzwerktypen &#039;&#039;&#039;Host&#039;&#039;&#039; und &#039;&#039;&#039;Bridge&#039;&#039;&#039; beschränken.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;bridge:&#039;&#039;&#039; The default network driver. If you don&#039;t specify a driver, this is the type of network you are creating. Bridge networks are commonly used when your application runs in a container that needs to communicate with other containers on the same host.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;host:&#039;&#039;&#039; Remove network isolation between the container and the Docker host, and use the host&#039;s networking directly.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;overlay:&#039;&#039;&#039; Overlay networks connect multiple Docker daemons together and enable Swarm services and containers to communicate across nodes. This strategy removes the need to do OS-level routing.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;ipvlan:&#039;&#039;&#039; IPvlan networks give users total control over both IPv4 and IPv6 addressing. The VLAN driver builds on top of that in giving operators complete control of layer 2 VLAN tagging and even IPvlan L3 routing for users interested in underlay network integration.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;macvlan:&#039;&#039;&#039; Macvlan networks allow you to assign a MAC address to a container, making it appear as a physical device on your network. The Docker daemon routes traffic to containers by their MAC addresses. Using the macvlan driver is sometimes the best choice when dealing with legacy applications that expect to be directly connected to the physical network, rather than routed through the Docker host&#039;s network stack.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;none:&#039;&#039;&#039; Completely isolate a container from the host and other containers. none is not available for Swarm services.&lt;br /&gt;
&amp;lt;ref&amp;gt;https://docs.docker.com/network/drivers/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 1): Default Bridge ===&lt;br /&gt;
Wird ein Container über {{BSL|docker run}} ohne weitere Netzwerkkonfiguration gestartet, so verwendet dieser den &#039;&#039;&#039;bridge&#039;&#039;&#039; Netzwerktreiber.&lt;br /&gt;
&lt;br /&gt;
Dies kann anhand von folgendem Beispiel nachvollzogen werden:&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Starten eines Containers&lt;br /&gt;
docker run --name ubuntu -it --rm -d ubuntu:22.04 bash&lt;br /&gt;
#Inspizieren des Containers&lt;br /&gt;
docker inspect ubuntu&lt;br /&gt;
...&lt;br /&gt;
                    &amp;quot;NetworkID&amp;quot;: &amp;quot;026a89529e7e830967b50e7b79099229815bb1e0de6363d47f0e779873e27c70&amp;quot;,&lt;br /&gt;
...&lt;br /&gt;
#Auflisten der Docker Netzwerke&lt;br /&gt;
docker network ls&lt;br /&gt;
NETWORK ID     NAME              DRIVER    SCOPE&lt;br /&gt;
...&lt;br /&gt;
026a89529e7e   bridge            bridge    local&lt;br /&gt;
...&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Anhand der &#039;&#039;&#039;NetworkID&#039;&#039;&#039; kann nachvollzogen werden, dass der neu gestartete Container das Netzwerk mit dem Namen &#039;&#039;&#039;bridge&#039;&#039;&#039; verwendet. Hierbei handelt es sich um das &#039;&#039;&#039;default&#039;&#039;&#039; Bridge Netzwerk.&lt;br /&gt;
&lt;br /&gt;
 Daraus resultiert, dass alle Container die mit {{BSL|docker run}} ohne expliziten Netzwerk Parameter Teil dieses Netzwerks sind. Diese können auch untereinander miteinander kommunizieren.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 2): Container Communication ===&lt;br /&gt;
Im folgenden wird das vorhergehende [[Docker_2024_04/Containers#Beispiel_5):_Node_Webserver|Beispiel]] um diverse Netzwerktools erweitert.&lt;br /&gt;
==== Dockerfile ====&lt;br /&gt;
Inhalt in Datei &#039;&#039;&#039;Dockerfile&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Baseimage&lt;br /&gt;
FROM example5:1.0&lt;br /&gt;
RUN apt-get update&lt;br /&gt;
RUN apt-get install -y curl inetutils-ping iproute2&lt;br /&gt;
#Standard Webseite erstellen&lt;br /&gt;
RUN mkdir -p /var/www&lt;br /&gt;
RUN echo &amp;quot;&amp;lt;html&amp;gt;&amp;lt;h1&amp;gt;Welcome&amp;lt;/h1&amp;gt;&amp;lt;/html&amp;gt;&amp;quot; &amp;gt; /var/www/index.html&lt;br /&gt;
#Der Entrypoint aus dem Baseimage wird verwendet&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Image erstellen ====&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker build . -t networking_example2:1.0&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Container starten ====&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Container mit Hostname A&lt;br /&gt;
docker run --name networkingA --hostname A --rm -d networking_example2:1.0&lt;br /&gt;
#Container mit Hostname B&lt;br /&gt;
docker run --name networkingB --hostname B --rm -d networking_example2:1.0&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Bash in Container starten ====&lt;br /&gt;
&#039;&#039;&#039;Terminal 1 - Networking A&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Bash starten&lt;br /&gt;
docker exec -it networkingA bash&lt;br /&gt;
#IP Adresse des Containers ermitteln&lt;br /&gt;
ip addr&lt;br /&gt;
...&lt;br /&gt;
77: eth0@if78: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc noqueue state UP group default &lt;br /&gt;
    link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0&lt;br /&gt;
    inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0&lt;br /&gt;
...&lt;br /&gt;
#Container B ist erreichbar&lt;br /&gt;
ping 172.17.0.5&lt;br /&gt;
#Webseite von Container B abrufen&lt;br /&gt;
curl 172.17.0.5&lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;h1&amp;gt;Welcome&amp;lt;/h1&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
#Namensauflösung&lt;br /&gt;
ping B&lt;br /&gt;
ping: unknown host&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;Terminal 2 - Terminal B&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Bash starten&lt;br /&gt;
docker exec -it networkingB bash&lt;br /&gt;
#IP Adresse des Containers ermitteln&lt;br /&gt;
ip addr&lt;br /&gt;
...&lt;br /&gt;
79: eth0@if80: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc noqueue state UP group default &lt;br /&gt;
    link/ether 02:42:ac:11:00:05 brd ff:ff:ff:ff:ff:ff link-netnsid 0&lt;br /&gt;
    inet 172.17.0.5/16 brd 172.17.255.255 scope global eth0&lt;br /&gt;
...&lt;br /&gt;
#Container A ist erreichbar&lt;br /&gt;
ping 172.17.0.4&lt;br /&gt;
#Webseite von Container A abrufen&lt;br /&gt;
curl 172.17.0.4&lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;h1&amp;gt;Welcome&amp;lt;/h1&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
#Namensauflösung&lt;br /&gt;
ping A&lt;br /&gt;
ping: unknown host&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Die DNS Auflösung über &#039;&#039;&#039;Docker DNS&#039;&#039;&#039; funktioniert &#039;&#039;&#039;NICHT&#039;&#039;&#039; im default Bridge Netzwerk.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 3): Container Communication Explizit Network ===&lt;br /&gt;
Im folgenden wird ein Docker Bridge Netzwerk erstellt.&lt;br /&gt;
&lt;br /&gt;
==== Bridge Netzwerk erstellen ====&lt;br /&gt;
{{BSL|docker network create network_example2}}&lt;br /&gt;
&lt;br /&gt;
==== Container starten ====&lt;br /&gt;
Verwenden des Netzwerks:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Container mit Hostname A&lt;br /&gt;
docker run --name networkingA --network network_example2 --hostname A --rm -d networking_example2:1.0&lt;br /&gt;
#Container mit Hostname B&lt;br /&gt;
docker run --name networkingB --network network_example2 --hostname B --rm -d networking_example2:1.0&lt;br /&gt;
#Container mit Hostname C, als Veranschaulichung der Container Isolierung, verwendet default Bridge&lt;br /&gt;
docker run --name networkingC --hostname C --rm -d networking_example2:1.0&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Bash starten ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 1 - Networking A&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Bash starten&lt;br /&gt;
docker exec -it networkingB bash&lt;br /&gt;
curl B&lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;h1&amp;gt;Welcome&amp;lt;/h1&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
#Namensauflösung&lt;br /&gt;
ping B&lt;br /&gt;
#IP ermitteln&lt;br /&gt;
ip addr&lt;br /&gt;
inet 172.21.0.2/16 brd 172.21.255.255 scope global eth0&lt;br /&gt;
#Keine Route zu C&lt;br /&gt;
ping 172.17.0.4&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 2 - Networking B&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Bash starten&lt;br /&gt;
docker exec -it networkingB bash&lt;br /&gt;
curl A&lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;h1&amp;gt;Welcome&amp;lt;/h1&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
#Namensauflösung&lt;br /&gt;
ping A&lt;br /&gt;
#IP ermitteln&lt;br /&gt;
ip addr&lt;br /&gt;
inet 172.21.0.3/16 brd 172.21.255.255 scope global eth0&lt;br /&gt;
#Keine Route zu C&lt;br /&gt;
ping 172.17.0.4&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 3 - Networking C&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Bash starten&lt;br /&gt;
docker exec -it networkingC bash&lt;br /&gt;
#IP ermitteln&lt;br /&gt;
ip addr&lt;br /&gt;
inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0&lt;br /&gt;
#Keine Route zu A oder B&lt;br /&gt;
ping 172.21.0.2&lt;br /&gt;
ping 172.21.0.3&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Wie zu sehen ist, ist der Container &#039;&#039;&#039;networkC&#039;&#039;&#039; von &#039;&#039;&#039;networkA&#039;&#039;&#039; und &#039;&#039;&#039;networkB&#039;&#039;&#039; isoliert.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 4): Komplexeres Beispiel ===&lt;br /&gt;
Als Annahme wird folgender Serviceverbund herangezogen:&lt;br /&gt;
# Reverseproxy&lt;br /&gt;
## Funktion: Übernimmt Caching und Verschlüsselung, nach außen Sichtbar, z.B.: nginx&lt;br /&gt;
## Kommunikation: Anwendung&lt;br /&gt;
# Anwendung&lt;br /&gt;
## Funktion: Liefert Webseite zurück und dient als API, z.B.: vuejs + express&lt;br /&gt;
## Kommunikation: Reverseproxy und Datenbank&lt;br /&gt;
# Datenbank&lt;br /&gt;
## Funktion: Liefert Daten für die Anwendung, z.B.: MySQL&lt;br /&gt;
## Kommunikation: Anwendung&lt;br /&gt;
&lt;br /&gt;
==== Netzwerke erstellen ====&lt;br /&gt;
Reverseproxy ---&amp;gt; Netzwerk tier1 &amp;lt;--- Anwendung ---&amp;gt; Netzwerk tier2 &amp;lt;--- Datenbank&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker network create tier1&lt;br /&gt;
docker network create tier2&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Container starten ====&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Reverseproxy&lt;br /&gt;
docker run --name reverseproxy --network tier1 --hostname reverseproxy --rm -d networking_example2:1.0&lt;br /&gt;
#App&lt;br /&gt;
docker run --name app --network tier1 --hostname app --rm -d networking_example2:1.0&lt;br /&gt;
#Netzwerk muss mit Container verbunden werden&lt;br /&gt;
docker network connect tier2 app&lt;br /&gt;
#Db&lt;br /&gt;
docker run --name db --network tier2 --hostname db --rm -d networking_example2:1.0&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 1 - Reverseproxy&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Bash starten&lt;br /&gt;
docker exec -it reverseproxy bash&lt;br /&gt;
#Erreichbarkeit&lt;br /&gt;
ping app #ok&lt;br /&gt;
ping db #not reachable&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 2 - Application&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Bash starten&lt;br /&gt;
docker exec -it app bash&lt;br /&gt;
#Erreichbarkeit&lt;br /&gt;
ping reverseproxy #ok&lt;br /&gt;
ping db #ok&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Terminal 3 - Database&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Bash starten&lt;br /&gt;
docker exec -it db bash&lt;br /&gt;
#Erreichbarkeit&lt;br /&gt;
ping reverseproxy #not ok&lt;br /&gt;
ping app #ok&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 5): Host Network ===&lt;br /&gt;
Beim Host Netzwerk entfällt die &#039;&#039;&#039;Netzwerkisolierung&#039;&#039;&#039;. dies kann für einen &#039;&#039;&#039;Loadbalancer&#039;&#039;&#039; oder &#039;&#039;&#039;Reverseproxy&#039;&#039;&#039; Sinn machen und die Konfiguration erleichtern.&lt;br /&gt;
&lt;br /&gt;
Ein gutes Beispiel stellt ein Reverseproxy dar. Der Proxy leitet Daten an verschiedene jeweils voneinander (bezogen auf die Netzwerkebene) isolierte Container weiter, welche jeweils einen anderen Port exponieren.&lt;br /&gt;
Wird ein Bridge Network für den Proxy verwendet, so muss jeder entsprechende Container teil dieses Netzwerks sein. Somit können auch alle Container untereinander kommunizieren, was unter Umständen nicht gewünscht ist. Dies würde sich dann so verhalten wie beim &#039;&#039;&#039;default&#039;&#039;&#039; &#039;&#039;&#039;Bridge&#039;&#039;&#039; Netzwerk.&lt;br /&gt;
&lt;br /&gt;
Bei Verwendung des &#039;&#039;&#039;Host Netzwerks&#039;&#039;&#039;, muss jeder Container lediglich den entsprechenden Port zum Host exponieren. Der Reverseproxy kann somit automatisch die Daten an die Ports weiterleiten.&lt;br /&gt;
&lt;br /&gt;
==== Container starten ====&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Der Host Parameter kann weggelassen werden, dieser wird vom Host übernommen&lt;br /&gt;
#Etwaige Port Weiterleitungen entfallen, bzw. werden nicht berücksichtigt&lt;br /&gt;
docker run --name networkingHost --network host --rm -d networking_example2:1.0&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Prüfen der Verbindung ====&lt;br /&gt;
{{BML|code=&lt;br /&gt;
curl http://localhost:5000&lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;h1&amp;gt;Welcome&amp;lt;/h1&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Containers&amp;diff=3541</id>
		<title>Docker 2024 04/Containers</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Containers&amp;diff=3541"/>
		<updated>2024-04-19T05:37:28Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Beispiel 5): Node Webserver */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Folgendes soll einen grundlegendenden Überblick über das verwalten von Docker Containern bieten.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 1): Erster Container start ===&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker run --name ubuntu --rm -it ubuntu:22.04 bash&lt;br /&gt;
}}&lt;br /&gt;
Es öffnet sich nun ein Terminal im Container.&lt;br /&gt;
{{BML|code=&lt;br /&gt;
ps&lt;br /&gt;
}}&lt;br /&gt;
Zeigt sehr anschaulich die Prozessisolierung.&lt;br /&gt;
{{BML|code=&lt;br /&gt;
    PID TTY          TIME CMD&lt;br /&gt;
      1 pts/0    00:00:00 bash&lt;br /&gt;
      9 pts/0    00:00:00 ps&lt;br /&gt;
}}&lt;br /&gt;
Wird das ausgeführte Programm, in diesem Fall {{BSL|bash}} mit {{BSL|exit}} geschlossen, so wird auch der Container beendet und durch den Parameter {{BSL|--rm}} auch entfernt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parameter&#039;&#039;&#039;&lt;br /&gt;
* {{BSL|docker run}}&lt;br /&gt;
** Startet Container&lt;br /&gt;
* {{BSL|--name ubuntu}}&lt;br /&gt;
** Legt den Container Name fest, ansonsten wird ein sonderbarer Name generiert&lt;br /&gt;
* {{BSL|--rm}}&lt;br /&gt;
** Löscht den Container nach dem dieser geschlossen wird. Ansonsten bleibt dieser erhalten (im Status Exited)&lt;br /&gt;
* {{BSL|-it}}&lt;br /&gt;
** Standard Input offen halten und Pseudo TTY erstellen (Terminal)&lt;br /&gt;
* {{BSL|ubuntu:22.04}}&lt;br /&gt;
** Name des Images das gestartet werden soll&lt;br /&gt;
* {{BSL|bash}}&lt;br /&gt;
** Kommando das ausgeführt werden soll&lt;br /&gt;
&lt;br /&gt;
=== Wichtige Befehle ===&lt;br /&gt;
Zu folgenden Befehlen sei angemerkt, dass diese alle den Parameter {{BSL|--help}} unterstützen. Die Liste ist in keinster Weise vollständig {{BSL|docker --help}}.&lt;br /&gt;
* {{BSL|docker run}}&lt;br /&gt;
** Container erstellen&lt;br /&gt;
* {{BSL|docker start}}&lt;br /&gt;
** Gestoppten Container starten&lt;br /&gt;
* {{BSL|docker exec}}&lt;br /&gt;
** Befehl in Container ausführen&lt;br /&gt;
* {{BSL|docker cp}}&lt;br /&gt;
** Dateien in einen, oder von einem Container kopieren&lt;br /&gt;
* {{BSL|docker image}}&lt;br /&gt;
** Verwalten von Images&lt;br /&gt;
* {{BSL|docker volume}}&lt;br /&gt;
** Verwalten von Volumes&lt;br /&gt;
* {{BSL|docker ps}}&lt;br /&gt;
** Anzeigen von Containern&lt;br /&gt;
* {{BSL|docker stats}}&lt;br /&gt;
** Statistiken zu Containern anzeigen&lt;br /&gt;
* {{BSL|docker container}}&lt;br /&gt;
** Verwalten von Containern&lt;br /&gt;
* {{BSL|docker network}}&lt;br /&gt;
** Verwalten von Netzwerken&lt;br /&gt;
* {{BSL|docker build}}&lt;br /&gt;
** Erstellen von images&lt;br /&gt;
* {{BSL|docker tag}}&lt;br /&gt;
** Neuen Image Tag mit Link auf bestehendes Image erstellen&lt;br /&gt;
* {{BSL|docker push}}&lt;br /&gt;
** Images in Registry hochladen&lt;br /&gt;
* {{BSL|docker pull}}&lt;br /&gt;
** Image aus Registry holen&lt;br /&gt;
* {{BSL|docker inspect}}&lt;br /&gt;
** Container Details inspizieren&lt;br /&gt;
* {{BSL|docker log}}&lt;br /&gt;
** Container Ausgabe einsehen&lt;br /&gt;
* {{BSL|docker attach}}&lt;br /&gt;
** Mit Container verbinden&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 2): Mit Container verbinden ===&lt;br /&gt;
Starten des vorhergehenden Images im detached mode, {{BSL|-d}}. Der Befehl {{BSL|bash}} benötigt {{BSL|-it}}, da er sonst beendet wird wie auch der Container selbst.&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Starten&lt;br /&gt;
docker run --name ubuntu -it -d --rm ubuntu:22.04 bash&lt;br /&gt;
#Container anzeigen -a, auch gestoppte&lt;br /&gt;
docker ps -a&lt;br /&gt;
CONTAINER ID   IMAGE                 COMMAND                  CREATED         STATUS        PORTS                                                                                  NAMES&lt;br /&gt;
3d2986a44d6f   ubuntu:22.04          &amp;quot;bash&amp;quot;                   2 seconds ago   Up 1 second                                                                                          ubuntu&lt;br /&gt;
#Erneut mit Container verbinden&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
#Bash im Container schließen, beendet auch den Container&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
=== Beispiel 3): Befehl in Container ausführen ===&lt;br /&gt;
Starten des vorhergehenden Images im detached mode.&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Starten&lt;br /&gt;
docker run --name ubuntu -it -d --rm ubuntu:22.04 bash&lt;br /&gt;
#Befehl ausführen, listet alle Dateien im Arbeitsverzeichnis des Containers&lt;br /&gt;
docker exec ubuntu ls -la&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 4): Container starten/stoppen und entfernen ===&lt;br /&gt;
Starten des vorhergehenden Images im detached mode. {{BSL|--rm}} wird explizit weggelassen. Mit {{BSL|docker ps -a}} kann jeder Schritt geprüft werden. &lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Starten&lt;br /&gt;
docker run --name ubuntu -it -d ubuntu:22.04 bash&lt;br /&gt;
#Container stoppen&lt;br /&gt;
docker container stop ubuntu&lt;br /&gt;
#Container starten&lt;br /&gt;
docker container start ubuntu&lt;br /&gt;
#Container erneut stoppen&lt;br /&gt;
docker container stop ubuntu&lt;br /&gt;
#Container entfernen&lt;br /&gt;
docker container rm ubuntu&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 5): Node Webserver ===&lt;br /&gt;
==== Dockerfile ====&lt;br /&gt;
Inhalt in Datei &#039;&#039;&#039;Dockerfile&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Baseimage&lt;br /&gt;
FROM ubuntu:22.04&lt;br /&gt;
#Don&#039;t ask questions apt&lt;br /&gt;
ARG DEBIAN_FRONTEND=noninteractive&lt;br /&gt;
#Update apt&lt;br /&gt;
RUN apt-get update&lt;br /&gt;
#Install curl&lt;br /&gt;
RUN apt-get -y install curl&lt;br /&gt;
#Add new nodejs version to apt repository&lt;br /&gt;
RUN curl -sL https://deb.nodesource.com/setup_lts.x {{!}} bash -&lt;br /&gt;
#Update apt again&lt;br /&gt;
RUN apt-get update&lt;br /&gt;
#Install nodejs&lt;br /&gt;
RUN apt-get -y install nodejs&lt;br /&gt;
#Run the node js http-serve as entrypoint&lt;br /&gt;
ENTRYPOINT [&amp;quot;npx&amp;quot;, &amp;quot;http-serve&amp;quot;, &amp;quot;-p&amp;quot;, &amp;quot;5000&amp;quot;,&amp;quot;/var/www&amp;quot;]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Image erstellen ====&lt;br /&gt;
{{BSL|docker build . -t example5:1.0}}&lt;br /&gt;
==== Image verwenden ====&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Starten&lt;br /&gt;
docker run --rm --name example5 -d example5:1.0&lt;br /&gt;
#Logs des containers einsehen&lt;br /&gt;
docker logs example5&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Mount verwenden ====&lt;br /&gt;
Weder kann nun auf den Webserver zugegriffen werden, noch hat dieser Zugriff auf das Dateisystem. Im folgenden wird ein Portmapping und ein Ordner Mount verwendet.&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Starten&lt;br /&gt;
docker run --rm --name example5 -d -v ./http:/var/www -p 8000:5000 example5:1.0&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;-v ./http:/var/www&#039;&#039;&#039;&lt;br /&gt;
 Ordner mit dem relativen Pfad &#039;&#039;&#039;http&#039;&#039;&#039; wird in Container nach &#039;&#039;&#039;/var/www gemounted&#039;&#039;&#039;.&lt;br /&gt;
 Handelt es sich nicht um einen lokalen Ordner, so wird ein automatisch ein &#039;&#039;&#039;Named Volume&#039;&#039;&#039; erstellt.&lt;br /&gt;
 Es können &#039;&#039;beliebig&#039;&#039; viele Verzeichnisse oder Named Volumes gemounted werden.&lt;br /&gt;
 &lt;br /&gt;
 &#039;&#039;&#039;-p 8000:5000&#039;&#039;&#039;&lt;br /&gt;
 Für den Container wird ein virtuelles Netzwerkdevice erstellt (bzw. das default Bridge Netzwerk verwendet). Über das Portmapping wird der Port 8000 des Hostbestriebssystem auf den Port 5000 des Containers gemapped.&lt;br /&gt;
&lt;br /&gt;
Nun kann über http://localhost:8000 auf den Webserver zugegriffen werden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 5.1): Node Webserver using Named Volume ===&lt;br /&gt;
Im folgenden soll anstatt eines Ordners ein &#039;&#039;&#039;Named Volume&#039;&#039;&#039; verwendet werden. Diese dienen ebenfalls als persistenter Speicher für Container.&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Starten&lt;br /&gt;
docker run --rm --name example5.1 -d -v www:/var/www -p 8000:5000 example5:1.0&lt;br /&gt;
#Dateien oder Ordner in das Volume kopieren&lt;br /&gt;
docker cp index.html example5.1:/var/www&lt;br /&gt;
#Dateien oder Ordner aus dem Volume kopieren&lt;br /&gt;
docker cp example5.1:/var/www .&lt;br /&gt;
#Container beenden&lt;br /&gt;
docker container stop example5.1&lt;br /&gt;
#Das Volume bleibt bestehen&lt;br /&gt;
docker volume ls&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3540</id>
		<title>Docker 2024 04</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3540"/>
		<updated>2024-04-18T13:42:30Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Schulung Docker 2024/04 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Schulung Docker 2024/04 =&lt;br /&gt;
In der folgenden Schulung soll ein grundlegendes Verständnis für die Containerisierung erworben werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Teilnehmer_innen sollen nach der Schulung in der Lage sein&#039;&#039;&#039;&lt;br /&gt;
* die Begriffe Virtualisierung und Containerisierung zu unterscheiden&lt;br /&gt;
* bestehende Docker Images ausführen&lt;br /&gt;
* eigene Docker Images zu erstellen und diese mittels {{BSL|docker run}} und {{BSL|docker compose}} zu starten&lt;br /&gt;
* die bereitgestellten Ressourcen für Arbeitsspeicher, CPU Zeit und Disk IO zu modifizieren&lt;br /&gt;
* die Einsatzzwecke der verschiedenen Networking Modelle (insbesondere Bridge und Host Network) zu unterscheiden und diese anwenden können&lt;br /&gt;
* das Dateisystem und Volumes einbinden und verwalten&lt;br /&gt;
* eine eigene Image Registry zu erstellen und dort Images ablegen und abrufen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welche Bereiche werden explizit ausgeklammert:&#039;&#039;&#039;&lt;br /&gt;
* Limitierung von Netzwerkresourcen ([https://man7.org/linux/man-pages/man8/tc.8.html siehe tc])&lt;br /&gt;
* Limitierung von Speicherplatz ([https://de.wikipedia.org/wiki/XFS_(Dateisystem) siehe XFS])&lt;br /&gt;
&lt;br /&gt;
[[Datei:Dockerschulung 2024 04.odp|mini|Einführungspräsentation]]&lt;br /&gt;
&lt;br /&gt;
== Virtualisierung vs Containerisierung ==&lt;br /&gt;
&lt;br /&gt;
Beide Varianten bieten die Möglichkeit Applikationen isoliert von anderen Prozessen auszuführen. Im Gegensatz zur Containerisierung wird bei der Virtualisierung ein komplettes Betriebssystem mit entsprechenden Anwendungen gestartet.&lt;br /&gt;
&lt;br /&gt;
=== Gründe für Virtualisierung und Containerisierung ===&lt;br /&gt;
Programme können lokal, oder auf Servern installiert werden. Hierfür benötigt es keine der beiden Technologien.&lt;br /&gt;
Folgende Gründe sprechen jedoch für die Verwendung dieser Technologien:&lt;br /&gt;
 &#039;&#039;&#039;Teilen von Hardware Ressourcen&#039;&#039;&#039;&lt;br /&gt;
 Virtualisierung bietet die Möglichkeit physische Hardware auf mehrere Betriebssysteme zu verteilen.&lt;br /&gt;
 Containerisierung bietet die Möglichkeit physische Hardware auf mehrere Applikationen zu verteilen.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Isolation&#039;&#039;&#039;&lt;br /&gt;
 Fehlerhafte Anwendungen oder Sicherheitslücken wirken sich nicht auf das gesamte System aus.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Übertragbarkeit&#039;&#039;&#039;&lt;br /&gt;
 Ein weiterer Vorteil der Virtualisierung bzw. Containerisierung ist die in sich abgeschlossene und übertragbare Umgebung. Eine gekapselte Anwendung kann so auf nahezu jedem System ausgeführt werden. Die Abhängigkeiten beschränken sich hierbei auf ein Minimum.&lt;br /&gt;
&lt;br /&gt;
=== Virtualisierung ===&lt;br /&gt;
Bei der Virtualisierung übernimmt der &#039;&#039;&#039;Hypervisor&#039;&#039;&#039; das erstellen, starten und das Zuteilen der Hardwareressourcen des Hosts an die virtualisierten Gast Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
 Ein Hypervisor ist eine Software, die virtuelle Maschinen (VMs) erstellt und ausführt. Ein Hypervisor, manchmal auch Virtual Machine Monitor (VMM) genannt, isoliert das Hypervisor-Betriebssystem und die Ressourcen von den virtuellen Maschinen und ermöglicht die Erstellung und Verwaltung dieser VMs.&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hypervisoren können in verschiedene Typen eingeteilt werden:&lt;br /&gt;
* &#039;&#039;&#039;Typ 1&#039;&#039;&#039;, Läuft direkt auf der Hardware (z.B.: KVM, Microsoft Hyper-V und VMware vSphere)&lt;br /&gt;
* &#039;&#039;&#039;Typ 2&#039;&#039;&#039;, Läuft auf einem Host Betriebssystem (z.B.: VMware Workstation und Oracle VirtualBox)&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Virtual-Machines.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Containerisierung ===&lt;br /&gt;
 Unter Containerisierung versteht man das Zusammenfassen von Softwarecode mit den für die Ausführung des Codes erforderlichen Betriebssystembibliotheken und Abhängigkeiten zu einer einzigen ausführbaren Datei, die als Container bezeichnet wird und in jeder Infrastruktur konsistent ausgeführt werden kann. Container sind portabler und ressourceneffizienter als virtuelle Maschinen (VMs) und haben sich de facto zu den Recheneinheiten moderner cloudnativer Anwendungen entwickelt.&amp;lt;ref&amp;gt;https://www.ibm.com/de-de/topics/containerization&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Container Lösungen bieten im Vergleich zur Virtualisierung eine leichtgewichtigere Möglichkeit Applikationen isoliert zu starten. Folgende Informationen beziehen sich auf Docker, sind aber möglicherweise auch auf andere Container Lösungen (wie z.B.: LXC) übertragbar.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zur Virtualisierung wird bei der Containerisierung nur die zu startende Anwendung und ihre Abhängigkeiten gestartet. Es wird kein komplettes Betriebssystem initialisiert. Der Container teilt sich den Kernel mit dem Hostbetriebssystem. Die Isolierung zu den Hostanwendungen erfolgt durch verschiedene andere Mechanismen die im weiteren Verlauf erklärt werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Containers.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Vor- und Nachteile ===&lt;br /&gt;
Folgend eine sehr vereinfachte Gegenüberstellung:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Virtualisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Sehr hoher Isolationsgrad&lt;br /&gt;
 Negativ: Höherer Ressourcenverbrauch&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Containerisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Geringer Ressourcenverbrauch&lt;br /&gt;
 Negativ: Nicht so hoher Isolationsgrad, Host Kernel wird direkt von allen Containern verwendet&lt;br /&gt;
&lt;br /&gt;
== Docker ==&lt;br /&gt;
&lt;br /&gt;
Docker ist eine der am weitesten verbreiteten und unterstützten Container Lösungen. Docker selbst kann nur in Verbindung mit dem Linux Kernel verwendet werden.&lt;br /&gt;
 Docker kann auf weiteren Betriebssystemen wie Windows oder MacOS verwendet werden. Jedoch wird hierbei ein Hostsystem mit Linux Kernel emuliert bzw. virtualisiert, welches für das Ausführen des Docker Daemons zuständig ist.&lt;br /&gt;
&lt;br /&gt;
=== Container Isolierung ===&lt;br /&gt;
&lt;br /&gt;
Um den starken Isolationsgrad zu erreichen, d.h.: Anwendungungen im Container von anderen Anwendungen zu trennen, werden einige Features des Linux Kernels benötigt. Das folgende wird möglicherweise auch das Verständnis von Isolation verbessern:&lt;br /&gt;
&lt;br /&gt;
==== Namespaces ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;Namespaces are a feature of the Linux kernel that partition kernel resources such that one set of processes sees one set of resources, while another set of processes sees a different set of resources. The feature works by having the same namespace for a set of resources and processes, but those namespaces refer to distinct resources. Resources may exist in multiple spaces. Examples of such resources are process IDs, host-names, user IDs, file names, some names associated with network access, and Inter-process communication.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Linux_namespaces&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PID Namespace&#039;&#039;&#039; - Jeder Container hat seinen eigenen Prozess-ID-Namespace, was bedeutet, dass die Prozesse in einem Container nur ihre eigenen Prozess-IDs sehen können und nicht die IDs der Prozesse außerhalb des Containers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Network Namespace&#039;&#039;&#039; - Docker erstellt für jeden Container einen eigenen Netzwerknamespace. Das bedeutet, dass jeder Container sein eigenes Netzwerkinterface, seine eigenen IP-Adressen, Routing-Tabellen usw. hat. Dadurch können Container voneinander isoliert sein und unabhängig voneinander agieren.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mount Namespace&#039;&#039;&#039; - Mount Namespaces isolieren das Dateisystem des Containers von dem des Hostsystems. Jeder Container hat sein eigenes Dateisystem, was es ermöglicht, dass verschiedene Container unterschiedliche Dateisysteme nutzen können, ohne sich gegenseitig zu beeinflussen.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;IPC Namespace&#039;&#039;&#039; - IPC (Inter Process Communication) Namespaces isolieren die Interprozesskommunikation, wie zum Beispiel die Verwendung von Shared Memory oder IPC Pipes. Dadurch sind die Kommunikationsmechanismen zwischen Prozessen in verschiedenen Containern getrennt.&lt;br /&gt;
&lt;br /&gt;
==== CGroups ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;cgroups (abbreviated from control groups) is a Linux kernel feature that limits, accounts for, and isolates the resource usage (CPU, memory, disk I/O, etc.[1]) of a collection of processes.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Cgroups&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CPU-Begrenzung&#039;&#039;&#039; - Mit cgroups kann Docker die CPU-Nutzung jedes Containers begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht mehr CPU-Ressourcen verwendet als ihm zugewiesen wurden, und um sicherzustellen, dass andere Container und Anwendungen auf dem Hostsystem ausreichend CPU-Zeit erhalten.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Speicherbegrenzung&#039;&#039;&#039; - Docker kann die Menge an Arbeitsspeicher, die von einem Container verwendet werden kann, mithilfe von cgroups begrenzen. Dies hilft dabei, zu verhindern, dass ein einzelner Container zu viel Arbeitsspeicher beansprucht und das gesamte System zum Absturz bringt.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;I/O-Begrenzung&#039;&#039;&#039; - Durch cgroups kann Docker die Ein- und Ausgabegeschwindigkeit für einen Container begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht zu viel Festplatten- oder Netzwerkbandbreite beansprucht und dadurch die Leistung anderer Container beeinträchtigt.&lt;br /&gt;
&lt;br /&gt;
==== Weitere Mechanismen ====&lt;br /&gt;
* SELinux&lt;br /&gt;
* AppArmor&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen finden sich [https://medium.com/@BeNitinAgarwal/understanding-the-docker-internals-7ccb052ce9fe hier]&lt;br /&gt;
&lt;br /&gt;
=== Aufbau von Docker ===&lt;br /&gt;
&lt;br /&gt;
Docker besteht aus den folgend genannten Komponenten:&lt;br /&gt;
&lt;br /&gt;
==== Images ====&lt;br /&gt;
Images bilden in sich abgeschlossenen Applikationen welche mit der &#039;&#039;&#039;Docker Engine&#039;&#039;&#039; erstellt und gestartet (&#039;&#039;&#039;Container&#039;&#039;&#039;) werden können.&lt;br /&gt;
&lt;br /&gt;
==== Registry ====&lt;br /&gt;
Eine zentrale stelle an der Docker Images gespeichert und abgerufen werden kann. Die wohl bekannteste Registry ist [https://hub.docker.com/ dockerhub]. Es kann jedoch auch eine eigene Registry erstellt werden.&lt;br /&gt;
&lt;br /&gt;
==== Engine ====&lt;br /&gt;
Die Docker Engine ist das Herzstück von Docker. Sie besteht aus drei Komponenten:&lt;br /&gt;
# &#039;&#039;&#039;Docker-Daemon&#039;&#039;&#039; - Der Docker-Daemon läuft als Hintergrundprozess auf dem Host System. Dieser ist die zentrale Steuerung der Docker Engine und ist zuständig für sämtliche Verwaltungsaufgaben (z.B.: Anlegen von Netzwerken, Volumes, Images und Containern)&lt;br /&gt;
# &#039;&#039;&#039;REST Api&#039;&#039;&#039; - Dient der Kommunikation mit dem Docker Daemon&lt;br /&gt;
# &#039;&#039;&#039;Command Line Interface&#039;&#039;&#039; - Kommuniziert über die REST Api mit dem Daemon und ermöglicht dem User das ausführen von Docker Befehlen&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.ionos.at/digitalguide/server/konfiguration/docker-tutorial-installation-und-erste-schritte&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Docker_2024_04/Containers|Container]] ===&lt;br /&gt;
=== [[Docker_2024_04/Networking|Networking]] ===&lt;br /&gt;
=== [[Docker_2024_04/Image|Image]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[Docker_2024_04/Resource Restriction|Resourcen limitieren]] ===&lt;br /&gt;
=== [[Docker_2024_04/Docker Compose|Docker Compose]] ===&lt;br /&gt;
=== [[Docker_2024_04/Registry|Registry]] ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Datei:Dockerschulung_2024_04.odp&amp;diff=3539</id>
		<title>Datei:Dockerschulung 2024 04.odp</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Datei:Dockerschulung_2024_04.odp&amp;diff=3539"/>
		<updated>2024-04-18T13:42:17Z</updated>

		<summary type="html">&lt;p&gt;Drlue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Einführungspräsentation&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3538</id>
		<title>Docker 2024 04</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3538"/>
		<updated>2024-04-18T13:34:38Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Image erstellen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Schulung Docker 2024/04 =&lt;br /&gt;
In der folgenden Schulung soll ein grundlegendes Verständnis für die Containerisierung erworben werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Teilnehmer_innen sollen nach der Schulung in der Lage sein&#039;&#039;&#039;&lt;br /&gt;
* die Begriffe Virtualisierung und Containerisierung zu unterscheiden&lt;br /&gt;
* bestehende Docker Images ausführen&lt;br /&gt;
* eigene Docker Images zu erstellen und diese mittels {{BSL|docker run}} und {{BSL|docker compose}} zu starten&lt;br /&gt;
* die bereitgestellten Ressourcen für Arbeitsspeicher, CPU Zeit und Disk IO zu modifizieren&lt;br /&gt;
* die Einsatzzwecke der verschiedenen Networking Modelle (insbesondere Bridge und Host Network) zu unterscheiden und diese anwenden können&lt;br /&gt;
* das Dateisystem und Volumes einbinden und verwalten&lt;br /&gt;
* eine eigene Image Registry zu erstellen und dort Images ablegen und abrufen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welche Bereiche werden explizit ausgeklammert:&#039;&#039;&#039;&lt;br /&gt;
* Limitierung von Netzwerkresourcen ([https://man7.org/linux/man-pages/man8/tc.8.html siehe tc])&lt;br /&gt;
* Limitierung von Speicherplatz ([https://de.wikipedia.org/wiki/XFS_(Dateisystem) siehe XFS])&lt;br /&gt;
&lt;br /&gt;
== Virtualisierung vs Containerisierung ==&lt;br /&gt;
&lt;br /&gt;
Beide Varianten bieten die Möglichkeit Applikationen isoliert von anderen Prozessen auszuführen. Im Gegensatz zur Containerisierung wird bei der Virtualisierung ein komplettes Betriebssystem mit entsprechenden Anwendungen gestartet.&lt;br /&gt;
&lt;br /&gt;
=== Gründe für Virtualisierung und Containerisierung ===&lt;br /&gt;
Programme können lokal, oder auf Servern installiert werden. Hierfür benötigt es keine der beiden Technologien.&lt;br /&gt;
Folgende Gründe sprechen jedoch für die Verwendung dieser Technologien:&lt;br /&gt;
 &#039;&#039;&#039;Teilen von Hardware Ressourcen&#039;&#039;&#039;&lt;br /&gt;
 Virtualisierung bietet die Möglichkeit physische Hardware auf mehrere Betriebssysteme zu verteilen.&lt;br /&gt;
 Containerisierung bietet die Möglichkeit physische Hardware auf mehrere Applikationen zu verteilen.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Isolation&#039;&#039;&#039;&lt;br /&gt;
 Fehlerhafte Anwendungen oder Sicherheitslücken wirken sich nicht auf das gesamte System aus.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Übertragbarkeit&#039;&#039;&#039;&lt;br /&gt;
 Ein weiterer Vorteil der Virtualisierung bzw. Containerisierung ist die in sich abgeschlossene und übertragbare Umgebung. Eine gekapselte Anwendung kann so auf nahezu jedem System ausgeführt werden. Die Abhängigkeiten beschränken sich hierbei auf ein Minimum.&lt;br /&gt;
&lt;br /&gt;
=== Virtualisierung ===&lt;br /&gt;
Bei der Virtualisierung übernimmt der &#039;&#039;&#039;Hypervisor&#039;&#039;&#039; das erstellen, starten und das Zuteilen der Hardwareressourcen des Hosts an die virtualisierten Gast Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
 Ein Hypervisor ist eine Software, die virtuelle Maschinen (VMs) erstellt und ausführt. Ein Hypervisor, manchmal auch Virtual Machine Monitor (VMM) genannt, isoliert das Hypervisor-Betriebssystem und die Ressourcen von den virtuellen Maschinen und ermöglicht die Erstellung und Verwaltung dieser VMs.&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hypervisoren können in verschiedene Typen eingeteilt werden:&lt;br /&gt;
* &#039;&#039;&#039;Typ 1&#039;&#039;&#039;, Läuft direkt auf der Hardware (z.B.: KVM, Microsoft Hyper-V und VMware vSphere)&lt;br /&gt;
* &#039;&#039;&#039;Typ 2&#039;&#039;&#039;, Läuft auf einem Host Betriebssystem (z.B.: VMware Workstation und Oracle VirtualBox)&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Virtual-Machines.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Containerisierung ===&lt;br /&gt;
 Unter Containerisierung versteht man das Zusammenfassen von Softwarecode mit den für die Ausführung des Codes erforderlichen Betriebssystembibliotheken und Abhängigkeiten zu einer einzigen ausführbaren Datei, die als Container bezeichnet wird und in jeder Infrastruktur konsistent ausgeführt werden kann. Container sind portabler und ressourceneffizienter als virtuelle Maschinen (VMs) und haben sich de facto zu den Recheneinheiten moderner cloudnativer Anwendungen entwickelt.&amp;lt;ref&amp;gt;https://www.ibm.com/de-de/topics/containerization&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Container Lösungen bieten im Vergleich zur Virtualisierung eine leichtgewichtigere Möglichkeit Applikationen isoliert zu starten. Folgende Informationen beziehen sich auf Docker, sind aber möglicherweise auch auf andere Container Lösungen (wie z.B.: LXC) übertragbar.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zur Virtualisierung wird bei der Containerisierung nur die zu startende Anwendung und ihre Abhängigkeiten gestartet. Es wird kein komplettes Betriebssystem initialisiert. Der Container teilt sich den Kernel mit dem Hostbetriebssystem. Die Isolierung zu den Hostanwendungen erfolgt durch verschiedene andere Mechanismen die im weiteren Verlauf erklärt werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Containers.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Vor- und Nachteile ===&lt;br /&gt;
Folgend eine sehr vereinfachte Gegenüberstellung:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Virtualisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Sehr hoher Isolationsgrad&lt;br /&gt;
 Negativ: Höherer Ressourcenverbrauch&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Containerisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Geringer Ressourcenverbrauch&lt;br /&gt;
 Negativ: Nicht so hoher Isolationsgrad, Host Kernel wird direkt von allen Containern verwendet&lt;br /&gt;
&lt;br /&gt;
== Docker ==&lt;br /&gt;
&lt;br /&gt;
Docker ist eine der am weitesten verbreiteten und unterstützten Container Lösungen. Docker selbst kann nur in Verbindung mit dem Linux Kernel verwendet werden.&lt;br /&gt;
 Docker kann auf weiteren Betriebssystemen wie Windows oder MacOS verwendet werden. Jedoch wird hierbei ein Hostsystem mit Linux Kernel emuliert bzw. virtualisiert, welches für das Ausführen des Docker Daemons zuständig ist.&lt;br /&gt;
&lt;br /&gt;
=== Container Isolierung ===&lt;br /&gt;
&lt;br /&gt;
Um den starken Isolationsgrad zu erreichen, d.h.: Anwendungungen im Container von anderen Anwendungen zu trennen, werden einige Features des Linux Kernels benötigt. Das folgende wird möglicherweise auch das Verständnis von Isolation verbessern:&lt;br /&gt;
&lt;br /&gt;
==== Namespaces ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;Namespaces are a feature of the Linux kernel that partition kernel resources such that one set of processes sees one set of resources, while another set of processes sees a different set of resources. The feature works by having the same namespace for a set of resources and processes, but those namespaces refer to distinct resources. Resources may exist in multiple spaces. Examples of such resources are process IDs, host-names, user IDs, file names, some names associated with network access, and Inter-process communication.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Linux_namespaces&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PID Namespace&#039;&#039;&#039; - Jeder Container hat seinen eigenen Prozess-ID-Namespace, was bedeutet, dass die Prozesse in einem Container nur ihre eigenen Prozess-IDs sehen können und nicht die IDs der Prozesse außerhalb des Containers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Network Namespace&#039;&#039;&#039; - Docker erstellt für jeden Container einen eigenen Netzwerknamespace. Das bedeutet, dass jeder Container sein eigenes Netzwerkinterface, seine eigenen IP-Adressen, Routing-Tabellen usw. hat. Dadurch können Container voneinander isoliert sein und unabhängig voneinander agieren.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mount Namespace&#039;&#039;&#039; - Mount Namespaces isolieren das Dateisystem des Containers von dem des Hostsystems. Jeder Container hat sein eigenes Dateisystem, was es ermöglicht, dass verschiedene Container unterschiedliche Dateisysteme nutzen können, ohne sich gegenseitig zu beeinflussen.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;IPC Namespace&#039;&#039;&#039; - IPC (Inter Process Communication) Namespaces isolieren die Interprozesskommunikation, wie zum Beispiel die Verwendung von Shared Memory oder IPC Pipes. Dadurch sind die Kommunikationsmechanismen zwischen Prozessen in verschiedenen Containern getrennt.&lt;br /&gt;
&lt;br /&gt;
==== CGroups ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;cgroups (abbreviated from control groups) is a Linux kernel feature that limits, accounts for, and isolates the resource usage (CPU, memory, disk I/O, etc.[1]) of a collection of processes.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Cgroups&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CPU-Begrenzung&#039;&#039;&#039; - Mit cgroups kann Docker die CPU-Nutzung jedes Containers begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht mehr CPU-Ressourcen verwendet als ihm zugewiesen wurden, und um sicherzustellen, dass andere Container und Anwendungen auf dem Hostsystem ausreichend CPU-Zeit erhalten.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Speicherbegrenzung&#039;&#039;&#039; - Docker kann die Menge an Arbeitsspeicher, die von einem Container verwendet werden kann, mithilfe von cgroups begrenzen. Dies hilft dabei, zu verhindern, dass ein einzelner Container zu viel Arbeitsspeicher beansprucht und das gesamte System zum Absturz bringt.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;I/O-Begrenzung&#039;&#039;&#039; - Durch cgroups kann Docker die Ein- und Ausgabegeschwindigkeit für einen Container begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht zu viel Festplatten- oder Netzwerkbandbreite beansprucht und dadurch die Leistung anderer Container beeinträchtigt.&lt;br /&gt;
&lt;br /&gt;
==== Weitere Mechanismen ====&lt;br /&gt;
* SELinux&lt;br /&gt;
* AppArmor&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen finden sich [https://medium.com/@BeNitinAgarwal/understanding-the-docker-internals-7ccb052ce9fe hier]&lt;br /&gt;
&lt;br /&gt;
=== Aufbau von Docker ===&lt;br /&gt;
&lt;br /&gt;
Docker besteht aus den folgend genannten Komponenten:&lt;br /&gt;
&lt;br /&gt;
==== Images ====&lt;br /&gt;
Images bilden in sich abgeschlossenen Applikationen welche mit der &#039;&#039;&#039;Docker Engine&#039;&#039;&#039; erstellt und gestartet (&#039;&#039;&#039;Container&#039;&#039;&#039;) werden können.&lt;br /&gt;
&lt;br /&gt;
==== Registry ====&lt;br /&gt;
Eine zentrale stelle an der Docker Images gespeichert und abgerufen werden kann. Die wohl bekannteste Registry ist [https://hub.docker.com/ dockerhub]. Es kann jedoch auch eine eigene Registry erstellt werden.&lt;br /&gt;
&lt;br /&gt;
==== Engine ====&lt;br /&gt;
Die Docker Engine ist das Herzstück von Docker. Sie besteht aus drei Komponenten:&lt;br /&gt;
# &#039;&#039;&#039;Docker-Daemon&#039;&#039;&#039; - Der Docker-Daemon läuft als Hintergrundprozess auf dem Host System. Dieser ist die zentrale Steuerung der Docker Engine und ist zuständig für sämtliche Verwaltungsaufgaben (z.B.: Anlegen von Netzwerken, Volumes, Images und Containern)&lt;br /&gt;
# &#039;&#039;&#039;REST Api&#039;&#039;&#039; - Dient der Kommunikation mit dem Docker Daemon&lt;br /&gt;
# &#039;&#039;&#039;Command Line Interface&#039;&#039;&#039; - Kommuniziert über die REST Api mit dem Daemon und ermöglicht dem User das ausführen von Docker Befehlen&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.ionos.at/digitalguide/server/konfiguration/docker-tutorial-installation-und-erste-schritte&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Docker_2024_04/Containers|Container]] ===&lt;br /&gt;
=== [[Docker_2024_04/Networking|Networking]] ===&lt;br /&gt;
=== [[Docker_2024_04/Image|Image]] ===&lt;br /&gt;
&lt;br /&gt;
=== [[Docker_2024_04/Resource Restriction|Resourcen limitieren]] ===&lt;br /&gt;
=== [[Docker_2024_04/Docker Compose|Docker Compose]] ===&lt;br /&gt;
=== [[Docker_2024_04/Registry|Registry]] ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3537</id>
		<title>Docker 2024 04</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3537"/>
		<updated>2024-04-18T13:13:19Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Gründe für Virtualisierung und Containerisierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Schulung Docker 2024/04 =&lt;br /&gt;
In der folgenden Schulung soll ein grundlegendes Verständnis für die Containerisierung erworben werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Teilnehmer_innen sollen nach der Schulung in der Lage sein&#039;&#039;&#039;&lt;br /&gt;
* die Begriffe Virtualisierung und Containerisierung zu unterscheiden&lt;br /&gt;
* bestehende Docker Images ausführen&lt;br /&gt;
* eigene Docker Images zu erstellen und diese mittels {{BSL|docker run}} und {{BSL|docker compose}} zu starten&lt;br /&gt;
* die bereitgestellten Ressourcen für Arbeitsspeicher, CPU Zeit und Disk IO zu modifizieren&lt;br /&gt;
* die Einsatzzwecke der verschiedenen Networking Modelle (insbesondere Bridge und Host Network) zu unterscheiden und diese anwenden können&lt;br /&gt;
* das Dateisystem und Volumes einbinden und verwalten&lt;br /&gt;
* eine eigene Image Registry zu erstellen und dort Images ablegen und abrufen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welche Bereiche werden explizit ausgeklammert:&#039;&#039;&#039;&lt;br /&gt;
* Limitierung von Netzwerkresourcen ([https://man7.org/linux/man-pages/man8/tc.8.html siehe tc])&lt;br /&gt;
* Limitierung von Speicherplatz ([https://de.wikipedia.org/wiki/XFS_(Dateisystem) siehe XFS])&lt;br /&gt;
&lt;br /&gt;
== Virtualisierung vs Containerisierung ==&lt;br /&gt;
&lt;br /&gt;
Beide Varianten bieten die Möglichkeit Applikationen isoliert von anderen Prozessen auszuführen. Im Gegensatz zur Containerisierung wird bei der Virtualisierung ein komplettes Betriebssystem mit entsprechenden Anwendungen gestartet.&lt;br /&gt;
&lt;br /&gt;
=== Gründe für Virtualisierung und Containerisierung ===&lt;br /&gt;
Programme können lokal, oder auf Servern installiert werden. Hierfür benötigt es keine der beiden Technologien.&lt;br /&gt;
Folgende Gründe sprechen jedoch für die Verwendung dieser Technologien:&lt;br /&gt;
 &#039;&#039;&#039;Teilen von Hardware Ressourcen&#039;&#039;&#039;&lt;br /&gt;
 Virtualisierung bietet die Möglichkeit physische Hardware auf mehrere Betriebssysteme zu verteilen.&lt;br /&gt;
 Containerisierung bietet die Möglichkeit physische Hardware auf mehrere Applikationen zu verteilen.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Isolation&#039;&#039;&#039;&lt;br /&gt;
 Fehlerhafte Anwendungen oder Sicherheitslücken wirken sich nicht auf das gesamte System aus.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Übertragbarkeit&#039;&#039;&#039;&lt;br /&gt;
 Ein weiterer Vorteil der Virtualisierung bzw. Containerisierung ist die in sich abgeschlossene und übertragbare Umgebung. Eine gekapselte Anwendung kann so auf nahezu jedem System ausgeführt werden. Die Abhängigkeiten beschränken sich hierbei auf ein Minimum.&lt;br /&gt;
&lt;br /&gt;
=== Virtualisierung ===&lt;br /&gt;
Bei der Virtualisierung übernimmt der &#039;&#039;&#039;Hypervisor&#039;&#039;&#039; das erstellen, starten und das Zuteilen der Hardwareressourcen des Hosts an die virtualisierten Gast Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
 Ein Hypervisor ist eine Software, die virtuelle Maschinen (VMs) erstellt und ausführt. Ein Hypervisor, manchmal auch Virtual Machine Monitor (VMM) genannt, isoliert das Hypervisor-Betriebssystem und die Ressourcen von den virtuellen Maschinen und ermöglicht die Erstellung und Verwaltung dieser VMs.&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hypervisoren können in verschiedene Typen eingeteilt werden:&lt;br /&gt;
* &#039;&#039;&#039;Typ 1&#039;&#039;&#039;, Läuft direkt auf der Hardware (z.B.: KVM, Microsoft Hyper-V und VMware vSphere)&lt;br /&gt;
* &#039;&#039;&#039;Typ 2&#039;&#039;&#039;, Läuft auf einem Host Betriebssystem (z.B.: VMware Workstation und Oracle VirtualBox)&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Virtual-Machines.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Containerisierung ===&lt;br /&gt;
 Unter Containerisierung versteht man das Zusammenfassen von Softwarecode mit den für die Ausführung des Codes erforderlichen Betriebssystembibliotheken und Abhängigkeiten zu einer einzigen ausführbaren Datei, die als Container bezeichnet wird und in jeder Infrastruktur konsistent ausgeführt werden kann. Container sind portabler und ressourceneffizienter als virtuelle Maschinen (VMs) und haben sich de facto zu den Recheneinheiten moderner cloudnativer Anwendungen entwickelt.&amp;lt;ref&amp;gt;https://www.ibm.com/de-de/topics/containerization&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Container Lösungen bieten im Vergleich zur Virtualisierung eine leichtgewichtigere Möglichkeit Applikationen isoliert zu starten. Folgende Informationen beziehen sich auf Docker, sind aber möglicherweise auch auf andere Container Lösungen (wie z.B.: LXC) übertragbar.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zur Virtualisierung wird bei der Containerisierung nur die zu startende Anwendung und ihre Abhängigkeiten gestartet. Es wird kein komplettes Betriebssystem initialisiert. Der Container teilt sich den Kernel mit dem Hostbetriebssystem. Die Isolierung zu den Hostanwendungen erfolgt durch verschiedene andere Mechanismen die im weiteren Verlauf erklärt werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Containers.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Vor- und Nachteile ===&lt;br /&gt;
Folgend eine sehr vereinfachte Gegenüberstellung:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Virtualisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Sehr hoher Isolationsgrad&lt;br /&gt;
 Negativ: Höherer Ressourcenverbrauch&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Containerisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Geringer Ressourcenverbrauch&lt;br /&gt;
 Negativ: Nicht so hoher Isolationsgrad, Host Kernel wird direkt von allen Containern verwendet&lt;br /&gt;
&lt;br /&gt;
== Docker ==&lt;br /&gt;
&lt;br /&gt;
Docker ist eine der am weitesten verbreiteten und unterstützten Container Lösungen. Docker selbst kann nur in Verbindung mit dem Linux Kernel verwendet werden.&lt;br /&gt;
 Docker kann auf weiteren Betriebssystemen wie Windows oder MacOS verwendet werden. Jedoch wird hierbei ein Hostsystem mit Linux Kernel emuliert bzw. virtualisiert, welches für das Ausführen des Docker Daemons zuständig ist.&lt;br /&gt;
&lt;br /&gt;
=== Container Isolierung ===&lt;br /&gt;
&lt;br /&gt;
Um den starken Isolationsgrad zu erreichen, d.h.: Anwendungungen im Container von anderen Anwendungen zu trennen, werden einige Features des Linux Kernels benötigt. Das folgende wird möglicherweise auch das Verständnis von Isolation verbessern:&lt;br /&gt;
&lt;br /&gt;
==== Namespaces ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;Namespaces are a feature of the Linux kernel that partition kernel resources such that one set of processes sees one set of resources, while another set of processes sees a different set of resources. The feature works by having the same namespace for a set of resources and processes, but those namespaces refer to distinct resources. Resources may exist in multiple spaces. Examples of such resources are process IDs, host-names, user IDs, file names, some names associated with network access, and Inter-process communication.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Linux_namespaces&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PID Namespace&#039;&#039;&#039; - Jeder Container hat seinen eigenen Prozess-ID-Namespace, was bedeutet, dass die Prozesse in einem Container nur ihre eigenen Prozess-IDs sehen können und nicht die IDs der Prozesse außerhalb des Containers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Network Namespace&#039;&#039;&#039; - Docker erstellt für jeden Container einen eigenen Netzwerknamespace. Das bedeutet, dass jeder Container sein eigenes Netzwerkinterface, seine eigenen IP-Adressen, Routing-Tabellen usw. hat. Dadurch können Container voneinander isoliert sein und unabhängig voneinander agieren.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mount Namespace&#039;&#039;&#039; - Mount Namespaces isolieren das Dateisystem des Containers von dem des Hostsystems. Jeder Container hat sein eigenes Dateisystem, was es ermöglicht, dass verschiedene Container unterschiedliche Dateisysteme nutzen können, ohne sich gegenseitig zu beeinflussen.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;IPC Namespace&#039;&#039;&#039; - IPC (Inter Process Communication) Namespaces isolieren die Interprozesskommunikation, wie zum Beispiel die Verwendung von Shared Memory oder IPC Pipes. Dadurch sind die Kommunikationsmechanismen zwischen Prozessen in verschiedenen Containern getrennt.&lt;br /&gt;
&lt;br /&gt;
==== CGroups ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;cgroups (abbreviated from control groups) is a Linux kernel feature that limits, accounts for, and isolates the resource usage (CPU, memory, disk I/O, etc.[1]) of a collection of processes.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Cgroups&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CPU-Begrenzung&#039;&#039;&#039; - Mit cgroups kann Docker die CPU-Nutzung jedes Containers begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht mehr CPU-Ressourcen verwendet als ihm zugewiesen wurden, und um sicherzustellen, dass andere Container und Anwendungen auf dem Hostsystem ausreichend CPU-Zeit erhalten.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Speicherbegrenzung&#039;&#039;&#039; - Docker kann die Menge an Arbeitsspeicher, die von einem Container verwendet werden kann, mithilfe von cgroups begrenzen. Dies hilft dabei, zu verhindern, dass ein einzelner Container zu viel Arbeitsspeicher beansprucht und das gesamte System zum Absturz bringt.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;I/O-Begrenzung&#039;&#039;&#039; - Durch cgroups kann Docker die Ein- und Ausgabegeschwindigkeit für einen Container begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht zu viel Festplatten- oder Netzwerkbandbreite beansprucht und dadurch die Leistung anderer Container beeinträchtigt.&lt;br /&gt;
&lt;br /&gt;
==== Weitere Mechanismen ====&lt;br /&gt;
* SELinux&lt;br /&gt;
* AppArmor&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen finden sich [https://medium.com/@BeNitinAgarwal/understanding-the-docker-internals-7ccb052ce9fe hier]&lt;br /&gt;
&lt;br /&gt;
=== Aufbau von Docker ===&lt;br /&gt;
&lt;br /&gt;
Docker besteht aus den folgend genannten Komponenten:&lt;br /&gt;
&lt;br /&gt;
==== Images ====&lt;br /&gt;
Images bilden in sich abgeschlossenen Applikationen welche mit der &#039;&#039;&#039;Docker Engine&#039;&#039;&#039; erstellt und gestartet (&#039;&#039;&#039;Container&#039;&#039;&#039;) werden können.&lt;br /&gt;
&lt;br /&gt;
==== Registry ====&lt;br /&gt;
Eine zentrale stelle an der Docker Images gespeichert und abgerufen werden kann. Die wohl bekannteste Registry ist [https://hub.docker.com/ dockerhub]. Es kann jedoch auch eine eigene Registry erstellt werden.&lt;br /&gt;
&lt;br /&gt;
==== Engine ====&lt;br /&gt;
Die Docker Engine ist das Herzstück von Docker. Sie besteht aus drei Komponenten:&lt;br /&gt;
# &#039;&#039;&#039;Docker-Daemon&#039;&#039;&#039; - Der Docker-Daemon läuft als Hintergrundprozess auf dem Host System. Dieser ist die zentrale Steuerung der Docker Engine und ist zuständig für sämtliche Verwaltungsaufgaben (z.B.: Anlegen von Netzwerken, Volumes, Images und Containern)&lt;br /&gt;
# &#039;&#039;&#039;REST Api&#039;&#039;&#039; - Dient der Kommunikation mit dem Docker Daemon&lt;br /&gt;
# &#039;&#039;&#039;Command Line Interface&#039;&#039;&#039; - Kommuniziert über die REST Api mit dem Daemon und ermöglicht dem User das ausführen von Docker Befehlen&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.ionos.at/digitalguide/server/konfiguration/docker-tutorial-installation-und-erste-schritte&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Docker_2024_04/Containers|Container]] ===&lt;br /&gt;
=== [[Docker_2024_04/Networking|Networking]] ===&lt;br /&gt;
=== [[Docker_2024_04/Image|Image erstellen]] ===&lt;br /&gt;
=== [[Docker_2024_04/Resource Restriction|Resourcen limitieren]] ===&lt;br /&gt;
=== [[Docker_2024_04/Docker Compose|Docker Compose]] ===&lt;br /&gt;
=== [[Docker_2024_04/Registry|Registry]] ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3536</id>
		<title>Docker 2024 04</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3536"/>
		<updated>2024-04-18T13:09:33Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Schulung Docker 2024/04 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Schulung Docker 2024/04 =&lt;br /&gt;
In der folgenden Schulung soll ein grundlegendes Verständnis für die Containerisierung erworben werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Teilnehmer_innen sollen nach der Schulung in der Lage sein&#039;&#039;&#039;&lt;br /&gt;
* die Begriffe Virtualisierung und Containerisierung zu unterscheiden&lt;br /&gt;
* bestehende Docker Images ausführen&lt;br /&gt;
* eigene Docker Images zu erstellen und diese mittels {{BSL|docker run}} und {{BSL|docker compose}} zu starten&lt;br /&gt;
* die bereitgestellten Ressourcen für Arbeitsspeicher, CPU Zeit und Disk IO zu modifizieren&lt;br /&gt;
* die Einsatzzwecke der verschiedenen Networking Modelle (insbesondere Bridge und Host Network) zu unterscheiden und diese anwenden können&lt;br /&gt;
* das Dateisystem und Volumes einbinden und verwalten&lt;br /&gt;
* eine eigene Image Registry zu erstellen und dort Images ablegen und abrufen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welche Bereiche werden explizit ausgeklammert:&#039;&#039;&#039;&lt;br /&gt;
* Limitierung von Netzwerkresourcen ([https://man7.org/linux/man-pages/man8/tc.8.html siehe tc])&lt;br /&gt;
* Limitierung von Speicherplatz ([https://de.wikipedia.org/wiki/XFS_(Dateisystem) siehe XFS])&lt;br /&gt;
&lt;br /&gt;
== Virtualisierung vs Containerisierung ==&lt;br /&gt;
&lt;br /&gt;
Beide Varianten bieten die Möglichkeit Applikationen isoliert von anderen Prozessen auszuführen. Im Gegensatz zur Containerisierung wird bei der Virtualisierung ein komplettes Betriebssystem mit entsprechenden Anwendungen gestartet.&lt;br /&gt;
&lt;br /&gt;
=== Gründe für Virtualisierung und Containerisierung ===&lt;br /&gt;
Programme können lokal, oder auf Servern installiert werden. Hierfür benötigt es keine der beiden Technologien.&lt;br /&gt;
Folgende Gründe sprechen jedoch für die Verwendung dieser Technologien:&lt;br /&gt;
 &#039;&#039;&#039;Teilen von Hardware Ressourcen&#039;&#039;&#039;&lt;br /&gt;
 Virtualisierung bietet die Möglichkeit physische Hardware auf mehrere Betriebssysteme zu verteilen.&lt;br /&gt;
 Containerisierung bietet die Möglichkeit physische Hardware auf mehrere Applikationen zu verteilen.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Isolationsgrad&#039;&#039;&#039;&lt;br /&gt;
 Fehlerhafte Anwendungen oder Sicherheitslücken wirken sich nicht auf das gesamte System aus.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Übertragbarkeit&#039;&#039;&#039;&lt;br /&gt;
 Ein weiterer Vorteil der Virtualisierung bzw. Containerisierung ist die in sich abgeschlossene und übertragbare Umgebung. Eine gekapselte Anwendung kann so auf nahezu jedem System ausgeführt werden. Die Abhängigkeiten beschränken sich hierbei auf ein Minimum.&lt;br /&gt;
&lt;br /&gt;
=== Virtualisierung ===&lt;br /&gt;
Bei der Virtualisierung übernimmt der &#039;&#039;&#039;Hypervisor&#039;&#039;&#039; das erstellen, starten und das Zuteilen der Hardwareressourcen des Hosts an die virtualisierten Gast Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
 Ein Hypervisor ist eine Software, die virtuelle Maschinen (VMs) erstellt und ausführt. Ein Hypervisor, manchmal auch Virtual Machine Monitor (VMM) genannt, isoliert das Hypervisor-Betriebssystem und die Ressourcen von den virtuellen Maschinen und ermöglicht die Erstellung und Verwaltung dieser VMs.&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hypervisoren können in verschiedene Typen eingeteilt werden:&lt;br /&gt;
* &#039;&#039;&#039;Typ 1&#039;&#039;&#039;, Läuft direkt auf der Hardware (z.B.: KVM, Microsoft Hyper-V und VMware vSphere)&lt;br /&gt;
* &#039;&#039;&#039;Typ 2&#039;&#039;&#039;, Läuft auf einem Host Betriebssystem (z.B.: VMware Workstation und Oracle VirtualBox)&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Virtual-Machines.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Containerisierung ===&lt;br /&gt;
 Unter Containerisierung versteht man das Zusammenfassen von Softwarecode mit den für die Ausführung des Codes erforderlichen Betriebssystembibliotheken und Abhängigkeiten zu einer einzigen ausführbaren Datei, die als Container bezeichnet wird und in jeder Infrastruktur konsistent ausgeführt werden kann. Container sind portabler und ressourceneffizienter als virtuelle Maschinen (VMs) und haben sich de facto zu den Recheneinheiten moderner cloudnativer Anwendungen entwickelt.&amp;lt;ref&amp;gt;https://www.ibm.com/de-de/topics/containerization&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Container Lösungen bieten im Vergleich zur Virtualisierung eine leichtgewichtigere Möglichkeit Applikationen isoliert zu starten. Folgende Informationen beziehen sich auf Docker, sind aber möglicherweise auch auf andere Container Lösungen (wie z.B.: LXC) übertragbar.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zur Virtualisierung wird bei der Containerisierung nur die zu startende Anwendung und ihre Abhängigkeiten gestartet. Es wird kein komplettes Betriebssystem initialisiert. Der Container teilt sich den Kernel mit dem Hostbetriebssystem. Die Isolierung zu den Hostanwendungen erfolgt durch verschiedene andere Mechanismen die im weiteren Verlauf erklärt werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Containers.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Vor- und Nachteile ===&lt;br /&gt;
Folgend eine sehr vereinfachte Gegenüberstellung:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Virtualisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Sehr hoher Isolationsgrad&lt;br /&gt;
 Negativ: Höherer Ressourcenverbrauch&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Containerisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Geringer Ressourcenverbrauch&lt;br /&gt;
 Negativ: Nicht so hoher Isolationsgrad, Host Kernel wird direkt von allen Containern verwendet&lt;br /&gt;
&lt;br /&gt;
== Docker ==&lt;br /&gt;
&lt;br /&gt;
Docker ist eine der am weitesten verbreiteten und unterstützten Container Lösungen. Docker selbst kann nur in Verbindung mit dem Linux Kernel verwendet werden.&lt;br /&gt;
 Docker kann auf weiteren Betriebssystemen wie Windows oder MacOS verwendet werden. Jedoch wird hierbei ein Hostsystem mit Linux Kernel emuliert bzw. virtualisiert, welches für das Ausführen des Docker Daemons zuständig ist.&lt;br /&gt;
&lt;br /&gt;
=== Container Isolierung ===&lt;br /&gt;
&lt;br /&gt;
Um den starken Isolationsgrad zu erreichen, d.h.: Anwendungungen im Container von anderen Anwendungen zu trennen, werden einige Features des Linux Kernels benötigt. Das folgende wird möglicherweise auch das Verständnis von Isolation verbessern:&lt;br /&gt;
&lt;br /&gt;
==== Namespaces ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;Namespaces are a feature of the Linux kernel that partition kernel resources such that one set of processes sees one set of resources, while another set of processes sees a different set of resources. The feature works by having the same namespace for a set of resources and processes, but those namespaces refer to distinct resources. Resources may exist in multiple spaces. Examples of such resources are process IDs, host-names, user IDs, file names, some names associated with network access, and Inter-process communication.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Linux_namespaces&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PID Namespace&#039;&#039;&#039; - Jeder Container hat seinen eigenen Prozess-ID-Namespace, was bedeutet, dass die Prozesse in einem Container nur ihre eigenen Prozess-IDs sehen können und nicht die IDs der Prozesse außerhalb des Containers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Network Namespace&#039;&#039;&#039; - Docker erstellt für jeden Container einen eigenen Netzwerknamespace. Das bedeutet, dass jeder Container sein eigenes Netzwerkinterface, seine eigenen IP-Adressen, Routing-Tabellen usw. hat. Dadurch können Container voneinander isoliert sein und unabhängig voneinander agieren.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mount Namespace&#039;&#039;&#039; - Mount Namespaces isolieren das Dateisystem des Containers von dem des Hostsystems. Jeder Container hat sein eigenes Dateisystem, was es ermöglicht, dass verschiedene Container unterschiedliche Dateisysteme nutzen können, ohne sich gegenseitig zu beeinflussen.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;IPC Namespace&#039;&#039;&#039; - IPC (Inter Process Communication) Namespaces isolieren die Interprozesskommunikation, wie zum Beispiel die Verwendung von Shared Memory oder IPC Pipes. Dadurch sind die Kommunikationsmechanismen zwischen Prozessen in verschiedenen Containern getrennt.&lt;br /&gt;
&lt;br /&gt;
==== CGroups ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;cgroups (abbreviated from control groups) is a Linux kernel feature that limits, accounts for, and isolates the resource usage (CPU, memory, disk I/O, etc.[1]) of a collection of processes.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Cgroups&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CPU-Begrenzung&#039;&#039;&#039; - Mit cgroups kann Docker die CPU-Nutzung jedes Containers begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht mehr CPU-Ressourcen verwendet als ihm zugewiesen wurden, und um sicherzustellen, dass andere Container und Anwendungen auf dem Hostsystem ausreichend CPU-Zeit erhalten.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Speicherbegrenzung&#039;&#039;&#039; - Docker kann die Menge an Arbeitsspeicher, die von einem Container verwendet werden kann, mithilfe von cgroups begrenzen. Dies hilft dabei, zu verhindern, dass ein einzelner Container zu viel Arbeitsspeicher beansprucht und das gesamte System zum Absturz bringt.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;I/O-Begrenzung&#039;&#039;&#039; - Durch cgroups kann Docker die Ein- und Ausgabegeschwindigkeit für einen Container begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht zu viel Festplatten- oder Netzwerkbandbreite beansprucht und dadurch die Leistung anderer Container beeinträchtigt.&lt;br /&gt;
&lt;br /&gt;
==== Weitere Mechanismen ====&lt;br /&gt;
* SELinux&lt;br /&gt;
* AppArmor&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen finden sich [https://medium.com/@BeNitinAgarwal/understanding-the-docker-internals-7ccb052ce9fe hier]&lt;br /&gt;
&lt;br /&gt;
=== Aufbau von Docker ===&lt;br /&gt;
&lt;br /&gt;
Docker besteht aus den folgend genannten Komponenten:&lt;br /&gt;
&lt;br /&gt;
==== Images ====&lt;br /&gt;
Images bilden in sich abgeschlossenen Applikationen welche mit der &#039;&#039;&#039;Docker Engine&#039;&#039;&#039; erstellt und gestartet (&#039;&#039;&#039;Container&#039;&#039;&#039;) werden können.&lt;br /&gt;
&lt;br /&gt;
==== Registry ====&lt;br /&gt;
Eine zentrale stelle an der Docker Images gespeichert und abgerufen werden kann. Die wohl bekannteste Registry ist [https://hub.docker.com/ dockerhub]. Es kann jedoch auch eine eigene Registry erstellt werden.&lt;br /&gt;
&lt;br /&gt;
==== Engine ====&lt;br /&gt;
Die Docker Engine ist das Herzstück von Docker. Sie besteht aus drei Komponenten:&lt;br /&gt;
# &#039;&#039;&#039;Docker-Daemon&#039;&#039;&#039; - Der Docker-Daemon läuft als Hintergrundprozess auf dem Host System. Dieser ist die zentrale Steuerung der Docker Engine und ist zuständig für sämtliche Verwaltungsaufgaben (z.B.: Anlegen von Netzwerken, Volumes, Images und Containern)&lt;br /&gt;
# &#039;&#039;&#039;REST Api&#039;&#039;&#039; - Dient der Kommunikation mit dem Docker Daemon&lt;br /&gt;
# &#039;&#039;&#039;Command Line Interface&#039;&#039;&#039; - Kommuniziert über die REST Api mit dem Daemon und ermöglicht dem User das ausführen von Docker Befehlen&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.ionos.at/digitalguide/server/konfiguration/docker-tutorial-installation-und-erste-schritte&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Docker_2024_04/Containers|Container]] ===&lt;br /&gt;
=== [[Docker_2024_04/Networking|Networking]] ===&lt;br /&gt;
=== [[Docker_2024_04/Image|Image erstellen]] ===&lt;br /&gt;
=== [[Docker_2024_04/Resource Restriction|Resourcen limitieren]] ===&lt;br /&gt;
=== [[Docker_2024_04/Docker Compose|Docker Compose]] ===&lt;br /&gt;
=== [[Docker_2024_04/Registry|Registry]] ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3535</id>
		<title>Docker 2024 04</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3535"/>
		<updated>2024-04-18T13:07:36Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Schulung Docker 2024/04 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Schulung Docker 2024/04 =&lt;br /&gt;
In der folgenden Schulung soll ein grundlegendes Verständnis für die Containerisierung erworben werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Teilnehmer_innen sollen nach der Schulung in der Lage sein&#039;&#039;&#039;&lt;br /&gt;
* die Begriffe Virtualisierung und Containerisierung zu unterscheiden&lt;br /&gt;
* bestehende Docker Images ausführen&lt;br /&gt;
* eigene Docker Images zu erstellen und diese mittels {{BSL|docker run}} und {{BSL|docker compose}} zu starten&lt;br /&gt;
* die bereitgestellten Ressourcen für Arbeitsspeicher, CPU Zeit und Disk IO zu modifizieren&lt;br /&gt;
* die Einsatzzwecke der verschiedenen Networking Modelle (insbesondere Bridge und Host Network) zu unterscheiden und diese anwenden können&lt;br /&gt;
* eine eigene Image Registry zu erstellen und dort Images ablegen und abrufen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welche Bereiche werden explizit ausgeklammert:&#039;&#039;&#039;&lt;br /&gt;
* Limitierung von Netzwerkresourcen ([https://man7.org/linux/man-pages/man8/tc.8.html siehe tc])&lt;br /&gt;
* Limitierung von Speicherplatz ([https://de.wikipedia.org/wiki/XFS_(Dateisystem) siehe XFS])&lt;br /&gt;
&lt;br /&gt;
== Virtualisierung vs Containerisierung ==&lt;br /&gt;
&lt;br /&gt;
Beide Varianten bieten die Möglichkeit Applikationen isoliert von anderen Prozessen auszuführen. Im Gegensatz zur Containerisierung wird bei der Virtualisierung ein komplettes Betriebssystem mit entsprechenden Anwendungen gestartet.&lt;br /&gt;
&lt;br /&gt;
=== Gründe für Virtualisierung und Containerisierung ===&lt;br /&gt;
Programme können lokal, oder auf Servern installiert werden. Hierfür benötigt es keine der beiden Technologien.&lt;br /&gt;
Folgende Gründe sprechen jedoch für die Verwendung dieser Technologien:&lt;br /&gt;
 &#039;&#039;&#039;Teilen von Hardware Ressourcen&#039;&#039;&#039;&lt;br /&gt;
 Virtualisierung bietet die Möglichkeit physische Hardware auf mehrere Betriebssysteme zu verteilen.&lt;br /&gt;
 Containerisierung bietet die Möglichkeit physische Hardware auf mehrere Applikationen zu verteilen.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Isolationsgrad&#039;&#039;&#039;&lt;br /&gt;
 Fehlerhafte Anwendungen oder Sicherheitslücken wirken sich nicht auf das gesamte System aus.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Übertragbarkeit&#039;&#039;&#039;&lt;br /&gt;
 Ein weiterer Vorteil der Virtualisierung bzw. Containerisierung ist die in sich abgeschlossene und übertragbare Umgebung. Eine gekapselte Anwendung kann so auf nahezu jedem System ausgeführt werden. Die Abhängigkeiten beschränken sich hierbei auf ein Minimum.&lt;br /&gt;
&lt;br /&gt;
=== Virtualisierung ===&lt;br /&gt;
Bei der Virtualisierung übernimmt der &#039;&#039;&#039;Hypervisor&#039;&#039;&#039; das erstellen, starten und das Zuteilen der Hardwareressourcen des Hosts an die virtualisierten Gast Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
 Ein Hypervisor ist eine Software, die virtuelle Maschinen (VMs) erstellt und ausführt. Ein Hypervisor, manchmal auch Virtual Machine Monitor (VMM) genannt, isoliert das Hypervisor-Betriebssystem und die Ressourcen von den virtuellen Maschinen und ermöglicht die Erstellung und Verwaltung dieser VMs.&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hypervisoren können in verschiedene Typen eingeteilt werden:&lt;br /&gt;
* &#039;&#039;&#039;Typ 1&#039;&#039;&#039;, Läuft direkt auf der Hardware (z.B.: KVM, Microsoft Hyper-V und VMware vSphere)&lt;br /&gt;
* &#039;&#039;&#039;Typ 2&#039;&#039;&#039;, Läuft auf einem Host Betriebssystem (z.B.: VMware Workstation und Oracle VirtualBox)&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Virtual-Machines.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Containerisierung ===&lt;br /&gt;
 Unter Containerisierung versteht man das Zusammenfassen von Softwarecode mit den für die Ausführung des Codes erforderlichen Betriebssystembibliotheken und Abhängigkeiten zu einer einzigen ausführbaren Datei, die als Container bezeichnet wird und in jeder Infrastruktur konsistent ausgeführt werden kann. Container sind portabler und ressourceneffizienter als virtuelle Maschinen (VMs) und haben sich de facto zu den Recheneinheiten moderner cloudnativer Anwendungen entwickelt.&amp;lt;ref&amp;gt;https://www.ibm.com/de-de/topics/containerization&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Container Lösungen bieten im Vergleich zur Virtualisierung eine leichtgewichtigere Möglichkeit Applikationen isoliert zu starten. Folgende Informationen beziehen sich auf Docker, sind aber möglicherweise auch auf andere Container Lösungen (wie z.B.: LXC) übertragbar.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zur Virtualisierung wird bei der Containerisierung nur die zu startende Anwendung und ihre Abhängigkeiten gestartet. Es wird kein komplettes Betriebssystem initialisiert. Der Container teilt sich den Kernel mit dem Hostbetriebssystem. Die Isolierung zu den Hostanwendungen erfolgt durch verschiedene andere Mechanismen die im weiteren Verlauf erklärt werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Containers.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Vor- und Nachteile ===&lt;br /&gt;
Folgend eine sehr vereinfachte Gegenüberstellung:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Virtualisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Sehr hoher Isolationsgrad&lt;br /&gt;
 Negativ: Höherer Ressourcenverbrauch&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Containerisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Geringer Ressourcenverbrauch&lt;br /&gt;
 Negativ: Nicht so hoher Isolationsgrad, Host Kernel wird direkt von allen Containern verwendet&lt;br /&gt;
&lt;br /&gt;
== Docker ==&lt;br /&gt;
&lt;br /&gt;
Docker ist eine der am weitesten verbreiteten und unterstützten Container Lösungen. Docker selbst kann nur in Verbindung mit dem Linux Kernel verwendet werden.&lt;br /&gt;
 Docker kann auf weiteren Betriebssystemen wie Windows oder MacOS verwendet werden. Jedoch wird hierbei ein Hostsystem mit Linux Kernel emuliert bzw. virtualisiert, welches für das Ausführen des Docker Daemons zuständig ist.&lt;br /&gt;
&lt;br /&gt;
=== Container Isolierung ===&lt;br /&gt;
&lt;br /&gt;
Um den starken Isolationsgrad zu erreichen, d.h.: Anwendungungen im Container von anderen Anwendungen zu trennen, werden einige Features des Linux Kernels benötigt. Das folgende wird möglicherweise auch das Verständnis von Isolation verbessern:&lt;br /&gt;
&lt;br /&gt;
==== Namespaces ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;Namespaces are a feature of the Linux kernel that partition kernel resources such that one set of processes sees one set of resources, while another set of processes sees a different set of resources. The feature works by having the same namespace for a set of resources and processes, but those namespaces refer to distinct resources. Resources may exist in multiple spaces. Examples of such resources are process IDs, host-names, user IDs, file names, some names associated with network access, and Inter-process communication.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Linux_namespaces&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PID Namespace&#039;&#039;&#039; - Jeder Container hat seinen eigenen Prozess-ID-Namespace, was bedeutet, dass die Prozesse in einem Container nur ihre eigenen Prozess-IDs sehen können und nicht die IDs der Prozesse außerhalb des Containers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Network Namespace&#039;&#039;&#039; - Docker erstellt für jeden Container einen eigenen Netzwerknamespace. Das bedeutet, dass jeder Container sein eigenes Netzwerkinterface, seine eigenen IP-Adressen, Routing-Tabellen usw. hat. Dadurch können Container voneinander isoliert sein und unabhängig voneinander agieren.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mount Namespace&#039;&#039;&#039; - Mount Namespaces isolieren das Dateisystem des Containers von dem des Hostsystems. Jeder Container hat sein eigenes Dateisystem, was es ermöglicht, dass verschiedene Container unterschiedliche Dateisysteme nutzen können, ohne sich gegenseitig zu beeinflussen.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;IPC Namespace&#039;&#039;&#039; - IPC (Inter Process Communication) Namespaces isolieren die Interprozesskommunikation, wie zum Beispiel die Verwendung von Shared Memory oder IPC Pipes. Dadurch sind die Kommunikationsmechanismen zwischen Prozessen in verschiedenen Containern getrennt.&lt;br /&gt;
&lt;br /&gt;
==== CGroups ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;cgroups (abbreviated from control groups) is a Linux kernel feature that limits, accounts for, and isolates the resource usage (CPU, memory, disk I/O, etc.[1]) of a collection of processes.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Cgroups&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CPU-Begrenzung&#039;&#039;&#039; - Mit cgroups kann Docker die CPU-Nutzung jedes Containers begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht mehr CPU-Ressourcen verwendet als ihm zugewiesen wurden, und um sicherzustellen, dass andere Container und Anwendungen auf dem Hostsystem ausreichend CPU-Zeit erhalten.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Speicherbegrenzung&#039;&#039;&#039; - Docker kann die Menge an Arbeitsspeicher, die von einem Container verwendet werden kann, mithilfe von cgroups begrenzen. Dies hilft dabei, zu verhindern, dass ein einzelner Container zu viel Arbeitsspeicher beansprucht und das gesamte System zum Absturz bringt.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;I/O-Begrenzung&#039;&#039;&#039; - Durch cgroups kann Docker die Ein- und Ausgabegeschwindigkeit für einen Container begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht zu viel Festplatten- oder Netzwerkbandbreite beansprucht und dadurch die Leistung anderer Container beeinträchtigt.&lt;br /&gt;
&lt;br /&gt;
==== Weitere Mechanismen ====&lt;br /&gt;
* SELinux&lt;br /&gt;
* AppArmor&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen finden sich [https://medium.com/@BeNitinAgarwal/understanding-the-docker-internals-7ccb052ce9fe hier]&lt;br /&gt;
&lt;br /&gt;
=== Aufbau von Docker ===&lt;br /&gt;
&lt;br /&gt;
Docker besteht aus den folgend genannten Komponenten:&lt;br /&gt;
&lt;br /&gt;
==== Images ====&lt;br /&gt;
Images bilden in sich abgeschlossenen Applikationen welche mit der &#039;&#039;&#039;Docker Engine&#039;&#039;&#039; erstellt und gestartet (&#039;&#039;&#039;Container&#039;&#039;&#039;) werden können.&lt;br /&gt;
&lt;br /&gt;
==== Registry ====&lt;br /&gt;
Eine zentrale stelle an der Docker Images gespeichert und abgerufen werden kann. Die wohl bekannteste Registry ist [https://hub.docker.com/ dockerhub]. Es kann jedoch auch eine eigene Registry erstellt werden.&lt;br /&gt;
&lt;br /&gt;
==== Engine ====&lt;br /&gt;
Die Docker Engine ist das Herzstück von Docker. Sie besteht aus drei Komponenten:&lt;br /&gt;
# &#039;&#039;&#039;Docker-Daemon&#039;&#039;&#039; - Der Docker-Daemon läuft als Hintergrundprozess auf dem Host System. Dieser ist die zentrale Steuerung der Docker Engine und ist zuständig für sämtliche Verwaltungsaufgaben (z.B.: Anlegen von Netzwerken, Volumes, Images und Containern)&lt;br /&gt;
# &#039;&#039;&#039;REST Api&#039;&#039;&#039; - Dient der Kommunikation mit dem Docker Daemon&lt;br /&gt;
# &#039;&#039;&#039;Command Line Interface&#039;&#039;&#039; - Kommuniziert über die REST Api mit dem Daemon und ermöglicht dem User das ausführen von Docker Befehlen&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.ionos.at/digitalguide/server/konfiguration/docker-tutorial-installation-und-erste-schritte&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Docker_2024_04/Containers|Container]] ===&lt;br /&gt;
=== [[Docker_2024_04/Networking|Networking]] ===&lt;br /&gt;
=== [[Docker_2024_04/Image|Image erstellen]] ===&lt;br /&gt;
=== [[Docker_2024_04/Resource Restriction|Resourcen limitieren]] ===&lt;br /&gt;
=== [[Docker_2024_04/Docker Compose|Docker Compose]] ===&lt;br /&gt;
=== [[Docker_2024_04/Registry|Registry]] ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3534</id>
		<title>Docker 2024 04</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3534"/>
		<updated>2024-04-18T13:06:22Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Schulung Docker 2024/04 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Schulung Docker 2024/04 =&lt;br /&gt;
In der folgenden Schulung soll ein grundlegendes Verständnis für die Containerisierung erworben werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Teilnehmer_innen sollen nach der Schulung in der Lage sein&#039;&#039;&#039;&lt;br /&gt;
* bestehende Docker Images ausführen&lt;br /&gt;
* eigene Docker Images zu erstellen und diese mittels {{BSL|docker run}} und {{BSL|docker compose}} zu starten&lt;br /&gt;
* die bereitgestellten Ressourcen für Arbeitsspeicher, CPU Zeit und Disk IO zu modifizieren&lt;br /&gt;
* die Einsatzzwecke der verschiedenen Networking Modelle (insbesondere Bridge und Host Network) zu unterscheiden und diese anwenden können&lt;br /&gt;
* eine eigene Image Registry zu erstellen und dort Images ablegen und abrufen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welche Bereiche werden explizit ausgeklammert:&#039;&#039;&#039;&lt;br /&gt;
* Limitierung von Netzwerkresourcen ([https://man7.org/linux/man-pages/man8/tc.8.html siehe tc])&lt;br /&gt;
* Limitierung von Speicherplatz ([https://de.wikipedia.org/wiki/XFS_(Dateisystem) siehe XFS])&lt;br /&gt;
&lt;br /&gt;
== Virtualisierung vs Containerisierung ==&lt;br /&gt;
&lt;br /&gt;
Beide Varianten bieten die Möglichkeit Applikationen isoliert von anderen Prozessen auszuführen. Im Gegensatz zur Containerisierung wird bei der Virtualisierung ein komplettes Betriebssystem mit entsprechenden Anwendungen gestartet.&lt;br /&gt;
&lt;br /&gt;
=== Gründe für Virtualisierung und Containerisierung ===&lt;br /&gt;
Programme können lokal, oder auf Servern installiert werden. Hierfür benötigt es keine der beiden Technologien.&lt;br /&gt;
Folgende Gründe sprechen jedoch für die Verwendung dieser Technologien:&lt;br /&gt;
 &#039;&#039;&#039;Teilen von Hardware Ressourcen&#039;&#039;&#039;&lt;br /&gt;
 Virtualisierung bietet die Möglichkeit physische Hardware auf mehrere Betriebssysteme zu verteilen.&lt;br /&gt;
 Containerisierung bietet die Möglichkeit physische Hardware auf mehrere Applikationen zu verteilen.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Isolationsgrad&#039;&#039;&#039;&lt;br /&gt;
 Fehlerhafte Anwendungen oder Sicherheitslücken wirken sich nicht auf das gesamte System aus.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Übertragbarkeit&#039;&#039;&#039;&lt;br /&gt;
 Ein weiterer Vorteil der Virtualisierung bzw. Containerisierung ist die in sich abgeschlossene und übertragbare Umgebung. Eine gekapselte Anwendung kann so auf nahezu jedem System ausgeführt werden. Die Abhängigkeiten beschränken sich hierbei auf ein Minimum.&lt;br /&gt;
&lt;br /&gt;
=== Virtualisierung ===&lt;br /&gt;
Bei der Virtualisierung übernimmt der &#039;&#039;&#039;Hypervisor&#039;&#039;&#039; das erstellen, starten und das Zuteilen der Hardwareressourcen des Hosts an die virtualisierten Gast Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
 Ein Hypervisor ist eine Software, die virtuelle Maschinen (VMs) erstellt und ausführt. Ein Hypervisor, manchmal auch Virtual Machine Monitor (VMM) genannt, isoliert das Hypervisor-Betriebssystem und die Ressourcen von den virtuellen Maschinen und ermöglicht die Erstellung und Verwaltung dieser VMs.&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hypervisoren können in verschiedene Typen eingeteilt werden:&lt;br /&gt;
* &#039;&#039;&#039;Typ 1&#039;&#039;&#039;, Läuft direkt auf der Hardware (z.B.: KVM, Microsoft Hyper-V und VMware vSphere)&lt;br /&gt;
* &#039;&#039;&#039;Typ 2&#039;&#039;&#039;, Läuft auf einem Host Betriebssystem (z.B.: VMware Workstation und Oracle VirtualBox)&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Virtual-Machines.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Containerisierung ===&lt;br /&gt;
 Unter Containerisierung versteht man das Zusammenfassen von Softwarecode mit den für die Ausführung des Codes erforderlichen Betriebssystembibliotheken und Abhängigkeiten zu einer einzigen ausführbaren Datei, die als Container bezeichnet wird und in jeder Infrastruktur konsistent ausgeführt werden kann. Container sind portabler und ressourceneffizienter als virtuelle Maschinen (VMs) und haben sich de facto zu den Recheneinheiten moderner cloudnativer Anwendungen entwickelt.&amp;lt;ref&amp;gt;https://www.ibm.com/de-de/topics/containerization&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Container Lösungen bieten im Vergleich zur Virtualisierung eine leichtgewichtigere Möglichkeit Applikationen isoliert zu starten. Folgende Informationen beziehen sich auf Docker, sind aber möglicherweise auch auf andere Container Lösungen (wie z.B.: LXC) übertragbar.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zur Virtualisierung wird bei der Containerisierung nur die zu startende Anwendung und ihre Abhängigkeiten gestartet. Es wird kein komplettes Betriebssystem initialisiert. Der Container teilt sich den Kernel mit dem Hostbetriebssystem. Die Isolierung zu den Hostanwendungen erfolgt durch verschiedene andere Mechanismen die im weiteren Verlauf erklärt werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Containers.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Vor- und Nachteile ===&lt;br /&gt;
Folgend eine sehr vereinfachte Gegenüberstellung:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Virtualisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Sehr hoher Isolationsgrad&lt;br /&gt;
 Negativ: Höherer Ressourcenverbrauch&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Containerisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Geringer Ressourcenverbrauch&lt;br /&gt;
 Negativ: Nicht so hoher Isolationsgrad, Host Kernel wird direkt von allen Containern verwendet&lt;br /&gt;
&lt;br /&gt;
== Docker ==&lt;br /&gt;
&lt;br /&gt;
Docker ist eine der am weitesten verbreiteten und unterstützten Container Lösungen. Docker selbst kann nur in Verbindung mit dem Linux Kernel verwendet werden.&lt;br /&gt;
 Docker kann auf weiteren Betriebssystemen wie Windows oder MacOS verwendet werden. Jedoch wird hierbei ein Hostsystem mit Linux Kernel emuliert bzw. virtualisiert, welches für das Ausführen des Docker Daemons zuständig ist.&lt;br /&gt;
&lt;br /&gt;
=== Container Isolierung ===&lt;br /&gt;
&lt;br /&gt;
Um den starken Isolationsgrad zu erreichen, d.h.: Anwendungungen im Container von anderen Anwendungen zu trennen, werden einige Features des Linux Kernels benötigt. Das folgende wird möglicherweise auch das Verständnis von Isolation verbessern:&lt;br /&gt;
&lt;br /&gt;
==== Namespaces ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;Namespaces are a feature of the Linux kernel that partition kernel resources such that one set of processes sees one set of resources, while another set of processes sees a different set of resources. The feature works by having the same namespace for a set of resources and processes, but those namespaces refer to distinct resources. Resources may exist in multiple spaces. Examples of such resources are process IDs, host-names, user IDs, file names, some names associated with network access, and Inter-process communication.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Linux_namespaces&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PID Namespace&#039;&#039;&#039; - Jeder Container hat seinen eigenen Prozess-ID-Namespace, was bedeutet, dass die Prozesse in einem Container nur ihre eigenen Prozess-IDs sehen können und nicht die IDs der Prozesse außerhalb des Containers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Network Namespace&#039;&#039;&#039; - Docker erstellt für jeden Container einen eigenen Netzwerknamespace. Das bedeutet, dass jeder Container sein eigenes Netzwerkinterface, seine eigenen IP-Adressen, Routing-Tabellen usw. hat. Dadurch können Container voneinander isoliert sein und unabhängig voneinander agieren.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mount Namespace&#039;&#039;&#039; - Mount Namespaces isolieren das Dateisystem des Containers von dem des Hostsystems. Jeder Container hat sein eigenes Dateisystem, was es ermöglicht, dass verschiedene Container unterschiedliche Dateisysteme nutzen können, ohne sich gegenseitig zu beeinflussen.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;IPC Namespace&#039;&#039;&#039; - IPC (Inter Process Communication) Namespaces isolieren die Interprozesskommunikation, wie zum Beispiel die Verwendung von Shared Memory oder IPC Pipes. Dadurch sind die Kommunikationsmechanismen zwischen Prozessen in verschiedenen Containern getrennt.&lt;br /&gt;
&lt;br /&gt;
==== CGroups ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;cgroups (abbreviated from control groups) is a Linux kernel feature that limits, accounts for, and isolates the resource usage (CPU, memory, disk I/O, etc.[1]) of a collection of processes.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Cgroups&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CPU-Begrenzung&#039;&#039;&#039; - Mit cgroups kann Docker die CPU-Nutzung jedes Containers begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht mehr CPU-Ressourcen verwendet als ihm zugewiesen wurden, und um sicherzustellen, dass andere Container und Anwendungen auf dem Hostsystem ausreichend CPU-Zeit erhalten.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Speicherbegrenzung&#039;&#039;&#039; - Docker kann die Menge an Arbeitsspeicher, die von einem Container verwendet werden kann, mithilfe von cgroups begrenzen. Dies hilft dabei, zu verhindern, dass ein einzelner Container zu viel Arbeitsspeicher beansprucht und das gesamte System zum Absturz bringt.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;I/O-Begrenzung&#039;&#039;&#039; - Durch cgroups kann Docker die Ein- und Ausgabegeschwindigkeit für einen Container begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht zu viel Festplatten- oder Netzwerkbandbreite beansprucht und dadurch die Leistung anderer Container beeinträchtigt.&lt;br /&gt;
&lt;br /&gt;
==== Weitere Mechanismen ====&lt;br /&gt;
* SELinux&lt;br /&gt;
* AppArmor&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen finden sich [https://medium.com/@BeNitinAgarwal/understanding-the-docker-internals-7ccb052ce9fe hier]&lt;br /&gt;
&lt;br /&gt;
=== Aufbau von Docker ===&lt;br /&gt;
&lt;br /&gt;
Docker besteht aus den folgend genannten Komponenten:&lt;br /&gt;
&lt;br /&gt;
==== Images ====&lt;br /&gt;
Images bilden in sich abgeschlossenen Applikationen welche mit der &#039;&#039;&#039;Docker Engine&#039;&#039;&#039; erstellt und gestartet (&#039;&#039;&#039;Container&#039;&#039;&#039;) werden können.&lt;br /&gt;
&lt;br /&gt;
==== Registry ====&lt;br /&gt;
Eine zentrale stelle an der Docker Images gespeichert und abgerufen werden kann. Die wohl bekannteste Registry ist [https://hub.docker.com/ dockerhub]. Es kann jedoch auch eine eigene Registry erstellt werden.&lt;br /&gt;
&lt;br /&gt;
==== Engine ====&lt;br /&gt;
Die Docker Engine ist das Herzstück von Docker. Sie besteht aus drei Komponenten:&lt;br /&gt;
# &#039;&#039;&#039;Docker-Daemon&#039;&#039;&#039; - Der Docker-Daemon läuft als Hintergrundprozess auf dem Host System. Dieser ist die zentrale Steuerung der Docker Engine und ist zuständig für sämtliche Verwaltungsaufgaben (z.B.: Anlegen von Netzwerken, Volumes, Images und Containern)&lt;br /&gt;
# &#039;&#039;&#039;REST Api&#039;&#039;&#039; - Dient der Kommunikation mit dem Docker Daemon&lt;br /&gt;
# &#039;&#039;&#039;Command Line Interface&#039;&#039;&#039; - Kommuniziert über die REST Api mit dem Daemon und ermöglicht dem User das ausführen von Docker Befehlen&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.ionos.at/digitalguide/server/konfiguration/docker-tutorial-installation-und-erste-schritte&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Docker_2024_04/Containers|Container]] ===&lt;br /&gt;
=== [[Docker_2024_04/Networking|Networking]] ===&lt;br /&gt;
=== [[Docker_2024_04/Image|Image erstellen]] ===&lt;br /&gt;
=== [[Docker_2024_04/Resource Restriction|Resourcen limitieren]] ===&lt;br /&gt;
=== [[Docker_2024_04/Docker Compose|Docker Compose]] ===&lt;br /&gt;
=== [[Docker_2024_04/Registry|Registry]] ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3533</id>
		<title>Docker 2024 04</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3533"/>
		<updated>2024-04-18T13:06:11Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Schulung Docker 2024/04 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Schulung Docker 2024/04 =&lt;br /&gt;
In der folgenden Schulung soll ein grundlegendes Verständnis für die Containerisierung erworben werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Teilnehmer_innen sollen nach der Schulung in der Lage sein&#039;&#039;&#039;&lt;br /&gt;
* bestehende Images ausführen&lt;br /&gt;
* eigene Docker Images zu erstellen und diese mittels {{BSL|docker run}} und {{BSL|docker compose}} zu starten&lt;br /&gt;
* die bereitgestellten Ressourcen für Arbeitsspeicher, CPU Zeit und Disk IO zu modifizieren&lt;br /&gt;
* die Einsatzzwecke der verschiedenen Networking Modelle (insbesondere Bridge und Host Network) zu unterscheiden und diese anwenden können&lt;br /&gt;
* eine eigene Image Registry zu erstellen und dort Images ablegen und abrufen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welche Bereiche werden explizit ausgeklammert:&#039;&#039;&#039;&lt;br /&gt;
* Limitierung von Netzwerkresourcen ([https://man7.org/linux/man-pages/man8/tc.8.html siehe tc])&lt;br /&gt;
* Limitierung von Speicherplatz ([https://de.wikipedia.org/wiki/XFS_(Dateisystem) siehe XFS])&lt;br /&gt;
&lt;br /&gt;
== Virtualisierung vs Containerisierung ==&lt;br /&gt;
&lt;br /&gt;
Beide Varianten bieten die Möglichkeit Applikationen isoliert von anderen Prozessen auszuführen. Im Gegensatz zur Containerisierung wird bei der Virtualisierung ein komplettes Betriebssystem mit entsprechenden Anwendungen gestartet.&lt;br /&gt;
&lt;br /&gt;
=== Gründe für Virtualisierung und Containerisierung ===&lt;br /&gt;
Programme können lokal, oder auf Servern installiert werden. Hierfür benötigt es keine der beiden Technologien.&lt;br /&gt;
Folgende Gründe sprechen jedoch für die Verwendung dieser Technologien:&lt;br /&gt;
 &#039;&#039;&#039;Teilen von Hardware Ressourcen&#039;&#039;&#039;&lt;br /&gt;
 Virtualisierung bietet die Möglichkeit physische Hardware auf mehrere Betriebssysteme zu verteilen.&lt;br /&gt;
 Containerisierung bietet die Möglichkeit physische Hardware auf mehrere Applikationen zu verteilen.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Isolationsgrad&#039;&#039;&#039;&lt;br /&gt;
 Fehlerhafte Anwendungen oder Sicherheitslücken wirken sich nicht auf das gesamte System aus.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Übertragbarkeit&#039;&#039;&#039;&lt;br /&gt;
 Ein weiterer Vorteil der Virtualisierung bzw. Containerisierung ist die in sich abgeschlossene und übertragbare Umgebung. Eine gekapselte Anwendung kann so auf nahezu jedem System ausgeführt werden. Die Abhängigkeiten beschränken sich hierbei auf ein Minimum.&lt;br /&gt;
&lt;br /&gt;
=== Virtualisierung ===&lt;br /&gt;
Bei der Virtualisierung übernimmt der &#039;&#039;&#039;Hypervisor&#039;&#039;&#039; das erstellen, starten und das Zuteilen der Hardwareressourcen des Hosts an die virtualisierten Gast Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
 Ein Hypervisor ist eine Software, die virtuelle Maschinen (VMs) erstellt und ausführt. Ein Hypervisor, manchmal auch Virtual Machine Monitor (VMM) genannt, isoliert das Hypervisor-Betriebssystem und die Ressourcen von den virtuellen Maschinen und ermöglicht die Erstellung und Verwaltung dieser VMs.&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hypervisoren können in verschiedene Typen eingeteilt werden:&lt;br /&gt;
* &#039;&#039;&#039;Typ 1&#039;&#039;&#039;, Läuft direkt auf der Hardware (z.B.: KVM, Microsoft Hyper-V und VMware vSphere)&lt;br /&gt;
* &#039;&#039;&#039;Typ 2&#039;&#039;&#039;, Läuft auf einem Host Betriebssystem (z.B.: VMware Workstation und Oracle VirtualBox)&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Virtual-Machines.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Containerisierung ===&lt;br /&gt;
 Unter Containerisierung versteht man das Zusammenfassen von Softwarecode mit den für die Ausführung des Codes erforderlichen Betriebssystembibliotheken und Abhängigkeiten zu einer einzigen ausführbaren Datei, die als Container bezeichnet wird und in jeder Infrastruktur konsistent ausgeführt werden kann. Container sind portabler und ressourceneffizienter als virtuelle Maschinen (VMs) und haben sich de facto zu den Recheneinheiten moderner cloudnativer Anwendungen entwickelt.&amp;lt;ref&amp;gt;https://www.ibm.com/de-de/topics/containerization&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Container Lösungen bieten im Vergleich zur Virtualisierung eine leichtgewichtigere Möglichkeit Applikationen isoliert zu starten. Folgende Informationen beziehen sich auf Docker, sind aber möglicherweise auch auf andere Container Lösungen (wie z.B.: LXC) übertragbar.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zur Virtualisierung wird bei der Containerisierung nur die zu startende Anwendung und ihre Abhängigkeiten gestartet. Es wird kein komplettes Betriebssystem initialisiert. Der Container teilt sich den Kernel mit dem Hostbetriebssystem. Die Isolierung zu den Hostanwendungen erfolgt durch verschiedene andere Mechanismen die im weiteren Verlauf erklärt werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Containers.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Vor- und Nachteile ===&lt;br /&gt;
Folgend eine sehr vereinfachte Gegenüberstellung:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Virtualisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Sehr hoher Isolationsgrad&lt;br /&gt;
 Negativ: Höherer Ressourcenverbrauch&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Containerisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Geringer Ressourcenverbrauch&lt;br /&gt;
 Negativ: Nicht so hoher Isolationsgrad, Host Kernel wird direkt von allen Containern verwendet&lt;br /&gt;
&lt;br /&gt;
== Docker ==&lt;br /&gt;
&lt;br /&gt;
Docker ist eine der am weitesten verbreiteten und unterstützten Container Lösungen. Docker selbst kann nur in Verbindung mit dem Linux Kernel verwendet werden.&lt;br /&gt;
 Docker kann auf weiteren Betriebssystemen wie Windows oder MacOS verwendet werden. Jedoch wird hierbei ein Hostsystem mit Linux Kernel emuliert bzw. virtualisiert, welches für das Ausführen des Docker Daemons zuständig ist.&lt;br /&gt;
&lt;br /&gt;
=== Container Isolierung ===&lt;br /&gt;
&lt;br /&gt;
Um den starken Isolationsgrad zu erreichen, d.h.: Anwendungungen im Container von anderen Anwendungen zu trennen, werden einige Features des Linux Kernels benötigt. Das folgende wird möglicherweise auch das Verständnis von Isolation verbessern:&lt;br /&gt;
&lt;br /&gt;
==== Namespaces ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;Namespaces are a feature of the Linux kernel that partition kernel resources such that one set of processes sees one set of resources, while another set of processes sees a different set of resources. The feature works by having the same namespace for a set of resources and processes, but those namespaces refer to distinct resources. Resources may exist in multiple spaces. Examples of such resources are process IDs, host-names, user IDs, file names, some names associated with network access, and Inter-process communication.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Linux_namespaces&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PID Namespace&#039;&#039;&#039; - Jeder Container hat seinen eigenen Prozess-ID-Namespace, was bedeutet, dass die Prozesse in einem Container nur ihre eigenen Prozess-IDs sehen können und nicht die IDs der Prozesse außerhalb des Containers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Network Namespace&#039;&#039;&#039; - Docker erstellt für jeden Container einen eigenen Netzwerknamespace. Das bedeutet, dass jeder Container sein eigenes Netzwerkinterface, seine eigenen IP-Adressen, Routing-Tabellen usw. hat. Dadurch können Container voneinander isoliert sein und unabhängig voneinander agieren.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mount Namespace&#039;&#039;&#039; - Mount Namespaces isolieren das Dateisystem des Containers von dem des Hostsystems. Jeder Container hat sein eigenes Dateisystem, was es ermöglicht, dass verschiedene Container unterschiedliche Dateisysteme nutzen können, ohne sich gegenseitig zu beeinflussen.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;IPC Namespace&#039;&#039;&#039; - IPC (Inter Process Communication) Namespaces isolieren die Interprozesskommunikation, wie zum Beispiel die Verwendung von Shared Memory oder IPC Pipes. Dadurch sind die Kommunikationsmechanismen zwischen Prozessen in verschiedenen Containern getrennt.&lt;br /&gt;
&lt;br /&gt;
==== CGroups ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;cgroups (abbreviated from control groups) is a Linux kernel feature that limits, accounts for, and isolates the resource usage (CPU, memory, disk I/O, etc.[1]) of a collection of processes.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Cgroups&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CPU-Begrenzung&#039;&#039;&#039; - Mit cgroups kann Docker die CPU-Nutzung jedes Containers begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht mehr CPU-Ressourcen verwendet als ihm zugewiesen wurden, und um sicherzustellen, dass andere Container und Anwendungen auf dem Hostsystem ausreichend CPU-Zeit erhalten.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Speicherbegrenzung&#039;&#039;&#039; - Docker kann die Menge an Arbeitsspeicher, die von einem Container verwendet werden kann, mithilfe von cgroups begrenzen. Dies hilft dabei, zu verhindern, dass ein einzelner Container zu viel Arbeitsspeicher beansprucht und das gesamte System zum Absturz bringt.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;I/O-Begrenzung&#039;&#039;&#039; - Durch cgroups kann Docker die Ein- und Ausgabegeschwindigkeit für einen Container begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht zu viel Festplatten- oder Netzwerkbandbreite beansprucht und dadurch die Leistung anderer Container beeinträchtigt.&lt;br /&gt;
&lt;br /&gt;
==== Weitere Mechanismen ====&lt;br /&gt;
* SELinux&lt;br /&gt;
* AppArmor&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen finden sich [https://medium.com/@BeNitinAgarwal/understanding-the-docker-internals-7ccb052ce9fe hier]&lt;br /&gt;
&lt;br /&gt;
=== Aufbau von Docker ===&lt;br /&gt;
&lt;br /&gt;
Docker besteht aus den folgend genannten Komponenten:&lt;br /&gt;
&lt;br /&gt;
==== Images ====&lt;br /&gt;
Images bilden in sich abgeschlossenen Applikationen welche mit der &#039;&#039;&#039;Docker Engine&#039;&#039;&#039; erstellt und gestartet (&#039;&#039;&#039;Container&#039;&#039;&#039;) werden können.&lt;br /&gt;
&lt;br /&gt;
==== Registry ====&lt;br /&gt;
Eine zentrale stelle an der Docker Images gespeichert und abgerufen werden kann. Die wohl bekannteste Registry ist [https://hub.docker.com/ dockerhub]. Es kann jedoch auch eine eigene Registry erstellt werden.&lt;br /&gt;
&lt;br /&gt;
==== Engine ====&lt;br /&gt;
Die Docker Engine ist das Herzstück von Docker. Sie besteht aus drei Komponenten:&lt;br /&gt;
# &#039;&#039;&#039;Docker-Daemon&#039;&#039;&#039; - Der Docker-Daemon läuft als Hintergrundprozess auf dem Host System. Dieser ist die zentrale Steuerung der Docker Engine und ist zuständig für sämtliche Verwaltungsaufgaben (z.B.: Anlegen von Netzwerken, Volumes, Images und Containern)&lt;br /&gt;
# &#039;&#039;&#039;REST Api&#039;&#039;&#039; - Dient der Kommunikation mit dem Docker Daemon&lt;br /&gt;
# &#039;&#039;&#039;Command Line Interface&#039;&#039;&#039; - Kommuniziert über die REST Api mit dem Daemon und ermöglicht dem User das ausführen von Docker Befehlen&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.ionos.at/digitalguide/server/konfiguration/docker-tutorial-installation-und-erste-schritte&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Docker_2024_04/Containers|Container]] ===&lt;br /&gt;
=== [[Docker_2024_04/Networking|Networking]] ===&lt;br /&gt;
=== [[Docker_2024_04/Image|Image erstellen]] ===&lt;br /&gt;
=== [[Docker_2024_04/Resource Restriction|Resourcen limitieren]] ===&lt;br /&gt;
=== [[Docker_2024_04/Docker Compose|Docker Compose]] ===&lt;br /&gt;
=== [[Docker_2024_04/Registry|Registry]] ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3532</id>
		<title>Docker 2024 04</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3532"/>
		<updated>2024-04-18T12:59:52Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Docker */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Schulung Docker 2024/04 =&lt;br /&gt;
In der folgenden Schulung soll ein grundlegendes Verständnis für die Containerisierung erworben werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Teilnehmer_innen sollen nach der Schulung in der Lage sein&#039;&#039;&#039;&lt;br /&gt;
* eigene Docker Images zu erstellen und diese mittels {{BSL|docker run}} und {{BSL|docker compose}} zu starten&lt;br /&gt;
* die bereitgestellten Ressourcen für Arbeitsspeicher, CPU Zeit und Disk IO zu modifizieren&lt;br /&gt;
* die Einsatzzwecke der verschiedenen Networking Modelle (insbesondere Bridge und Host Network) zu unterscheiden und diese anwenden können&lt;br /&gt;
* eine eigene Image Registry zu erstellen und dort Images ablegen und abrufen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welche Bereiche werden explizit ausgeklammert:&#039;&#039;&#039;&lt;br /&gt;
* Limitierung von Netzwerkresourcen ([https://man7.org/linux/man-pages/man8/tc.8.html siehe tc])&lt;br /&gt;
* Limitierung von Speicherplatz ([https://de.wikipedia.org/wiki/XFS_(Dateisystem) siehe XFS])&lt;br /&gt;
&lt;br /&gt;
== Virtualisierung vs Containerisierung ==&lt;br /&gt;
&lt;br /&gt;
Beide Varianten bieten die Möglichkeit Applikationen isoliert von anderen Prozessen auszuführen. Im Gegensatz zur Containerisierung wird bei der Virtualisierung ein komplettes Betriebssystem mit entsprechenden Anwendungen gestartet.&lt;br /&gt;
&lt;br /&gt;
=== Gründe für Virtualisierung und Containerisierung ===&lt;br /&gt;
Programme können lokal, oder auf Servern installiert werden. Hierfür benötigt es keine der beiden Technologien.&lt;br /&gt;
Folgende Gründe sprechen jedoch für die Verwendung dieser Technologien:&lt;br /&gt;
 &#039;&#039;&#039;Teilen von Hardware Ressourcen&#039;&#039;&#039;&lt;br /&gt;
 Virtualisierung bietet die Möglichkeit physische Hardware auf mehrere Betriebssysteme zu verteilen.&lt;br /&gt;
 Containerisierung bietet die Möglichkeit physische Hardware auf mehrere Applikationen zu verteilen.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Isolationsgrad&#039;&#039;&#039;&lt;br /&gt;
 Fehlerhafte Anwendungen oder Sicherheitslücken wirken sich nicht auf das gesamte System aus.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Übertragbarkeit&#039;&#039;&#039;&lt;br /&gt;
 Ein weiterer Vorteil der Virtualisierung bzw. Containerisierung ist die in sich abgeschlossene und übertragbare Umgebung. Eine gekapselte Anwendung kann so auf nahezu jedem System ausgeführt werden. Die Abhängigkeiten beschränken sich hierbei auf ein Minimum.&lt;br /&gt;
&lt;br /&gt;
=== Virtualisierung ===&lt;br /&gt;
Bei der Virtualisierung übernimmt der &#039;&#039;&#039;Hypervisor&#039;&#039;&#039; das erstellen, starten und das Zuteilen der Hardwareressourcen des Hosts an die virtualisierten Gast Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
 Ein Hypervisor ist eine Software, die virtuelle Maschinen (VMs) erstellt und ausführt. Ein Hypervisor, manchmal auch Virtual Machine Monitor (VMM) genannt, isoliert das Hypervisor-Betriebssystem und die Ressourcen von den virtuellen Maschinen und ermöglicht die Erstellung und Verwaltung dieser VMs.&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hypervisoren können in verschiedene Typen eingeteilt werden:&lt;br /&gt;
* &#039;&#039;&#039;Typ 1&#039;&#039;&#039;, Läuft direkt auf der Hardware (z.B.: KVM, Microsoft Hyper-V und VMware vSphere)&lt;br /&gt;
* &#039;&#039;&#039;Typ 2&#039;&#039;&#039;, Läuft auf einem Host Betriebssystem (z.B.: VMware Workstation und Oracle VirtualBox)&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Virtual-Machines.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Containerisierung ===&lt;br /&gt;
 Unter Containerisierung versteht man das Zusammenfassen von Softwarecode mit den für die Ausführung des Codes erforderlichen Betriebssystembibliotheken und Abhängigkeiten zu einer einzigen ausführbaren Datei, die als Container bezeichnet wird und in jeder Infrastruktur konsistent ausgeführt werden kann. Container sind portabler und ressourceneffizienter als virtuelle Maschinen (VMs) und haben sich de facto zu den Recheneinheiten moderner cloudnativer Anwendungen entwickelt.&amp;lt;ref&amp;gt;https://www.ibm.com/de-de/topics/containerization&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Container Lösungen bieten im Vergleich zur Virtualisierung eine leichtgewichtigere Möglichkeit Applikationen isoliert zu starten. Folgende Informationen beziehen sich auf Docker, sind aber möglicherweise auch auf andere Container Lösungen (wie z.B.: LXC) übertragbar.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zur Virtualisierung wird bei der Containerisierung nur die zu startende Anwendung und ihre Abhängigkeiten gestartet. Es wird kein komplettes Betriebssystem initialisiert. Der Container teilt sich den Kernel mit dem Hostbetriebssystem. Die Isolierung zu den Hostanwendungen erfolgt durch verschiedene andere Mechanismen die im weiteren Verlauf erklärt werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Containers.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Vor- und Nachteile ===&lt;br /&gt;
Folgend eine sehr vereinfachte Gegenüberstellung:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Virtualisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Sehr hoher Isolationsgrad&lt;br /&gt;
 Negativ: Höherer Ressourcenverbrauch&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Containerisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Geringer Ressourcenverbrauch&lt;br /&gt;
 Negativ: Nicht so hoher Isolationsgrad, Host Kernel wird direkt von allen Containern verwendet&lt;br /&gt;
&lt;br /&gt;
== Docker ==&lt;br /&gt;
&lt;br /&gt;
Docker ist eine der am weitesten verbreiteten und unterstützten Container Lösungen. Docker selbst kann nur in Verbindung mit dem Linux Kernel verwendet werden.&lt;br /&gt;
 Docker kann auf weiteren Betriebssystemen wie Windows oder MacOS verwendet werden. Jedoch wird hierbei ein Hostsystem mit Linux Kernel emuliert bzw. virtualisiert, welches für das Ausführen des Docker Daemons zuständig ist.&lt;br /&gt;
&lt;br /&gt;
=== Container Isolierung ===&lt;br /&gt;
&lt;br /&gt;
Um den starken Isolationsgrad zu erreichen, d.h.: Anwendungungen im Container von anderen Anwendungen zu trennen, werden einige Features des Linux Kernels benötigt. Das folgende wird möglicherweise auch das Verständnis von Isolation verbessern:&lt;br /&gt;
&lt;br /&gt;
==== Namespaces ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;Namespaces are a feature of the Linux kernel that partition kernel resources such that one set of processes sees one set of resources, while another set of processes sees a different set of resources. The feature works by having the same namespace for a set of resources and processes, but those namespaces refer to distinct resources. Resources may exist in multiple spaces. Examples of such resources are process IDs, host-names, user IDs, file names, some names associated with network access, and Inter-process communication.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Linux_namespaces&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PID Namespace&#039;&#039;&#039; - Jeder Container hat seinen eigenen Prozess-ID-Namespace, was bedeutet, dass die Prozesse in einem Container nur ihre eigenen Prozess-IDs sehen können und nicht die IDs der Prozesse außerhalb des Containers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Network Namespace&#039;&#039;&#039; - Docker erstellt für jeden Container einen eigenen Netzwerknamespace. Das bedeutet, dass jeder Container sein eigenes Netzwerkinterface, seine eigenen IP-Adressen, Routing-Tabellen usw. hat. Dadurch können Container voneinander isoliert sein und unabhängig voneinander agieren.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mount Namespace&#039;&#039;&#039; - Mount Namespaces isolieren das Dateisystem des Containers von dem des Hostsystems. Jeder Container hat sein eigenes Dateisystem, was es ermöglicht, dass verschiedene Container unterschiedliche Dateisysteme nutzen können, ohne sich gegenseitig zu beeinflussen.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;IPC Namespace&#039;&#039;&#039; - IPC (Inter Process Communication) Namespaces isolieren die Interprozesskommunikation, wie zum Beispiel die Verwendung von Shared Memory oder IPC Pipes. Dadurch sind die Kommunikationsmechanismen zwischen Prozessen in verschiedenen Containern getrennt.&lt;br /&gt;
&lt;br /&gt;
==== CGroups ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;cgroups (abbreviated from control groups) is a Linux kernel feature that limits, accounts for, and isolates the resource usage (CPU, memory, disk I/O, etc.[1]) of a collection of processes.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Cgroups&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CPU-Begrenzung&#039;&#039;&#039; - Mit cgroups kann Docker die CPU-Nutzung jedes Containers begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht mehr CPU-Ressourcen verwendet als ihm zugewiesen wurden, und um sicherzustellen, dass andere Container und Anwendungen auf dem Hostsystem ausreichend CPU-Zeit erhalten.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Speicherbegrenzung&#039;&#039;&#039; - Docker kann die Menge an Arbeitsspeicher, die von einem Container verwendet werden kann, mithilfe von cgroups begrenzen. Dies hilft dabei, zu verhindern, dass ein einzelner Container zu viel Arbeitsspeicher beansprucht und das gesamte System zum Absturz bringt.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;I/O-Begrenzung&#039;&#039;&#039; - Durch cgroups kann Docker die Ein- und Ausgabegeschwindigkeit für einen Container begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht zu viel Festplatten- oder Netzwerkbandbreite beansprucht und dadurch die Leistung anderer Container beeinträchtigt.&lt;br /&gt;
&lt;br /&gt;
==== Weitere Mechanismen ====&lt;br /&gt;
* SELinux&lt;br /&gt;
* AppArmor&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen finden sich [https://medium.com/@BeNitinAgarwal/understanding-the-docker-internals-7ccb052ce9fe hier]&lt;br /&gt;
&lt;br /&gt;
=== Aufbau von Docker ===&lt;br /&gt;
&lt;br /&gt;
Docker besteht aus den folgend genannten Komponenten:&lt;br /&gt;
&lt;br /&gt;
==== Images ====&lt;br /&gt;
Images bilden in sich abgeschlossenen Applikationen welche mit der &#039;&#039;&#039;Docker Engine&#039;&#039;&#039; erstellt und gestartet (&#039;&#039;&#039;Container&#039;&#039;&#039;) werden können.&lt;br /&gt;
&lt;br /&gt;
==== Registry ====&lt;br /&gt;
Eine zentrale stelle an der Docker Images gespeichert und abgerufen werden kann. Die wohl bekannteste Registry ist [https://hub.docker.com/ dockerhub]. Es kann jedoch auch eine eigene Registry erstellt werden.&lt;br /&gt;
&lt;br /&gt;
==== Engine ====&lt;br /&gt;
Die Docker Engine ist das Herzstück von Docker. Sie besteht aus drei Komponenten:&lt;br /&gt;
# &#039;&#039;&#039;Docker-Daemon&#039;&#039;&#039; - Der Docker-Daemon läuft als Hintergrundprozess auf dem Host System. Dieser ist die zentrale Steuerung der Docker Engine und ist zuständig für sämtliche Verwaltungsaufgaben (z.B.: Anlegen von Netzwerken, Volumes, Images und Containern)&lt;br /&gt;
# &#039;&#039;&#039;REST Api&#039;&#039;&#039; - Dient der Kommunikation mit dem Docker Daemon&lt;br /&gt;
# &#039;&#039;&#039;Command Line Interface&#039;&#039;&#039; - Kommuniziert über die REST Api mit dem Daemon und ermöglicht dem User das ausführen von Docker Befehlen&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.ionos.at/digitalguide/server/konfiguration/docker-tutorial-installation-und-erste-schritte&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Docker_2024_04/Containers|Container]] ===&lt;br /&gt;
=== [[Docker_2024_04/Networking|Networking]] ===&lt;br /&gt;
=== [[Docker_2024_04/Image|Image erstellen]] ===&lt;br /&gt;
=== [[Docker_2024_04/Resource Restriction|Resourcen limitieren]] ===&lt;br /&gt;
=== [[Docker_2024_04/Docker Compose|Docker Compose]] ===&lt;br /&gt;
=== [[Docker_2024_04/Registry|Registry]] ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3531</id>
		<title>Docker 2024 04</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3531"/>
		<updated>2024-04-18T12:58:47Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Containerisierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Schulung Docker 2024/04 =&lt;br /&gt;
In der folgenden Schulung soll ein grundlegendes Verständnis für die Containerisierung erworben werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Teilnehmer_innen sollen nach der Schulung in der Lage sein&#039;&#039;&#039;&lt;br /&gt;
* eigene Docker Images zu erstellen und diese mittels {{BSL|docker run}} und {{BSL|docker compose}} zu starten&lt;br /&gt;
* die bereitgestellten Ressourcen für Arbeitsspeicher, CPU Zeit und Disk IO zu modifizieren&lt;br /&gt;
* die Einsatzzwecke der verschiedenen Networking Modelle (insbesondere Bridge und Host Network) zu unterscheiden und diese anwenden können&lt;br /&gt;
* eine eigene Image Registry zu erstellen und dort Images ablegen und abrufen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welche Bereiche werden explizit ausgeklammert:&#039;&#039;&#039;&lt;br /&gt;
* Limitierung von Netzwerkresourcen ([https://man7.org/linux/man-pages/man8/tc.8.html siehe tc])&lt;br /&gt;
* Limitierung von Speicherplatz ([https://de.wikipedia.org/wiki/XFS_(Dateisystem) siehe XFS])&lt;br /&gt;
&lt;br /&gt;
== Virtualisierung vs Containerisierung ==&lt;br /&gt;
&lt;br /&gt;
Beide Varianten bieten die Möglichkeit Applikationen isoliert von anderen Prozessen auszuführen. Im Gegensatz zur Containerisierung wird bei der Virtualisierung ein komplettes Betriebssystem mit entsprechenden Anwendungen gestartet.&lt;br /&gt;
&lt;br /&gt;
=== Gründe für Virtualisierung und Containerisierung ===&lt;br /&gt;
Programme können lokal, oder auf Servern installiert werden. Hierfür benötigt es keine der beiden Technologien.&lt;br /&gt;
Folgende Gründe sprechen jedoch für die Verwendung dieser Technologien:&lt;br /&gt;
 &#039;&#039;&#039;Teilen von Hardware Ressourcen&#039;&#039;&#039;&lt;br /&gt;
 Virtualisierung bietet die Möglichkeit physische Hardware auf mehrere Betriebssysteme zu verteilen.&lt;br /&gt;
 Containerisierung bietet die Möglichkeit physische Hardware auf mehrere Applikationen zu verteilen.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Isolationsgrad&#039;&#039;&#039;&lt;br /&gt;
 Fehlerhafte Anwendungen oder Sicherheitslücken wirken sich nicht auf das gesamte System aus.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Übertragbarkeit&#039;&#039;&#039;&lt;br /&gt;
 Ein weiterer Vorteil der Virtualisierung bzw. Containerisierung ist die in sich abgeschlossene und übertragbare Umgebung. Eine gekapselte Anwendung kann so auf nahezu jedem System ausgeführt werden. Die Abhängigkeiten beschränken sich hierbei auf ein Minimum.&lt;br /&gt;
&lt;br /&gt;
=== Virtualisierung ===&lt;br /&gt;
Bei der Virtualisierung übernimmt der &#039;&#039;&#039;Hypervisor&#039;&#039;&#039; das erstellen, starten und das Zuteilen der Hardwareressourcen des Hosts an die virtualisierten Gast Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
 Ein Hypervisor ist eine Software, die virtuelle Maschinen (VMs) erstellt und ausführt. Ein Hypervisor, manchmal auch Virtual Machine Monitor (VMM) genannt, isoliert das Hypervisor-Betriebssystem und die Ressourcen von den virtuellen Maschinen und ermöglicht die Erstellung und Verwaltung dieser VMs.&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hypervisoren können in verschiedene Typen eingeteilt werden:&lt;br /&gt;
* &#039;&#039;&#039;Typ 1&#039;&#039;&#039;, Läuft direkt auf der Hardware (z.B.: KVM, Microsoft Hyper-V und VMware vSphere)&lt;br /&gt;
* &#039;&#039;&#039;Typ 2&#039;&#039;&#039;, Läuft auf einem Host Betriebssystem (z.B.: VMware Workstation und Oracle VirtualBox)&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Virtual-Machines.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Containerisierung ===&lt;br /&gt;
 Unter Containerisierung versteht man das Zusammenfassen von Softwarecode mit den für die Ausführung des Codes erforderlichen Betriebssystembibliotheken und Abhängigkeiten zu einer einzigen ausführbaren Datei, die als Container bezeichnet wird und in jeder Infrastruktur konsistent ausgeführt werden kann. Container sind portabler und ressourceneffizienter als virtuelle Maschinen (VMs) und haben sich de facto zu den Recheneinheiten moderner cloudnativer Anwendungen entwickelt.&amp;lt;ref&amp;gt;https://www.ibm.com/de-de/topics/containerization&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Container Lösungen bieten im Vergleich zur Virtualisierung eine leichtgewichtigere Möglichkeit Applikationen isoliert zu starten. Folgende Informationen beziehen sich auf Docker, sind aber möglicherweise auch auf andere Container Lösungen (wie z.B.: LXC) übertragbar.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zur Virtualisierung wird bei der Containerisierung nur die zu startende Anwendung und ihre Abhängigkeiten gestartet. Es wird kein komplettes Betriebssystem initialisiert. Der Container teilt sich den Kernel mit dem Hostbetriebssystem. Die Isolierung zu den Hostanwendungen erfolgt durch verschiedene andere Mechanismen die im weiteren Verlauf erklärt werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Containers.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Vor- und Nachteile ===&lt;br /&gt;
Folgend eine sehr vereinfachte Gegenüberstellung:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Virtualisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Sehr hoher Isolationsgrad&lt;br /&gt;
 Negativ: Höherer Ressourcenverbrauch&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Containerisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Geringer Ressourcenverbrauch&lt;br /&gt;
 Negativ: Nicht so hoher Isolationsgrad, Host Kernel wird direkt von allen Containern verwendet&lt;br /&gt;
&lt;br /&gt;
== Docker ==&lt;br /&gt;
&lt;br /&gt;
Docker ist eine der am weitesten verbreiteten und unterstützten Container Lösungen. Docker selbst kann nur in Verbindung mit dem Linux Kernel verwendet werden.&lt;br /&gt;
 Docker auf weiteren Betriebssystemen wie Windows oder MacOS verwendet werden. Jedoch wird hierbei ein Hostsystem mit Linux Kernel emuliert bzw. virtualisiert, welches für das Ausführen des Docker Daemons zuständig ist.&lt;br /&gt;
&lt;br /&gt;
=== Container Isolierung ===&lt;br /&gt;
&lt;br /&gt;
Um den starken Isolationsgrad zu erreichen, d.h.: Anwendungungen im Container von anderen Anwendungen zu trennen, werden einige Features des Linux Kernels benötigt. Das folgende wird möglicherweise auch das Verständnis von Isolation verbessern:&lt;br /&gt;
&lt;br /&gt;
==== Namespaces ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;Namespaces are a feature of the Linux kernel that partition kernel resources such that one set of processes sees one set of resources, while another set of processes sees a different set of resources. The feature works by having the same namespace for a set of resources and processes, but those namespaces refer to distinct resources. Resources may exist in multiple spaces. Examples of such resources are process IDs, host-names, user IDs, file names, some names associated with network access, and Inter-process communication.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Linux_namespaces&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PID Namespace&#039;&#039;&#039; - Jeder Container hat seinen eigenen Prozess-ID-Namespace, was bedeutet, dass die Prozesse in einem Container nur ihre eigenen Prozess-IDs sehen können und nicht die IDs der Prozesse außerhalb des Containers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Network Namespace&#039;&#039;&#039; - Docker erstellt für jeden Container einen eigenen Netzwerknamespace. Das bedeutet, dass jeder Container sein eigenes Netzwerkinterface, seine eigenen IP-Adressen, Routing-Tabellen usw. hat. Dadurch können Container voneinander isoliert sein und unabhängig voneinander agieren.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mount Namespace&#039;&#039;&#039; - Mount Namespaces isolieren das Dateisystem des Containers von dem des Hostsystems. Jeder Container hat sein eigenes Dateisystem, was es ermöglicht, dass verschiedene Container unterschiedliche Dateisysteme nutzen können, ohne sich gegenseitig zu beeinflussen.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;IPC Namespace&#039;&#039;&#039; - IPC (Inter Process Communication) Namespaces isolieren die Interprozesskommunikation, wie zum Beispiel die Verwendung von Shared Memory oder IPC Pipes. Dadurch sind die Kommunikationsmechanismen zwischen Prozessen in verschiedenen Containern getrennt.&lt;br /&gt;
&lt;br /&gt;
==== CGroups ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;cgroups (abbreviated from control groups) is a Linux kernel feature that limits, accounts for, and isolates the resource usage (CPU, memory, disk I/O, etc.[1]) of a collection of processes.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Cgroups&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CPU-Begrenzung&#039;&#039;&#039; - Mit cgroups kann Docker die CPU-Nutzung jedes Containers begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht mehr CPU-Ressourcen verwendet als ihm zugewiesen wurden, und um sicherzustellen, dass andere Container und Anwendungen auf dem Hostsystem ausreichend CPU-Zeit erhalten.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Speicherbegrenzung&#039;&#039;&#039; - Docker kann die Menge an Arbeitsspeicher, die von einem Container verwendet werden kann, mithilfe von cgroups begrenzen. Dies hilft dabei, zu verhindern, dass ein einzelner Container zu viel Arbeitsspeicher beansprucht und das gesamte System zum Absturz bringt.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;I/O-Begrenzung&#039;&#039;&#039; - Durch cgroups kann Docker die Ein- und Ausgabegeschwindigkeit für einen Container begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht zu viel Festplatten- oder Netzwerkbandbreite beansprucht und dadurch die Leistung anderer Container beeinträchtigt.&lt;br /&gt;
&lt;br /&gt;
==== Weitere Mechanismen ====&lt;br /&gt;
* SELinux&lt;br /&gt;
* AppArmor&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen finden sich [https://medium.com/@BeNitinAgarwal/understanding-the-docker-internals-7ccb052ce9fe hier]&lt;br /&gt;
&lt;br /&gt;
=== Aufbau von Docker ===&lt;br /&gt;
&lt;br /&gt;
Docker besteht aus den folgend genannten Komponenten:&lt;br /&gt;
&lt;br /&gt;
==== Images ====&lt;br /&gt;
Images bilden in sich abgeschlossenen Applikationen welche mit der &#039;&#039;&#039;Docker Engine&#039;&#039;&#039; erstellt und gestartet (&#039;&#039;&#039;Container&#039;&#039;&#039;) werden können.&lt;br /&gt;
&lt;br /&gt;
==== Registry ====&lt;br /&gt;
Eine zentrale stelle an der Docker Images gespeichert und abgerufen werden kann. Die wohl bekannteste Registry ist [https://hub.docker.com/ dockerhub]. Es kann jedoch auch eine eigene Registry erstellt werden.&lt;br /&gt;
&lt;br /&gt;
==== Engine ====&lt;br /&gt;
Die Docker Engine ist das Herzstück von Docker. Sie besteht aus drei Komponenten:&lt;br /&gt;
# &#039;&#039;&#039;Docker-Daemon&#039;&#039;&#039; - Der Docker-Daemon läuft als Hintergrundprozess auf dem Host System. Dieser ist die zentrale Steuerung der Docker Engine und ist zuständig für sämtliche Verwaltungsaufgaben (z.B.: Anlegen von Netzwerken, Volumes, Images und Containern)&lt;br /&gt;
# &#039;&#039;&#039;REST Api&#039;&#039;&#039; - Dient der Kommunikation mit dem Docker Daemon&lt;br /&gt;
# &#039;&#039;&#039;Command Line Interface&#039;&#039;&#039; - Kommuniziert über die REST Api mit dem Daemon und ermöglicht dem User das ausführen von Docker Befehlen&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.ionos.at/digitalguide/server/konfiguration/docker-tutorial-installation-und-erste-schritte&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Docker_2024_04/Containers|Container]] ===&lt;br /&gt;
=== [[Docker_2024_04/Networking|Networking]] ===&lt;br /&gt;
=== [[Docker_2024_04/Image|Image erstellen]] ===&lt;br /&gt;
=== [[Docker_2024_04/Resource Restriction|Resourcen limitieren]] ===&lt;br /&gt;
=== [[Docker_2024_04/Docker Compose|Docker Compose]] ===&lt;br /&gt;
=== [[Docker_2024_04/Registry|Registry]] ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3530</id>
		<title>Docker 2024 04</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3530"/>
		<updated>2024-04-18T12:57:49Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Virtualisierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Schulung Docker 2024/04 =&lt;br /&gt;
In der folgenden Schulung soll ein grundlegendes Verständnis für die Containerisierung erworben werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Teilnehmer_innen sollen nach der Schulung in der Lage sein&#039;&#039;&#039;&lt;br /&gt;
* eigene Docker Images zu erstellen und diese mittels {{BSL|docker run}} und {{BSL|docker compose}} zu starten&lt;br /&gt;
* die bereitgestellten Ressourcen für Arbeitsspeicher, CPU Zeit und Disk IO zu modifizieren&lt;br /&gt;
* die Einsatzzwecke der verschiedenen Networking Modelle (insbesondere Bridge und Host Network) zu unterscheiden und diese anwenden können&lt;br /&gt;
* eine eigene Image Registry zu erstellen und dort Images ablegen und abrufen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welche Bereiche werden explizit ausgeklammert:&#039;&#039;&#039;&lt;br /&gt;
* Limitierung von Netzwerkresourcen ([https://man7.org/linux/man-pages/man8/tc.8.html siehe tc])&lt;br /&gt;
* Limitierung von Speicherplatz ([https://de.wikipedia.org/wiki/XFS_(Dateisystem) siehe XFS])&lt;br /&gt;
&lt;br /&gt;
== Virtualisierung vs Containerisierung ==&lt;br /&gt;
&lt;br /&gt;
Beide Varianten bieten die Möglichkeit Applikationen isoliert von anderen Prozessen auszuführen. Im Gegensatz zur Containerisierung wird bei der Virtualisierung ein komplettes Betriebssystem mit entsprechenden Anwendungen gestartet.&lt;br /&gt;
&lt;br /&gt;
=== Gründe für Virtualisierung und Containerisierung ===&lt;br /&gt;
Programme können lokal, oder auf Servern installiert werden. Hierfür benötigt es keine der beiden Technologien.&lt;br /&gt;
Folgende Gründe sprechen jedoch für die Verwendung dieser Technologien:&lt;br /&gt;
 &#039;&#039;&#039;Teilen von Hardware Ressourcen&#039;&#039;&#039;&lt;br /&gt;
 Virtualisierung bietet die Möglichkeit physische Hardware auf mehrere Betriebssysteme zu verteilen.&lt;br /&gt;
 Containerisierung bietet die Möglichkeit physische Hardware auf mehrere Applikationen zu verteilen.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Isolationsgrad&#039;&#039;&#039;&lt;br /&gt;
 Fehlerhafte Anwendungen oder Sicherheitslücken wirken sich nicht auf das gesamte System aus.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Übertragbarkeit&#039;&#039;&#039;&lt;br /&gt;
 Ein weiterer Vorteil der Virtualisierung bzw. Containerisierung ist die in sich abgeschlossene und übertragbare Umgebung. Eine gekapselte Anwendung kann so auf nahezu jedem System ausgeführt werden. Die Abhängigkeiten beschränken sich hierbei auf ein Minimum.&lt;br /&gt;
&lt;br /&gt;
=== Virtualisierung ===&lt;br /&gt;
Bei der Virtualisierung übernimmt der &#039;&#039;&#039;Hypervisor&#039;&#039;&#039; das erstellen, starten und das Zuteilen der Hardwareressourcen des Hosts an die virtualisierten Gast Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
 Ein Hypervisor ist eine Software, die virtuelle Maschinen (VMs) erstellt und ausführt. Ein Hypervisor, manchmal auch Virtual Machine Monitor (VMM) genannt, isoliert das Hypervisor-Betriebssystem und die Ressourcen von den virtuellen Maschinen und ermöglicht die Erstellung und Verwaltung dieser VMs.&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hypervisoren können in verschiedene Typen eingeteilt werden:&lt;br /&gt;
* &#039;&#039;&#039;Typ 1&#039;&#039;&#039;, Läuft direkt auf der Hardware (z.B.: KVM, Microsoft Hyper-V und VMware vSphere)&lt;br /&gt;
* &#039;&#039;&#039;Typ 2&#039;&#039;&#039;, Läuft auf einem Host Betriebssystem (z.B.: VMware Workstation und Oracle VirtualBox)&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Virtual-Machines.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Containerisierung ===&lt;br /&gt;
 Unter Containerisierung versteht man das Zusammenfassen von Softwarecode mit den für die Ausführung des Codes erforderlichen Betriebssystembibliotheken und Abhängigkeiten zu einer einzigen ausführbaren Datei, die als Container bezeichnet wird und in jeder Infrastruktur konsistent ausgeführt werden kann.  Container sind portabler und ressourceneffizienter als virtuelle Maschinen (VMs) und haben sich de facto zu den Recheneinheiten moderner cloudnativer Anwendungen entwickelt.&amp;lt;ref&amp;gt;https://www.ibm.com/de-de/topics/containerization&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Container Lösungen bieten im Vergleich zur Virtualisierung eine leichtgewichtigere Möglichkeit Applikationen isoliert zu starten. Folgende Informationen beziehen sich auf Docker, sind aber möglicherweise auch auf andere Container Lösungen (wie z.B.: LXC) übertragbar.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zur Virtualisierung wird bei der Containerisierung nur die zu startende Anwendung und ihre Abhängigkeiten gestartet. Es wird kein komplettes Betriebssystem initialisiert. Der Container teilt sich den Kernel mit dem Hostbetriebssystem. Die Isolierung zu den Hostanwendungen erfolgt durch verschiedene andere Mechanismen die im weiteren Verlauf erklärt werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Containers.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Vor- und Nachteile ===&lt;br /&gt;
Folgend eine sehr vereinfachte Gegenüberstellung:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Virtualisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Sehr hoher Isolationsgrad&lt;br /&gt;
 Negativ: Höherer Ressourcenverbrauch&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Containerisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Geringer Ressourcenverbrauch&lt;br /&gt;
 Negativ: Nicht so hoher Isolationsgrad, Host Kernel wird direkt von allen Containern verwendet&lt;br /&gt;
&lt;br /&gt;
== Docker ==&lt;br /&gt;
&lt;br /&gt;
Docker ist eine der am weitesten verbreiteten und unterstützten Container Lösungen. Docker selbst kann nur in Verbindung mit dem Linux Kernel verwendet werden.&lt;br /&gt;
 Docker auf weiteren Betriebssystemen wie Windows oder MacOS verwendet werden. Jedoch wird hierbei ein Hostsystem mit Linux Kernel emuliert bzw. virtualisiert, welches für das Ausführen des Docker Daemons zuständig ist.&lt;br /&gt;
&lt;br /&gt;
=== Container Isolierung ===&lt;br /&gt;
&lt;br /&gt;
Um den starken Isolationsgrad zu erreichen, d.h.: Anwendungungen im Container von anderen Anwendungen zu trennen, werden einige Features des Linux Kernels benötigt. Das folgende wird möglicherweise auch das Verständnis von Isolation verbessern:&lt;br /&gt;
&lt;br /&gt;
==== Namespaces ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;Namespaces are a feature of the Linux kernel that partition kernel resources such that one set of processes sees one set of resources, while another set of processes sees a different set of resources. The feature works by having the same namespace for a set of resources and processes, but those namespaces refer to distinct resources. Resources may exist in multiple spaces. Examples of such resources are process IDs, host-names, user IDs, file names, some names associated with network access, and Inter-process communication.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Linux_namespaces&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PID Namespace&#039;&#039;&#039; - Jeder Container hat seinen eigenen Prozess-ID-Namespace, was bedeutet, dass die Prozesse in einem Container nur ihre eigenen Prozess-IDs sehen können und nicht die IDs der Prozesse außerhalb des Containers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Network Namespace&#039;&#039;&#039; - Docker erstellt für jeden Container einen eigenen Netzwerknamespace. Das bedeutet, dass jeder Container sein eigenes Netzwerkinterface, seine eigenen IP-Adressen, Routing-Tabellen usw. hat. Dadurch können Container voneinander isoliert sein und unabhängig voneinander agieren.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mount Namespace&#039;&#039;&#039; - Mount Namespaces isolieren das Dateisystem des Containers von dem des Hostsystems. Jeder Container hat sein eigenes Dateisystem, was es ermöglicht, dass verschiedene Container unterschiedliche Dateisysteme nutzen können, ohne sich gegenseitig zu beeinflussen.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;IPC Namespace&#039;&#039;&#039; - IPC (Inter Process Communication) Namespaces isolieren die Interprozesskommunikation, wie zum Beispiel die Verwendung von Shared Memory oder IPC Pipes. Dadurch sind die Kommunikationsmechanismen zwischen Prozessen in verschiedenen Containern getrennt.&lt;br /&gt;
&lt;br /&gt;
==== CGroups ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;cgroups (abbreviated from control groups) is a Linux kernel feature that limits, accounts for, and isolates the resource usage (CPU, memory, disk I/O, etc.[1]) of a collection of processes.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Cgroups&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CPU-Begrenzung&#039;&#039;&#039; - Mit cgroups kann Docker die CPU-Nutzung jedes Containers begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht mehr CPU-Ressourcen verwendet als ihm zugewiesen wurden, und um sicherzustellen, dass andere Container und Anwendungen auf dem Hostsystem ausreichend CPU-Zeit erhalten.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Speicherbegrenzung&#039;&#039;&#039; - Docker kann die Menge an Arbeitsspeicher, die von einem Container verwendet werden kann, mithilfe von cgroups begrenzen. Dies hilft dabei, zu verhindern, dass ein einzelner Container zu viel Arbeitsspeicher beansprucht und das gesamte System zum Absturz bringt.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;I/O-Begrenzung&#039;&#039;&#039; - Durch cgroups kann Docker die Ein- und Ausgabegeschwindigkeit für einen Container begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht zu viel Festplatten- oder Netzwerkbandbreite beansprucht und dadurch die Leistung anderer Container beeinträchtigt.&lt;br /&gt;
&lt;br /&gt;
==== Weitere Mechanismen ====&lt;br /&gt;
* SELinux&lt;br /&gt;
* AppArmor&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen finden sich [https://medium.com/@BeNitinAgarwal/understanding-the-docker-internals-7ccb052ce9fe hier]&lt;br /&gt;
&lt;br /&gt;
=== Aufbau von Docker ===&lt;br /&gt;
&lt;br /&gt;
Docker besteht aus den folgend genannten Komponenten:&lt;br /&gt;
&lt;br /&gt;
==== Images ====&lt;br /&gt;
Images bilden in sich abgeschlossenen Applikationen welche mit der &#039;&#039;&#039;Docker Engine&#039;&#039;&#039; erstellt und gestartet (&#039;&#039;&#039;Container&#039;&#039;&#039;) werden können.&lt;br /&gt;
&lt;br /&gt;
==== Registry ====&lt;br /&gt;
Eine zentrale stelle an der Docker Images gespeichert und abgerufen werden kann. Die wohl bekannteste Registry ist [https://hub.docker.com/ dockerhub]. Es kann jedoch auch eine eigene Registry erstellt werden.&lt;br /&gt;
&lt;br /&gt;
==== Engine ====&lt;br /&gt;
Die Docker Engine ist das Herzstück von Docker. Sie besteht aus drei Komponenten:&lt;br /&gt;
# &#039;&#039;&#039;Docker-Daemon&#039;&#039;&#039; - Der Docker-Daemon läuft als Hintergrundprozess auf dem Host System. Dieser ist die zentrale Steuerung der Docker Engine und ist zuständig für sämtliche Verwaltungsaufgaben (z.B.: Anlegen von Netzwerken, Volumes, Images und Containern)&lt;br /&gt;
# &#039;&#039;&#039;REST Api&#039;&#039;&#039; - Dient der Kommunikation mit dem Docker Daemon&lt;br /&gt;
# &#039;&#039;&#039;Command Line Interface&#039;&#039;&#039; - Kommuniziert über die REST Api mit dem Daemon und ermöglicht dem User das ausführen von Docker Befehlen&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.ionos.at/digitalguide/server/konfiguration/docker-tutorial-installation-und-erste-schritte&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Docker_2024_04/Containers|Container]] ===&lt;br /&gt;
=== [[Docker_2024_04/Networking|Networking]] ===&lt;br /&gt;
=== [[Docker_2024_04/Image|Image erstellen]] ===&lt;br /&gt;
=== [[Docker_2024_04/Resource Restriction|Resourcen limitieren]] ===&lt;br /&gt;
=== [[Docker_2024_04/Docker Compose|Docker Compose]] ===&lt;br /&gt;
=== [[Docker_2024_04/Registry|Registry]] ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3529</id>
		<title>Docker 2024 04</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3529"/>
		<updated>2024-04-18T12:57:22Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Gründe für Virtualisierung und Containerisierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Schulung Docker 2024/04 =&lt;br /&gt;
In der folgenden Schulung soll ein grundlegendes Verständnis für die Containerisierung erworben werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Teilnehmer_innen sollen nach der Schulung in der Lage sein&#039;&#039;&#039;&lt;br /&gt;
* eigene Docker Images zu erstellen und diese mittels {{BSL|docker run}} und {{BSL|docker compose}} zu starten&lt;br /&gt;
* die bereitgestellten Ressourcen für Arbeitsspeicher, CPU Zeit und Disk IO zu modifizieren&lt;br /&gt;
* die Einsatzzwecke der verschiedenen Networking Modelle (insbesondere Bridge und Host Network) zu unterscheiden und diese anwenden können&lt;br /&gt;
* eine eigene Image Registry zu erstellen und dort Images ablegen und abrufen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welche Bereiche werden explizit ausgeklammert:&#039;&#039;&#039;&lt;br /&gt;
* Limitierung von Netzwerkresourcen ([https://man7.org/linux/man-pages/man8/tc.8.html siehe tc])&lt;br /&gt;
* Limitierung von Speicherplatz ([https://de.wikipedia.org/wiki/XFS_(Dateisystem) siehe XFS])&lt;br /&gt;
&lt;br /&gt;
== Virtualisierung vs Containerisierung ==&lt;br /&gt;
&lt;br /&gt;
Beide Varianten bieten die Möglichkeit Applikationen isoliert von anderen Prozessen auszuführen. Im Gegensatz zur Containerisierung wird bei der Virtualisierung ein komplettes Betriebssystem mit entsprechenden Anwendungen gestartet.&lt;br /&gt;
&lt;br /&gt;
=== Gründe für Virtualisierung und Containerisierung ===&lt;br /&gt;
Programme können lokal, oder auf Servern installiert werden. Hierfür benötigt es keine der beiden Technologien.&lt;br /&gt;
Folgende Gründe sprechen jedoch für die Verwendung dieser Technologien:&lt;br /&gt;
 &#039;&#039;&#039;Teilen von Hardware Ressourcen&#039;&#039;&#039;&lt;br /&gt;
 Virtualisierung bietet die Möglichkeit physische Hardware auf mehrere Betriebssysteme zu verteilen.&lt;br /&gt;
 Containerisierung bietet die Möglichkeit physische Hardware auf mehrere Applikationen zu verteilen.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Isolationsgrad&#039;&#039;&#039;&lt;br /&gt;
 Fehlerhafte Anwendungen oder Sicherheitslücken wirken sich nicht auf das gesamte System aus.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Übertragbarkeit&#039;&#039;&#039;&lt;br /&gt;
 Ein weiterer Vorteil der Virtualisierung bzw. Containerisierung ist die in sich abgeschlossene und übertragbare Umgebung. Eine gekapselte Anwendung kann so auf nahezu jedem System ausgeführt werden. Die Abhängigkeiten beschränken sich hierbei auf ein Minimum.&lt;br /&gt;
&lt;br /&gt;
=== Virtualisierung ===&lt;br /&gt;
Bei der Virtualisierung übernimmt der &#039;&#039;&#039;Hypervisor&#039;&#039;&#039; das erstellen, starten und das Zuteilen der Hardwareressourcen des Hosts, an die virtualisierten Gast Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
 Ein Hypervisor ist eine Software, die virtuelle Maschinen (VMs) erstellt und ausführt. Ein Hypervisor, manchmal auch Virtual Machine Monitor (VMM) genannt, isoliert das Hypervisor-Betriebssystem und die Ressourcen von den virtuellen Maschinen und ermöglicht die Erstellung und Verwaltung dieser VMs.&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hypervisoren können in verschiedene Typen eingeteilt werden:&lt;br /&gt;
* &#039;&#039;&#039;Typ 1&#039;&#039;&#039;, Läuft direkt auf der Hardware (z.B.: KVM, Microsoft Hyper-V und VMware vSphere)&lt;br /&gt;
* &#039;&#039;&#039;Typ 2&#039;&#039;&#039;, Läuft auf einem Host Betriebssystem (z.B.: VMware Workstation und Oracle VirtualBox)&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Virtual-Machines.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Containerisierung ===&lt;br /&gt;
 Unter Containerisierung versteht man das Zusammenfassen von Softwarecode mit den für die Ausführung des Codes erforderlichen Betriebssystembibliotheken und Abhängigkeiten zu einer einzigen ausführbaren Datei, die als Container bezeichnet wird und in jeder Infrastruktur konsistent ausgeführt werden kann.  Container sind portabler und ressourceneffizienter als virtuelle Maschinen (VMs) und haben sich de facto zu den Recheneinheiten moderner cloudnativer Anwendungen entwickelt.&amp;lt;ref&amp;gt;https://www.ibm.com/de-de/topics/containerization&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Container Lösungen bieten im Vergleich zur Virtualisierung eine leichtgewichtigere Möglichkeit Applikationen isoliert zu starten. Folgende Informationen beziehen sich auf Docker, sind aber möglicherweise auch auf andere Container Lösungen (wie z.B.: LXC) übertragbar.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zur Virtualisierung wird bei der Containerisierung nur die zu startende Anwendung und ihre Abhängigkeiten gestartet. Es wird kein komplettes Betriebssystem initialisiert. Der Container teilt sich den Kernel mit dem Hostbetriebssystem. Die Isolierung zu den Hostanwendungen erfolgt durch verschiedene andere Mechanismen die im weiteren Verlauf erklärt werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Containers.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Vor- und Nachteile ===&lt;br /&gt;
Folgend eine sehr vereinfachte Gegenüberstellung:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Virtualisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Sehr hoher Isolationsgrad&lt;br /&gt;
 Negativ: Höherer Ressourcenverbrauch&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Containerisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Geringer Ressourcenverbrauch&lt;br /&gt;
 Negativ: Nicht so hoher Isolationsgrad, Host Kernel wird direkt von allen Containern verwendet&lt;br /&gt;
&lt;br /&gt;
== Docker ==&lt;br /&gt;
&lt;br /&gt;
Docker ist eine der am weitesten verbreiteten und unterstützten Container Lösungen. Docker selbst kann nur in Verbindung mit dem Linux Kernel verwendet werden.&lt;br /&gt;
 Docker auf weiteren Betriebssystemen wie Windows oder MacOS verwendet werden. Jedoch wird hierbei ein Hostsystem mit Linux Kernel emuliert bzw. virtualisiert, welches für das Ausführen des Docker Daemons zuständig ist.&lt;br /&gt;
&lt;br /&gt;
=== Container Isolierung ===&lt;br /&gt;
&lt;br /&gt;
Um den starken Isolationsgrad zu erreichen, d.h.: Anwendungungen im Container von anderen Anwendungen zu trennen, werden einige Features des Linux Kernels benötigt. Das folgende wird möglicherweise auch das Verständnis von Isolation verbessern:&lt;br /&gt;
&lt;br /&gt;
==== Namespaces ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;Namespaces are a feature of the Linux kernel that partition kernel resources such that one set of processes sees one set of resources, while another set of processes sees a different set of resources. The feature works by having the same namespace for a set of resources and processes, but those namespaces refer to distinct resources. Resources may exist in multiple spaces. Examples of such resources are process IDs, host-names, user IDs, file names, some names associated with network access, and Inter-process communication.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Linux_namespaces&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PID Namespace&#039;&#039;&#039; - Jeder Container hat seinen eigenen Prozess-ID-Namespace, was bedeutet, dass die Prozesse in einem Container nur ihre eigenen Prozess-IDs sehen können und nicht die IDs der Prozesse außerhalb des Containers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Network Namespace&#039;&#039;&#039; - Docker erstellt für jeden Container einen eigenen Netzwerknamespace. Das bedeutet, dass jeder Container sein eigenes Netzwerkinterface, seine eigenen IP-Adressen, Routing-Tabellen usw. hat. Dadurch können Container voneinander isoliert sein und unabhängig voneinander agieren.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mount Namespace&#039;&#039;&#039; - Mount Namespaces isolieren das Dateisystem des Containers von dem des Hostsystems. Jeder Container hat sein eigenes Dateisystem, was es ermöglicht, dass verschiedene Container unterschiedliche Dateisysteme nutzen können, ohne sich gegenseitig zu beeinflussen.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;IPC Namespace&#039;&#039;&#039; - IPC (Inter Process Communication) Namespaces isolieren die Interprozesskommunikation, wie zum Beispiel die Verwendung von Shared Memory oder IPC Pipes. Dadurch sind die Kommunikationsmechanismen zwischen Prozessen in verschiedenen Containern getrennt.&lt;br /&gt;
&lt;br /&gt;
==== CGroups ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;cgroups (abbreviated from control groups) is a Linux kernel feature that limits, accounts for, and isolates the resource usage (CPU, memory, disk I/O, etc.[1]) of a collection of processes.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Cgroups&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CPU-Begrenzung&#039;&#039;&#039; - Mit cgroups kann Docker die CPU-Nutzung jedes Containers begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht mehr CPU-Ressourcen verwendet als ihm zugewiesen wurden, und um sicherzustellen, dass andere Container und Anwendungen auf dem Hostsystem ausreichend CPU-Zeit erhalten.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Speicherbegrenzung&#039;&#039;&#039; - Docker kann die Menge an Arbeitsspeicher, die von einem Container verwendet werden kann, mithilfe von cgroups begrenzen. Dies hilft dabei, zu verhindern, dass ein einzelner Container zu viel Arbeitsspeicher beansprucht und das gesamte System zum Absturz bringt.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;I/O-Begrenzung&#039;&#039;&#039; - Durch cgroups kann Docker die Ein- und Ausgabegeschwindigkeit für einen Container begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht zu viel Festplatten- oder Netzwerkbandbreite beansprucht und dadurch die Leistung anderer Container beeinträchtigt.&lt;br /&gt;
&lt;br /&gt;
==== Weitere Mechanismen ====&lt;br /&gt;
* SELinux&lt;br /&gt;
* AppArmor&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen finden sich [https://medium.com/@BeNitinAgarwal/understanding-the-docker-internals-7ccb052ce9fe hier]&lt;br /&gt;
&lt;br /&gt;
=== Aufbau von Docker ===&lt;br /&gt;
&lt;br /&gt;
Docker besteht aus den folgend genannten Komponenten:&lt;br /&gt;
&lt;br /&gt;
==== Images ====&lt;br /&gt;
Images bilden in sich abgeschlossenen Applikationen welche mit der &#039;&#039;&#039;Docker Engine&#039;&#039;&#039; erstellt und gestartet (&#039;&#039;&#039;Container&#039;&#039;&#039;) werden können.&lt;br /&gt;
&lt;br /&gt;
==== Registry ====&lt;br /&gt;
Eine zentrale stelle an der Docker Images gespeichert und abgerufen werden kann. Die wohl bekannteste Registry ist [https://hub.docker.com/ dockerhub]. Es kann jedoch auch eine eigene Registry erstellt werden.&lt;br /&gt;
&lt;br /&gt;
==== Engine ====&lt;br /&gt;
Die Docker Engine ist das Herzstück von Docker. Sie besteht aus drei Komponenten:&lt;br /&gt;
# &#039;&#039;&#039;Docker-Daemon&#039;&#039;&#039; - Der Docker-Daemon läuft als Hintergrundprozess auf dem Host System. Dieser ist die zentrale Steuerung der Docker Engine und ist zuständig für sämtliche Verwaltungsaufgaben (z.B.: Anlegen von Netzwerken, Volumes, Images und Containern)&lt;br /&gt;
# &#039;&#039;&#039;REST Api&#039;&#039;&#039; - Dient der Kommunikation mit dem Docker Daemon&lt;br /&gt;
# &#039;&#039;&#039;Command Line Interface&#039;&#039;&#039; - Kommuniziert über die REST Api mit dem Daemon und ermöglicht dem User das ausführen von Docker Befehlen&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.ionos.at/digitalguide/server/konfiguration/docker-tutorial-installation-und-erste-schritte&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Docker_2024_04/Containers|Container]] ===&lt;br /&gt;
=== [[Docker_2024_04/Networking|Networking]] ===&lt;br /&gt;
=== [[Docker_2024_04/Image|Image erstellen]] ===&lt;br /&gt;
=== [[Docker_2024_04/Resource Restriction|Resourcen limitieren]] ===&lt;br /&gt;
=== [[Docker_2024_04/Docker Compose|Docker Compose]] ===&lt;br /&gt;
=== [[Docker_2024_04/Registry|Registry]] ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3528</id>
		<title>Docker 2024 04</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3528"/>
		<updated>2024-04-18T12:55:41Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Schulung Docker 2024/04 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Schulung Docker 2024/04 =&lt;br /&gt;
In der folgenden Schulung soll ein grundlegendes Verständnis für die Containerisierung erworben werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Teilnehmer_innen sollen nach der Schulung in der Lage sein&#039;&#039;&#039;&lt;br /&gt;
* eigene Docker Images zu erstellen und diese mittels {{BSL|docker run}} und {{BSL|docker compose}} zu starten&lt;br /&gt;
* die bereitgestellten Ressourcen für Arbeitsspeicher, CPU Zeit und Disk IO zu modifizieren&lt;br /&gt;
* die Einsatzzwecke der verschiedenen Networking Modelle (insbesondere Bridge und Host Network) zu unterscheiden und diese anwenden können&lt;br /&gt;
* eine eigene Image Registry zu erstellen und dort Images ablegen und abrufen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welche Bereiche werden explizit ausgeklammert:&#039;&#039;&#039;&lt;br /&gt;
* Limitierung von Netzwerkresourcen ([https://man7.org/linux/man-pages/man8/tc.8.html siehe tc])&lt;br /&gt;
* Limitierung von Speicherplatz ([https://de.wikipedia.org/wiki/XFS_(Dateisystem) siehe XFS])&lt;br /&gt;
&lt;br /&gt;
== Virtualisierung vs Containerisierung ==&lt;br /&gt;
&lt;br /&gt;
Beide Varianten bieten die Möglichkeit Applikationen isoliert von anderen Prozessen auszuführen. Im Gegensatz zur Containerisierung wird bei der Virtualisierung ein komplettes Betriebssystem mit entsprechenden Anwendungen gestartet.&lt;br /&gt;
&lt;br /&gt;
=== Gründe für Virtualisierung und Containerisierung ===&lt;br /&gt;
Programme können lokal, oder auf Servern installiert werden. Hierfür benötigt es keine der beiden Technologien. Folgende Gründe sprechen für diese Technologien&lt;br /&gt;
 &#039;&#039;&#039;Teilen von Hardware Ressourcen&#039;&#039;&#039;&lt;br /&gt;
 Virtualisierung bietet die Möglichkeit physische Hardware auf mehrere Betriebssysteme zu verteilen.&lt;br /&gt;
 Containerisierung bietet die Möglichkeit physische Hardware auf mehrere Applikationen zu verteilen.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Isolationsgrad&#039;&#039;&#039;&lt;br /&gt;
 Fehlerhafte Anwendungen oder Sicherheitslücken wirken sich nicht auf das gesamte System aus.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Übertragbarkeit&#039;&#039;&#039;&lt;br /&gt;
 Ein weiterer Vorteil der Virtualisierung bzw. Containerisierung ist die in sich abgeschlossene und übertragbare Umgebung. Eine gekapselte Anwendung kann so auf nahezu jedem System ausgeführt werden. Die Abhängigkeiten beschränken sich hierbei auf ein Minimum.&lt;br /&gt;
&lt;br /&gt;
=== Virtualisierung ===&lt;br /&gt;
Bei der Virtualisierung übernimmt der &#039;&#039;&#039;Hypervisor&#039;&#039;&#039; das erstellen, starten und das Zuteilen der Hardwareressourcen des Hosts, an die virtualisierten Gast Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
 Ein Hypervisor ist eine Software, die virtuelle Maschinen (VMs) erstellt und ausführt. Ein Hypervisor, manchmal auch Virtual Machine Monitor (VMM) genannt, isoliert das Hypervisor-Betriebssystem und die Ressourcen von den virtuellen Maschinen und ermöglicht die Erstellung und Verwaltung dieser VMs.&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hypervisoren können in verschiedene Typen eingeteilt werden:&lt;br /&gt;
* &#039;&#039;&#039;Typ 1&#039;&#039;&#039;, Läuft direkt auf der Hardware (z.B.: KVM, Microsoft Hyper-V und VMware vSphere)&lt;br /&gt;
* &#039;&#039;&#039;Typ 2&#039;&#039;&#039;, Läuft auf einem Host Betriebssystem (z.B.: VMware Workstation und Oracle VirtualBox)&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Virtual-Machines.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Containerisierung ===&lt;br /&gt;
 Unter Containerisierung versteht man das Zusammenfassen von Softwarecode mit den für die Ausführung des Codes erforderlichen Betriebssystembibliotheken und Abhängigkeiten zu einer einzigen ausführbaren Datei, die als Container bezeichnet wird und in jeder Infrastruktur konsistent ausgeführt werden kann.  Container sind portabler und ressourceneffizienter als virtuelle Maschinen (VMs) und haben sich de facto zu den Recheneinheiten moderner cloudnativer Anwendungen entwickelt.&amp;lt;ref&amp;gt;https://www.ibm.com/de-de/topics/containerization&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Container Lösungen bieten im Vergleich zur Virtualisierung eine leichtgewichtigere Möglichkeit Applikationen isoliert zu starten. Folgende Informationen beziehen sich auf Docker, sind aber möglicherweise auch auf andere Container Lösungen (wie z.B.: LXC) übertragbar.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zur Virtualisierung wird bei der Containerisierung nur die zu startende Anwendung und ihre Abhängigkeiten gestartet. Es wird kein komplettes Betriebssystem initialisiert. Der Container teilt sich den Kernel mit dem Hostbetriebssystem. Die Isolierung zu den Hostanwendungen erfolgt durch verschiedene andere Mechanismen die im weiteren Verlauf erklärt werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Containers.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Vor- und Nachteile ===&lt;br /&gt;
Folgend eine sehr vereinfachte Gegenüberstellung:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Virtualisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Sehr hoher Isolationsgrad&lt;br /&gt;
 Negativ: Höherer Ressourcenverbrauch&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Containerisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Geringer Ressourcenverbrauch&lt;br /&gt;
 Negativ: Nicht so hoher Isolationsgrad, Host Kernel wird direkt von allen Containern verwendet&lt;br /&gt;
&lt;br /&gt;
== Docker ==&lt;br /&gt;
&lt;br /&gt;
Docker ist eine der am weitesten verbreiteten und unterstützten Container Lösungen. Docker selbst kann nur in Verbindung mit dem Linux Kernel verwendet werden.&lt;br /&gt;
 Docker auf weiteren Betriebssystemen wie Windows oder MacOS verwendet werden. Jedoch wird hierbei ein Hostsystem mit Linux Kernel emuliert bzw. virtualisiert, welches für das Ausführen des Docker Daemons zuständig ist.&lt;br /&gt;
&lt;br /&gt;
=== Container Isolierung ===&lt;br /&gt;
&lt;br /&gt;
Um den starken Isolationsgrad zu erreichen, d.h.: Anwendungungen im Container von anderen Anwendungen zu trennen, werden einige Features des Linux Kernels benötigt. Das folgende wird möglicherweise auch das Verständnis von Isolation verbessern:&lt;br /&gt;
&lt;br /&gt;
==== Namespaces ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;Namespaces are a feature of the Linux kernel that partition kernel resources such that one set of processes sees one set of resources, while another set of processes sees a different set of resources. The feature works by having the same namespace for a set of resources and processes, but those namespaces refer to distinct resources. Resources may exist in multiple spaces. Examples of such resources are process IDs, host-names, user IDs, file names, some names associated with network access, and Inter-process communication.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Linux_namespaces&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PID Namespace&#039;&#039;&#039; - Jeder Container hat seinen eigenen Prozess-ID-Namespace, was bedeutet, dass die Prozesse in einem Container nur ihre eigenen Prozess-IDs sehen können und nicht die IDs der Prozesse außerhalb des Containers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Network Namespace&#039;&#039;&#039; - Docker erstellt für jeden Container einen eigenen Netzwerknamespace. Das bedeutet, dass jeder Container sein eigenes Netzwerkinterface, seine eigenen IP-Adressen, Routing-Tabellen usw. hat. Dadurch können Container voneinander isoliert sein und unabhängig voneinander agieren.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mount Namespace&#039;&#039;&#039; - Mount Namespaces isolieren das Dateisystem des Containers von dem des Hostsystems. Jeder Container hat sein eigenes Dateisystem, was es ermöglicht, dass verschiedene Container unterschiedliche Dateisysteme nutzen können, ohne sich gegenseitig zu beeinflussen.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;IPC Namespace&#039;&#039;&#039; - IPC (Inter Process Communication) Namespaces isolieren die Interprozesskommunikation, wie zum Beispiel die Verwendung von Shared Memory oder IPC Pipes. Dadurch sind die Kommunikationsmechanismen zwischen Prozessen in verschiedenen Containern getrennt.&lt;br /&gt;
&lt;br /&gt;
==== CGroups ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;cgroups (abbreviated from control groups) is a Linux kernel feature that limits, accounts for, and isolates the resource usage (CPU, memory, disk I/O, etc.[1]) of a collection of processes.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Cgroups&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CPU-Begrenzung&#039;&#039;&#039; - Mit cgroups kann Docker die CPU-Nutzung jedes Containers begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht mehr CPU-Ressourcen verwendet als ihm zugewiesen wurden, und um sicherzustellen, dass andere Container und Anwendungen auf dem Hostsystem ausreichend CPU-Zeit erhalten.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Speicherbegrenzung&#039;&#039;&#039; - Docker kann die Menge an Arbeitsspeicher, die von einem Container verwendet werden kann, mithilfe von cgroups begrenzen. Dies hilft dabei, zu verhindern, dass ein einzelner Container zu viel Arbeitsspeicher beansprucht und das gesamte System zum Absturz bringt.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;I/O-Begrenzung&#039;&#039;&#039; - Durch cgroups kann Docker die Ein- und Ausgabegeschwindigkeit für einen Container begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht zu viel Festplatten- oder Netzwerkbandbreite beansprucht und dadurch die Leistung anderer Container beeinträchtigt.&lt;br /&gt;
&lt;br /&gt;
==== Weitere Mechanismen ====&lt;br /&gt;
* SELinux&lt;br /&gt;
* AppArmor&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen finden sich [https://medium.com/@BeNitinAgarwal/understanding-the-docker-internals-7ccb052ce9fe hier]&lt;br /&gt;
&lt;br /&gt;
=== Aufbau von Docker ===&lt;br /&gt;
&lt;br /&gt;
Docker besteht aus den folgend genannten Komponenten:&lt;br /&gt;
&lt;br /&gt;
==== Images ====&lt;br /&gt;
Images bilden in sich abgeschlossenen Applikationen welche mit der &#039;&#039;&#039;Docker Engine&#039;&#039;&#039; erstellt und gestartet (&#039;&#039;&#039;Container&#039;&#039;&#039;) werden können.&lt;br /&gt;
&lt;br /&gt;
==== Registry ====&lt;br /&gt;
Eine zentrale stelle an der Docker Images gespeichert und abgerufen werden kann. Die wohl bekannteste Registry ist [https://hub.docker.com/ dockerhub]. Es kann jedoch auch eine eigene Registry erstellt werden.&lt;br /&gt;
&lt;br /&gt;
==== Engine ====&lt;br /&gt;
Die Docker Engine ist das Herzstück von Docker. Sie besteht aus drei Komponenten:&lt;br /&gt;
# &#039;&#039;&#039;Docker-Daemon&#039;&#039;&#039; - Der Docker-Daemon läuft als Hintergrundprozess auf dem Host System. Dieser ist die zentrale Steuerung der Docker Engine und ist zuständig für sämtliche Verwaltungsaufgaben (z.B.: Anlegen von Netzwerken, Volumes, Images und Containern)&lt;br /&gt;
# &#039;&#039;&#039;REST Api&#039;&#039;&#039; - Dient der Kommunikation mit dem Docker Daemon&lt;br /&gt;
# &#039;&#039;&#039;Command Line Interface&#039;&#039;&#039; - Kommuniziert über die REST Api mit dem Daemon und ermöglicht dem User das ausführen von Docker Befehlen&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.ionos.at/digitalguide/server/konfiguration/docker-tutorial-installation-und-erste-schritte&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Docker_2024_04/Containers|Container]] ===&lt;br /&gt;
=== [[Docker_2024_04/Networking|Networking]] ===&lt;br /&gt;
=== [[Docker_2024_04/Image|Image erstellen]] ===&lt;br /&gt;
=== [[Docker_2024_04/Resource Restriction|Resourcen limitieren]] ===&lt;br /&gt;
=== [[Docker_2024_04/Docker Compose|Docker Compose]] ===&lt;br /&gt;
=== [[Docker_2024_04/Registry|Registry]] ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3527</id>
		<title>Docker 2024 04</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3527"/>
		<updated>2024-04-18T10:36:19Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Docker */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Schulung Docker 2024/04 =&lt;br /&gt;
In der folgenden Schulung soll ein grundlegendes Verständnis für die Containerisierung erworben werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Teilnehmer_innen sollen nach der Schulung in der Lage sein&#039;&#039;&#039;&lt;br /&gt;
* eigene Docker Images zu erstellen und diese mittels Docker Compose zu starten&lt;br /&gt;
* die bereitgestellten Ressourcen für Arbeitsspeicher, CPU Zeit und Disk IO zu modifizieren&lt;br /&gt;
* die Einsatzzwecke der verschiedenen Networking Modelle (insbesondere Bridge und Host Network) zu unterscheiden und diese gezielt anwenden können&lt;br /&gt;
* eine eigene Image Registry zu erstellen und dort Images ablegen und abrufen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welche Bereiche werden explizit ausgeklammert:&#039;&#039;&#039;&lt;br /&gt;
* Limitierung von Netzwerkresourcen ([https://man7.org/linux/man-pages/man8/tc.8.html siehe tc])&lt;br /&gt;
* Limitierung von Speicherplatz ([https://de.wikipedia.org/wiki/XFS_(Dateisystem) siehe XFS])&lt;br /&gt;
&lt;br /&gt;
== Virtualisierung vs Containerisierung ==&lt;br /&gt;
&lt;br /&gt;
Beide Varianten bieten die Möglichkeit Applikationen isoliert von anderen Prozessen auszuführen. Im Gegensatz zur Containerisierung wird bei der Virtualisierung ein komplettes Betriebssystem mit entsprechenden Anwendungen gestartet.&lt;br /&gt;
&lt;br /&gt;
=== Gründe für Virtualisierung und Containerisierung ===&lt;br /&gt;
Programme können lokal, oder auf Servern installiert werden. Hierfür benötigt es keine der beiden Technologien. Folgende Gründe sprechen für diese Technologien&lt;br /&gt;
 &#039;&#039;&#039;Teilen von Hardware Ressourcen&#039;&#039;&#039;&lt;br /&gt;
 Virtualisierung bietet die Möglichkeit physische Hardware auf mehrere Betriebssysteme zu verteilen.&lt;br /&gt;
 Containerisierung bietet die Möglichkeit physische Hardware auf mehrere Applikationen zu verteilen.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Isolationsgrad&#039;&#039;&#039;&lt;br /&gt;
 Fehlerhafte Anwendungen oder Sicherheitslücken wirken sich nicht auf das gesamte System aus.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Übertragbarkeit&#039;&#039;&#039;&lt;br /&gt;
 Ein weiterer Vorteil der Virtualisierung bzw. Containerisierung ist die in sich abgeschlossene und übertragbare Umgebung. Eine gekapselte Anwendung kann so auf nahezu jedem System ausgeführt werden. Die Abhängigkeiten beschränken sich hierbei auf ein Minimum.&lt;br /&gt;
&lt;br /&gt;
=== Virtualisierung ===&lt;br /&gt;
Bei der Virtualisierung übernimmt der &#039;&#039;&#039;Hypervisor&#039;&#039;&#039; das erstellen, starten und das Zuteilen der Hardwareressourcen des Hosts, an die virtualisierten Gast Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
 Ein Hypervisor ist eine Software, die virtuelle Maschinen (VMs) erstellt und ausführt. Ein Hypervisor, manchmal auch Virtual Machine Monitor (VMM) genannt, isoliert das Hypervisor-Betriebssystem und die Ressourcen von den virtuellen Maschinen und ermöglicht die Erstellung und Verwaltung dieser VMs.&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hypervisoren können in verschiedene Typen eingeteilt werden:&lt;br /&gt;
* &#039;&#039;&#039;Typ 1&#039;&#039;&#039;, Läuft direkt auf der Hardware (z.B.: KVM, Microsoft Hyper-V und VMware vSphere)&lt;br /&gt;
* &#039;&#039;&#039;Typ 2&#039;&#039;&#039;, Läuft auf einem Host Betriebssystem (z.B.: VMware Workstation und Oracle VirtualBox)&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Virtual-Machines.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Containerisierung ===&lt;br /&gt;
 Unter Containerisierung versteht man das Zusammenfassen von Softwarecode mit den für die Ausführung des Codes erforderlichen Betriebssystembibliotheken und Abhängigkeiten zu einer einzigen ausführbaren Datei, die als Container bezeichnet wird und in jeder Infrastruktur konsistent ausgeführt werden kann.  Container sind portabler und ressourceneffizienter als virtuelle Maschinen (VMs) und haben sich de facto zu den Recheneinheiten moderner cloudnativer Anwendungen entwickelt.&amp;lt;ref&amp;gt;https://www.ibm.com/de-de/topics/containerization&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Container Lösungen bieten im Vergleich zur Virtualisierung eine leichtgewichtigere Möglichkeit Applikationen isoliert zu starten. Folgende Informationen beziehen sich auf Docker, sind aber möglicherweise auch auf andere Container Lösungen (wie z.B.: LXC) übertragbar.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zur Virtualisierung wird bei der Containerisierung nur die zu startende Anwendung und ihre Abhängigkeiten gestartet. Es wird kein komplettes Betriebssystem initialisiert. Der Container teilt sich den Kernel mit dem Hostbetriebssystem. Die Isolierung zu den Hostanwendungen erfolgt durch verschiedene andere Mechanismen die im weiteren Verlauf erklärt werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Containers.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Vor- und Nachteile ===&lt;br /&gt;
Folgend eine sehr vereinfachte Gegenüberstellung:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Virtualisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Sehr hoher Isolationsgrad&lt;br /&gt;
 Negativ: Höherer Ressourcenverbrauch&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Containerisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Geringer Ressourcenverbrauch&lt;br /&gt;
 Negativ: Nicht so hoher Isolationsgrad, Host Kernel wird direkt von allen Containern verwendet&lt;br /&gt;
&lt;br /&gt;
== Docker ==&lt;br /&gt;
&lt;br /&gt;
Docker ist eine der am weitesten verbreiteten und unterstützten Container Lösungen. Docker selbst kann nur in Verbindung mit dem Linux Kernel verwendet werden.&lt;br /&gt;
 Docker auf weiteren Betriebssystemen wie Windows oder MacOS verwendet werden. Jedoch wird hierbei ein Hostsystem mit Linux Kernel emuliert bzw. virtualisiert, welches für das Ausführen des Docker Daemons zuständig ist.&lt;br /&gt;
&lt;br /&gt;
=== Container Isolierung ===&lt;br /&gt;
&lt;br /&gt;
Um den starken Isolationsgrad zu erreichen, d.h.: Anwendungungen im Container von anderen Anwendungen zu trennen, werden einige Features des Linux Kernels benötigt. Das folgende wird möglicherweise auch das Verständnis von Isolation verbessern:&lt;br /&gt;
&lt;br /&gt;
==== Namespaces ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;Namespaces are a feature of the Linux kernel that partition kernel resources such that one set of processes sees one set of resources, while another set of processes sees a different set of resources. The feature works by having the same namespace for a set of resources and processes, but those namespaces refer to distinct resources. Resources may exist in multiple spaces. Examples of such resources are process IDs, host-names, user IDs, file names, some names associated with network access, and Inter-process communication.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Linux_namespaces&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PID Namespace&#039;&#039;&#039; - Jeder Container hat seinen eigenen Prozess-ID-Namespace, was bedeutet, dass die Prozesse in einem Container nur ihre eigenen Prozess-IDs sehen können und nicht die IDs der Prozesse außerhalb des Containers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Network Namespace&#039;&#039;&#039; - Docker erstellt für jeden Container einen eigenen Netzwerknamespace. Das bedeutet, dass jeder Container sein eigenes Netzwerkinterface, seine eigenen IP-Adressen, Routing-Tabellen usw. hat. Dadurch können Container voneinander isoliert sein und unabhängig voneinander agieren.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mount Namespace&#039;&#039;&#039; - Mount Namespaces isolieren das Dateisystem des Containers von dem des Hostsystems. Jeder Container hat sein eigenes Dateisystem, was es ermöglicht, dass verschiedene Container unterschiedliche Dateisysteme nutzen können, ohne sich gegenseitig zu beeinflussen.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;IPC Namespace&#039;&#039;&#039; - IPC (Inter Process Communication) Namespaces isolieren die Interprozesskommunikation, wie zum Beispiel die Verwendung von Shared Memory oder IPC Pipes. Dadurch sind die Kommunikationsmechanismen zwischen Prozessen in verschiedenen Containern getrennt.&lt;br /&gt;
&lt;br /&gt;
==== CGroups ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;cgroups (abbreviated from control groups) is a Linux kernel feature that limits, accounts for, and isolates the resource usage (CPU, memory, disk I/O, etc.[1]) of a collection of processes.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Cgroups&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CPU-Begrenzung&#039;&#039;&#039; - Mit cgroups kann Docker die CPU-Nutzung jedes Containers begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht mehr CPU-Ressourcen verwendet als ihm zugewiesen wurden, und um sicherzustellen, dass andere Container und Anwendungen auf dem Hostsystem ausreichend CPU-Zeit erhalten.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Speicherbegrenzung&#039;&#039;&#039; - Docker kann die Menge an Arbeitsspeicher, die von einem Container verwendet werden kann, mithilfe von cgroups begrenzen. Dies hilft dabei, zu verhindern, dass ein einzelner Container zu viel Arbeitsspeicher beansprucht und das gesamte System zum Absturz bringt.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;I/O-Begrenzung&#039;&#039;&#039; - Durch cgroups kann Docker die Ein- und Ausgabegeschwindigkeit für einen Container begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht zu viel Festplatten- oder Netzwerkbandbreite beansprucht und dadurch die Leistung anderer Container beeinträchtigt.&lt;br /&gt;
&lt;br /&gt;
==== Weitere Mechanismen ====&lt;br /&gt;
* SELinux&lt;br /&gt;
* AppArmor&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen finden sich [https://medium.com/@BeNitinAgarwal/understanding-the-docker-internals-7ccb052ce9fe hier]&lt;br /&gt;
&lt;br /&gt;
=== Aufbau von Docker ===&lt;br /&gt;
&lt;br /&gt;
Docker besteht aus den folgend genannten Komponenten:&lt;br /&gt;
&lt;br /&gt;
==== Images ====&lt;br /&gt;
Images bilden in sich abgeschlossenen Applikationen welche mit der &#039;&#039;&#039;Docker Engine&#039;&#039;&#039; erstellt und gestartet (&#039;&#039;&#039;Container&#039;&#039;&#039;) werden können.&lt;br /&gt;
&lt;br /&gt;
==== Registry ====&lt;br /&gt;
Eine zentrale stelle an der Docker Images gespeichert und abgerufen werden kann. Die wohl bekannteste Registry ist [https://hub.docker.com/ dockerhub]. Es kann jedoch auch eine eigene Registry erstellt werden.&lt;br /&gt;
&lt;br /&gt;
==== Engine ====&lt;br /&gt;
Die Docker Engine ist das Herzstück von Docker. Sie besteht aus drei Komponenten:&lt;br /&gt;
# &#039;&#039;&#039;Docker-Daemon&#039;&#039;&#039; - Der Docker-Daemon läuft als Hintergrundprozess auf dem Host System. Dieser ist die zentrale Steuerung der Docker Engine und ist zuständig für sämtliche Verwaltungsaufgaben (z.B.: Anlegen von Netzwerken, Volumes, Images und Containern)&lt;br /&gt;
# &#039;&#039;&#039;REST Api&#039;&#039;&#039; - Dient der Kommunikation mit dem Docker Daemon&lt;br /&gt;
# &#039;&#039;&#039;Command Line Interface&#039;&#039;&#039; - Kommuniziert über die REST Api mit dem Daemon und ermöglicht dem User das ausführen von Docker Befehlen&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.ionos.at/digitalguide/server/konfiguration/docker-tutorial-installation-und-erste-schritte&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Docker_2024_04/Containers|Container]] ===&lt;br /&gt;
=== [[Docker_2024_04/Networking|Networking]] ===&lt;br /&gt;
=== [[Docker_2024_04/Image|Image erstellen]] ===&lt;br /&gt;
=== [[Docker_2024_04/Resource Restriction|Resourcen limitieren]] ===&lt;br /&gt;
=== [[Docker_2024_04/Docker Compose|Docker Compose]] ===&lt;br /&gt;
=== [[Docker_2024_04/Registry|Registry]] ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3526</id>
		<title>Docker 2024 04</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3526"/>
		<updated>2024-04-18T10:35:32Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Virtualisierung vs Containerisierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Schulung Docker 2024/04 =&lt;br /&gt;
In der folgenden Schulung soll ein grundlegendes Verständnis für die Containerisierung erworben werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Teilnehmer_innen sollen nach der Schulung in der Lage sein&#039;&#039;&#039;&lt;br /&gt;
* eigene Docker Images zu erstellen und diese mittels Docker Compose zu starten&lt;br /&gt;
* die bereitgestellten Ressourcen für Arbeitsspeicher, CPU Zeit und Disk IO zu modifizieren&lt;br /&gt;
* die Einsatzzwecke der verschiedenen Networking Modelle (insbesondere Bridge und Host Network) zu unterscheiden und diese gezielt anwenden können&lt;br /&gt;
* eine eigene Image Registry zu erstellen und dort Images ablegen und abrufen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welche Bereiche werden explizit ausgeklammert:&#039;&#039;&#039;&lt;br /&gt;
* Limitierung von Netzwerkresourcen ([https://man7.org/linux/man-pages/man8/tc.8.html siehe tc])&lt;br /&gt;
* Limitierung von Speicherplatz ([https://de.wikipedia.org/wiki/XFS_(Dateisystem) siehe XFS])&lt;br /&gt;
&lt;br /&gt;
== Virtualisierung vs Containerisierung ==&lt;br /&gt;
&lt;br /&gt;
Beide Varianten bieten die Möglichkeit Applikationen isoliert von anderen Prozessen auszuführen. Im Gegensatz zur Containerisierung wird bei der Virtualisierung ein komplettes Betriebssystem mit entsprechenden Anwendungen gestartet.&lt;br /&gt;
&lt;br /&gt;
=== Gründe für Virtualisierung und Containerisierung ===&lt;br /&gt;
Programme können lokal, oder auf Servern installiert werden. Hierfür benötigt es keine der beiden Technologien. Folgende Gründe sprechen für diese Technologien&lt;br /&gt;
 &#039;&#039;&#039;Teilen von Hardware Ressourcen&#039;&#039;&#039;&lt;br /&gt;
 Virtualisierung bietet die Möglichkeit physische Hardware auf mehrere Betriebssysteme zu verteilen.&lt;br /&gt;
 Containerisierung bietet die Möglichkeit physische Hardware auf mehrere Applikationen zu verteilen.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Isolationsgrad&#039;&#039;&#039;&lt;br /&gt;
 Fehlerhafte Anwendungen oder Sicherheitslücken wirken sich nicht auf das gesamte System aus.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Übertragbarkeit&#039;&#039;&#039;&lt;br /&gt;
 Ein weiterer Vorteil der Virtualisierung bzw. Containerisierung ist die in sich abgeschlossene und übertragbare Umgebung. Eine gekapselte Anwendung kann so auf nahezu jedem System ausgeführt werden. Die Abhängigkeiten beschränken sich hierbei auf ein Minimum.&lt;br /&gt;
&lt;br /&gt;
=== Virtualisierung ===&lt;br /&gt;
Bei der Virtualisierung übernimmt der &#039;&#039;&#039;Hypervisor&#039;&#039;&#039; das erstellen, starten und das Zuteilen der Hardwareressourcen des Hosts, an die virtualisierten Gast Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
 Ein Hypervisor ist eine Software, die virtuelle Maschinen (VMs) erstellt und ausführt. Ein Hypervisor, manchmal auch Virtual Machine Monitor (VMM) genannt, isoliert das Hypervisor-Betriebssystem und die Ressourcen von den virtuellen Maschinen und ermöglicht die Erstellung und Verwaltung dieser VMs.&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hypervisoren können in verschiedene Typen eingeteilt werden:&lt;br /&gt;
* &#039;&#039;&#039;Typ 1&#039;&#039;&#039;, Läuft direkt auf der Hardware (z.B.: KVM, Microsoft Hyper-V und VMware vSphere)&lt;br /&gt;
* &#039;&#039;&#039;Typ 2&#039;&#039;&#039;, Läuft auf einem Host Betriebssystem (z.B.: VMware Workstation und Oracle VirtualBox)&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Virtual-Machines.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Containerisierung ===&lt;br /&gt;
 Unter Containerisierung versteht man das Zusammenfassen von Softwarecode mit den für die Ausführung des Codes erforderlichen Betriebssystembibliotheken und Abhängigkeiten zu einer einzigen ausführbaren Datei, die als Container bezeichnet wird und in jeder Infrastruktur konsistent ausgeführt werden kann.  Container sind portabler und ressourceneffizienter als virtuelle Maschinen (VMs) und haben sich de facto zu den Recheneinheiten moderner cloudnativer Anwendungen entwickelt.&amp;lt;ref&amp;gt;https://www.ibm.com/de-de/topics/containerization&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Container Lösungen bieten im Vergleich zur Virtualisierung eine leichtgewichtigere Möglichkeit Applikationen isoliert zu starten. Folgende Informationen beziehen sich auf Docker, sind aber möglicherweise auch auf andere Container Lösungen (wie z.B.: LXC) übertragbar.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zur Virtualisierung wird bei der Containerisierung nur die zu startende Anwendung und ihre Abhängigkeiten gestartet. Es wird kein komplettes Betriebssystem initialisiert. Der Container teilt sich den Kernel mit dem Hostbetriebssystem. Die Isolierung zu den Hostanwendungen erfolgt durch verschiedene andere Mechanismen die im weiteren Verlauf erklärt werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Containers.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Vor- und Nachteile ===&lt;br /&gt;
Folgend eine sehr vereinfachte Gegenüberstellung:&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Virtualisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Sehr hoher Isolationsgrad&lt;br /&gt;
 Negativ: Höherer Ressourcenverbrauch&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Containerisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Geringer Ressourcenverbrauch&lt;br /&gt;
 Negativ: Nicht so hoher Isolationsgrad, Host Kernel wird direkt von allen Containern verwendet&lt;br /&gt;
&lt;br /&gt;
== Docker ==&lt;br /&gt;
&lt;br /&gt;
Docker ist eine der am weitesten verbreiteten und unterstützten Container Lösungen. Docker selbst kann nur in Verbindung mit dem Linux Kernel verwendet werden.&lt;br /&gt;
 Natürlich kann Docker auf weiteren Betriebssystemen wie Windows oder MacOS verwendet werden. Jedoch wird hierbei ein Hostsystem mit Linux Kernel emuliert (starke Vereinfachung).&lt;br /&gt;
&lt;br /&gt;
=== Container Isolierung ===&lt;br /&gt;
&lt;br /&gt;
Um den starken Isolationsgrad zu erreichen, d.h.: Anwendungungen im Container von anderen Anwendungen zu trennen, werden einige Features des Linux Kernels benötigt. Das folgende wird möglicherweise auch das Verständnis von Isolation verbessern:&lt;br /&gt;
&lt;br /&gt;
==== Namespaces ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;Namespaces are a feature of the Linux kernel that partition kernel resources such that one set of processes sees one set of resources, while another set of processes sees a different set of resources. The feature works by having the same namespace for a set of resources and processes, but those namespaces refer to distinct resources. Resources may exist in multiple spaces. Examples of such resources are process IDs, host-names, user IDs, file names, some names associated with network access, and Inter-process communication.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Linux_namespaces&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PID Namespace&#039;&#039;&#039; - Jeder Container hat seinen eigenen Prozess-ID-Namespace, was bedeutet, dass die Prozesse in einem Container nur ihre eigenen Prozess-IDs sehen können und nicht die IDs der Prozesse außerhalb des Containers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Network Namespace&#039;&#039;&#039; - Docker erstellt für jeden Container einen eigenen Netzwerknamespace. Das bedeutet, dass jeder Container sein eigenes Netzwerkinterface, seine eigenen IP-Adressen, Routing-Tabellen usw. hat. Dadurch können Container voneinander isoliert sein und unabhängig voneinander agieren.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mount Namespace&#039;&#039;&#039; - Mount Namespaces isolieren das Dateisystem des Containers von dem des Hostsystems. Jeder Container hat sein eigenes Dateisystem, was es ermöglicht, dass verschiedene Container unterschiedliche Dateisysteme nutzen können, ohne sich gegenseitig zu beeinflussen.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;IPC Namespace&#039;&#039;&#039; - IPC (Inter Process Communication) Namespaces isolieren die Interprozesskommunikation, wie zum Beispiel die Verwendung von Shared Memory oder IPC Pipes. Dadurch sind die Kommunikationsmechanismen zwischen Prozessen in verschiedenen Containern getrennt.&lt;br /&gt;
&lt;br /&gt;
==== CGroups ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;cgroups (abbreviated from control groups) is a Linux kernel feature that limits, accounts for, and isolates the resource usage (CPU, memory, disk I/O, etc.[1]) of a collection of processes.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Cgroups&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CPU-Begrenzung&#039;&#039;&#039; - Mit cgroups kann Docker die CPU-Nutzung jedes Containers begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht mehr CPU-Ressourcen verwendet als ihm zugewiesen wurden, und um sicherzustellen, dass andere Container und Anwendungen auf dem Hostsystem ausreichend CPU-Zeit erhalten.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Speicherbegrenzung&#039;&#039;&#039; - Docker kann die Menge an Arbeitsspeicher, die von einem Container verwendet werden kann, mithilfe von cgroups begrenzen. Dies hilft dabei, zu verhindern, dass ein einzelner Container zu viel Arbeitsspeicher beansprucht und das gesamte System zum Absturz bringt.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;I/O-Begrenzung&#039;&#039;&#039; - Durch cgroups kann Docker die Ein- und Ausgabegeschwindigkeit für einen Container begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht zu viel Festplatten- oder Netzwerkbandbreite beansprucht und dadurch die Leistung anderer Container beeinträchtigt.&lt;br /&gt;
&lt;br /&gt;
==== Weitere Mechanismen ====&lt;br /&gt;
* SELinux&lt;br /&gt;
* AppArmor&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen finden sich [https://medium.com/@BeNitinAgarwal/understanding-the-docker-internals-7ccb052ce9fe hier]&lt;br /&gt;
&lt;br /&gt;
=== Aufbau von Docker ===&lt;br /&gt;
&lt;br /&gt;
Docker besteht aus den folgend genannten Komponenten:&lt;br /&gt;
&lt;br /&gt;
==== Images ====&lt;br /&gt;
Images bilden in sich abgeschlossenen Applikationen welche mit der &#039;&#039;&#039;Docker Engine&#039;&#039;&#039; erstellt und gestartet (&#039;&#039;&#039;Container&#039;&#039;&#039;) werden können.&lt;br /&gt;
&lt;br /&gt;
==== Registry ====&lt;br /&gt;
Eine zentrale stelle an der Docker Images gespeichert und abgerufen werden kann. Die wohl bekannteste Registry ist [https://hub.docker.com/ dockerhub]. Es kann jedoch auch eine eigene Registry erstellt werden.&lt;br /&gt;
&lt;br /&gt;
==== Engine ====&lt;br /&gt;
Die Docker Engine ist das Herzstück von Docker. Sie besteht aus drei Komponenten:&lt;br /&gt;
# &#039;&#039;&#039;Docker-Daemon&#039;&#039;&#039; - Der Docker-Daemon läuft als Hintergrundprozess auf dem Host System. Dieser ist die zentrale Steuerung der Docker Engine und ist zuständig für sämtliche Verwaltungsaufgaben (z.B.: Anlegen von Netzwerken, Volumes, Images und Containern)&lt;br /&gt;
# &#039;&#039;&#039;REST Api&#039;&#039;&#039; - Dient der Kommunikation mit dem Docker Daemon&lt;br /&gt;
# &#039;&#039;&#039;Command Line Interface&#039;&#039;&#039; - Kommuniziert über die REST Api mit dem Daemon und ermöglicht dem User das ausführen von Docker Befehlen&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.ionos.at/digitalguide/server/konfiguration/docker-tutorial-installation-und-erste-schritte&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Docker_2024_04/Containers|Container]] ===&lt;br /&gt;
=== [[Docker_2024_04/Networking|Networking]] ===&lt;br /&gt;
=== [[Docker_2024_04/Image|Image erstellen]] ===&lt;br /&gt;
=== [[Docker_2024_04/Resource Restriction|Resourcen limitieren]] ===&lt;br /&gt;
=== [[Docker_2024_04/Docker Compose|Docker Compose]] ===&lt;br /&gt;
=== [[Docker_2024_04/Registry|Registry]] ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3525</id>
		<title>Docker 2024 04</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3525"/>
		<updated>2024-04-18T10:34:47Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Virtualisierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Schulung Docker 2024/04 =&lt;br /&gt;
In der folgenden Schulung soll ein grundlegendes Verständnis für die Containerisierung erworben werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Teilnehmer_innen sollen nach der Schulung in der Lage sein&#039;&#039;&#039;&lt;br /&gt;
* eigene Docker Images zu erstellen und diese mittels Docker Compose zu starten&lt;br /&gt;
* die bereitgestellten Ressourcen für Arbeitsspeicher, CPU Zeit und Disk IO zu modifizieren&lt;br /&gt;
* die Einsatzzwecke der verschiedenen Networking Modelle (insbesondere Bridge und Host Network) zu unterscheiden und diese gezielt anwenden können&lt;br /&gt;
* eine eigene Image Registry zu erstellen und dort Images ablegen und abrufen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welche Bereiche werden explizit ausgeklammert:&#039;&#039;&#039;&lt;br /&gt;
* Limitierung von Netzwerkresourcen ([https://man7.org/linux/man-pages/man8/tc.8.html siehe tc])&lt;br /&gt;
* Limitierung von Speicherplatz ([https://de.wikipedia.org/wiki/XFS_(Dateisystem) siehe XFS])&lt;br /&gt;
&lt;br /&gt;
== Virtualisierung vs Containerisierung ==&lt;br /&gt;
&lt;br /&gt;
Beide Varianten bieten die Möglichkeit Applikationen isoliert von anderen Prozessen auszuführen. Im Gegensatz zur Containerisierung wird bei der Virtualisierung ein komplettes Betriebssystem mit entsprechenden Anwendungen gestartet.&lt;br /&gt;
&lt;br /&gt;
=== Gründe für Virtualisierung und Containerisierung ===&lt;br /&gt;
Programme können lokal, oder auf Servern installiert werden. Hierfür benötigt es keine der beiden Technologien. Folgende Gründe sprechen für diese Technologien&lt;br /&gt;
 &#039;&#039;&#039;Teilen von Hardware Ressourcen&#039;&#039;&#039;&lt;br /&gt;
 Virtualisierung bietet die Möglichkeit physische Hardware auf mehrere Betriebssysteme zu verteilen.&lt;br /&gt;
 Containerisierung bietet die Möglichkeit physische Hardware auf mehrere Applikationen zu verteilen.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Isolationsgrad&#039;&#039;&#039;&lt;br /&gt;
 Fehlerhafte Anwendungen oder Sicherheitslücken wirken sich nicht auf das gesamte System aus.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Übertragbarkeit&#039;&#039;&#039;&lt;br /&gt;
 Ein weiterer Vorteil der Virtualisierung bzw. Containerisierung ist die in sich abgeschlossene und übertragbare Umgebung. Eine gekapselte Anwendung kann so auf nahezu jedem System ausgeführt werden. Die Abhängigkeiten beschränken sich hierbei auf ein Minimum.&lt;br /&gt;
&lt;br /&gt;
=== Virtualisierung ===&lt;br /&gt;
Bei der Virtualisierung übernimmt der &#039;&#039;&#039;Hypervisor&#039;&#039;&#039; das erstellen, starten und das Zuteilen der Hardwareressourcen des Hosts, an die virtualisierten Gast Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
 Ein Hypervisor ist eine Software, die virtuelle Maschinen (VMs) erstellt und ausführt. Ein Hypervisor, manchmal auch Virtual Machine Monitor (VMM) genannt, isoliert das Hypervisor-Betriebssystem und die Ressourcen von den virtuellen Maschinen und ermöglicht die Erstellung und Verwaltung dieser VMs.&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hypervisoren können in verschiedene Typen eingeteilt werden:&lt;br /&gt;
* &#039;&#039;&#039;Typ 1&#039;&#039;&#039;, Läuft direkt auf der Hardware (z.B.: KVM, Microsoft Hyper-V und VMware vSphere)&lt;br /&gt;
* &#039;&#039;&#039;Typ 2&#039;&#039;&#039;, Läuft auf einem Host Betriebssystem (z.B.: VMware Workstation und Oracle VirtualBox)&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Virtual-Machines.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Containerisierung ===&lt;br /&gt;
 Unter Containerisierung versteht man das Zusammenfassen von Softwarecode mit den für die Ausführung des Codes erforderlichen Betriebssystembibliotheken und Abhängigkeiten zu einer einzigen ausführbaren Datei, die als Container bezeichnet wird und in jeder Infrastruktur konsistent ausgeführt werden kann.  Container sind portabler und ressourceneffizienter als virtuelle Maschinen (VMs) und haben sich de facto zu den Recheneinheiten moderner cloudnativer Anwendungen entwickelt.&amp;lt;ref&amp;gt;https://www.ibm.com/de-de/topics/containerization&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Container Lösungen bieten im Vergleich zur Virtualisierung eine leichtgewichtigere Möglichkeit Applikationen isoliert zu starten. Folgende Informationen beziehen sich auf Docker, sind aber möglicherweise auch auf andere Container Lösungen (wie z.B.: LXC) übertragbar.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zur Virtualisierung wird bei der Containerisierung nur die zu startende Anwendung und ihre Abhängigkeiten gestartet. Es wird kein komplettes Betriebssystem initialisiert. Der Container teilt sich den Kernel mit dem Hostbetriebssystem. Die Isolierung zu den Hostanwendungen erfolgt durch verschiedene andere Mechanismen die im weiteren Verlauf erklärt werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Containers.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Virtualisierung vs Containerisierung ===&lt;br /&gt;
 &#039;&#039;&#039;Virtualisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Sehr hoher Isolationsgrad&lt;br /&gt;
 Negativ: Höherer Ressourcenverbrauch&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Containerisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Geringer Ressourcenverbrauch&lt;br /&gt;
 Negativ: Nicht so hoher Isolationsgrad, Host Kernel wird direkt von allen Containern verwendet&lt;br /&gt;
&lt;br /&gt;
== Docker ==&lt;br /&gt;
&lt;br /&gt;
Docker ist eine der am weitesten verbreiteten und unterstützten Container Lösungen. Docker selbst kann nur in Verbindung mit dem Linux Kernel verwendet werden.&lt;br /&gt;
 Natürlich kann Docker auf weiteren Betriebssystemen wie Windows oder MacOS verwendet werden. Jedoch wird hierbei ein Hostsystem mit Linux Kernel emuliert (starke Vereinfachung).&lt;br /&gt;
&lt;br /&gt;
=== Container Isolierung ===&lt;br /&gt;
&lt;br /&gt;
Um den starken Isolationsgrad zu erreichen, d.h.: Anwendungungen im Container von anderen Anwendungen zu trennen, werden einige Features des Linux Kernels benötigt. Das folgende wird möglicherweise auch das Verständnis von Isolation verbessern:&lt;br /&gt;
&lt;br /&gt;
==== Namespaces ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;Namespaces are a feature of the Linux kernel that partition kernel resources such that one set of processes sees one set of resources, while another set of processes sees a different set of resources. The feature works by having the same namespace for a set of resources and processes, but those namespaces refer to distinct resources. Resources may exist in multiple spaces. Examples of such resources are process IDs, host-names, user IDs, file names, some names associated with network access, and Inter-process communication.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Linux_namespaces&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PID Namespace&#039;&#039;&#039; - Jeder Container hat seinen eigenen Prozess-ID-Namespace, was bedeutet, dass die Prozesse in einem Container nur ihre eigenen Prozess-IDs sehen können und nicht die IDs der Prozesse außerhalb des Containers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Network Namespace&#039;&#039;&#039; - Docker erstellt für jeden Container einen eigenen Netzwerknamespace. Das bedeutet, dass jeder Container sein eigenes Netzwerkinterface, seine eigenen IP-Adressen, Routing-Tabellen usw. hat. Dadurch können Container voneinander isoliert sein und unabhängig voneinander agieren.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mount Namespace&#039;&#039;&#039; - Mount Namespaces isolieren das Dateisystem des Containers von dem des Hostsystems. Jeder Container hat sein eigenes Dateisystem, was es ermöglicht, dass verschiedene Container unterschiedliche Dateisysteme nutzen können, ohne sich gegenseitig zu beeinflussen.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;IPC Namespace&#039;&#039;&#039; - IPC (Inter Process Communication) Namespaces isolieren die Interprozesskommunikation, wie zum Beispiel die Verwendung von Shared Memory oder IPC Pipes. Dadurch sind die Kommunikationsmechanismen zwischen Prozessen in verschiedenen Containern getrennt.&lt;br /&gt;
&lt;br /&gt;
==== CGroups ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;cgroups (abbreviated from control groups) is a Linux kernel feature that limits, accounts for, and isolates the resource usage (CPU, memory, disk I/O, etc.[1]) of a collection of processes.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Cgroups&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CPU-Begrenzung&#039;&#039;&#039; - Mit cgroups kann Docker die CPU-Nutzung jedes Containers begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht mehr CPU-Ressourcen verwendet als ihm zugewiesen wurden, und um sicherzustellen, dass andere Container und Anwendungen auf dem Hostsystem ausreichend CPU-Zeit erhalten.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Speicherbegrenzung&#039;&#039;&#039; - Docker kann die Menge an Arbeitsspeicher, die von einem Container verwendet werden kann, mithilfe von cgroups begrenzen. Dies hilft dabei, zu verhindern, dass ein einzelner Container zu viel Arbeitsspeicher beansprucht und das gesamte System zum Absturz bringt.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;I/O-Begrenzung&#039;&#039;&#039; - Durch cgroups kann Docker die Ein- und Ausgabegeschwindigkeit für einen Container begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht zu viel Festplatten- oder Netzwerkbandbreite beansprucht und dadurch die Leistung anderer Container beeinträchtigt.&lt;br /&gt;
&lt;br /&gt;
==== Weitere Mechanismen ====&lt;br /&gt;
* SELinux&lt;br /&gt;
* AppArmor&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen finden sich [https://medium.com/@BeNitinAgarwal/understanding-the-docker-internals-7ccb052ce9fe hier]&lt;br /&gt;
&lt;br /&gt;
=== Aufbau von Docker ===&lt;br /&gt;
&lt;br /&gt;
Docker besteht aus den folgend genannten Komponenten:&lt;br /&gt;
&lt;br /&gt;
==== Images ====&lt;br /&gt;
Images bilden in sich abgeschlossenen Applikationen welche mit der &#039;&#039;&#039;Docker Engine&#039;&#039;&#039; erstellt und gestartet (&#039;&#039;&#039;Container&#039;&#039;&#039;) werden können.&lt;br /&gt;
&lt;br /&gt;
==== Registry ====&lt;br /&gt;
Eine zentrale stelle an der Docker Images gespeichert und abgerufen werden kann. Die wohl bekannteste Registry ist [https://hub.docker.com/ dockerhub]. Es kann jedoch auch eine eigene Registry erstellt werden.&lt;br /&gt;
&lt;br /&gt;
==== Engine ====&lt;br /&gt;
Die Docker Engine ist das Herzstück von Docker. Sie besteht aus drei Komponenten:&lt;br /&gt;
# &#039;&#039;&#039;Docker-Daemon&#039;&#039;&#039; - Der Docker-Daemon läuft als Hintergrundprozess auf dem Host System. Dieser ist die zentrale Steuerung der Docker Engine und ist zuständig für sämtliche Verwaltungsaufgaben (z.B.: Anlegen von Netzwerken, Volumes, Images und Containern)&lt;br /&gt;
# &#039;&#039;&#039;REST Api&#039;&#039;&#039; - Dient der Kommunikation mit dem Docker Daemon&lt;br /&gt;
# &#039;&#039;&#039;Command Line Interface&#039;&#039;&#039; - Kommuniziert über die REST Api mit dem Daemon und ermöglicht dem User das ausführen von Docker Befehlen&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.ionos.at/digitalguide/server/konfiguration/docker-tutorial-installation-und-erste-schritte&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Docker_2024_04/Containers|Container]] ===&lt;br /&gt;
=== [[Docker_2024_04/Networking|Networking]] ===&lt;br /&gt;
=== [[Docker_2024_04/Image|Image erstellen]] ===&lt;br /&gt;
=== [[Docker_2024_04/Resource Restriction|Resourcen limitieren]] ===&lt;br /&gt;
=== [[Docker_2024_04/Docker Compose|Docker Compose]] ===&lt;br /&gt;
=== [[Docker_2024_04/Registry|Registry]] ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3524</id>
		<title>Docker 2024 04</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3524"/>
		<updated>2024-04-18T10:34:31Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Virtualisierung vs Containerisierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Schulung Docker 2024/04 =&lt;br /&gt;
In der folgenden Schulung soll ein grundlegendes Verständnis für die Containerisierung erworben werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Teilnehmer_innen sollen nach der Schulung in der Lage sein&#039;&#039;&#039;&lt;br /&gt;
* eigene Docker Images zu erstellen und diese mittels Docker Compose zu starten&lt;br /&gt;
* die bereitgestellten Ressourcen für Arbeitsspeicher, CPU Zeit und Disk IO zu modifizieren&lt;br /&gt;
* die Einsatzzwecke der verschiedenen Networking Modelle (insbesondere Bridge und Host Network) zu unterscheiden und diese gezielt anwenden können&lt;br /&gt;
* eine eigene Image Registry zu erstellen und dort Images ablegen und abrufen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welche Bereiche werden explizit ausgeklammert:&#039;&#039;&#039;&lt;br /&gt;
* Limitierung von Netzwerkresourcen ([https://man7.org/linux/man-pages/man8/tc.8.html siehe tc])&lt;br /&gt;
* Limitierung von Speicherplatz ([https://de.wikipedia.org/wiki/XFS_(Dateisystem) siehe XFS])&lt;br /&gt;
&lt;br /&gt;
== Virtualisierung vs Containerisierung ==&lt;br /&gt;
&lt;br /&gt;
Beide Varianten bieten die Möglichkeit Applikationen isoliert von anderen Prozessen auszuführen. Im Gegensatz zur Containerisierung wird bei der Virtualisierung ein komplettes Betriebssystem mit entsprechenden Anwendungen gestartet.&lt;br /&gt;
&lt;br /&gt;
=== Gründe für Virtualisierung und Containerisierung ===&lt;br /&gt;
Programme können lokal, oder auf Servern installiert werden. Hierfür benötigt es keine der beiden Technologien. Folgende Gründe sprechen für diese Technologien&lt;br /&gt;
 &#039;&#039;&#039;Teilen von Hardware Ressourcen&#039;&#039;&#039;&lt;br /&gt;
 Virtualisierung bietet die Möglichkeit physische Hardware auf mehrere Betriebssysteme zu verteilen.&lt;br /&gt;
 Containerisierung bietet die Möglichkeit physische Hardware auf mehrere Applikationen zu verteilen.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Isolationsgrad&#039;&#039;&#039;&lt;br /&gt;
 Fehlerhafte Anwendungen oder Sicherheitslücken wirken sich nicht auf das gesamte System aus.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Übertragbarkeit&#039;&#039;&#039;&lt;br /&gt;
 Ein weiterer Vorteil der Virtualisierung bzw. Containerisierung ist die in sich abgeschlossene und übertragbare Umgebung. Eine gekapselte Anwendung kann so auf nahezu jedem System ausgeführt werden. Die Abhängigkeiten beschränken sich hierbei auf ein Minimum.&lt;br /&gt;
&lt;br /&gt;
=== Virtualisierung ===&lt;br /&gt;
Bei der Virtualisierung übernimmt der &#039;&#039;&#039;Hypervisor&#039;&#039;&#039; das erstellen, starten und das Zuteilen der Hardwareressourcen des Hosts, an die virtualisierten Gast Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
 Ein Hypervisor ist eine Software, die virtuelle Maschinen (VMs) erstellt und ausführt. Ein Hypervisor, manchmal auch Virtual Machine Monitor (VMM) genannt, isoliert das Hypervisor-Betriebssystem und die Ressourcen von den virtuellen Maschinen und ermöglicht die Erstellung und Verwaltung dieser VMs.&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hypervisoren können in verschiedene Typen eingeteilt werden:&lt;br /&gt;
* Typ 1, Läuft direkt auf der Hardware (z.B.: KVM, Microsoft Hyper-V und VMware vSphere)&lt;br /&gt;
* Typ 2, Läuft auf einem Host Betriebssystem (z.B.: VMware Workstation und Oracle VirtualBox)&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Virtual-Machines.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Containerisierung ===&lt;br /&gt;
 Unter Containerisierung versteht man das Zusammenfassen von Softwarecode mit den für die Ausführung des Codes erforderlichen Betriebssystembibliotheken und Abhängigkeiten zu einer einzigen ausführbaren Datei, die als Container bezeichnet wird und in jeder Infrastruktur konsistent ausgeführt werden kann.  Container sind portabler und ressourceneffizienter als virtuelle Maschinen (VMs) und haben sich de facto zu den Recheneinheiten moderner cloudnativer Anwendungen entwickelt.&amp;lt;ref&amp;gt;https://www.ibm.com/de-de/topics/containerization&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Container Lösungen bieten im Vergleich zur Virtualisierung eine leichtgewichtigere Möglichkeit Applikationen isoliert zu starten. Folgende Informationen beziehen sich auf Docker, sind aber möglicherweise auch auf andere Container Lösungen (wie z.B.: LXC) übertragbar.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zur Virtualisierung wird bei der Containerisierung nur die zu startende Anwendung und ihre Abhängigkeiten gestartet. Es wird kein komplettes Betriebssystem initialisiert. Der Container teilt sich den Kernel mit dem Hostbetriebssystem. Die Isolierung zu den Hostanwendungen erfolgt durch verschiedene andere Mechanismen die im weiteren Verlauf erklärt werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Containers.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Virtualisierung vs Containerisierung ===&lt;br /&gt;
 &#039;&#039;&#039;Virtualisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Sehr hoher Isolationsgrad&lt;br /&gt;
 Negativ: Höherer Ressourcenverbrauch&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Containerisierung&#039;&#039;&#039;&lt;br /&gt;
 Positiv: Geringer Ressourcenverbrauch&lt;br /&gt;
 Negativ: Nicht so hoher Isolationsgrad, Host Kernel wird direkt von allen Containern verwendet&lt;br /&gt;
&lt;br /&gt;
== Docker ==&lt;br /&gt;
&lt;br /&gt;
Docker ist eine der am weitesten verbreiteten und unterstützten Container Lösungen. Docker selbst kann nur in Verbindung mit dem Linux Kernel verwendet werden.&lt;br /&gt;
 Natürlich kann Docker auf weiteren Betriebssystemen wie Windows oder MacOS verwendet werden. Jedoch wird hierbei ein Hostsystem mit Linux Kernel emuliert (starke Vereinfachung).&lt;br /&gt;
&lt;br /&gt;
=== Container Isolierung ===&lt;br /&gt;
&lt;br /&gt;
Um den starken Isolationsgrad zu erreichen, d.h.: Anwendungungen im Container von anderen Anwendungen zu trennen, werden einige Features des Linux Kernels benötigt. Das folgende wird möglicherweise auch das Verständnis von Isolation verbessern:&lt;br /&gt;
&lt;br /&gt;
==== Namespaces ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;Namespaces are a feature of the Linux kernel that partition kernel resources such that one set of processes sees one set of resources, while another set of processes sees a different set of resources. The feature works by having the same namespace for a set of resources and processes, but those namespaces refer to distinct resources. Resources may exist in multiple spaces. Examples of such resources are process IDs, host-names, user IDs, file names, some names associated with network access, and Inter-process communication.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Linux_namespaces&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PID Namespace&#039;&#039;&#039; - Jeder Container hat seinen eigenen Prozess-ID-Namespace, was bedeutet, dass die Prozesse in einem Container nur ihre eigenen Prozess-IDs sehen können und nicht die IDs der Prozesse außerhalb des Containers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Network Namespace&#039;&#039;&#039; - Docker erstellt für jeden Container einen eigenen Netzwerknamespace. Das bedeutet, dass jeder Container sein eigenes Netzwerkinterface, seine eigenen IP-Adressen, Routing-Tabellen usw. hat. Dadurch können Container voneinander isoliert sein und unabhängig voneinander agieren.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mount Namespace&#039;&#039;&#039; - Mount Namespaces isolieren das Dateisystem des Containers von dem des Hostsystems. Jeder Container hat sein eigenes Dateisystem, was es ermöglicht, dass verschiedene Container unterschiedliche Dateisysteme nutzen können, ohne sich gegenseitig zu beeinflussen.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;IPC Namespace&#039;&#039;&#039; - IPC (Inter Process Communication) Namespaces isolieren die Interprozesskommunikation, wie zum Beispiel die Verwendung von Shared Memory oder IPC Pipes. Dadurch sind die Kommunikationsmechanismen zwischen Prozessen in verschiedenen Containern getrennt.&lt;br /&gt;
&lt;br /&gt;
==== CGroups ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;cgroups (abbreviated from control groups) is a Linux kernel feature that limits, accounts for, and isolates the resource usage (CPU, memory, disk I/O, etc.[1]) of a collection of processes.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Cgroups&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CPU-Begrenzung&#039;&#039;&#039; - Mit cgroups kann Docker die CPU-Nutzung jedes Containers begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht mehr CPU-Ressourcen verwendet als ihm zugewiesen wurden, und um sicherzustellen, dass andere Container und Anwendungen auf dem Hostsystem ausreichend CPU-Zeit erhalten.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Speicherbegrenzung&#039;&#039;&#039; - Docker kann die Menge an Arbeitsspeicher, die von einem Container verwendet werden kann, mithilfe von cgroups begrenzen. Dies hilft dabei, zu verhindern, dass ein einzelner Container zu viel Arbeitsspeicher beansprucht und das gesamte System zum Absturz bringt.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;I/O-Begrenzung&#039;&#039;&#039; - Durch cgroups kann Docker die Ein- und Ausgabegeschwindigkeit für einen Container begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht zu viel Festplatten- oder Netzwerkbandbreite beansprucht und dadurch die Leistung anderer Container beeinträchtigt.&lt;br /&gt;
&lt;br /&gt;
==== Weitere Mechanismen ====&lt;br /&gt;
* SELinux&lt;br /&gt;
* AppArmor&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen finden sich [https://medium.com/@BeNitinAgarwal/understanding-the-docker-internals-7ccb052ce9fe hier]&lt;br /&gt;
&lt;br /&gt;
=== Aufbau von Docker ===&lt;br /&gt;
&lt;br /&gt;
Docker besteht aus den folgend genannten Komponenten:&lt;br /&gt;
&lt;br /&gt;
==== Images ====&lt;br /&gt;
Images bilden in sich abgeschlossenen Applikationen welche mit der &#039;&#039;&#039;Docker Engine&#039;&#039;&#039; erstellt und gestartet (&#039;&#039;&#039;Container&#039;&#039;&#039;) werden können.&lt;br /&gt;
&lt;br /&gt;
==== Registry ====&lt;br /&gt;
Eine zentrale stelle an der Docker Images gespeichert und abgerufen werden kann. Die wohl bekannteste Registry ist [https://hub.docker.com/ dockerhub]. Es kann jedoch auch eine eigene Registry erstellt werden.&lt;br /&gt;
&lt;br /&gt;
==== Engine ====&lt;br /&gt;
Die Docker Engine ist das Herzstück von Docker. Sie besteht aus drei Komponenten:&lt;br /&gt;
# &#039;&#039;&#039;Docker-Daemon&#039;&#039;&#039; - Der Docker-Daemon läuft als Hintergrundprozess auf dem Host System. Dieser ist die zentrale Steuerung der Docker Engine und ist zuständig für sämtliche Verwaltungsaufgaben (z.B.: Anlegen von Netzwerken, Volumes, Images und Containern)&lt;br /&gt;
# &#039;&#039;&#039;REST Api&#039;&#039;&#039; - Dient der Kommunikation mit dem Docker Daemon&lt;br /&gt;
# &#039;&#039;&#039;Command Line Interface&#039;&#039;&#039; - Kommuniziert über die REST Api mit dem Daemon und ermöglicht dem User das ausführen von Docker Befehlen&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.ionos.at/digitalguide/server/konfiguration/docker-tutorial-installation-und-erste-schritte&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Docker_2024_04/Containers|Container]] ===&lt;br /&gt;
=== [[Docker_2024_04/Networking|Networking]] ===&lt;br /&gt;
=== [[Docker_2024_04/Image|Image erstellen]] ===&lt;br /&gt;
=== [[Docker_2024_04/Resource Restriction|Resourcen limitieren]] ===&lt;br /&gt;
=== [[Docker_2024_04/Docker Compose|Docker Compose]] ===&lt;br /&gt;
=== [[Docker_2024_04/Registry|Registry]] ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3523</id>
		<title>Docker 2024 04</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3523"/>
		<updated>2024-04-18T10:31:16Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Containerisierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Schulung Docker 2024/04 =&lt;br /&gt;
In der folgenden Schulung soll ein grundlegendes Verständnis für die Containerisierung erworben werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Teilnehmer_innen sollen nach der Schulung in der Lage sein&#039;&#039;&#039;&lt;br /&gt;
* eigene Docker Images zu erstellen und diese mittels Docker Compose zu starten&lt;br /&gt;
* die bereitgestellten Ressourcen für Arbeitsspeicher, CPU Zeit und Disk IO zu modifizieren&lt;br /&gt;
* die Einsatzzwecke der verschiedenen Networking Modelle (insbesondere Bridge und Host Network) zu unterscheiden und diese gezielt anwenden können&lt;br /&gt;
* eine eigene Image Registry zu erstellen und dort Images ablegen und abrufen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welche Bereiche werden explizit ausgeklammert:&#039;&#039;&#039;&lt;br /&gt;
* Limitierung von Netzwerkresourcen ([https://man7.org/linux/man-pages/man8/tc.8.html siehe tc])&lt;br /&gt;
* Limitierung von Speicherplatz ([https://de.wikipedia.org/wiki/XFS_(Dateisystem) siehe XFS])&lt;br /&gt;
&lt;br /&gt;
== Virtualisierung vs Containerisierung ==&lt;br /&gt;
&lt;br /&gt;
Beide Varianten bieten die Möglichkeit Applikationen isoliert von anderen Prozessen auszuführen. Im Gegensatz zur Containerisierung wird bei der Virtualisierung ein komplettes Betriebssystem mit entsprechenden Anwendungen gestartet.&lt;br /&gt;
&lt;br /&gt;
=== Gründe für Virtualisierung und Containerisierung ===&lt;br /&gt;
Programme können lokal, oder auf Servern installiert werden. Hierfür benötigt es keine der beiden Technologien. Folgende Gründe sprechen für diese Technologien&lt;br /&gt;
 &#039;&#039;&#039;Teilen von Hardware Ressourcen&#039;&#039;&#039;&lt;br /&gt;
 Virtualisierung bietet die Möglichkeit physische Hardware auf mehrere Betriebssysteme zu verteilen.&lt;br /&gt;
 Containerisierung bietet die Möglichkeit physische Hardware auf mehrere Applikationen zu verteilen.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Isolationsgrad&#039;&#039;&#039;&lt;br /&gt;
 Fehlerhafte Anwendungen oder Sicherheitslücken wirken sich nicht auf das gesamte System aus.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Übertragbarkeit&#039;&#039;&#039;&lt;br /&gt;
 Ein weiterer Vorteil der Virtualisierung bzw. Containerisierung ist die in sich abgeschlossene und übertragbare Umgebung. Eine gekapselte Anwendung kann so auf nahezu jedem System ausgeführt werden. Die Abhängigkeiten beschränken sich hierbei auf ein Minimum.&lt;br /&gt;
&lt;br /&gt;
=== Virtualisierung ===&lt;br /&gt;
Bei der Virtualisierung übernimmt der &#039;&#039;&#039;Hypervisor&#039;&#039;&#039; das erstellen, starten und das Zuteilen der Hardwareressourcen des Hosts, an die virtualisierten Gast Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
 Ein Hypervisor ist eine Software, die virtuelle Maschinen (VMs) erstellt und ausführt. Ein Hypervisor, manchmal auch Virtual Machine Monitor (VMM) genannt, isoliert das Hypervisor-Betriebssystem und die Ressourcen von den virtuellen Maschinen und ermöglicht die Erstellung und Verwaltung dieser VMs.&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hypervisoren können in verschiedene Typen eingeteilt werden:&lt;br /&gt;
* Typ 1, Läuft direkt auf der Hardware (z.B.: KVM, Microsoft Hyper-V und VMware vSphere)&lt;br /&gt;
* Typ 2, Läuft auf einem Host Betriebssystem (z.B.: VMware Workstation und Oracle VirtualBox)&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Virtual-Machines.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Containerisierung ===&lt;br /&gt;
 Unter Containerisierung versteht man das Zusammenfassen von Softwarecode mit den für die Ausführung des Codes erforderlichen Betriebssystembibliotheken und Abhängigkeiten zu einer einzigen ausführbaren Datei, die als Container bezeichnet wird und in jeder Infrastruktur konsistent ausgeführt werden kann.  Container sind portabler und ressourceneffizienter als virtuelle Maschinen (VMs) und haben sich de facto zu den Recheneinheiten moderner cloudnativer Anwendungen entwickelt.&amp;lt;ref&amp;gt;https://www.ibm.com/de-de/topics/containerization&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Container Lösungen bieten im Vergleich zur Virtualisierung eine leichtgewichtigere Möglichkeit Applikationen isoliert zu starten. Folgende Informationen beziehen sich auf Docker, sind aber möglicherweise auch auf andere Container Lösungen (wie z.B.: LXC) übertragbar.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zur Virtualisierung wird bei der Containerisierung nur die zu startende Anwendung und ihre Abhängigkeiten gestartet. Es wird kein komplettes Betriebssystem initialisiert. Der Container teilt sich den Kernel mit dem Hostbetriebssystem. Die Isolierung zu den Hostanwendungen erfolgt durch verschiedene andere Mechanismen die im weiteren Verlauf erklärt werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Containers.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
== Docker ==&lt;br /&gt;
&lt;br /&gt;
Docker ist eine der am weitesten verbreiteten und unterstützten Container Lösungen. Docker selbst kann nur in Verbindung mit dem Linux Kernel verwendet werden.&lt;br /&gt;
 Natürlich kann Docker auf weiteren Betriebssystemen wie Windows oder MacOS verwendet werden. Jedoch wird hierbei ein Hostsystem mit Linux Kernel emuliert (starke Vereinfachung).&lt;br /&gt;
&lt;br /&gt;
=== Container Isolierung ===&lt;br /&gt;
&lt;br /&gt;
Um den starken Isolationsgrad zu erreichen, d.h.: Anwendungungen im Container von anderen Anwendungen zu trennen, werden einige Features des Linux Kernels benötigt. Das folgende wird möglicherweise auch das Verständnis von Isolation verbessern:&lt;br /&gt;
&lt;br /&gt;
==== Namespaces ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;Namespaces are a feature of the Linux kernel that partition kernel resources such that one set of processes sees one set of resources, while another set of processes sees a different set of resources. The feature works by having the same namespace for a set of resources and processes, but those namespaces refer to distinct resources. Resources may exist in multiple spaces. Examples of such resources are process IDs, host-names, user IDs, file names, some names associated with network access, and Inter-process communication.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Linux_namespaces&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PID Namespace&#039;&#039;&#039; - Jeder Container hat seinen eigenen Prozess-ID-Namespace, was bedeutet, dass die Prozesse in einem Container nur ihre eigenen Prozess-IDs sehen können und nicht die IDs der Prozesse außerhalb des Containers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Network Namespace&#039;&#039;&#039; - Docker erstellt für jeden Container einen eigenen Netzwerknamespace. Das bedeutet, dass jeder Container sein eigenes Netzwerkinterface, seine eigenen IP-Adressen, Routing-Tabellen usw. hat. Dadurch können Container voneinander isoliert sein und unabhängig voneinander agieren.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mount Namespace&#039;&#039;&#039; - Mount Namespaces isolieren das Dateisystem des Containers von dem des Hostsystems. Jeder Container hat sein eigenes Dateisystem, was es ermöglicht, dass verschiedene Container unterschiedliche Dateisysteme nutzen können, ohne sich gegenseitig zu beeinflussen.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;IPC Namespace&#039;&#039;&#039; - IPC (Inter Process Communication) Namespaces isolieren die Interprozesskommunikation, wie zum Beispiel die Verwendung von Shared Memory oder IPC Pipes. Dadurch sind die Kommunikationsmechanismen zwischen Prozessen in verschiedenen Containern getrennt.&lt;br /&gt;
&lt;br /&gt;
==== CGroups ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;cgroups (abbreviated from control groups) is a Linux kernel feature that limits, accounts for, and isolates the resource usage (CPU, memory, disk I/O, etc.[1]) of a collection of processes.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Cgroups&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CPU-Begrenzung&#039;&#039;&#039; - Mit cgroups kann Docker die CPU-Nutzung jedes Containers begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht mehr CPU-Ressourcen verwendet als ihm zugewiesen wurden, und um sicherzustellen, dass andere Container und Anwendungen auf dem Hostsystem ausreichend CPU-Zeit erhalten.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Speicherbegrenzung&#039;&#039;&#039; - Docker kann die Menge an Arbeitsspeicher, die von einem Container verwendet werden kann, mithilfe von cgroups begrenzen. Dies hilft dabei, zu verhindern, dass ein einzelner Container zu viel Arbeitsspeicher beansprucht und das gesamte System zum Absturz bringt.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;I/O-Begrenzung&#039;&#039;&#039; - Durch cgroups kann Docker die Ein- und Ausgabegeschwindigkeit für einen Container begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht zu viel Festplatten- oder Netzwerkbandbreite beansprucht und dadurch die Leistung anderer Container beeinträchtigt.&lt;br /&gt;
&lt;br /&gt;
==== Weitere Mechanismen ====&lt;br /&gt;
* SELinux&lt;br /&gt;
* AppArmor&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen finden sich [https://medium.com/@BeNitinAgarwal/understanding-the-docker-internals-7ccb052ce9fe hier]&lt;br /&gt;
&lt;br /&gt;
=== Aufbau von Docker ===&lt;br /&gt;
&lt;br /&gt;
Docker besteht aus den folgend genannten Komponenten:&lt;br /&gt;
&lt;br /&gt;
==== Images ====&lt;br /&gt;
Images bilden in sich abgeschlossenen Applikationen welche mit der &#039;&#039;&#039;Docker Engine&#039;&#039;&#039; erstellt und gestartet (&#039;&#039;&#039;Container&#039;&#039;&#039;) werden können.&lt;br /&gt;
&lt;br /&gt;
==== Registry ====&lt;br /&gt;
Eine zentrale stelle an der Docker Images gespeichert und abgerufen werden kann. Die wohl bekannteste Registry ist [https://hub.docker.com/ dockerhub]. Es kann jedoch auch eine eigene Registry erstellt werden.&lt;br /&gt;
&lt;br /&gt;
==== Engine ====&lt;br /&gt;
Die Docker Engine ist das Herzstück von Docker. Sie besteht aus drei Komponenten:&lt;br /&gt;
# &#039;&#039;&#039;Docker-Daemon&#039;&#039;&#039; - Der Docker-Daemon läuft als Hintergrundprozess auf dem Host System. Dieser ist die zentrale Steuerung der Docker Engine und ist zuständig für sämtliche Verwaltungsaufgaben (z.B.: Anlegen von Netzwerken, Volumes, Images und Containern)&lt;br /&gt;
# &#039;&#039;&#039;REST Api&#039;&#039;&#039; - Dient der Kommunikation mit dem Docker Daemon&lt;br /&gt;
# &#039;&#039;&#039;Command Line Interface&#039;&#039;&#039; - Kommuniziert über die REST Api mit dem Daemon und ermöglicht dem User das ausführen von Docker Befehlen&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.ionos.at/digitalguide/server/konfiguration/docker-tutorial-installation-und-erste-schritte&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Docker_2024_04/Containers|Container]] ===&lt;br /&gt;
=== [[Docker_2024_04/Networking|Networking]] ===&lt;br /&gt;
=== [[Docker_2024_04/Image|Image erstellen]] ===&lt;br /&gt;
=== [[Docker_2024_04/Resource Restriction|Resourcen limitieren]] ===&lt;br /&gt;
=== [[Docker_2024_04/Docker Compose|Docker Compose]] ===&lt;br /&gt;
=== [[Docker_2024_04/Registry|Registry]] ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3522</id>
		<title>Docker 2024 04</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3522"/>
		<updated>2024-04-18T10:30:47Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Virtualisierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Schulung Docker 2024/04 =&lt;br /&gt;
In der folgenden Schulung soll ein grundlegendes Verständnis für die Containerisierung erworben werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Teilnehmer_innen sollen nach der Schulung in der Lage sein&#039;&#039;&#039;&lt;br /&gt;
* eigene Docker Images zu erstellen und diese mittels Docker Compose zu starten&lt;br /&gt;
* die bereitgestellten Ressourcen für Arbeitsspeicher, CPU Zeit und Disk IO zu modifizieren&lt;br /&gt;
* die Einsatzzwecke der verschiedenen Networking Modelle (insbesondere Bridge und Host Network) zu unterscheiden und diese gezielt anwenden können&lt;br /&gt;
* eine eigene Image Registry zu erstellen und dort Images ablegen und abrufen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welche Bereiche werden explizit ausgeklammert:&#039;&#039;&#039;&lt;br /&gt;
* Limitierung von Netzwerkresourcen ([https://man7.org/linux/man-pages/man8/tc.8.html siehe tc])&lt;br /&gt;
* Limitierung von Speicherplatz ([https://de.wikipedia.org/wiki/XFS_(Dateisystem) siehe XFS])&lt;br /&gt;
&lt;br /&gt;
== Virtualisierung vs Containerisierung ==&lt;br /&gt;
&lt;br /&gt;
Beide Varianten bieten die Möglichkeit Applikationen isoliert von anderen Prozessen auszuführen. Im Gegensatz zur Containerisierung wird bei der Virtualisierung ein komplettes Betriebssystem mit entsprechenden Anwendungen gestartet.&lt;br /&gt;
&lt;br /&gt;
=== Gründe für Virtualisierung und Containerisierung ===&lt;br /&gt;
Programme können lokal, oder auf Servern installiert werden. Hierfür benötigt es keine der beiden Technologien. Folgende Gründe sprechen für diese Technologien&lt;br /&gt;
 &#039;&#039;&#039;Teilen von Hardware Ressourcen&#039;&#039;&#039;&lt;br /&gt;
 Virtualisierung bietet die Möglichkeit physische Hardware auf mehrere Betriebssysteme zu verteilen.&lt;br /&gt;
 Containerisierung bietet die Möglichkeit physische Hardware auf mehrere Applikationen zu verteilen.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Isolationsgrad&#039;&#039;&#039;&lt;br /&gt;
 Fehlerhafte Anwendungen oder Sicherheitslücken wirken sich nicht auf das gesamte System aus.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Übertragbarkeit&#039;&#039;&#039;&lt;br /&gt;
 Ein weiterer Vorteil der Virtualisierung bzw. Containerisierung ist die in sich abgeschlossene und übertragbare Umgebung. Eine gekapselte Anwendung kann so auf nahezu jedem System ausgeführt werden. Die Abhängigkeiten beschränken sich hierbei auf ein Minimum.&lt;br /&gt;
&lt;br /&gt;
=== Virtualisierung ===&lt;br /&gt;
Bei der Virtualisierung übernimmt der &#039;&#039;&#039;Hypervisor&#039;&#039;&#039; das erstellen, starten und das Zuteilen der Hardwareressourcen des Hosts, an die virtualisierten Gast Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
 Ein Hypervisor ist eine Software, die virtuelle Maschinen (VMs) erstellt und ausführt. Ein Hypervisor, manchmal auch Virtual Machine Monitor (VMM) genannt, isoliert das Hypervisor-Betriebssystem und die Ressourcen von den virtuellen Maschinen und ermöglicht die Erstellung und Verwaltung dieser VMs.&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hypervisoren können in verschiedene Typen eingeteilt werden:&lt;br /&gt;
* Typ 1, Läuft direkt auf der Hardware (z.B.: KVM, Microsoft Hyper-V und VMware vSphere)&lt;br /&gt;
* Typ 2, Läuft auf einem Host Betriebssystem (z.B.: VMware Workstation und Oracle VirtualBox)&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Virtual-Machines.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Containerisierung ===&lt;br /&gt;
&amp;lt;cite&amp;gt;Unter Containerisierung versteht man das Zusammenfassen von Softwarecode mit den für die Ausführung des Codes erforderlichen Betriebssystembibliotheken und Abhängigkeiten zu einer einzigen ausführbaren Datei, die als Container bezeichnet wird und in jeder Infrastruktur konsistent ausgeführt werden kann.  Container sind portabler und ressourceneffizienter als virtuelle Maschinen (VMs) und haben sich de facto zu den Recheneinheiten moderner cloudnativer Anwendungen entwickelt.&amp;lt;ref&amp;gt;https://www.ibm.com/de-de/topics/containerization&amp;lt;/ref&amp;gt;&amp;lt;/cite&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Container Lösungen bieten im Vergleich zur Virtualisierung eine leichtgewichtigere Möglichkeit Applikationen isoliert zu starten. Folgende Informationen beziehen sich auf Docker, sind aber möglicherweise auch auf andere Container Lösungen (wie z.B.: LXC) übertragbar.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zur Virtualisierung wird bei der Containerisierung nur die zu startende Anwendung und ihre Abhängigkeiten gestartet. Es wird kein komplettes Betriebssystem initialisiert. Der Container teilt sich den Kernel mit dem Hostbetriebssystem. Die Isolierung zu den Hostanwendungen erfolgt durch verschiedene andere Mechanismen die im weiteren Verlauf erklärt werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Containers.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
== Docker ==&lt;br /&gt;
&lt;br /&gt;
Docker ist eine der am weitesten verbreiteten und unterstützten Container Lösungen. Docker selbst kann nur in Verbindung mit dem Linux Kernel verwendet werden.&lt;br /&gt;
 Natürlich kann Docker auf weiteren Betriebssystemen wie Windows oder MacOS verwendet werden. Jedoch wird hierbei ein Hostsystem mit Linux Kernel emuliert (starke Vereinfachung).&lt;br /&gt;
&lt;br /&gt;
=== Container Isolierung ===&lt;br /&gt;
&lt;br /&gt;
Um den starken Isolationsgrad zu erreichen, d.h.: Anwendungungen im Container von anderen Anwendungen zu trennen, werden einige Features des Linux Kernels benötigt. Das folgende wird möglicherweise auch das Verständnis von Isolation verbessern:&lt;br /&gt;
&lt;br /&gt;
==== Namespaces ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;Namespaces are a feature of the Linux kernel that partition kernel resources such that one set of processes sees one set of resources, while another set of processes sees a different set of resources. The feature works by having the same namespace for a set of resources and processes, but those namespaces refer to distinct resources. Resources may exist in multiple spaces. Examples of such resources are process IDs, host-names, user IDs, file names, some names associated with network access, and Inter-process communication.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Linux_namespaces&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PID Namespace&#039;&#039;&#039; - Jeder Container hat seinen eigenen Prozess-ID-Namespace, was bedeutet, dass die Prozesse in einem Container nur ihre eigenen Prozess-IDs sehen können und nicht die IDs der Prozesse außerhalb des Containers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Network Namespace&#039;&#039;&#039; - Docker erstellt für jeden Container einen eigenen Netzwerknamespace. Das bedeutet, dass jeder Container sein eigenes Netzwerkinterface, seine eigenen IP-Adressen, Routing-Tabellen usw. hat. Dadurch können Container voneinander isoliert sein und unabhängig voneinander agieren.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mount Namespace&#039;&#039;&#039; - Mount Namespaces isolieren das Dateisystem des Containers von dem des Hostsystems. Jeder Container hat sein eigenes Dateisystem, was es ermöglicht, dass verschiedene Container unterschiedliche Dateisysteme nutzen können, ohne sich gegenseitig zu beeinflussen.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;IPC Namespace&#039;&#039;&#039; - IPC (Inter Process Communication) Namespaces isolieren die Interprozesskommunikation, wie zum Beispiel die Verwendung von Shared Memory oder IPC Pipes. Dadurch sind die Kommunikationsmechanismen zwischen Prozessen in verschiedenen Containern getrennt.&lt;br /&gt;
&lt;br /&gt;
==== CGroups ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;cgroups (abbreviated from control groups) is a Linux kernel feature that limits, accounts for, and isolates the resource usage (CPU, memory, disk I/O, etc.[1]) of a collection of processes.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Cgroups&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CPU-Begrenzung&#039;&#039;&#039; - Mit cgroups kann Docker die CPU-Nutzung jedes Containers begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht mehr CPU-Ressourcen verwendet als ihm zugewiesen wurden, und um sicherzustellen, dass andere Container und Anwendungen auf dem Hostsystem ausreichend CPU-Zeit erhalten.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Speicherbegrenzung&#039;&#039;&#039; - Docker kann die Menge an Arbeitsspeicher, die von einem Container verwendet werden kann, mithilfe von cgroups begrenzen. Dies hilft dabei, zu verhindern, dass ein einzelner Container zu viel Arbeitsspeicher beansprucht und das gesamte System zum Absturz bringt.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;I/O-Begrenzung&#039;&#039;&#039; - Durch cgroups kann Docker die Ein- und Ausgabegeschwindigkeit für einen Container begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht zu viel Festplatten- oder Netzwerkbandbreite beansprucht und dadurch die Leistung anderer Container beeinträchtigt.&lt;br /&gt;
&lt;br /&gt;
==== Weitere Mechanismen ====&lt;br /&gt;
* SELinux&lt;br /&gt;
* AppArmor&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen finden sich [https://medium.com/@BeNitinAgarwal/understanding-the-docker-internals-7ccb052ce9fe hier]&lt;br /&gt;
&lt;br /&gt;
=== Aufbau von Docker ===&lt;br /&gt;
&lt;br /&gt;
Docker besteht aus den folgend genannten Komponenten:&lt;br /&gt;
&lt;br /&gt;
==== Images ====&lt;br /&gt;
Images bilden in sich abgeschlossenen Applikationen welche mit der &#039;&#039;&#039;Docker Engine&#039;&#039;&#039; erstellt und gestartet (&#039;&#039;&#039;Container&#039;&#039;&#039;) werden können.&lt;br /&gt;
&lt;br /&gt;
==== Registry ====&lt;br /&gt;
Eine zentrale stelle an der Docker Images gespeichert und abgerufen werden kann. Die wohl bekannteste Registry ist [https://hub.docker.com/ dockerhub]. Es kann jedoch auch eine eigene Registry erstellt werden.&lt;br /&gt;
&lt;br /&gt;
==== Engine ====&lt;br /&gt;
Die Docker Engine ist das Herzstück von Docker. Sie besteht aus drei Komponenten:&lt;br /&gt;
# &#039;&#039;&#039;Docker-Daemon&#039;&#039;&#039; - Der Docker-Daemon läuft als Hintergrundprozess auf dem Host System. Dieser ist die zentrale Steuerung der Docker Engine und ist zuständig für sämtliche Verwaltungsaufgaben (z.B.: Anlegen von Netzwerken, Volumes, Images und Containern)&lt;br /&gt;
# &#039;&#039;&#039;REST Api&#039;&#039;&#039; - Dient der Kommunikation mit dem Docker Daemon&lt;br /&gt;
# &#039;&#039;&#039;Command Line Interface&#039;&#039;&#039; - Kommuniziert über die REST Api mit dem Daemon und ermöglicht dem User das ausführen von Docker Befehlen&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.ionos.at/digitalguide/server/konfiguration/docker-tutorial-installation-und-erste-schritte&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Docker_2024_04/Containers|Container]] ===&lt;br /&gt;
=== [[Docker_2024_04/Networking|Networking]] ===&lt;br /&gt;
=== [[Docker_2024_04/Image|Image erstellen]] ===&lt;br /&gt;
=== [[Docker_2024_04/Resource Restriction|Resourcen limitieren]] ===&lt;br /&gt;
=== [[Docker_2024_04/Docker Compose|Docker Compose]] ===&lt;br /&gt;
=== [[Docker_2024_04/Registry|Registry]] ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3521</id>
		<title>Docker 2024 04</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3521"/>
		<updated>2024-04-18T10:30:28Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Gründe für Virtualisierung und Containerisierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Schulung Docker 2024/04 =&lt;br /&gt;
In der folgenden Schulung soll ein grundlegendes Verständnis für die Containerisierung erworben werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Teilnehmer_innen sollen nach der Schulung in der Lage sein&#039;&#039;&#039;&lt;br /&gt;
* eigene Docker Images zu erstellen und diese mittels Docker Compose zu starten&lt;br /&gt;
* die bereitgestellten Ressourcen für Arbeitsspeicher, CPU Zeit und Disk IO zu modifizieren&lt;br /&gt;
* die Einsatzzwecke der verschiedenen Networking Modelle (insbesondere Bridge und Host Network) zu unterscheiden und diese gezielt anwenden können&lt;br /&gt;
* eine eigene Image Registry zu erstellen und dort Images ablegen und abrufen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welche Bereiche werden explizit ausgeklammert:&#039;&#039;&#039;&lt;br /&gt;
* Limitierung von Netzwerkresourcen ([https://man7.org/linux/man-pages/man8/tc.8.html siehe tc])&lt;br /&gt;
* Limitierung von Speicherplatz ([https://de.wikipedia.org/wiki/XFS_(Dateisystem) siehe XFS])&lt;br /&gt;
&lt;br /&gt;
== Virtualisierung vs Containerisierung ==&lt;br /&gt;
&lt;br /&gt;
Beide Varianten bieten die Möglichkeit Applikationen isoliert von anderen Prozessen auszuführen. Im Gegensatz zur Containerisierung wird bei der Virtualisierung ein komplettes Betriebssystem mit entsprechenden Anwendungen gestartet.&lt;br /&gt;
&lt;br /&gt;
=== Gründe für Virtualisierung und Containerisierung ===&lt;br /&gt;
Programme können lokal, oder auf Servern installiert werden. Hierfür benötigt es keine der beiden Technologien. Folgende Gründe sprechen für diese Technologien&lt;br /&gt;
 &#039;&#039;&#039;Teilen von Hardware Ressourcen&#039;&#039;&#039;&lt;br /&gt;
 Virtualisierung bietet die Möglichkeit physische Hardware auf mehrere Betriebssysteme zu verteilen.&lt;br /&gt;
 Containerisierung bietet die Möglichkeit physische Hardware auf mehrere Applikationen zu verteilen.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Isolationsgrad&#039;&#039;&#039;&lt;br /&gt;
 Fehlerhafte Anwendungen oder Sicherheitslücken wirken sich nicht auf das gesamte System aus.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Übertragbarkeit&#039;&#039;&#039;&lt;br /&gt;
 Ein weiterer Vorteil der Virtualisierung bzw. Containerisierung ist die in sich abgeschlossene und übertragbare Umgebung. Eine gekapselte Anwendung kann so auf nahezu jedem System ausgeführt werden. Die Abhängigkeiten beschränken sich hierbei auf ein Minimum.&lt;br /&gt;
&lt;br /&gt;
=== Virtualisierung ===&lt;br /&gt;
Bei der Virtualisierung übernimmt der &#039;&#039;&#039;Hypervisor&#039;&#039;&#039; das erstellen, starten und das Zuteilen der Hardwareressource des Hosts, an die virtualisierten Gast Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
 Ein Hypervisor ist eine Software, die virtuelle Maschinen (VMs) erstellt und ausführt. Ein Hypervisor, manchmal auch Virtual Machine Monitor (VMM) genannt, isoliert das Hypervisor-Betriebssystem und die Ressourcen von den virtuellen Maschinen und ermöglicht die Erstellung und Verwaltung dieser VMs.&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hypervisoren können in verschiedene Typen eingeteilt werden:&lt;br /&gt;
* Typ 1, Läuft direkt auf der Hardware (z.B.: KVM, Microsoft Hyper-V und VMware vSphere)&lt;br /&gt;
* Typ 2, Läuft auf einem Host Betriebssystem (z.B.: VMware Workstation und Oracle VirtualBox)&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Virtual-Machines.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Containerisierung ===&lt;br /&gt;
&amp;lt;cite&amp;gt;Unter Containerisierung versteht man das Zusammenfassen von Softwarecode mit den für die Ausführung des Codes erforderlichen Betriebssystembibliotheken und Abhängigkeiten zu einer einzigen ausführbaren Datei, die als Container bezeichnet wird und in jeder Infrastruktur konsistent ausgeführt werden kann.  Container sind portabler und ressourceneffizienter als virtuelle Maschinen (VMs) und haben sich de facto zu den Recheneinheiten moderner cloudnativer Anwendungen entwickelt.&amp;lt;ref&amp;gt;https://www.ibm.com/de-de/topics/containerization&amp;lt;/ref&amp;gt;&amp;lt;/cite&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Container Lösungen bieten im Vergleich zur Virtualisierung eine leichtgewichtigere Möglichkeit Applikationen isoliert zu starten. Folgende Informationen beziehen sich auf Docker, sind aber möglicherweise auch auf andere Container Lösungen (wie z.B.: LXC) übertragbar.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zur Virtualisierung wird bei der Containerisierung nur die zu startende Anwendung und ihre Abhängigkeiten gestartet. Es wird kein komplettes Betriebssystem initialisiert. Der Container teilt sich den Kernel mit dem Hostbetriebssystem. Die Isolierung zu den Hostanwendungen erfolgt durch verschiedene andere Mechanismen die im weiteren Verlauf erklärt werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Containers.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
== Docker ==&lt;br /&gt;
&lt;br /&gt;
Docker ist eine der am weitesten verbreiteten und unterstützten Container Lösungen. Docker selbst kann nur in Verbindung mit dem Linux Kernel verwendet werden.&lt;br /&gt;
 Natürlich kann Docker auf weiteren Betriebssystemen wie Windows oder MacOS verwendet werden. Jedoch wird hierbei ein Hostsystem mit Linux Kernel emuliert (starke Vereinfachung).&lt;br /&gt;
&lt;br /&gt;
=== Container Isolierung ===&lt;br /&gt;
&lt;br /&gt;
Um den starken Isolationsgrad zu erreichen, d.h.: Anwendungungen im Container von anderen Anwendungen zu trennen, werden einige Features des Linux Kernels benötigt. Das folgende wird möglicherweise auch das Verständnis von Isolation verbessern:&lt;br /&gt;
&lt;br /&gt;
==== Namespaces ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;Namespaces are a feature of the Linux kernel that partition kernel resources such that one set of processes sees one set of resources, while another set of processes sees a different set of resources. The feature works by having the same namespace for a set of resources and processes, but those namespaces refer to distinct resources. Resources may exist in multiple spaces. Examples of such resources are process IDs, host-names, user IDs, file names, some names associated with network access, and Inter-process communication.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Linux_namespaces&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PID Namespace&#039;&#039;&#039; - Jeder Container hat seinen eigenen Prozess-ID-Namespace, was bedeutet, dass die Prozesse in einem Container nur ihre eigenen Prozess-IDs sehen können und nicht die IDs der Prozesse außerhalb des Containers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Network Namespace&#039;&#039;&#039; - Docker erstellt für jeden Container einen eigenen Netzwerknamespace. Das bedeutet, dass jeder Container sein eigenes Netzwerkinterface, seine eigenen IP-Adressen, Routing-Tabellen usw. hat. Dadurch können Container voneinander isoliert sein und unabhängig voneinander agieren.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mount Namespace&#039;&#039;&#039; - Mount Namespaces isolieren das Dateisystem des Containers von dem des Hostsystems. Jeder Container hat sein eigenes Dateisystem, was es ermöglicht, dass verschiedene Container unterschiedliche Dateisysteme nutzen können, ohne sich gegenseitig zu beeinflussen.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;IPC Namespace&#039;&#039;&#039; - IPC (Inter Process Communication) Namespaces isolieren die Interprozesskommunikation, wie zum Beispiel die Verwendung von Shared Memory oder IPC Pipes. Dadurch sind die Kommunikationsmechanismen zwischen Prozessen in verschiedenen Containern getrennt.&lt;br /&gt;
&lt;br /&gt;
==== CGroups ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;cgroups (abbreviated from control groups) is a Linux kernel feature that limits, accounts for, and isolates the resource usage (CPU, memory, disk I/O, etc.[1]) of a collection of processes.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Cgroups&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CPU-Begrenzung&#039;&#039;&#039; - Mit cgroups kann Docker die CPU-Nutzung jedes Containers begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht mehr CPU-Ressourcen verwendet als ihm zugewiesen wurden, und um sicherzustellen, dass andere Container und Anwendungen auf dem Hostsystem ausreichend CPU-Zeit erhalten.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Speicherbegrenzung&#039;&#039;&#039; - Docker kann die Menge an Arbeitsspeicher, die von einem Container verwendet werden kann, mithilfe von cgroups begrenzen. Dies hilft dabei, zu verhindern, dass ein einzelner Container zu viel Arbeitsspeicher beansprucht und das gesamte System zum Absturz bringt.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;I/O-Begrenzung&#039;&#039;&#039; - Durch cgroups kann Docker die Ein- und Ausgabegeschwindigkeit für einen Container begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht zu viel Festplatten- oder Netzwerkbandbreite beansprucht und dadurch die Leistung anderer Container beeinträchtigt.&lt;br /&gt;
&lt;br /&gt;
==== Weitere Mechanismen ====&lt;br /&gt;
* SELinux&lt;br /&gt;
* AppArmor&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen finden sich [https://medium.com/@BeNitinAgarwal/understanding-the-docker-internals-7ccb052ce9fe hier]&lt;br /&gt;
&lt;br /&gt;
=== Aufbau von Docker ===&lt;br /&gt;
&lt;br /&gt;
Docker besteht aus den folgend genannten Komponenten:&lt;br /&gt;
&lt;br /&gt;
==== Images ====&lt;br /&gt;
Images bilden in sich abgeschlossenen Applikationen welche mit der &#039;&#039;&#039;Docker Engine&#039;&#039;&#039; erstellt und gestartet (&#039;&#039;&#039;Container&#039;&#039;&#039;) werden können.&lt;br /&gt;
&lt;br /&gt;
==== Registry ====&lt;br /&gt;
Eine zentrale stelle an der Docker Images gespeichert und abgerufen werden kann. Die wohl bekannteste Registry ist [https://hub.docker.com/ dockerhub]. Es kann jedoch auch eine eigene Registry erstellt werden.&lt;br /&gt;
&lt;br /&gt;
==== Engine ====&lt;br /&gt;
Die Docker Engine ist das Herzstück von Docker. Sie besteht aus drei Komponenten:&lt;br /&gt;
# &#039;&#039;&#039;Docker-Daemon&#039;&#039;&#039; - Der Docker-Daemon läuft als Hintergrundprozess auf dem Host System. Dieser ist die zentrale Steuerung der Docker Engine und ist zuständig für sämtliche Verwaltungsaufgaben (z.B.: Anlegen von Netzwerken, Volumes, Images und Containern)&lt;br /&gt;
# &#039;&#039;&#039;REST Api&#039;&#039;&#039; - Dient der Kommunikation mit dem Docker Daemon&lt;br /&gt;
# &#039;&#039;&#039;Command Line Interface&#039;&#039;&#039; - Kommuniziert über die REST Api mit dem Daemon und ermöglicht dem User das ausführen von Docker Befehlen&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.ionos.at/digitalguide/server/konfiguration/docker-tutorial-installation-und-erste-schritte&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Docker_2024_04/Containers|Container]] ===&lt;br /&gt;
=== [[Docker_2024_04/Networking|Networking]] ===&lt;br /&gt;
=== [[Docker_2024_04/Image|Image erstellen]] ===&lt;br /&gt;
=== [[Docker_2024_04/Resource Restriction|Resourcen limitieren]] ===&lt;br /&gt;
=== [[Docker_2024_04/Docker Compose|Docker Compose]] ===&lt;br /&gt;
=== [[Docker_2024_04/Registry|Registry]] ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3520</id>
		<title>Docker 2024 04</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3520"/>
		<updated>2024-04-18T10:30:12Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Gründe für Virtualisierungs und Containerisierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Schulung Docker 2024/04 =&lt;br /&gt;
In der folgenden Schulung soll ein grundlegendes Verständnis für die Containerisierung erworben werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Teilnehmer_innen sollen nach der Schulung in der Lage sein&#039;&#039;&#039;&lt;br /&gt;
* eigene Docker Images zu erstellen und diese mittels Docker Compose zu starten&lt;br /&gt;
* die bereitgestellten Ressourcen für Arbeitsspeicher, CPU Zeit und Disk IO zu modifizieren&lt;br /&gt;
* die Einsatzzwecke der verschiedenen Networking Modelle (insbesondere Bridge und Host Network) zu unterscheiden und diese gezielt anwenden können&lt;br /&gt;
* eine eigene Image Registry zu erstellen und dort Images ablegen und abrufen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welche Bereiche werden explizit ausgeklammert:&#039;&#039;&#039;&lt;br /&gt;
* Limitierung von Netzwerkresourcen ([https://man7.org/linux/man-pages/man8/tc.8.html siehe tc])&lt;br /&gt;
* Limitierung von Speicherplatz ([https://de.wikipedia.org/wiki/XFS_(Dateisystem) siehe XFS])&lt;br /&gt;
&lt;br /&gt;
== Virtualisierung vs Containerisierung ==&lt;br /&gt;
&lt;br /&gt;
Beide Varianten bieten die Möglichkeit Applikationen isoliert von anderen Prozessen auszuführen. Im Gegensatz zur Containerisierung wird bei der Virtualisierung ein komplettes Betriebssystem mit entsprechenden Anwendungen gestartet.&lt;br /&gt;
&lt;br /&gt;
=== Gründe für Virtualisierung und Containerisierung ===&lt;br /&gt;
Programme können lokal, oder auf Servern installiert werden. Hierfür benötigt es keine der beiden Technologien. Folgende Gründe sprechen für diese Technologien&lt;br /&gt;
 &#039;&#039;&#039;Server Hardware kann geteilt werden&#039;&#039;&#039;&lt;br /&gt;
 Virtualisierung bietet die Möglichkeit physische Hardware auf mehrere Betriebssysteme zu verteilen.&lt;br /&gt;
 Containerisierung bietet die Möglichkeit physische Hardware auf mehrere Applikationen zu verteilen.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Isolationsgrad&#039;&#039;&#039;&lt;br /&gt;
 Fehlerhafte Anwendungen oder Sicherheitslücken wirken sich nicht auf das gesamte System aus.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Übertragbarkeit&#039;&#039;&#039;&lt;br /&gt;
 Ein weiterer Vorteil der Virtualisierung bzw. Containerisierung ist die in sich abgeschlossene und übertragbare Umgebung. Eine gekapselte Anwendung kann so auf nahezu jedem System ausgeführt werden. Die Abhängigkeiten beschränken sich hierbei auf ein Minimum.&lt;br /&gt;
&lt;br /&gt;
=== Virtualisierung ===&lt;br /&gt;
Bei der Virtualisierung übernimmt der &#039;&#039;&#039;Hypervisor&#039;&#039;&#039; das erstellen, starten und das Zuteilen der Hardwareressource des Hosts, an die virtualisierten Gast Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
 Ein Hypervisor ist eine Software, die virtuelle Maschinen (VMs) erstellt und ausführt. Ein Hypervisor, manchmal auch Virtual Machine Monitor (VMM) genannt, isoliert das Hypervisor-Betriebssystem und die Ressourcen von den virtuellen Maschinen und ermöglicht die Erstellung und Verwaltung dieser VMs.&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hypervisoren können in verschiedene Typen eingeteilt werden:&lt;br /&gt;
* Typ 1, Läuft direkt auf der Hardware (z.B.: KVM, Microsoft Hyper-V und VMware vSphere)&lt;br /&gt;
* Typ 2, Läuft auf einem Host Betriebssystem (z.B.: VMware Workstation und Oracle VirtualBox)&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Virtual-Machines.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Containerisierung ===&lt;br /&gt;
&amp;lt;cite&amp;gt;Unter Containerisierung versteht man das Zusammenfassen von Softwarecode mit den für die Ausführung des Codes erforderlichen Betriebssystembibliotheken und Abhängigkeiten zu einer einzigen ausführbaren Datei, die als Container bezeichnet wird und in jeder Infrastruktur konsistent ausgeführt werden kann.  Container sind portabler und ressourceneffizienter als virtuelle Maschinen (VMs) und haben sich de facto zu den Recheneinheiten moderner cloudnativer Anwendungen entwickelt.&amp;lt;ref&amp;gt;https://www.ibm.com/de-de/topics/containerization&amp;lt;/ref&amp;gt;&amp;lt;/cite&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Container Lösungen bieten im Vergleich zur Virtualisierung eine leichtgewichtigere Möglichkeit Applikationen isoliert zu starten. Folgende Informationen beziehen sich auf Docker, sind aber möglicherweise auch auf andere Container Lösungen (wie z.B.: LXC) übertragbar.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zur Virtualisierung wird bei der Containerisierung nur die zu startende Anwendung und ihre Abhängigkeiten gestartet. Es wird kein komplettes Betriebssystem initialisiert. Der Container teilt sich den Kernel mit dem Hostbetriebssystem. Die Isolierung zu den Hostanwendungen erfolgt durch verschiedene andere Mechanismen die im weiteren Verlauf erklärt werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Containers.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
== Docker ==&lt;br /&gt;
&lt;br /&gt;
Docker ist eine der am weitesten verbreiteten und unterstützten Container Lösungen. Docker selbst kann nur in Verbindung mit dem Linux Kernel verwendet werden.&lt;br /&gt;
 Natürlich kann Docker auf weiteren Betriebssystemen wie Windows oder MacOS verwendet werden. Jedoch wird hierbei ein Hostsystem mit Linux Kernel emuliert (starke Vereinfachung).&lt;br /&gt;
&lt;br /&gt;
=== Container Isolierung ===&lt;br /&gt;
&lt;br /&gt;
Um den starken Isolationsgrad zu erreichen, d.h.: Anwendungungen im Container von anderen Anwendungen zu trennen, werden einige Features des Linux Kernels benötigt. Das folgende wird möglicherweise auch das Verständnis von Isolation verbessern:&lt;br /&gt;
&lt;br /&gt;
==== Namespaces ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;Namespaces are a feature of the Linux kernel that partition kernel resources such that one set of processes sees one set of resources, while another set of processes sees a different set of resources. The feature works by having the same namespace for a set of resources and processes, but those namespaces refer to distinct resources. Resources may exist in multiple spaces. Examples of such resources are process IDs, host-names, user IDs, file names, some names associated with network access, and Inter-process communication.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Linux_namespaces&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PID Namespace&#039;&#039;&#039; - Jeder Container hat seinen eigenen Prozess-ID-Namespace, was bedeutet, dass die Prozesse in einem Container nur ihre eigenen Prozess-IDs sehen können und nicht die IDs der Prozesse außerhalb des Containers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Network Namespace&#039;&#039;&#039; - Docker erstellt für jeden Container einen eigenen Netzwerknamespace. Das bedeutet, dass jeder Container sein eigenes Netzwerkinterface, seine eigenen IP-Adressen, Routing-Tabellen usw. hat. Dadurch können Container voneinander isoliert sein und unabhängig voneinander agieren.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mount Namespace&#039;&#039;&#039; - Mount Namespaces isolieren das Dateisystem des Containers von dem des Hostsystems. Jeder Container hat sein eigenes Dateisystem, was es ermöglicht, dass verschiedene Container unterschiedliche Dateisysteme nutzen können, ohne sich gegenseitig zu beeinflussen.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;IPC Namespace&#039;&#039;&#039; - IPC (Inter Process Communication) Namespaces isolieren die Interprozesskommunikation, wie zum Beispiel die Verwendung von Shared Memory oder IPC Pipes. Dadurch sind die Kommunikationsmechanismen zwischen Prozessen in verschiedenen Containern getrennt.&lt;br /&gt;
&lt;br /&gt;
==== CGroups ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;cgroups (abbreviated from control groups) is a Linux kernel feature that limits, accounts for, and isolates the resource usage (CPU, memory, disk I/O, etc.[1]) of a collection of processes.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Cgroups&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CPU-Begrenzung&#039;&#039;&#039; - Mit cgroups kann Docker die CPU-Nutzung jedes Containers begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht mehr CPU-Ressourcen verwendet als ihm zugewiesen wurden, und um sicherzustellen, dass andere Container und Anwendungen auf dem Hostsystem ausreichend CPU-Zeit erhalten.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Speicherbegrenzung&#039;&#039;&#039; - Docker kann die Menge an Arbeitsspeicher, die von einem Container verwendet werden kann, mithilfe von cgroups begrenzen. Dies hilft dabei, zu verhindern, dass ein einzelner Container zu viel Arbeitsspeicher beansprucht und das gesamte System zum Absturz bringt.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;I/O-Begrenzung&#039;&#039;&#039; - Durch cgroups kann Docker die Ein- und Ausgabegeschwindigkeit für einen Container begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht zu viel Festplatten- oder Netzwerkbandbreite beansprucht und dadurch die Leistung anderer Container beeinträchtigt.&lt;br /&gt;
&lt;br /&gt;
==== Weitere Mechanismen ====&lt;br /&gt;
* SELinux&lt;br /&gt;
* AppArmor&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen finden sich [https://medium.com/@BeNitinAgarwal/understanding-the-docker-internals-7ccb052ce9fe hier]&lt;br /&gt;
&lt;br /&gt;
=== Aufbau von Docker ===&lt;br /&gt;
&lt;br /&gt;
Docker besteht aus den folgend genannten Komponenten:&lt;br /&gt;
&lt;br /&gt;
==== Images ====&lt;br /&gt;
Images bilden in sich abgeschlossenen Applikationen welche mit der &#039;&#039;&#039;Docker Engine&#039;&#039;&#039; erstellt und gestartet (&#039;&#039;&#039;Container&#039;&#039;&#039;) werden können.&lt;br /&gt;
&lt;br /&gt;
==== Registry ====&lt;br /&gt;
Eine zentrale stelle an der Docker Images gespeichert und abgerufen werden kann. Die wohl bekannteste Registry ist [https://hub.docker.com/ dockerhub]. Es kann jedoch auch eine eigene Registry erstellt werden.&lt;br /&gt;
&lt;br /&gt;
==== Engine ====&lt;br /&gt;
Die Docker Engine ist das Herzstück von Docker. Sie besteht aus drei Komponenten:&lt;br /&gt;
# &#039;&#039;&#039;Docker-Daemon&#039;&#039;&#039; - Der Docker-Daemon läuft als Hintergrundprozess auf dem Host System. Dieser ist die zentrale Steuerung der Docker Engine und ist zuständig für sämtliche Verwaltungsaufgaben (z.B.: Anlegen von Netzwerken, Volumes, Images und Containern)&lt;br /&gt;
# &#039;&#039;&#039;REST Api&#039;&#039;&#039; - Dient der Kommunikation mit dem Docker Daemon&lt;br /&gt;
# &#039;&#039;&#039;Command Line Interface&#039;&#039;&#039; - Kommuniziert über die REST Api mit dem Daemon und ermöglicht dem User das ausführen von Docker Befehlen&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.ionos.at/digitalguide/server/konfiguration/docker-tutorial-installation-und-erste-schritte&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Docker_2024_04/Containers|Container]] ===&lt;br /&gt;
=== [[Docker_2024_04/Networking|Networking]] ===&lt;br /&gt;
=== [[Docker_2024_04/Image|Image erstellen]] ===&lt;br /&gt;
=== [[Docker_2024_04/Resource Restriction|Resourcen limitieren]] ===&lt;br /&gt;
=== [[Docker_2024_04/Docker Compose|Docker Compose]] ===&lt;br /&gt;
=== [[Docker_2024_04/Registry|Registry]] ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3519</id>
		<title>Docker 2024 04</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04&amp;diff=3519"/>
		<updated>2024-04-18T10:30:03Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Virtualisierung vs Containerisierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Schulung Docker 2024/04 =&lt;br /&gt;
In der folgenden Schulung soll ein grundlegendes Verständnis für die Containerisierung erworben werden.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Teilnehmer_innen sollen nach der Schulung in der Lage sein&#039;&#039;&#039;&lt;br /&gt;
* eigene Docker Images zu erstellen und diese mittels Docker Compose zu starten&lt;br /&gt;
* die bereitgestellten Ressourcen für Arbeitsspeicher, CPU Zeit und Disk IO zu modifizieren&lt;br /&gt;
* die Einsatzzwecke der verschiedenen Networking Modelle (insbesondere Bridge und Host Network) zu unterscheiden und diese gezielt anwenden können&lt;br /&gt;
* eine eigene Image Registry zu erstellen und dort Images ablegen und abrufen&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welche Bereiche werden explizit ausgeklammert:&#039;&#039;&#039;&lt;br /&gt;
* Limitierung von Netzwerkresourcen ([https://man7.org/linux/man-pages/man8/tc.8.html siehe tc])&lt;br /&gt;
* Limitierung von Speicherplatz ([https://de.wikipedia.org/wiki/XFS_(Dateisystem) siehe XFS])&lt;br /&gt;
&lt;br /&gt;
== Virtualisierung vs Containerisierung ==&lt;br /&gt;
&lt;br /&gt;
Beide Varianten bieten die Möglichkeit Applikationen isoliert von anderen Prozessen auszuführen. Im Gegensatz zur Containerisierung wird bei der Virtualisierung ein komplettes Betriebssystem mit entsprechenden Anwendungen gestartet.&lt;br /&gt;
&lt;br /&gt;
=== Gründe für Virtualisierungs und Containerisierung ===&lt;br /&gt;
Programme können lokal, oder auf Servern installiert werden. Hierfür benötigt es keine der beiden Technologien. Folgende Gründe sprechen für diese Technologien&lt;br /&gt;
 &#039;&#039;&#039;Server Hardware kann geteilt werden&#039;&#039;&#039;&lt;br /&gt;
 Virtualisierung bietet die Möglichkeit physische Hardware auf mehrere Betriebssysteme zu verteilen.&lt;br /&gt;
 Containerisierung bietet die Möglichkeit physische Hardware auf mehrere Applikationen zu verteilen.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Isolationsgrad&#039;&#039;&#039;&lt;br /&gt;
 Fehlerhafte Anwendungen oder Sicherheitslücken wirken sich nicht auf das gesamte System aus.&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;Übertragbarkeit&#039;&#039;&#039;&lt;br /&gt;
 Ein weiterer Vorteil der Virtualisierung bzw. Containerisierung ist die in sich abgeschlossene und übertragbare Umgebung. Eine gekapselte Anwendung kann so auf nahezu jedem System ausgeführt werden. Die Abhängigkeiten beschränken sich hierbei auf ein Minimum.&lt;br /&gt;
&lt;br /&gt;
=== Virtualisierung ===&lt;br /&gt;
Bei der Virtualisierung übernimmt der &#039;&#039;&#039;Hypervisor&#039;&#039;&#039; das erstellen, starten und das Zuteilen der Hardwareressource des Hosts, an die virtualisierten Gast Betriebssysteme.&lt;br /&gt;
&lt;br /&gt;
 Ein Hypervisor ist eine Software, die virtuelle Maschinen (VMs) erstellt und ausführt. Ein Hypervisor, manchmal auch Virtual Machine Monitor (VMM) genannt, isoliert das Hypervisor-Betriebssystem und die Ressourcen von den virtuellen Maschinen und ermöglicht die Erstellung und Verwaltung dieser VMs.&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hypervisoren können in verschiedene Typen eingeteilt werden:&lt;br /&gt;
* Typ 1, Läuft direkt auf der Hardware (z.B.: KVM, Microsoft Hyper-V und VMware vSphere)&lt;br /&gt;
* Typ 2, Läuft auf einem Host Betriebssystem (z.B.: VMware Workstation und Oracle VirtualBox)&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.redhat.com/de/topics/virtualization/what-is-a-hypervisor&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Datei:Virtual-Machines.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
=== Containerisierung ===&lt;br /&gt;
&amp;lt;cite&amp;gt;Unter Containerisierung versteht man das Zusammenfassen von Softwarecode mit den für die Ausführung des Codes erforderlichen Betriebssystembibliotheken und Abhängigkeiten zu einer einzigen ausführbaren Datei, die als Container bezeichnet wird und in jeder Infrastruktur konsistent ausgeführt werden kann.  Container sind portabler und ressourceneffizienter als virtuelle Maschinen (VMs) und haben sich de facto zu den Recheneinheiten moderner cloudnativer Anwendungen entwickelt.&amp;lt;ref&amp;gt;https://www.ibm.com/de-de/topics/containerization&amp;lt;/ref&amp;gt;&amp;lt;/cite&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Container Lösungen bieten im Vergleich zur Virtualisierung eine leichtgewichtigere Möglichkeit Applikationen isoliert zu starten. Folgende Informationen beziehen sich auf Docker, sind aber möglicherweise auch auf andere Container Lösungen (wie z.B.: LXC) übertragbar.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zur Virtualisierung wird bei der Containerisierung nur die zu startende Anwendung und ihre Abhängigkeiten gestartet. Es wird kein komplettes Betriebssystem initialisiert. Der Container teilt sich den Kernel mit dem Hostbetriebssystem. Die Isolierung zu den Hostanwendungen erfolgt durch verschiedene andere Mechanismen die im weiteren Verlauf erklärt werden.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Containers.png|300px|mini|none|https://bi-insider.com/posts/virtual-machines-vs-containers/]]&lt;br /&gt;
&lt;br /&gt;
== Docker ==&lt;br /&gt;
&lt;br /&gt;
Docker ist eine der am weitesten verbreiteten und unterstützten Container Lösungen. Docker selbst kann nur in Verbindung mit dem Linux Kernel verwendet werden.&lt;br /&gt;
 Natürlich kann Docker auf weiteren Betriebssystemen wie Windows oder MacOS verwendet werden. Jedoch wird hierbei ein Hostsystem mit Linux Kernel emuliert (starke Vereinfachung).&lt;br /&gt;
&lt;br /&gt;
=== Container Isolierung ===&lt;br /&gt;
&lt;br /&gt;
Um den starken Isolationsgrad zu erreichen, d.h.: Anwendungungen im Container von anderen Anwendungen zu trennen, werden einige Features des Linux Kernels benötigt. Das folgende wird möglicherweise auch das Verständnis von Isolation verbessern:&lt;br /&gt;
&lt;br /&gt;
==== Namespaces ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;Namespaces are a feature of the Linux kernel that partition kernel resources such that one set of processes sees one set of resources, while another set of processes sees a different set of resources. The feature works by having the same namespace for a set of resources and processes, but those namespaces refer to distinct resources. Resources may exist in multiple spaces. Examples of such resources are process IDs, host-names, user IDs, file names, some names associated with network access, and Inter-process communication.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Linux_namespaces&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PID Namespace&#039;&#039;&#039; - Jeder Container hat seinen eigenen Prozess-ID-Namespace, was bedeutet, dass die Prozesse in einem Container nur ihre eigenen Prozess-IDs sehen können und nicht die IDs der Prozesse außerhalb des Containers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Network Namespace&#039;&#039;&#039; - Docker erstellt für jeden Container einen eigenen Netzwerknamespace. Das bedeutet, dass jeder Container sein eigenes Netzwerkinterface, seine eigenen IP-Adressen, Routing-Tabellen usw. hat. Dadurch können Container voneinander isoliert sein und unabhängig voneinander agieren.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Mount Namespace&#039;&#039;&#039; - Mount Namespaces isolieren das Dateisystem des Containers von dem des Hostsystems. Jeder Container hat sein eigenes Dateisystem, was es ermöglicht, dass verschiedene Container unterschiedliche Dateisysteme nutzen können, ohne sich gegenseitig zu beeinflussen.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;IPC Namespace&#039;&#039;&#039; - IPC (Inter Process Communication) Namespaces isolieren die Interprozesskommunikation, wie zum Beispiel die Verwendung von Shared Memory oder IPC Pipes. Dadurch sind die Kommunikationsmechanismen zwischen Prozessen in verschiedenen Containern getrennt.&lt;br /&gt;
&lt;br /&gt;
==== CGroups ====&lt;br /&gt;
 &amp;lt;cite&amp;gt;cgroups (abbreviated from control groups) is a Linux kernel feature that limits, accounts for, and isolates the resource usage (CPU, memory, disk I/O, etc.[1]) of a collection of processes.&amp;lt;/cite&amp;gt;&amp;lt;ref&amp;gt;https://en.wikipedia.org/wiki/Cgroups&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CPU-Begrenzung&#039;&#039;&#039; - Mit cgroups kann Docker die CPU-Nutzung jedes Containers begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht mehr CPU-Ressourcen verwendet als ihm zugewiesen wurden, und um sicherzustellen, dass andere Container und Anwendungen auf dem Hostsystem ausreichend CPU-Zeit erhalten.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Speicherbegrenzung&#039;&#039;&#039; - Docker kann die Menge an Arbeitsspeicher, die von einem Container verwendet werden kann, mithilfe von cgroups begrenzen. Dies hilft dabei, zu verhindern, dass ein einzelner Container zu viel Arbeitsspeicher beansprucht und das gesamte System zum Absturz bringt.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;I/O-Begrenzung&#039;&#039;&#039; - Durch cgroups kann Docker die Ein- und Ausgabegeschwindigkeit für einen Container begrenzen. Dies ist wichtig, um sicherzustellen, dass ein Container nicht zu viel Festplatten- oder Netzwerkbandbreite beansprucht und dadurch die Leistung anderer Container beeinträchtigt.&lt;br /&gt;
&lt;br /&gt;
==== Weitere Mechanismen ====&lt;br /&gt;
* SELinux&lt;br /&gt;
* AppArmor&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
Weitere Informationen finden sich [https://medium.com/@BeNitinAgarwal/understanding-the-docker-internals-7ccb052ce9fe hier]&lt;br /&gt;
&lt;br /&gt;
=== Aufbau von Docker ===&lt;br /&gt;
&lt;br /&gt;
Docker besteht aus den folgend genannten Komponenten:&lt;br /&gt;
&lt;br /&gt;
==== Images ====&lt;br /&gt;
Images bilden in sich abgeschlossenen Applikationen welche mit der &#039;&#039;&#039;Docker Engine&#039;&#039;&#039; erstellt und gestartet (&#039;&#039;&#039;Container&#039;&#039;&#039;) werden können.&lt;br /&gt;
&lt;br /&gt;
==== Registry ====&lt;br /&gt;
Eine zentrale stelle an der Docker Images gespeichert und abgerufen werden kann. Die wohl bekannteste Registry ist [https://hub.docker.com/ dockerhub]. Es kann jedoch auch eine eigene Registry erstellt werden.&lt;br /&gt;
&lt;br /&gt;
==== Engine ====&lt;br /&gt;
Die Docker Engine ist das Herzstück von Docker. Sie besteht aus drei Komponenten:&lt;br /&gt;
# &#039;&#039;&#039;Docker-Daemon&#039;&#039;&#039; - Der Docker-Daemon läuft als Hintergrundprozess auf dem Host System. Dieser ist die zentrale Steuerung der Docker Engine und ist zuständig für sämtliche Verwaltungsaufgaben (z.B.: Anlegen von Netzwerken, Volumes, Images und Containern)&lt;br /&gt;
# &#039;&#039;&#039;REST Api&#039;&#039;&#039; - Dient der Kommunikation mit dem Docker Daemon&lt;br /&gt;
# &#039;&#039;&#039;Command Line Interface&#039;&#039;&#039; - Kommuniziert über die REST Api mit dem Daemon und ermöglicht dem User das ausführen von Docker Befehlen&lt;br /&gt;
&amp;lt;ref&amp;gt;https://www.ionos.at/digitalguide/server/konfiguration/docker-tutorial-installation-und-erste-schritte&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [[Docker_2024_04/Containers|Container]] ===&lt;br /&gt;
=== [[Docker_2024_04/Networking|Networking]] ===&lt;br /&gt;
=== [[Docker_2024_04/Image|Image erstellen]] ===&lt;br /&gt;
=== [[Docker_2024_04/Resource Restriction|Resourcen limitieren]] ===&lt;br /&gt;
=== [[Docker_2024_04/Docker Compose|Docker Compose]] ===&lt;br /&gt;
=== [[Docker_2024_04/Registry|Registry]] ===&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Registry&amp;diff=3518</id>
		<title>Docker 2024 04/Registry</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Registry&amp;diff=3518"/>
		<updated>2024-04-18T10:24:06Z</updated>

		<summary type="html">&lt;p&gt;Drlue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Standard Registry für Images, [https://hub.docker.com/ dockerhub]], es kann jedoch auch eine eigene Image Registry erstellt werden.&lt;br /&gt;
Im Folgenden wird eine Lokale Registry erstellt. Diese kann natürlich auch über das Netzwerk erreichbar gemacht werden. {{BSL|localhost}} wird hierbei durch den {{BSL|hostname}} des Servers ersetzt.&lt;br /&gt;
&lt;br /&gt;
 Die hier gezeigte Registry bietet keinerlei Verschlüsselung bzw. Authentifizierungsmöglichkeiten. Für weitere Informationen diesbezgülich, siehe [https://www.exoscale.com/syslog/securing-private-docker-registry/ hier]&amp;lt;ref&amp;gt;https://www.exoscale.com/syslog/securing-private-docker-registry/&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Volume für Registry erstellen:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker volume create registry&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Registry mit Volume Mount erstellen, Host Port ist 5050:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker run -d -v registry:/var/lib/registry -p 5050:5000 --name registry registry:2&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das Testimage von [[Docker_2024_04/Resource_Restriction#Testimage|hier]] wird verwendet und erhält den Repository Präfix:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker tag resource_limiting_base:1.0 localhost:5050/resource_limiting_base:1.0&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das Image wird in die Registry gepusht:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker push localhost:5050/resource_limiting_base:1.0&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Prüfen des Images:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Remove locally stored images&lt;br /&gt;
docker image rm resource_limiting_base:1.0&lt;br /&gt;
docker image rm localhost:5050/resource_limiting_base:1.0&lt;br /&gt;
#Check if image is still locally available&lt;br /&gt;
docker image ls&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Starten des Images:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker run -it --rm localhost:5050/resource_limiting_base:1.0 bash&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Prüfen ob die Images auch wirklich persistent sind:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Stop registry&lt;br /&gt;
docker container stop registry&lt;br /&gt;
#Clear all dangling and images without reference to a container&lt;br /&gt;
docker image prune -a&lt;br /&gt;
#Check images&lt;br /&gt;
docker image ls&lt;br /&gt;
#Fails&lt;br /&gt;
docker run -it --rm localhost:5050/resource_limiting_base:1.0 bash&lt;br /&gt;
#Start registry again&lt;br /&gt;
docker run -d -v registry:/var/lib/registry -p 5050:5000 --name registry registry:2&lt;br /&gt;
#OK&lt;br /&gt;
docker run -it --rm localhost:5050/resource_limiting_base:1.0 bash&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Registry&amp;diff=3517</id>
		<title>Docker 2024 04/Registry</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Registry&amp;diff=3517"/>
		<updated>2024-04-18T10:21:29Z</updated>

		<summary type="html">&lt;p&gt;Drlue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Standard Registry für Images, [https://hub.docker.com/ dockerhub]], es kann jedoch auch eine eigene Image Registry erstellt werden.&lt;br /&gt;
Im Folgenden wird eine Lokale Registry erstellt. Diese kann natürlich auch über das Netzwerk erreichbar gemacht werden. {{BSL|localhost}} wird hierbei durch den {{BSL|hostname}} des Servers ersetzt.&lt;br /&gt;
&lt;br /&gt;
Volume für Registry erstellen:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker volume create registry&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Registry mit Volume Mount erstellen, Host Port ist 5050:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker run -d -v registry:/var/lib/registry -p 5050:5000 --name registry registry:2&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das Testimage von [[Docker_2024_04/Resource_Restriction#Testimage|hier]] wird verwendet und erhält den Repository Präfix:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker tag resource_limiting_base:1.0 localhost:5050/resource_limiting_base:1.0&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das Image wird in die Registry gepusht:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker push localhost:5050/resource_limiting_base:1.0&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Prüfen des Images:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Remove locally stored images&lt;br /&gt;
docker image rm resource_limiting_base:1.0&lt;br /&gt;
docker image rm localhost:5050/resource_limiting_base:1.0&lt;br /&gt;
#Check if image is still locally available&lt;br /&gt;
docker image ls&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Starten des Images:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker run -it --rm localhost:5050/resource_limiting_base:1.0 bash&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Prüfen ob die Images auch wirklich persistent sind:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Stop registry&lt;br /&gt;
docker container stop registry&lt;br /&gt;
#Clear all dangling and images without reference to a container&lt;br /&gt;
docker image prune -a&lt;br /&gt;
#Check images&lt;br /&gt;
docker image ls&lt;br /&gt;
#Fails&lt;br /&gt;
docker run -it --rm localhost:5050/resource_limiting_base:1.0 bash&lt;br /&gt;
#Start registry again&lt;br /&gt;
docker run -d -v registry:/var/lib/registry -p 5050:5000 --name registry registry:2&lt;br /&gt;
#OK&lt;br /&gt;
docker run -it --rm localhost:5050/resource_limiting_base:1.0 bash&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Registry&amp;diff=3516</id>
		<title>Docker 2024 04/Registry</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Registry&amp;diff=3516"/>
		<updated>2024-04-18T10:21:07Z</updated>

		<summary type="html">&lt;p&gt;Drlue: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die Standard Registry für Images, [https://hub.docker.com/ dockerhub]], es kann jedoch auch eine eigene Image Registry erstellt werden.&lt;br /&gt;
Im Folgenden wird eine Lokale Registry erstellt. Diese kann natürlich auch über das Netzwerk erreichbar gemacht werden. {{BSL|localhost}} wird hierbei durch den {{BSL|hostname}} des Servers ersetzt.&lt;br /&gt;
&lt;br /&gt;
Volume für Registry erstellen:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker volume create registry&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Registry mit Volume Mount erstellen, Host Port ist 5050:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker run -d -v registry:/var/lib/registry -p 5050:5000 --name registry registry:2&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das Testimage von [Docker_2024_04/Resource_Restriction#Testimage|hier] wird verwendet und erhält den Repository Präfix:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker tag resource_limiting_base:1.0 localhost:5050/resource_limiting_base:1.0&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das Image wird in die Registry gepusht:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker push localhost:5050/resource_limiting_base:1.0&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Prüfen des Images:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Remove locally stored images&lt;br /&gt;
docker image rm resource_limiting_base:1.0&lt;br /&gt;
docker image rm localhost:5050/resource_limiting_base:1.0&lt;br /&gt;
#Check if image is still locally available&lt;br /&gt;
docker image ls&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Starten des Images:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker run -it --rm localhost:5050/resource_limiting_base:1.0 bash&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Prüfen ob die Images auch wirklich persistent sind:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
#Stop registry&lt;br /&gt;
docker container stop registry&lt;br /&gt;
#Clear all dangling and images without reference to a container&lt;br /&gt;
docker image prune -a&lt;br /&gt;
#Check images&lt;br /&gt;
docker image ls&lt;br /&gt;
#Fails&lt;br /&gt;
docker run -it --rm localhost:5050/resource_limiting_base:1.0 bash&lt;br /&gt;
#Start registry again&lt;br /&gt;
docker run -d -v registry:/var/lib/registry -p 5050:5000 --name registry registry:2&lt;br /&gt;
#OK&lt;br /&gt;
docker run -it --rm localhost:5050/resource_limiting_base:1.0 bash&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Docker_Compose&amp;diff=3515</id>
		<title>Docker 2024 04/Docker Compose</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Docker_Compose&amp;diff=3515"/>
		<updated>2024-04-18T10:15:02Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Beispiel 6) Restarting */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Docker Compose&#039;&#039;&#039; bietet eine komfortable Möglichkeit &#039;&#039;&#039;Images&#039;&#039;&#039; zu bauen und &#039;&#039;&#039;Container&#039;&#039;&#039; bzw. &#039;&#039;&#039;Container&#039;&#039;&#039; im &#039;&#039;&#039;Serviceverbund&#039;&#039;&#039; zu starten. Die Erstellung von &#039;&#039;&#039;Volumes&#039;&#039;&#039; und &#039;&#039;&#039;Networks&#039;&#039;&#039; wird stark erleichtert. Zudem muss der oft Komplexe {{BSL|docker run}} Befehl nicht abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden einige der zuvor erstellten Beispiele mit &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; nachgebaut.&lt;br /&gt;
&lt;br /&gt;
 Der Standard Name für &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; Dateien ist docker-compose.yml.&lt;br /&gt;
 Mit dem Parameter {{BSL|-f}} kann jedoch direkt eine &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; Datei angegeben werden.&lt;br /&gt;
 Z.b.: {{BSL|docker-compose -f service1.yml}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 1) Erster Container ===&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Beispiel_1):_Erster_Container_start|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  ubuntu:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: ubuntu&lt;br /&gt;
    #Used image&lt;br /&gt;
    image: ubuntu:22.04&lt;br /&gt;
    #Command to run&lt;br /&gt;
    command: [&amp;quot;bash&amp;quot;]&lt;br /&gt;
    #Parameter -it&lt;br /&gt;
    stdin_open: true &lt;br /&gt;
    tty: true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service &#039;&#039;&#039;detached&#039;&#039;&#039; starten:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose up -d&lt;br /&gt;
}}&lt;br /&gt;
Mit Service verbinden und schließen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
Der Container ist nun im &#039;&#039;&#039;Exited State&#039;&#039;&#039; {{BSL|docker ps -a}}. Der Container wird mit folgendem Kommando korrekt gelöscht, bzw. auch gestoppt sofern dieser gestartet ist. Es werden so ebenfalls alle erstellten Netzwerke gelöscht.  Wird &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; verwendet so wird nicht Standardmäßig das bridge Netzwerk &#039;&#039;&#039;bridge&#039;&#039;&#039; verwendet. &lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose down&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 2) Node Webserver (bestehendes Image, Folder Mount) ===&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Beispiel_5):_Node_Webserver|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  node_webserver:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: example5&lt;br /&gt;
    #Used image&lt;br /&gt;
    image: example5:1.0&lt;br /&gt;
    #Folder/Volume mount -v&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./http:/var/www&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:5000&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service starten&lt;br /&gt;
{{BML|code=docker compose up -d}}&lt;br /&gt;
Logs einsehen&lt;br /&gt;
{{BML|code=docker compose logs [service name optional]}}&lt;br /&gt;
Ressourcen einsehen&lt;br /&gt;
{{BML|code=docker compose stats [service name optional]}}&lt;br /&gt;
Informationen einsehen&lt;br /&gt;
{{BML|code=docker compose ps [service name optional]}}&lt;br /&gt;
Webserver testen [http://localhost:8000 http://localhost:8000]&lt;br /&gt;
&lt;br /&gt;
Service beenden&lt;br /&gt;
{{BML|code=docker compose down}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 3) Node Webserver (existing Image, Volume Mount) ===&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Beispiel_5.1):_Node_Webserver_Using_Named_Volume|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  node_webserver:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: example5&lt;br /&gt;
    #Used image&lt;br /&gt;
    image: example5:1.0&lt;br /&gt;
    #Folder/Volume mount -v&lt;br /&gt;
    volumes:&lt;br /&gt;
      - www:/var/www&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:5000&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  www:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das Volume wird automatisch erstellt und bleibt auch nach {{BSL|docker compose down}} erhalten.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 4) Node Webserver (building Image) ===&lt;br /&gt;
Inhalt &#039;&#039;&#039;Dockerfile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Dockerfile|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  node_webserver:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: node_webserver&lt;br /&gt;
    #Build image&lt;br /&gt;
    build:&lt;br /&gt;
      context: .&lt;br /&gt;
    image: example5:1.0&lt;br /&gt;
    #Folder/Volume mount -v&lt;br /&gt;
    volumes:&lt;br /&gt;
      - www:/var/www&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:5000&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  www:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Löschen des bestehenden Images:&lt;br /&gt;
{{BML|code=docker image example5:1.0}}&lt;br /&gt;
Das starten des Services erstellt automatisch das Image bzw. die Images:&lt;br /&gt;
{{BML|code=docker compose up -d}}&lt;br /&gt;
Das oder die Images können auch explizit gebaut werden:&lt;br /&gt;
{{BML|code=docker compose build}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 5) Networking ===&lt;br /&gt;
Siehe [[Docker_2024_04/Networking#Beispiel_4):_Komplexeres_Beispiel|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;Dockerfile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Siehe [[Docker_2024_04/Networking#Dockerfile|hier]]&lt;br /&gt;
 Folgend werden &#039;&#039;&#039;Bridge&#039;&#039;&#039; Netzwerke verwendet. Es können verschiedene Treiber angegeben werden, siehe [https://docs.docker.com/compose/networking/ hier]&amp;lt;ref&amp;gt;https://docs.docker.com/compose/networking/&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Das &#039;&#039;&#039;Host Network&#039;&#039;&#039; kann über den Parameter {{BSL|network_mode: host}} verwendet werden.&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  app:&lt;br /&gt;
    container_name: app&lt;br /&gt;
    hostname: app&lt;br /&gt;
    build:&lt;br /&gt;
      context: .&lt;br /&gt;
    image: networking_example2:1.0&lt;br /&gt;
    #Use networks&lt;br /&gt;
    networks:&lt;br /&gt;
      - tier1&lt;br /&gt;
      - tier2&lt;br /&gt;
    #Depends on database&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - db&lt;br /&gt;
&lt;br /&gt;
  db:&lt;br /&gt;
    container_name: database&lt;br /&gt;
    hostname: db&lt;br /&gt;
    image: networking_example2:1.0&lt;br /&gt;
    networks:&lt;br /&gt;
      - tier2&lt;br /&gt;
&lt;br /&gt;
  reverseproxy:&lt;br /&gt;
    container_name: reverseproxy&lt;br /&gt;
    hostname: reverseproxy&lt;br /&gt;
    image: networking_example2:1.0&lt;br /&gt;
    networks:&lt;br /&gt;
      - tier1&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - app&lt;br /&gt;
&lt;br /&gt;
networks:&lt;br /&gt;
  tier1:&lt;br /&gt;
  tier2:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Services starten:&lt;br /&gt;
{{BML|code=docker compose up -d}}&lt;br /&gt;
&lt;br /&gt;
 Die Netzwerk funktionalität kann wie [[Docker_2024_04/Networking#Beispiel_4):_Komplexeres_Beispiel|hier]] bereits erläutert wurde, getestet werden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 6) Restarting ===&lt;br /&gt;
Wird die im Service gestartete Anwendung beendet, so kann definiert werden ob der Service neu gestartet werden soll. Weiter Informationen finden sich [https://www.baeldung.com/ops/docker-compose-restart-policies hier]&amp;lt;ref&amp;gt;https://www.baeldung.com/ops/docker-compose-restart-policies&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Folgendes Kommando bietet sich für ein eigenes Terminal an {{BSL|watch -n 0.1 -c &amp;quot;docker ps -a&amp;quot;}} um den Container Status zu überwachen.&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  ubuntu:&lt;br /&gt;
    container_name: ubuntu&lt;br /&gt;
    image: ubuntu:22.04&lt;br /&gt;
    command: [&amp;quot;bash&amp;quot;]&lt;br /&gt;
    stdin_open: true &lt;br /&gt;
    tty: true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service &#039;&#039;&#039;detached&#039;&#039;&#039; starten:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose up -d&lt;br /&gt;
}}&lt;br /&gt;
Mit Service verbinden und schließen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
Der Service wurde beendet und ist im &#039;&#039;&#039;Exited State&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  ubuntu:&lt;br /&gt;
    #Container always restarts after application terminates&lt;br /&gt;
    restart: always&lt;br /&gt;
    container_name: ubuntu&lt;br /&gt;
    image: ubuntu:22.04&lt;br /&gt;
    command: [&amp;quot;bash&amp;quot;]&lt;br /&gt;
    stdin_open: true &lt;br /&gt;
    tty: true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service &#039;&#039;&#039;detached&#039;&#039;&#039; starten:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose up -d&lt;br /&gt;
}}&lt;br /&gt;
Mit Service verbinden und schließen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
Der Service wurde beendet und ist im &#039;&#039;&#039;Exited State&#039;&#039;&#039;, wird jedoch neu gestartet.&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Docker_Compose&amp;diff=3514</id>
		<title>Docker 2024 04/Docker Compose</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Docker_Compose&amp;diff=3514"/>
		<updated>2024-04-18T10:13:15Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Beispiel 3) Node Webserver (existing Image, Volume Mount) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Docker Compose&#039;&#039;&#039; bietet eine komfortable Möglichkeit &#039;&#039;&#039;Images&#039;&#039;&#039; zu bauen und &#039;&#039;&#039;Container&#039;&#039;&#039; bzw. &#039;&#039;&#039;Container&#039;&#039;&#039; im &#039;&#039;&#039;Serviceverbund&#039;&#039;&#039; zu starten. Die Erstellung von &#039;&#039;&#039;Volumes&#039;&#039;&#039; und &#039;&#039;&#039;Networks&#039;&#039;&#039; wird stark erleichtert. Zudem muss der oft Komplexe {{BSL|docker run}} Befehl nicht abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden einige der zuvor erstellten Beispiele mit &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; nachgebaut.&lt;br /&gt;
&lt;br /&gt;
 Der Standard Name für &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; Dateien ist docker-compose.yml.&lt;br /&gt;
 Mit dem Parameter {{BSL|-f}} kann jedoch direkt eine &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; Datei angegeben werden.&lt;br /&gt;
 Z.b.: {{BSL|docker-compose -f service1.yml}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 1) Erster Container ===&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Beispiel_1):_Erster_Container_start|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  ubuntu:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: ubuntu&lt;br /&gt;
    #Used image&lt;br /&gt;
    image: ubuntu:22.04&lt;br /&gt;
    #Command to run&lt;br /&gt;
    command: [&amp;quot;bash&amp;quot;]&lt;br /&gt;
    #Parameter -it&lt;br /&gt;
    stdin_open: true &lt;br /&gt;
    tty: true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service &#039;&#039;&#039;detached&#039;&#039;&#039; starten:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose up -d&lt;br /&gt;
}}&lt;br /&gt;
Mit Service verbinden und schließen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
Der Container ist nun im &#039;&#039;&#039;Exited State&#039;&#039;&#039; {{BSL|docker ps -a}}. Der Container wird mit folgendem Kommando korrekt gelöscht, bzw. auch gestoppt sofern dieser gestartet ist. Es werden so ebenfalls alle erstellten Netzwerke gelöscht.  Wird &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; verwendet so wird nicht Standardmäßig das bridge Netzwerk &#039;&#039;&#039;bridge&#039;&#039;&#039; verwendet. &lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose down&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 2) Node Webserver (bestehendes Image, Folder Mount) ===&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Beispiel_5):_Node_Webserver|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  node_webserver:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: example5&lt;br /&gt;
    #Used image&lt;br /&gt;
    image: example5:1.0&lt;br /&gt;
    #Folder/Volume mount -v&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./http:/var/www&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:5000&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service starten&lt;br /&gt;
{{BML|code=docker compose up -d}}&lt;br /&gt;
Logs einsehen&lt;br /&gt;
{{BML|code=docker compose logs [service name optional]}}&lt;br /&gt;
Ressourcen einsehen&lt;br /&gt;
{{BML|code=docker compose stats [service name optional]}}&lt;br /&gt;
Informationen einsehen&lt;br /&gt;
{{BML|code=docker compose ps [service name optional]}}&lt;br /&gt;
Webserver testen [http://localhost:8000 http://localhost:8000]&lt;br /&gt;
&lt;br /&gt;
Service beenden&lt;br /&gt;
{{BML|code=docker compose down}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 3) Node Webserver (existing Image, Volume Mount) ===&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Beispiel_5.1):_Node_Webserver_Using_Named_Volume|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  node_webserver:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: example5&lt;br /&gt;
    #Used image&lt;br /&gt;
    image: example5:1.0&lt;br /&gt;
    #Folder/Volume mount -v&lt;br /&gt;
    volumes:&lt;br /&gt;
      - www:/var/www&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:5000&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  www:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das Volume wird automatisch erstellt und bleibt auch nach {{BSL|docker compose down}} erhalten.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 4) Node Webserver (building Image) ===&lt;br /&gt;
Inhalt &#039;&#039;&#039;Dockerfile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Dockerfile|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  node_webserver:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: node_webserver&lt;br /&gt;
    #Build image&lt;br /&gt;
    build:&lt;br /&gt;
      context: .&lt;br /&gt;
    image: example5:1.0&lt;br /&gt;
    #Folder/Volume mount -v&lt;br /&gt;
    volumes:&lt;br /&gt;
      - www:/var/www&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:5000&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  www:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Löschen des bestehenden Images:&lt;br /&gt;
{{BML|code=docker image example5:1.0}}&lt;br /&gt;
Das starten des Services erstellt automatisch das Image bzw. die Images:&lt;br /&gt;
{{BML|code=docker compose up -d}}&lt;br /&gt;
Das oder die Images können auch explizit gebaut werden:&lt;br /&gt;
{{BML|code=docker compose build}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 5) Networking ===&lt;br /&gt;
Siehe [[Docker_2024_04/Networking#Beispiel_4):_Komplexeres_Beispiel|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;Dockerfile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Siehe [[Docker_2024_04/Networking#Dockerfile|hier]]&lt;br /&gt;
 Folgend werden &#039;&#039;&#039;Bridge&#039;&#039;&#039; Netzwerke verwendet. Es können verschiedene Treiber angegeben werden, siehe [https://docs.docker.com/compose/networking/ hier]&amp;lt;ref&amp;gt;https://docs.docker.com/compose/networking/&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Das &#039;&#039;&#039;Host Network&#039;&#039;&#039; kann über den Parameter {{BSL|network_mode: host}} verwendet werden.&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  app:&lt;br /&gt;
    container_name: app&lt;br /&gt;
    hostname: app&lt;br /&gt;
    build:&lt;br /&gt;
      context: .&lt;br /&gt;
    image: networking_example2:1.0&lt;br /&gt;
    #Use networks&lt;br /&gt;
    networks:&lt;br /&gt;
      - tier1&lt;br /&gt;
      - tier2&lt;br /&gt;
    #Depends on database&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - db&lt;br /&gt;
&lt;br /&gt;
  db:&lt;br /&gt;
    container_name: database&lt;br /&gt;
    hostname: db&lt;br /&gt;
    image: networking_example2:1.0&lt;br /&gt;
    networks:&lt;br /&gt;
      - tier2&lt;br /&gt;
&lt;br /&gt;
  reverseproxy:&lt;br /&gt;
    container_name: reverseproxy&lt;br /&gt;
    hostname: reverseproxy&lt;br /&gt;
    image: networking_example2:1.0&lt;br /&gt;
    networks:&lt;br /&gt;
      - tier1&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - app&lt;br /&gt;
&lt;br /&gt;
networks:&lt;br /&gt;
  tier1:&lt;br /&gt;
  tier2:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Services starten:&lt;br /&gt;
{{BML|code=docker compose up -d}}&lt;br /&gt;
&lt;br /&gt;
 Die Netzwerk funktionalität kann wie [[Docker_2024_04/Networking#Beispiel_4):_Komplexeres_Beispiel|hier]] bereits erläutert wurde, getestet werden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 6) Restarting ===&lt;br /&gt;
Wird die im Service gestartete Anwendung beendet, so kann definiert werden ob der Service neu gestartet werden soll. Weiter Informationen finden sich [https://www.baeldung.com/ops/docker-compose-restart-policies hier]&amp;lt;ref&amp;gt;https://www.baeldung.com/ops/docker-compose-restart-policies&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Folgendes Kommando bietet sich für ein eigenes Terminal an {{BSL|watch -n 0.1 -c &amp;quot;docker ps -a&amp;quot;}} um den Container Status zu überwachen.&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  ubuntu:&lt;br /&gt;
    container_name: ubuntu&lt;br /&gt;
    image: ubuntu:22.04&lt;br /&gt;
    command: [&amp;quot;bash&amp;quot;]&lt;br /&gt;
    stdin_open: true &lt;br /&gt;
    tty: true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service &#039;&#039;&#039;detached&#039;&#039;&#039; starten:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose up -d&lt;br /&gt;
}}&lt;br /&gt;
Mit Service verbinden und schließen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
Der Service wurde beendet und ist im &#039;&#039;&#039;Exited State&#039;&#039;&#039;, {{BSL|docker ps -a}}&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  ubuntu:&lt;br /&gt;
    #Container always restarts after application terminates&lt;br /&gt;
    restart: always&lt;br /&gt;
    container_name: ubuntu&lt;br /&gt;
    image: ubuntu:22.04&lt;br /&gt;
    command: [&amp;quot;bash&amp;quot;]&lt;br /&gt;
    stdin_open: true &lt;br /&gt;
    tty: true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service &#039;&#039;&#039;detached&#039;&#039;&#039; starten:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose up -d&lt;br /&gt;
}}&lt;br /&gt;
Mit Service verbinden und schließen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
Der Service wurde beendet und ist im &#039;&#039;&#039;Exited State&#039;&#039;&#039;, wird jedoch neu gestartet {{BSL|docker ps -a}}&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Docker_Compose&amp;diff=3513</id>
		<title>Docker 2024 04/Docker Compose</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Docker_Compose&amp;diff=3513"/>
		<updated>2024-04-18T10:12:58Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Beispiel 2) Node Webserver (bestehendes Image, Folder Mount) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Docker Compose&#039;&#039;&#039; bietet eine komfortable Möglichkeit &#039;&#039;&#039;Images&#039;&#039;&#039; zu bauen und &#039;&#039;&#039;Container&#039;&#039;&#039; bzw. &#039;&#039;&#039;Container&#039;&#039;&#039; im &#039;&#039;&#039;Serviceverbund&#039;&#039;&#039; zu starten. Die Erstellung von &#039;&#039;&#039;Volumes&#039;&#039;&#039; und &#039;&#039;&#039;Networks&#039;&#039;&#039; wird stark erleichtert. Zudem muss der oft Komplexe {{BSL|docker run}} Befehl nicht abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden einige der zuvor erstellten Beispiele mit &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; nachgebaut.&lt;br /&gt;
&lt;br /&gt;
 Der Standard Name für &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; Dateien ist docker-compose.yml.&lt;br /&gt;
 Mit dem Parameter {{BSL|-f}} kann jedoch direkt eine &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; Datei angegeben werden.&lt;br /&gt;
 Z.b.: {{BSL|docker-compose -f service1.yml}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 1) Erster Container ===&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Beispiel_1):_Erster_Container_start|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  ubuntu:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: ubuntu&lt;br /&gt;
    #Used image&lt;br /&gt;
    image: ubuntu:22.04&lt;br /&gt;
    #Command to run&lt;br /&gt;
    command: [&amp;quot;bash&amp;quot;]&lt;br /&gt;
    #Parameter -it&lt;br /&gt;
    stdin_open: true &lt;br /&gt;
    tty: true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service &#039;&#039;&#039;detached&#039;&#039;&#039; starten:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose up -d&lt;br /&gt;
}}&lt;br /&gt;
Mit Service verbinden und schließen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
Der Container ist nun im &#039;&#039;&#039;Exited State&#039;&#039;&#039; {{BSL|docker ps -a}}. Der Container wird mit folgendem Kommando korrekt gelöscht, bzw. auch gestoppt sofern dieser gestartet ist. Es werden so ebenfalls alle erstellten Netzwerke gelöscht.  Wird &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; verwendet so wird nicht Standardmäßig das bridge Netzwerk &#039;&#039;&#039;bridge&#039;&#039;&#039; verwendet. &lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose down&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 2) Node Webserver (bestehendes Image, Folder Mount) ===&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Beispiel_5):_Node_Webserver|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  node_webserver:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: example5&lt;br /&gt;
    #Used image&lt;br /&gt;
    image: example5:1.0&lt;br /&gt;
    #Folder/Volume mount -v&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./http:/var/www&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:5000&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service starten&lt;br /&gt;
{{BML|code=docker compose up -d}}&lt;br /&gt;
Logs einsehen&lt;br /&gt;
{{BML|code=docker compose logs [service name optional]}}&lt;br /&gt;
Ressourcen einsehen&lt;br /&gt;
{{BML|code=docker compose stats [service name optional]}}&lt;br /&gt;
Informationen einsehen&lt;br /&gt;
{{BML|code=docker compose ps [service name optional]}}&lt;br /&gt;
Webserver testen [http://localhost:8000 http://localhost:8000]&lt;br /&gt;
&lt;br /&gt;
Service beenden&lt;br /&gt;
{{BML|code=docker compose down}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 3) Node Webserver (existing Image, Volume Mount) ===&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Beispiel_5.1):_Node_Webserver_Using_Named_Volume|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  example5:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: example5&lt;br /&gt;
    #Used image&lt;br /&gt;
    image: example5:1.0&lt;br /&gt;
    #Folder/Volume mount -v&lt;br /&gt;
    volumes:&lt;br /&gt;
      - www:/var/www&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:5000&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  www:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das Volume wird automatisch erstellt und bleibt auch nach {{BSL|docker compose down}} erhalten.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 4) Node Webserver (building Image) ===&lt;br /&gt;
Inhalt &#039;&#039;&#039;Dockerfile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Dockerfile|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  node_webserver:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: node_webserver&lt;br /&gt;
    #Build image&lt;br /&gt;
    build:&lt;br /&gt;
      context: .&lt;br /&gt;
    image: example5:1.0&lt;br /&gt;
    #Folder/Volume mount -v&lt;br /&gt;
    volumes:&lt;br /&gt;
      - www:/var/www&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:5000&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  www:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Löschen des bestehenden Images:&lt;br /&gt;
{{BML|code=docker image example5:1.0}}&lt;br /&gt;
Das starten des Services erstellt automatisch das Image bzw. die Images:&lt;br /&gt;
{{BML|code=docker compose up -d}}&lt;br /&gt;
Das oder die Images können auch explizit gebaut werden:&lt;br /&gt;
{{BML|code=docker compose build}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 5) Networking ===&lt;br /&gt;
Siehe [[Docker_2024_04/Networking#Beispiel_4):_Komplexeres_Beispiel|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;Dockerfile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Siehe [[Docker_2024_04/Networking#Dockerfile|hier]]&lt;br /&gt;
 Folgend werden &#039;&#039;&#039;Bridge&#039;&#039;&#039; Netzwerke verwendet. Es können verschiedene Treiber angegeben werden, siehe [https://docs.docker.com/compose/networking/ hier]&amp;lt;ref&amp;gt;https://docs.docker.com/compose/networking/&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Das &#039;&#039;&#039;Host Network&#039;&#039;&#039; kann über den Parameter {{BSL|network_mode: host}} verwendet werden.&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  app:&lt;br /&gt;
    container_name: app&lt;br /&gt;
    hostname: app&lt;br /&gt;
    build:&lt;br /&gt;
      context: .&lt;br /&gt;
    image: networking_example2:1.0&lt;br /&gt;
    #Use networks&lt;br /&gt;
    networks:&lt;br /&gt;
      - tier1&lt;br /&gt;
      - tier2&lt;br /&gt;
    #Depends on database&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - db&lt;br /&gt;
&lt;br /&gt;
  db:&lt;br /&gt;
    container_name: database&lt;br /&gt;
    hostname: db&lt;br /&gt;
    image: networking_example2:1.0&lt;br /&gt;
    networks:&lt;br /&gt;
      - tier2&lt;br /&gt;
&lt;br /&gt;
  reverseproxy:&lt;br /&gt;
    container_name: reverseproxy&lt;br /&gt;
    hostname: reverseproxy&lt;br /&gt;
    image: networking_example2:1.0&lt;br /&gt;
    networks:&lt;br /&gt;
      - tier1&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - app&lt;br /&gt;
&lt;br /&gt;
networks:&lt;br /&gt;
  tier1:&lt;br /&gt;
  tier2:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Services starten:&lt;br /&gt;
{{BML|code=docker compose up -d}}&lt;br /&gt;
&lt;br /&gt;
 Die Netzwerk funktionalität kann wie [[Docker_2024_04/Networking#Beispiel_4):_Komplexeres_Beispiel|hier]] bereits erläutert wurde, getestet werden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 6) Restarting ===&lt;br /&gt;
Wird die im Service gestartete Anwendung beendet, so kann definiert werden ob der Service neu gestartet werden soll. Weiter Informationen finden sich [https://www.baeldung.com/ops/docker-compose-restart-policies hier]&amp;lt;ref&amp;gt;https://www.baeldung.com/ops/docker-compose-restart-policies&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Folgendes Kommando bietet sich für ein eigenes Terminal an {{BSL|watch -n 0.1 -c &amp;quot;docker ps -a&amp;quot;}} um den Container Status zu überwachen.&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  ubuntu:&lt;br /&gt;
    container_name: ubuntu&lt;br /&gt;
    image: ubuntu:22.04&lt;br /&gt;
    command: [&amp;quot;bash&amp;quot;]&lt;br /&gt;
    stdin_open: true &lt;br /&gt;
    tty: true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service &#039;&#039;&#039;detached&#039;&#039;&#039; starten:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose up -d&lt;br /&gt;
}}&lt;br /&gt;
Mit Service verbinden und schließen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
Der Service wurde beendet und ist im &#039;&#039;&#039;Exited State&#039;&#039;&#039;, {{BSL|docker ps -a}}&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  ubuntu:&lt;br /&gt;
    #Container always restarts after application terminates&lt;br /&gt;
    restart: always&lt;br /&gt;
    container_name: ubuntu&lt;br /&gt;
    image: ubuntu:22.04&lt;br /&gt;
    command: [&amp;quot;bash&amp;quot;]&lt;br /&gt;
    stdin_open: true &lt;br /&gt;
    tty: true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service &#039;&#039;&#039;detached&#039;&#039;&#039; starten:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose up -d&lt;br /&gt;
}}&lt;br /&gt;
Mit Service verbinden und schließen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
Der Service wurde beendet und ist im &#039;&#039;&#039;Exited State&#039;&#039;&#039;, wird jedoch neu gestartet {{BSL|docker ps -a}}&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Docker_Compose&amp;diff=3512</id>
		<title>Docker 2024 04/Docker Compose</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Docker_Compose&amp;diff=3512"/>
		<updated>2024-04-18T10:12:15Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Beispiel 3) Node Webserver (existing Image, Volume Mount) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Docker Compose&#039;&#039;&#039; bietet eine komfortable Möglichkeit &#039;&#039;&#039;Images&#039;&#039;&#039; zu bauen und &#039;&#039;&#039;Container&#039;&#039;&#039; bzw. &#039;&#039;&#039;Container&#039;&#039;&#039; im &#039;&#039;&#039;Serviceverbund&#039;&#039;&#039; zu starten. Die Erstellung von &#039;&#039;&#039;Volumes&#039;&#039;&#039; und &#039;&#039;&#039;Networks&#039;&#039;&#039; wird stark erleichtert. Zudem muss der oft Komplexe {{BSL|docker run}} Befehl nicht abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden einige der zuvor erstellten Beispiele mit &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; nachgebaut.&lt;br /&gt;
&lt;br /&gt;
 Der Standard Name für &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; Dateien ist docker-compose.yml.&lt;br /&gt;
 Mit dem Parameter {{BSL|-f}} kann jedoch direkt eine &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; Datei angegeben werden.&lt;br /&gt;
 Z.b.: {{BSL|docker-compose -f service1.yml}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 1) Erster Container ===&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Beispiel_1):_Erster_Container_start|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  ubuntu:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: ubuntu&lt;br /&gt;
    #Used image&lt;br /&gt;
    image: ubuntu:22.04&lt;br /&gt;
    #Command to run&lt;br /&gt;
    command: [&amp;quot;bash&amp;quot;]&lt;br /&gt;
    #Parameter -it&lt;br /&gt;
    stdin_open: true &lt;br /&gt;
    tty: true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service &#039;&#039;&#039;detached&#039;&#039;&#039; starten:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose up -d&lt;br /&gt;
}}&lt;br /&gt;
Mit Service verbinden und schließen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
Der Container ist nun im &#039;&#039;&#039;Exited State&#039;&#039;&#039; {{BSL|docker ps -a}}. Der Container wird mit folgendem Kommando korrekt gelöscht, bzw. auch gestoppt sofern dieser gestartet ist. Es werden so ebenfalls alle erstellten Netzwerke gelöscht.  Wird &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; verwendet so wird nicht Standardmäßig das bridge Netzwerk &#039;&#039;&#039;bridge&#039;&#039;&#039; verwendet. &lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose down&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 2) Node Webserver (bestehendes Image, Folder Mount) ===&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Beispiel_5):_Node_Webserver|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  example5:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: example5&lt;br /&gt;
    #Used image&lt;br /&gt;
    image: example5:1.0&lt;br /&gt;
    #Folder/Volume mount -v&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./http:/var/www&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:5000&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service starten&lt;br /&gt;
{{BML|code=docker compose up -d}}&lt;br /&gt;
Logs einsehen&lt;br /&gt;
{{BML|code=docker compose logs [service name optional]}}&lt;br /&gt;
Ressourcen einsehen&lt;br /&gt;
{{BML|code=docker compose stats [service name optional]}}&lt;br /&gt;
Informationen einsehen&lt;br /&gt;
{{BML|code=docker compose ps [service name optional]}}&lt;br /&gt;
Webserver testen [http://localhost:8000 http://localhost:8000]&lt;br /&gt;
&lt;br /&gt;
Service beenden&lt;br /&gt;
{{BML|code=docker compose down}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 3) Node Webserver (existing Image, Volume Mount) ===&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Beispiel_5.1):_Node_Webserver_Using_Named_Volume|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  example5:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: example5&lt;br /&gt;
    #Used image&lt;br /&gt;
    image: example5:1.0&lt;br /&gt;
    #Folder/Volume mount -v&lt;br /&gt;
    volumes:&lt;br /&gt;
      - www:/var/www&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:5000&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  www:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das Volume wird automatisch erstellt und bleibt auch nach {{BSL|docker compose down}} erhalten.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 4) Node Webserver (building Image) ===&lt;br /&gt;
Inhalt &#039;&#039;&#039;Dockerfile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Dockerfile|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  node_webserver:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: node_webserver&lt;br /&gt;
    #Build image&lt;br /&gt;
    build:&lt;br /&gt;
      context: .&lt;br /&gt;
    image: example5:1.0&lt;br /&gt;
    #Folder/Volume mount -v&lt;br /&gt;
    volumes:&lt;br /&gt;
      - www:/var/www&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:5000&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  www:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Löschen des bestehenden Images:&lt;br /&gt;
{{BML|code=docker image example5:1.0}}&lt;br /&gt;
Das starten des Services erstellt automatisch das Image bzw. die Images:&lt;br /&gt;
{{BML|code=docker compose up -d}}&lt;br /&gt;
Das oder die Images können auch explizit gebaut werden:&lt;br /&gt;
{{BML|code=docker compose build}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 5) Networking ===&lt;br /&gt;
Siehe [[Docker_2024_04/Networking#Beispiel_4):_Komplexeres_Beispiel|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;Dockerfile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Siehe [[Docker_2024_04/Networking#Dockerfile|hier]]&lt;br /&gt;
 Folgend werden &#039;&#039;&#039;Bridge&#039;&#039;&#039; Netzwerke verwendet. Es können verschiedene Treiber angegeben werden, siehe [https://docs.docker.com/compose/networking/ hier]&amp;lt;ref&amp;gt;https://docs.docker.com/compose/networking/&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Das &#039;&#039;&#039;Host Network&#039;&#039;&#039; kann über den Parameter {{BSL|network_mode: host}} verwendet werden.&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  app:&lt;br /&gt;
    container_name: app&lt;br /&gt;
    hostname: app&lt;br /&gt;
    build:&lt;br /&gt;
      context: .&lt;br /&gt;
    image: networking_example2:1.0&lt;br /&gt;
    #Use networks&lt;br /&gt;
    networks:&lt;br /&gt;
      - tier1&lt;br /&gt;
      - tier2&lt;br /&gt;
    #Depends on database&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - db&lt;br /&gt;
&lt;br /&gt;
  db:&lt;br /&gt;
    container_name: database&lt;br /&gt;
    hostname: db&lt;br /&gt;
    image: networking_example2:1.0&lt;br /&gt;
    networks:&lt;br /&gt;
      - tier2&lt;br /&gt;
&lt;br /&gt;
  reverseproxy:&lt;br /&gt;
    container_name: reverseproxy&lt;br /&gt;
    hostname: reverseproxy&lt;br /&gt;
    image: networking_example2:1.0&lt;br /&gt;
    networks:&lt;br /&gt;
      - tier1&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - app&lt;br /&gt;
&lt;br /&gt;
networks:&lt;br /&gt;
  tier1:&lt;br /&gt;
  tier2:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Services starten:&lt;br /&gt;
{{BML|code=docker compose up -d}}&lt;br /&gt;
&lt;br /&gt;
 Die Netzwerk funktionalität kann wie [[Docker_2024_04/Networking#Beispiel_4):_Komplexeres_Beispiel|hier]] bereits erläutert wurde, getestet werden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 6) Restarting ===&lt;br /&gt;
Wird die im Service gestartete Anwendung beendet, so kann definiert werden ob der Service neu gestartet werden soll. Weiter Informationen finden sich [https://www.baeldung.com/ops/docker-compose-restart-policies hier]&amp;lt;ref&amp;gt;https://www.baeldung.com/ops/docker-compose-restart-policies&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Folgendes Kommando bietet sich für ein eigenes Terminal an {{BSL|watch -n 0.1 -c &amp;quot;docker ps -a&amp;quot;}} um den Container Status zu überwachen.&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  ubuntu:&lt;br /&gt;
    container_name: ubuntu&lt;br /&gt;
    image: ubuntu:22.04&lt;br /&gt;
    command: [&amp;quot;bash&amp;quot;]&lt;br /&gt;
    stdin_open: true &lt;br /&gt;
    tty: true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service &#039;&#039;&#039;detached&#039;&#039;&#039; starten:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose up -d&lt;br /&gt;
}}&lt;br /&gt;
Mit Service verbinden und schließen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
Der Service wurde beendet und ist im &#039;&#039;&#039;Exited State&#039;&#039;&#039;, {{BSL|docker ps -a}}&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  ubuntu:&lt;br /&gt;
    #Container always restarts after application terminates&lt;br /&gt;
    restart: always&lt;br /&gt;
    container_name: ubuntu&lt;br /&gt;
    image: ubuntu:22.04&lt;br /&gt;
    command: [&amp;quot;bash&amp;quot;]&lt;br /&gt;
    stdin_open: true &lt;br /&gt;
    tty: true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service &#039;&#039;&#039;detached&#039;&#039;&#039; starten:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose up -d&lt;br /&gt;
}}&lt;br /&gt;
Mit Service verbinden und schließen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
Der Service wurde beendet und ist im &#039;&#039;&#039;Exited State&#039;&#039;&#039;, wird jedoch neu gestartet {{BSL|docker ps -a}}&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Docker_Compose&amp;diff=3511</id>
		<title>Docker 2024 04/Docker Compose</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Docker_Compose&amp;diff=3511"/>
		<updated>2024-04-18T10:11:53Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Beispiel 2) Node Webserver (bestehendes Image, Folder Mount) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Docker Compose&#039;&#039;&#039; bietet eine komfortable Möglichkeit &#039;&#039;&#039;Images&#039;&#039;&#039; zu bauen und &#039;&#039;&#039;Container&#039;&#039;&#039; bzw. &#039;&#039;&#039;Container&#039;&#039;&#039; im &#039;&#039;&#039;Serviceverbund&#039;&#039;&#039; zu starten. Die Erstellung von &#039;&#039;&#039;Volumes&#039;&#039;&#039; und &#039;&#039;&#039;Networks&#039;&#039;&#039; wird stark erleichtert. Zudem muss der oft Komplexe {{BSL|docker run}} Befehl nicht abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden einige der zuvor erstellten Beispiele mit &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; nachgebaut.&lt;br /&gt;
&lt;br /&gt;
 Der Standard Name für &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; Dateien ist docker-compose.yml.&lt;br /&gt;
 Mit dem Parameter {{BSL|-f}} kann jedoch direkt eine &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; Datei angegeben werden.&lt;br /&gt;
 Z.b.: {{BSL|docker-compose -f service1.yml}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 1) Erster Container ===&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Beispiel_1):_Erster_Container_start|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  ubuntu:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: ubuntu&lt;br /&gt;
    #Used image&lt;br /&gt;
    image: ubuntu:22.04&lt;br /&gt;
    #Command to run&lt;br /&gt;
    command: [&amp;quot;bash&amp;quot;]&lt;br /&gt;
    #Parameter -it&lt;br /&gt;
    stdin_open: true &lt;br /&gt;
    tty: true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service &#039;&#039;&#039;detached&#039;&#039;&#039; starten:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose up -d&lt;br /&gt;
}}&lt;br /&gt;
Mit Service verbinden und schließen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
Der Container ist nun im &#039;&#039;&#039;Exited State&#039;&#039;&#039; {{BSL|docker ps -a}}. Der Container wird mit folgendem Kommando korrekt gelöscht, bzw. auch gestoppt sofern dieser gestartet ist. Es werden so ebenfalls alle erstellten Netzwerke gelöscht.  Wird &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; verwendet so wird nicht Standardmäßig das bridge Netzwerk &#039;&#039;&#039;bridge&#039;&#039;&#039; verwendet. &lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose down&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 2) Node Webserver (bestehendes Image, Folder Mount) ===&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Beispiel_5):_Node_Webserver|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  example5:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: example5&lt;br /&gt;
    #Used image&lt;br /&gt;
    image: example5:1.0&lt;br /&gt;
    #Folder/Volume mount -v&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./http:/var/www&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:5000&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service starten&lt;br /&gt;
{{BML|code=docker compose up -d}}&lt;br /&gt;
Logs einsehen&lt;br /&gt;
{{BML|code=docker compose logs [service name optional]}}&lt;br /&gt;
Ressourcen einsehen&lt;br /&gt;
{{BML|code=docker compose stats [service name optional]}}&lt;br /&gt;
Informationen einsehen&lt;br /&gt;
{{BML|code=docker compose ps [service name optional]}}&lt;br /&gt;
Webserver testen [http://localhost:8000 http://localhost:8000]&lt;br /&gt;
&lt;br /&gt;
Service beenden&lt;br /&gt;
{{BML|code=docker compose down}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 3) Node Webserver (existing Image, Volume Mount) ===&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Beispiel_5.1):_Node_Webserver_Using_Named_Volume|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  node_webserver:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: node_webserver&lt;br /&gt;
    #Used image&lt;br /&gt;
    image: example5:1.0&lt;br /&gt;
    #Folder/Volume mount -v&lt;br /&gt;
    volumes:&lt;br /&gt;
      - www:/var/www&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:5000&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  www:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das Volume wird automatisch erstellt und bleibt auch nach {{BSL|docker compose down}} erhalten.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 4) Node Webserver (building Image) ===&lt;br /&gt;
Inhalt &#039;&#039;&#039;Dockerfile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Dockerfile|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  node_webserver:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: node_webserver&lt;br /&gt;
    #Build image&lt;br /&gt;
    build:&lt;br /&gt;
      context: .&lt;br /&gt;
    image: example5:1.0&lt;br /&gt;
    #Folder/Volume mount -v&lt;br /&gt;
    volumes:&lt;br /&gt;
      - www:/var/www&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:5000&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  www:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Löschen des bestehenden Images:&lt;br /&gt;
{{BML|code=docker image example5:1.0}}&lt;br /&gt;
Das starten des Services erstellt automatisch das Image bzw. die Images:&lt;br /&gt;
{{BML|code=docker compose up -d}}&lt;br /&gt;
Das oder die Images können auch explizit gebaut werden:&lt;br /&gt;
{{BML|code=docker compose build}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 5) Networking ===&lt;br /&gt;
Siehe [[Docker_2024_04/Networking#Beispiel_4):_Komplexeres_Beispiel|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;Dockerfile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Siehe [[Docker_2024_04/Networking#Dockerfile|hier]]&lt;br /&gt;
 Folgend werden &#039;&#039;&#039;Bridge&#039;&#039;&#039; Netzwerke verwendet. Es können verschiedene Treiber angegeben werden, siehe [https://docs.docker.com/compose/networking/ hier]&amp;lt;ref&amp;gt;https://docs.docker.com/compose/networking/&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Das &#039;&#039;&#039;Host Network&#039;&#039;&#039; kann über den Parameter {{BSL|network_mode: host}} verwendet werden.&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  app:&lt;br /&gt;
    container_name: app&lt;br /&gt;
    hostname: app&lt;br /&gt;
    build:&lt;br /&gt;
      context: .&lt;br /&gt;
    image: networking_example2:1.0&lt;br /&gt;
    #Use networks&lt;br /&gt;
    networks:&lt;br /&gt;
      - tier1&lt;br /&gt;
      - tier2&lt;br /&gt;
    #Depends on database&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - db&lt;br /&gt;
&lt;br /&gt;
  db:&lt;br /&gt;
    container_name: database&lt;br /&gt;
    hostname: db&lt;br /&gt;
    image: networking_example2:1.0&lt;br /&gt;
    networks:&lt;br /&gt;
      - tier2&lt;br /&gt;
&lt;br /&gt;
  reverseproxy:&lt;br /&gt;
    container_name: reverseproxy&lt;br /&gt;
    hostname: reverseproxy&lt;br /&gt;
    image: networking_example2:1.0&lt;br /&gt;
    networks:&lt;br /&gt;
      - tier1&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - app&lt;br /&gt;
&lt;br /&gt;
networks:&lt;br /&gt;
  tier1:&lt;br /&gt;
  tier2:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Services starten:&lt;br /&gt;
{{BML|code=docker compose up -d}}&lt;br /&gt;
&lt;br /&gt;
 Die Netzwerk funktionalität kann wie [[Docker_2024_04/Networking#Beispiel_4):_Komplexeres_Beispiel|hier]] bereits erläutert wurde, getestet werden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 6) Restarting ===&lt;br /&gt;
Wird die im Service gestartete Anwendung beendet, so kann definiert werden ob der Service neu gestartet werden soll. Weiter Informationen finden sich [https://www.baeldung.com/ops/docker-compose-restart-policies hier]&amp;lt;ref&amp;gt;https://www.baeldung.com/ops/docker-compose-restart-policies&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Folgendes Kommando bietet sich für ein eigenes Terminal an {{BSL|watch -n 0.1 -c &amp;quot;docker ps -a&amp;quot;}} um den Container Status zu überwachen.&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  ubuntu:&lt;br /&gt;
    container_name: ubuntu&lt;br /&gt;
    image: ubuntu:22.04&lt;br /&gt;
    command: [&amp;quot;bash&amp;quot;]&lt;br /&gt;
    stdin_open: true &lt;br /&gt;
    tty: true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service &#039;&#039;&#039;detached&#039;&#039;&#039; starten:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose up -d&lt;br /&gt;
}}&lt;br /&gt;
Mit Service verbinden und schließen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
Der Service wurde beendet und ist im &#039;&#039;&#039;Exited State&#039;&#039;&#039;, {{BSL|docker ps -a}}&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  ubuntu:&lt;br /&gt;
    #Container always restarts after application terminates&lt;br /&gt;
    restart: always&lt;br /&gt;
    container_name: ubuntu&lt;br /&gt;
    image: ubuntu:22.04&lt;br /&gt;
    command: [&amp;quot;bash&amp;quot;]&lt;br /&gt;
    stdin_open: true &lt;br /&gt;
    tty: true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service &#039;&#039;&#039;detached&#039;&#039;&#039; starten:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose up -d&lt;br /&gt;
}}&lt;br /&gt;
Mit Service verbinden und schließen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
Der Service wurde beendet und ist im &#039;&#039;&#039;Exited State&#039;&#039;&#039;, wird jedoch neu gestartet {{BSL|docker ps -a}}&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
	<entry>
		<id>https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Docker_Compose&amp;diff=3510</id>
		<title>Docker 2024 04/Docker Compose</title>
		<link rel="alternate" type="text/html" href="https://ccwiki.digitalcampusvorarlberg.at/index.php?title=Docker_2024_04/Docker_Compose&amp;diff=3510"/>
		<updated>2024-04-18T10:10:08Z</updated>

		<summary type="html">&lt;p&gt;Drlue: /* Beispiel 6) Restarting */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Docker Compose&#039;&#039;&#039; bietet eine komfortable Möglichkeit &#039;&#039;&#039;Images&#039;&#039;&#039; zu bauen und &#039;&#039;&#039;Container&#039;&#039;&#039; bzw. &#039;&#039;&#039;Container&#039;&#039;&#039; im &#039;&#039;&#039;Serviceverbund&#039;&#039;&#039; zu starten. Die Erstellung von &#039;&#039;&#039;Volumes&#039;&#039;&#039; und &#039;&#039;&#039;Networks&#039;&#039;&#039; wird stark erleichtert. Zudem muss der oft Komplexe {{BSL|docker run}} Befehl nicht abgelegt werden.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden einige der zuvor erstellten Beispiele mit &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; nachgebaut.&lt;br /&gt;
&lt;br /&gt;
 Der Standard Name für &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; Dateien ist docker-compose.yml.&lt;br /&gt;
 Mit dem Parameter {{BSL|-f}} kann jedoch direkt eine &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; Datei angegeben werden.&lt;br /&gt;
 Z.b.: {{BSL|docker-compose -f service1.yml}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 1) Erster Container ===&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Beispiel_1):_Erster_Container_start|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  ubuntu:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: ubuntu&lt;br /&gt;
    #Used image&lt;br /&gt;
    image: ubuntu:22.04&lt;br /&gt;
    #Command to run&lt;br /&gt;
    command: [&amp;quot;bash&amp;quot;]&lt;br /&gt;
    #Parameter -it&lt;br /&gt;
    stdin_open: true &lt;br /&gt;
    tty: true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service &#039;&#039;&#039;detached&#039;&#039;&#039; starten:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose up -d&lt;br /&gt;
}}&lt;br /&gt;
Mit Service verbinden und schließen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
Der Container ist nun im &#039;&#039;&#039;Exited State&#039;&#039;&#039; {{BSL|docker ps -a}}. Der Container wird mit folgendem Kommando korrekt gelöscht, bzw. auch gestoppt sofern dieser gestartet ist. Es werden so ebenfalls alle erstellten Netzwerke gelöscht.  Wird &#039;&#039;&#039;Docker Compose&#039;&#039;&#039; verwendet so wird nicht Standardmäßig das bridge Netzwerk &#039;&#039;&#039;bridge&#039;&#039;&#039; verwendet. &lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose down&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 2) Node Webserver (bestehendes Image, Folder Mount) ===&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Beispiel_5):_Node_Webserver|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  node_webserver:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: node_webserver&lt;br /&gt;
    #Used image&lt;br /&gt;
    image: example5:1.0&lt;br /&gt;
    #Folder/Volume mount -v&lt;br /&gt;
    volumes:&lt;br /&gt;
      - ./http:/var/www&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:5000&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service starten&lt;br /&gt;
{{BML|code=docker compose up -d}}&lt;br /&gt;
Logs einsehen&lt;br /&gt;
{{BML|code=docker compose logs [service name optional]}}&lt;br /&gt;
Ressourcen einsehen&lt;br /&gt;
{{BML|code=docker compose stats [service name optional]}}&lt;br /&gt;
Informationen einsehen&lt;br /&gt;
{{BML|code=docker compose ps [service name optional]}}&lt;br /&gt;
Webserver testen [http://localhost:8000 http://localhost:8000]&lt;br /&gt;
&lt;br /&gt;
Service beenden&lt;br /&gt;
{{BML|code=docker compose down}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 3) Node Webserver (existing Image, Volume Mount) ===&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Beispiel_5.1):_Node_Webserver_Using_Named_Volume|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  node_webserver:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: node_webserver&lt;br /&gt;
    #Used image&lt;br /&gt;
    image: example5:1.0&lt;br /&gt;
    #Folder/Volume mount -v&lt;br /&gt;
    volumes:&lt;br /&gt;
      - www:/var/www&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:5000&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  www:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Das Volume wird automatisch erstellt und bleibt auch nach {{BSL|docker compose down}} erhalten.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 4) Node Webserver (building Image) ===&lt;br /&gt;
Inhalt &#039;&#039;&#039;Dockerfile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Siehe [[Docker_2024_04/Containers#Dockerfile|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  #Service name&lt;br /&gt;
  node_webserver:&lt;br /&gt;
    #Container name, --name&lt;br /&gt;
    container_name: node_webserver&lt;br /&gt;
    #Build image&lt;br /&gt;
    build:&lt;br /&gt;
      context: .&lt;br /&gt;
    image: example5:1.0&lt;br /&gt;
    #Folder/Volume mount -v&lt;br /&gt;
    volumes:&lt;br /&gt;
      - www:/var/www&lt;br /&gt;
    ports:&lt;br /&gt;
      - 8000:5000&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  www:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Löschen des bestehenden Images:&lt;br /&gt;
{{BML|code=docker image example5:1.0}}&lt;br /&gt;
Das starten des Services erstellt automatisch das Image bzw. die Images:&lt;br /&gt;
{{BML|code=docker compose up -d}}&lt;br /&gt;
Das oder die Images können auch explizit gebaut werden:&lt;br /&gt;
{{BML|code=docker compose build}}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 5) Networking ===&lt;br /&gt;
Siehe [[Docker_2024_04/Networking#Beispiel_4):_Komplexeres_Beispiel|hier]]&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;Dockerfile&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Siehe [[Docker_2024_04/Networking#Dockerfile|hier]]&lt;br /&gt;
 Folgend werden &#039;&#039;&#039;Bridge&#039;&#039;&#039; Netzwerke verwendet. Es können verschiedene Treiber angegeben werden, siehe [https://docs.docker.com/compose/networking/ hier]&amp;lt;ref&amp;gt;https://docs.docker.com/compose/networking/&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Das &#039;&#039;&#039;Host Network&#039;&#039;&#039; kann über den Parameter {{BSL|network_mode: host}} verwendet werden.&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  app:&lt;br /&gt;
    container_name: app&lt;br /&gt;
    hostname: app&lt;br /&gt;
    build:&lt;br /&gt;
      context: .&lt;br /&gt;
    image: networking_example2:1.0&lt;br /&gt;
    #Use networks&lt;br /&gt;
    networks:&lt;br /&gt;
      - tier1&lt;br /&gt;
      - tier2&lt;br /&gt;
    #Depends on database&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - db&lt;br /&gt;
&lt;br /&gt;
  db:&lt;br /&gt;
    container_name: database&lt;br /&gt;
    hostname: db&lt;br /&gt;
    image: networking_example2:1.0&lt;br /&gt;
    networks:&lt;br /&gt;
      - tier2&lt;br /&gt;
&lt;br /&gt;
  reverseproxy:&lt;br /&gt;
    container_name: reverseproxy&lt;br /&gt;
    hostname: reverseproxy&lt;br /&gt;
    image: networking_example2:1.0&lt;br /&gt;
    networks:&lt;br /&gt;
      - tier1&lt;br /&gt;
    depends_on:&lt;br /&gt;
      - app&lt;br /&gt;
&lt;br /&gt;
networks:&lt;br /&gt;
  tier1:&lt;br /&gt;
  tier2:&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Services starten:&lt;br /&gt;
{{BML|code=docker compose up -d}}&lt;br /&gt;
&lt;br /&gt;
 Die Netzwerk funktionalität kann wie [[Docker_2024_04/Networking#Beispiel_4):_Komplexeres_Beispiel|hier]] bereits erläutert wurde, getestet werden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel 6) Restarting ===&lt;br /&gt;
Wird die im Service gestartete Anwendung beendet, so kann definiert werden ob der Service neu gestartet werden soll. Weiter Informationen finden sich [https://www.baeldung.com/ops/docker-compose-restart-policies hier]&amp;lt;ref&amp;gt;https://www.baeldung.com/ops/docker-compose-restart-policies&amp;lt;/ref&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Folgendes Kommando bietet sich für ein eigenes Terminal an {{BSL|watch -n 0.1 -c &amp;quot;docker ps -a&amp;quot;}} um den Container Status zu überwachen.&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  ubuntu:&lt;br /&gt;
    container_name: ubuntu&lt;br /&gt;
    image: ubuntu:22.04&lt;br /&gt;
    command: [&amp;quot;bash&amp;quot;]&lt;br /&gt;
    stdin_open: true &lt;br /&gt;
    tty: true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service &#039;&#039;&#039;detached&#039;&#039;&#039; starten:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose up -d&lt;br /&gt;
}}&lt;br /&gt;
Mit Service verbinden und schließen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
Der Service wurde beendet und ist im &#039;&#039;&#039;Exited State&#039;&#039;&#039;, {{BSL|docker ps -a}}&lt;br /&gt;
&lt;br /&gt;
Inhalt &#039;&#039;&#039;docker-compose.yml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{BML|code=&lt;br /&gt;
services:&lt;br /&gt;
  ubuntu:&lt;br /&gt;
    #Container always restarts after application terminates&lt;br /&gt;
    restart: always&lt;br /&gt;
    container_name: ubuntu&lt;br /&gt;
    image: ubuntu:22.04&lt;br /&gt;
    command: [&amp;quot;bash&amp;quot;]&lt;br /&gt;
    stdin_open: true &lt;br /&gt;
    tty: true&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Service &#039;&#039;&#039;detached&#039;&#039;&#039; starten:&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker compose up -d&lt;br /&gt;
}}&lt;br /&gt;
Mit Service verbinden und schließen&lt;br /&gt;
{{BML|code=&lt;br /&gt;
docker attach ubuntu&lt;br /&gt;
exit&lt;br /&gt;
}}&lt;br /&gt;
Der Service wurde beendet und ist im &#039;&#039;&#039;Exited State&#039;&#039;&#039;, wird jedoch neu gestartet {{BSL|docker ps -a}}&lt;/div&gt;</summary>
		<author><name>Drlue</name></author>
	</entry>
</feed>