<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Container |</title><link>https://kurse.richter.consulting/tags/container/</link><atom:link href="https://kurse.richter.consulting/tags/container/index.xml" rel="self" type="application/rss+xml"/><description>Container</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>de</language><lastBuildDate>Tue, 02 Jun 2026 07:00:00 +0100</lastBuildDate><image><url>https://kurse.richter.consulting/media/logo.svg</url><title>Container</title><link>https://kurse.richter.consulting/tags/container/</link></image><item><title>Installation von Docker Desktop</title><link>https://kurse.richter.consulting/courses/container/install/</link><pubDate>Sat, 07 Dec 2024 00:00:00 +0000</pubDate><guid>https://kurse.richter.consulting/courses/container/install/</guid><description>&lt;p&gt;Die Firma Docker Inc. liefert für Entwickler ein einfaches Tool, um mit Containern starten zu können. Für die private Nutzung (und kleine Firmen) ist das Tool komplett kostenlos.&lt;/p&gt;
&lt;h2 id="docker-desktop-installieren"&gt;Docker Desktop installieren&lt;/h2&gt;
&lt;p&gt;Laden Sie die Installationsdatei von der offiziellen Seite herunter (Windows / macOS) oder installieren Sie diese über den Paket-Manager Ihrer Wahl.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;span class="inline-block pr-1"&gt;
&lt;svg style="height: 1em; transform: translateY(0.1em);" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3"/&gt;&lt;/svg&gt;
&lt;/span&gt; Download:
&lt;/li&gt;
&lt;li&gt;
&lt;span class="inline-block pr-1"&gt;
&lt;svg style="height: 1em; transform: translateY(0.1em);" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"&gt;&lt;path d="M39.676 32.972c-4.6 0-8.45 3.142-9.603 7.39c-4.063.571-7.218 4.031-7.218 8.246c0 4.1 2.954 7.523 6.84 8.293l.018.002a47 47 0 0 1 4.273.993L34 57.9c5.603 1.511 16.502 3.582 28.568 3.279c.77 1.573 1.95 2.907 3.441 3.809l-.014-.01c.523.325.946 1.19.946 1.696a5.444 5.444 0 0 0 5.425 5.427c1.417 0 2.756-.427 3.77-1.285s1.66-2.173 1.66-3.664l-.003-.808l-.004-.092a8.75 8.75 0 0 1 1.004-4.75V61.5c.434-.804.707-1.697.884-2.621c1.963-.514 3.917-1.088 5.83-1.809l.005-.002a9.5 9.5 0 0 1 2.08-.54l.004-.001a8.39 8.39 0 0 0 7.23-8.3c0-4.612-3.765-8.378-8.378-8.378c-1.33 0-2.567.355-3.683.907c-1.606-3.64-5.225-6.192-9.447-6.192c-4.792 0-8.802 3.298-9.973 7.73c-1.763-2.057-4.318-3.42-7.232-3.42c-2.579 0-4.847 1.098-6.577 2.76c-.66-4.875-4.811-8.663-9.862-8.663zm0 2.288a7.692 7.692 0 0 1 7.267 10.265a1.144 1.144 0 0 0 .894 1.506l.028.005a1.144 1.144 0 0 0 1.235-.757l.001.003l.002-.005l.037-.023a7.32 7.32 0 0 1 6.977-5.095a7.32 7.32 0 0 1 6.958 5.042a1.144 1.144 0 0 0 2.224-.476a8.046 8.046 0 0 1 8.023-8.876a8.06 8.06 0 0 1 7.688 5.629a1.144 1.144 0 0 0 1.38.762l.801-.21a1.1 1.1 0 0 0 .274-.111a6.04 6.04 0 0 1 2.986-.784a6.073 6.073 0 0 1 6.09 6.09a6.08 6.08 0 0 1-5.255 6.034h-.005a11.8 11.8 0 0 0-2.585.672a57 57 0 0 1-6.272 1.944a1.14 1.14 0 0 0-.862.995a6.8 6.8 0 0 1-.78 2.548l-.001.004a11.04 11.04 0 0 0-1.27 5.996l-.002-.094l.004.826c0 .875-.313 1.465-.85 1.918c-.535.454-1.34.746-2.293.746a3.123 3.123 0 0 1-3.14-3.14a4.28 4.28 0 0 0-2.024-3.639l-.01-.01a6.85 6.85 0 0 1-2.839-3.394a1.14 1.14 0 0 0-1.105-.732c-12.054.406-23.122-1.72-28.638-3.207l-.014-.004a48 48 0 0 0-4.472-1.038l.02.003c-2.84-.563-4.999-3.046-4.999-6.049a6.07 6.07 0 0 1 5.873-6.08a1.144 1.144 0 0 0 1.085-.938a7.695 7.695 0 0 1 7.578-6.331zM42.134.018a1.14 1.14 0 0 0-.9.811c-1.682 5.888.956 11.472 4.474 15.656a32 32 0 0 0 2.54 2.679a10.9 10.9 0 0 0-3.55.1c-6.317 1.244-11.696 5.254-14.618 13.505c-1.198 3.384-1.251 6.903-.865 10.1a6.1 6.1 0 0 1 1.8-.339a1.1 1.1 0 0 0 .437-.172c-.32-2.887-.225-5.978.784-8.827c2.713-7.662 7.224-10.906 12.902-12.024c1.956-.384 3.544-.057 5.28.508c.868.284 1.763.633 2.724.966l.178.055c.91.31 1.875.604 2.934.807a1.144 1.144 0 0 0 1.344-1.311a13 13 0 0 1-.003-4.198c.047-.28.088-.563.148-.837c.35-1.56.947-2.992 1.65-4.268a19.8 19.8 0 0 1 3.535-4.598c.376.285.753.54 1.128.96c.183.205.172.215.312.388c-1.77 1.643-5.705 6.102-5.078 13.084a1.144 1.144 0 0 0 1.181 1.039c2.503-.09 4.174-.92 5.634-1.593s2.712-1.216 4.968-1.146c4.667.147 8.737 3.814 10.339 6.051c1.73 2.634 3.858 5.908 3.513 14.883v.038a6 6 0 0 1 1.524-.197q.388.002.764.054c.316-9.267-2.162-13.403-3.908-16.06l-.023-.038c-1.945-2.722-6.366-6.837-12.137-7.017c-2.681-.083-4.49.66-5.996 1.354c-1.161.535-2.246.944-3.571 1.175c.009-6.858 5.037-10.568 5.037-10.568a1.144 1.144 0 0 0 .261-1.584s-.461-.654-1.112-1.385c-.65-.73-1.438-1.575-2.507-2.021a1.14 1.14 0 0 0-1.201.2a23 23 0 0 0-4.665 5.877c-.256.464-.48.971-.705 1.48c-.493-1.63-1.16-3.144-2.035-4.54c-2.415-3.85-6.317-6.742-11.89-8.982a1.14 1.14 0 0 0-.627-.065m1.036 2.775c4.533 2.018 7.624 4.428 9.541 7.486c1.4 2.23 2.21 4.867 2.548 7.989c.014.151.024.311.038.466v.001c.085.902.137 1.834.148 2.818c-.33-.175-.724-.428-1.097-.655c-.243-.148-.457-.254-.712-.423c-1.952-1.284-4.252-3.17-6.178-5.46c-2.944-3.504-4.99-7.784-4.288-12.223zm44.049 51.484a11.8 11.8 0 0 0-2.527.66a53 53 0 0 1-1.928.681c-.061.115-.088.172-.153.298c-.033.064-.148.236-.191.313h2.847v3.36a3.07 3.07 0 0 0 3.055 3.052h7.085a7.45 7.45 0 0 1 7.45 7.45v30.956a7.46 7.46 0 0 1-2.192 5.277a7.46 7.46 0 0 1-3.822 2.034a7.5 7.5 0 0 1-1.464.14h-.005c-2.39.005-4.898 0-6.988-.028a3.055 3.055 0 0 0-3.116 3.05c0 2.5 0 6.735-.01 8.553v.005a.76.76 0 0 1-.265.571c-1.157.863-4.513 2.628-10.991 3.83a65 65 0 0 1-4.268.64c-3.104.367-6.737.597-10.957.597c-16.572 0-24.463-2.779-26.608-4.01a.76.76 0 0 1-.35-.633l-.138-64.843h4.063c-.057-.105-.086-.176-.142-.28c-.326-.083-.699-.17-.996-.25l-.014-.003a48 48 0 0 0-4.472-1.038l.018.004a6 6 0 0 1-.517-.128a1.14 1.14 0 0 0-.228.554s.123 57.552.14 65.988a3.06 3.06 0 0 0 1.412 2.569l.042.023c2.862 1.657 10.915 4.332 27.789 4.332c17.268 0 25.067-3.613 27.63-5.55l.037-.032a3.05 3.05 0 0 0 1.101-2.342c.01-1.837.01-6.06.01-8.558a.76.76 0 0 1 .228-.546v-.001a.76.76 0 0 1 .553-.218h.01c2.11.028 4.628.032 7.025.028a9.74 9.74 0 0 0 9.772-9.737l.001-30.955a9.74 9.74 0 0 0-9.739-9.739h-7.084a.75.75 0 0 1-.765-.764v-4.503a1.14 1.14 0 0 0-.336-.81zm1.58 13.728a3.5 3.5 0 0 0-1.351.269a3.5 3.5 0 0 0-1.147.764v.001a3.5 3.5 0 0 0-.764 1.145a3.5 3.5 0 0 0-.269 1.352v27.78a3.5 3.5 0 0 0 .27 1.352a3.5 3.5 0 0 0 .763 1.146a3.5 3.5 0 0 0 1.147.764a3.5 3.5 0 0 0 1.351.27h6.082a3.5 3.5 0 0 0 1.352-.27a3.5 3.5 0 0 0 1.145-.764a3.5 3.5 0 0 0 .764-1.146a3.5 3.5 0 0 0 .27-1.351v-27.78a3.5 3.5 0 0 0-.27-1.352a3.5 3.5 0 0 0-.763-1.145h-.001a3.5 3.5 0 0 0-1.147-.765a3.5 3.5 0 0 0-1.35-.27zm0 2.288h6.082a1.244 1.244 0 0 1 1.243 1.242v27.782a1.243 1.243 0 0 1-1.243 1.243H88.8a1.24 1.24 0 0 1-.879-.363h-.001a1.24 1.24 0 0 1-.363-.88v-27.78a1.24 1.24 0 0 1 .767-1.15q.226-.092.476-.093z"/&gt;&lt;path fill="#d1d3d4" d="M43.171 2.793c-.701 4.438 1.344 8.719 4.289 12.222c2.567 3.053 5.799 5.387 7.988 6.538c-.052-4.604-.87-8.3-2.734-11.272c-1.92-3.058-5.01-5.47-9.543-7.486zm19.76 5.838a19.8 19.8 0 0 0-3.535 4.598c-1.408 2.552-2.392 5.73-1.797 9.303a1.144 1.144 0 0 1-1.343 1.311c-2.253-.431-4.1-1.262-5.836-1.828c-1.735-.567-3.323-.892-5.28-.507c-5.68 1.117-10.19 4.36-12.902 12.023c-.449 1.27-.708 2.59-.84 3.916c1.78-2.693 4.817-4.474 8.28-4.474c5.051 0 9.2 3.79 9.863 8.663c1.728-1.66 3.998-2.76 6.577-2.76c2.913 0 5.467 1.363 7.231 3.42c1.171-4.431 5.18-7.729 9.973-7.729c4.222 0 7.84 2.552 9.448 6.19a9 9 0 0 1 2.172-.739c-.076-7.241-1.956-10.21-3.527-12.602c-1.603-2.237-5.672-5.905-10.339-6.053c-2.256-.069-3.51.475-4.968 1.147c-1.46.673-3.131 1.504-5.634 1.593a1.144 1.144 0 0 1-1.18-1.04c-.63-6.982 3.307-11.44 5.076-13.084c-.14-.172-.128-.182-.31-.387c-.376-.42-.753-.675-1.129-.961"/&gt;&lt;path fill="#fbb040" d="M36.042 58.416v55.313a1.91 1.91 0 0 0 .955 1.656c2.417 1.151 9.427 3.9 21.716 3.9c12.372 0 19.173-3.34 21.451-4.718a1.9 1.9 0 0 0 .873-1.599c.005-7.316.005-48.47.005-54.473c-.456.128-.91.267-1.369.386a11 11 0 0 1-.345 1.356q-.213.661-.536 1.265l-.003.004a8.76 8.76 0 0 0-1.002 4.75l.004.093l.002.806a4.8 4.8 0 0 1-.45 2.07a4.7 4.7 0 0 1-.522.87a4.6 4.6 0 0 1-.688.724a5 5 0 0 1-.817.563a5.5 5.5 0 0 1-.918.402a6 6 0 0 1-.99.24q-.511.081-1.044.081a5.4 5.4 0 0 1-3.027-.93a5.5 5.5 0 0 1-1.972-2.39a5.4 5.4 0 0 1-.427-2.108c0-.126-.028-.275-.074-.431a2.6 2.6 0 0 0-.204-.483a2.6 2.6 0 0 0-.3-.45a1.6 1.6 0 0 0-.368-.33l.014.008a9 9 0 0 1-1.058-.754a9 9 0 0 1-.933-.899a9 9 0 0 1-.798-1.023a10 10 0 0 1-.653-1.132c-1.508.038-2.998.038-4.461.01a104 104 0 0 1-4.304-.18a109 109 0 0 1-4.099-.334a112 112 0 0 1-7.384-.991a104 104 0 0 1-3.19-.59a91 91 0 0 1-2.788-.604l-.296-.075zm6.615 3.51a2.6 2.6 0 0 1 1.007.202a2.6 2.6 0 0 1 .853.57a2.6 2.6 0 0 1 .57.852a2.6 2.6 0 0 1 .202 1.007v45.748a2.6 2.6 0 0 1-.033.412a2.6 2.6 0 0 1-.096.402a2.6 2.6 0 0 1-.156.382a2.6 2.6 0 0 1-.218.352a3 3 0 0 1-.267.314a2.6 2.6 0 0 1-.314.268a2.6 2.6 0 0 1-.353.217a2.6 2.6 0 0 1-.382.156a2.6 2.6 0 0 1-.402.098a3 3 0 0 1-.41.032a2.6 2.6 0 0 1-1.01-.2a2.6 2.6 0 0 1-.852-.57a2.6 2.6 0 0 1-.57-.854a2.6 2.6 0 0 1-.2-1.007V64.56a2.6 2.6 0 0 1 .2-1.008a2.6 2.6 0 0 1 .57-.853a2.6 2.6 0 0 1 .854-.57a2.6 2.6 0 0 1 1.007-.2z"/&gt;&lt;path fill="#ffdb96" d="M42.66 61.924a2.63 2.63 0 0 0-2.632 2.63v45.749a2.63 2.63 0 0 0 2.632 2.632a2.63 2.63 0 0 0 2.632-2.632V64.555a2.63 2.63 0 0 0-2.632-2.631"/&gt;&lt;path fill="#fff" d="M39.676 35.259a7.695 7.695 0 0 0-7.578 6.331a1.144 1.144 0 0 1-1.084.939a6.07 6.07 0 0 0-5.872 6.08c0 3.001 2.157 5.485 4.998 6.049l-.02-.004a48 48 0 0 1 4.473 1.038l.014.005c5.517 1.485 16.585 3.612 28.638 3.205a1.14 1.14 0 0 1 1.106.733a6.85 6.85 0 0 0 2.84 3.394l.01.01a4.28 4.28 0 0 1 2.025 3.638a3.123 3.123 0 0 0 3.14 3.142c.952 0 1.757-.294 2.293-.747c.536-.454.85-1.043.85-1.917l-.004-.805a11.04 11.04 0 0 1 1.27-5.924l.003-.004a6.8 6.8 0 0 0 .78-2.548a1.14 1.14 0 0 1 .861-.994a57 57 0 0 0 6.272-1.945a11.8 11.8 0 0 1 2.585-.67h.005a6.08 6.08 0 0 0 5.255-6.036a6.073 6.073 0 0 0-6.09-6.09c-1.088 0-2.1.285-2.986.784a1.1 1.1 0 0 1-.274.111l-.801.21a1.144 1.144 0 0 1-1.381-.762a8.06 8.06 0 0 0-7.687-5.629a8.046 8.046 0 0 0-8.022 8.876a1.144 1.144 0 0 1-2.225.476a7.32 7.32 0 0 0-6.957-5.042a7.32 7.32 0 0 0-6.977 5.094l-.037.023v.005l-.003-.004a1.144 1.144 0 0 1-1.235.758l-.028-.004a1.144 1.144 0 0 1-.894-1.507a7.692 7.692 0 0 0-7.267-10.266zm45.592 21.897a45 45 0 0 1-2.658.896c-.519.16-1.043.296-1.565.441c0 6 0 47.153-.005 54.473a1.9 1.9 0 0 1-.873 1.6c-.284.172-.64.374-1.067.597c-.428.223-.93.467-1.504.72a31 31 0 0 1-1.954.78a37 37 0 0 1-2.414.777a44 44 0 0 1-4.512 1.025a51 51 0 0 1-3.62.5q-.968.1-2 .171a63 63 0 0 1-4.379.146a75 75 0 0 1-4.364-.12a69 69 0 0 1-1.997-.142a66 66 0 0 1-3.635-.41a59 59 0 0 1-1.64-.26a53 53 0 0 1-2.925-.586a45 45 0 0 1-2.464-.642a38 38 0 0 1-2.007-.645a31 31 0 0 1-1.562-.599A24 24 0 0 1 37 115.38a1.91 1.91 0 0 1-.957-1.656v-55.31a74 74 0 0 1-2.046-.513l-.014-.004a46 46 0 0 0-2.123-.547l-.177-.038l.137 63.761a.78.78 0 0 0 .349.634c.268.154.626.333 1.08.525c.453.195 1.002.405 1.651.621c.651.216 1.402.44 2.26.664c.86.221 1.825.443 2.902.655c1.079.212 2.268.416 3.579.6q1.962.28 4.288.49a105 105 0 0 0 5.034.332a133 133 0 0 0 5.813.122a108 108 0 0 0 5.898-.16a90 90 0 0 0 2.632-.189a79 79 0 0 0 2.428-.247a70 70 0 0 0 2.232-.3a62 62 0 0 0 2.036-.343a54 54 0 0 0 2.285-.473a45 45 0 0 0 2.003-.51a38 38 0 0 0 1.732-.528a31 31 0 0 0 1.472-.53q.671-.261 1.22-.512q.55-.25.985-.48a13 13 0 0 0 .756-.432a8 8 0 0 0 .537-.364a.8.8 0 0 0 .196-.256a.7.7 0 0 0 .07-.313v-.005c.01-1.818.01-6.053.01-8.553a3.05 3.05 0 0 1 1.93-2.836a3.1 3.1 0 0 1 1.186-.216c2.089.028 4.599.032 6.986.028h.01a7.5 7.5 0 0 0 1.464-.14a7.46 7.46 0 0 0 5.442-4.452a7.5 7.5 0 0 0 .571-2.858V70.093a7.45 7.45 0 0 0-1.686-4.721a7.46 7.46 0 0 0-5.765-2.73h-7.084a3 3 0 0 1-1.701-.525a3.1 3.1 0 0 1-.826-.826a3 3 0 0 1-.526-1.7zm3.53 10.846h6.082a3.5 3.5 0 0 1 1.35.269a3.5 3.5 0 0 1 1.147.764a3.5 3.5 0 0 1 .765 1.147a3.5 3.5 0 0 1 .269 1.35v27.782a3.5 3.5 0 0 1-.268 1.35a3.5 3.5 0 0 1-.764 1.146h-.002a3.5 3.5 0 0 1-1.144.764a3.5 3.5 0 0 1-1.351.27h-6.084a3.5 3.5 0 0 1-1.351-.268a3.5 3.5 0 0 1-1.145-.765a3.5 3.5 0 0 1-.765-1.147a3.5 3.5 0 0 1-.268-1.35V71.532a3.5 3.5 0 0 1 .267-1.351a3.5 3.5 0 0 1 .764-1.146h.002a3.5 3.5 0 0 1 1.146-.765a3.5 3.5 0 0 1 1.35-.269z"/&gt;&lt;/svg&gt;
&lt;/span&gt; macOS Homebrew
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install --cask docker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;span class="inline-block pr-1"&gt;
&lt;svg style="height: 1em; transform: translateY(0.1em);" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"&gt;&lt;path fill="#0078d4" d="M67.328 67.331h60.669V128H67.328zm-67.325 0h60.669V128H.003zM67.328 0h60.669v60.669H67.328zM.003 0h60.669v60.669H.003z"/&gt;&lt;/svg&gt;
&lt;/span&gt; Windows WinGet
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-pwsh" data-lang="pwsh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;winget&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;Docker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;DockerDesktop&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="prüfen-der-installation"&gt;Prüfen der Installation&lt;/h2&gt;
&lt;p&gt;Nach der Installation und Start von Docker Desktop, sollte dieser in erster Linie in der Statusleiste als Icon
&lt;span class="inline-block pr-1"&gt;
&lt;svg style="height: 1em; transform: translateY(0.1em);" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"&gt;&lt;path fill="#3a4d54" fill-rule="evenodd" d="M73.8 50.8h11.3v11.5h5.7c2.6 0 5.3-.5 7.8-1.3c1.2-.4 2.6-1 3.8-1.7c-1.6-2.1-2.4-4.7-2.6-7.3c-.3-3.5.4-8.1 2.8-10.8l1.2-1.4l1.4 1.1c3.6 2.9 6.5 6.8 7.1 11.4c4.3-1.3 9.3-1 13.1 1.2l1.5.9l-.8 1.6c-3.2 6.2-9.9 8.2-16.4 7.8c-9.8 24.3-31 35.8-56.8 35.8c-13.3 0-25.5-5-32.5-16.8l-.1-.2l-1-2.1c-2.4-5.2-3.1-10.9-2.6-16.6l.2-1.7h9.6V50.8h11.3V39.6h22.5V28.3h13.5z" clip-rule="evenodd"/&gt;&lt;path fill="#00aada" d="M110.4 55.1c.8-5.9-3.6-10.5-6.4-12.7c-3.1 3.6-3.6 13.2 1.3 17.2c-2.8 2.4-8.5 4.7-14.5 4.7H18.6c-.6 6.2.5 11.9 3 16.8l.8 1.5c.5.9 1.1 1.7 1.7 2.6c3 .2 5.7.3 8.2.2c4.9-.1 8.9-.7 12-1.7c.5-.2.9.1 1.1.5c.2.5-.1.9-.5 1.1c-.4.1-.8.3-1.3.4c-2.4.7-5 1.1-8.3 1.3h-.6c-1.3.1-2.7.1-4.2.1c-1.6 0-3.1 0-4.9-.1c6 6.8 15.4 10.8 27.2 10.8c25 0 46.2-11.1 55.5-35.9c6.7.7 13.1-1 16-6.7c-4.5-2.7-10.5-1.8-13.9-.1"/&gt;&lt;path fill="#28b8eb" d="M110.4 55.1c.8-5.9-3.6-10.5-6.4-12.7c-3.1 3.6-3.6 13.2 1.3 17.2c-2.8 2.4-8.5 4.7-14.5 4.7h-68c-.3 9.5 3.2 16.7 9.5 21c4.9-.1 8.9-.7 12-1.7c.5-.2.9.1 1.1.5c.2.5-.1.9-.5 1.1c-.4.1-.8.3-1.3.4c-2.4.7-5.2 1.2-8.5 1.4l-.1-.1c8.5 4.4 20.8 4.3 35-1.1c15.8-6.1 30.6-17.7 40.9-30.9c-.2.1-.4.1-.5.2"/&gt;&lt;path fill="#028bb8" d="M18.7 71.8c.4 3.3 1.4 6.4 2.9 9.3l.8 1.5c.5.9 1.1 1.7 1.7 2.6c3 .2 5.7.3 8.2.2c4.9-.1 8.9-.7 12-1.7c.5-.2.9.1 1.1.5c.2.5-.1.9-.5 1.1c-.4.1-.8.3-1.3.4c-2.4.7-5.2 1.2-8.5 1.4h-.4c-1.3.1-2.7.1-4.1.1c-1.6 0-3.2 0-4.9-.1c6 6.8 15.5 10.8 27.3 10.8c21.4 0 40-8.1 50.8-26H18.7z"/&gt;&lt;path fill="#019bc6" d="M23.5 71.8c1.3 5.8 4.3 10.4 8.8 13.5c4.9-.1 8.9-.7 12-1.7c.5-.2.9.1 1.1.5c.2.5-.1.9-.5 1.1c-.4.1-.8.3-1.3.4c-2.4.7-5.2 1.2-8.6 1.4c8.5 4.4 20.8 4.3 34.9-1.1c8.5-3.3 16.8-8.2 24.2-14.1z"/&gt;&lt;path fill="#00acd3" fill-rule="evenodd" d="M28.4 52.7h9.8v9.8h-9.8zm.8.8h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm3-12h9.8v9.8h-9.8zm.9.8h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#23c2ee" fill-rule="evenodd" d="M39.6 52.7h9.8v9.8h-9.8zm.9.8h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#00acd3" fill-rule="evenodd" d="M50.9 52.7h9.8v9.8h-9.8zm.8.8h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#23c2ee" fill-rule="evenodd" d="M50.9 41.5h9.8v9.8h-9.8zm.8.8h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm3.1 10.4H72v9.8h-9.8zm.8.8h.8v8.1H63zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#00acd3" fill-rule="evenodd" d="M62.2 41.5H72v9.8h-9.8zm.8.8h.8v8.1H63zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#23c2ee" fill-rule="evenodd" d="M62.2 30.2H72V40h-9.8zm.8.8h.8v8.1H63zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#00acd3" fill-rule="evenodd" d="M73.5 52.7h9.8v9.8h-9.8zm.8.8h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#d4eef1" fill-rule="evenodd" d="M48.8 78.3c1.5 0 2.7 1.2 2.7 2.7s-1.2 2.7-2.7 2.7s-2.7-1.2-2.7-2.7s1.2-2.7 2.7-2.7" clip-rule="evenodd"/&gt;&lt;path fill="#3a4d54" fill-rule="evenodd" d="M48.8 79.1c.2 0 .5 0 .7.1c-.2.1-.4.4-.4.7c0 .4.4.8.8.8c.3 0 .6-.2.7-.4c.1.2.1.5.1.7c0 1.1-.9 1.9-1.9 1.9c-1.1 0-1.9-.9-1.9-1.9s.8-1.9 1.9-1.9M1.1 72.8h125.4c-2.7-.7-8.6-1.6-7.7-5.2c-5 5.7-16.9 4-20 1.2c-3.4 4.9-23 3-24.3-.8c-4.2 5-17.3 5-21.5 0c-1.4 3.8-21 5.7-24.3.8c-3 2.8-15 4.5-20-1.2c1.1 3.5-4.9 4.5-7.6 5.2" clip-rule="evenodd"/&gt;&lt;path fill="#bfdbe0" d="M56 97.8c-6.7-3.2-10.3-7.5-12.4-12.2c-2.5.7-5.5 1.2-8.9 1.4c-1.3.1-2.7.1-4.1.1c-1.7 0-3.4 0-5.2-.1c6 6 13.6 10.7 27.5 10.8z"/&gt;&lt;path fill="#d4eef1" d="M46.1 89.9c-.9-1.3-1.8-2.8-2.5-4.3c-2.5.7-5.5 1.2-8.9 1.4c2.3 1.2 5.7 2.4 11.4 2.9"/&gt;&lt;/svg&gt;
&lt;/span&gt; angezeigt werden. Wenn dies nicht der Fall ist, sollten Sie die Installation überprüfen.&lt;/p&gt;
&lt;h3 id="in-terminal--powershell"&gt;In Terminal / PowerShell&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Client:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Version: 29.1.2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; API version: 1.52
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Go version: go1.25.5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Git commit: 890dcca
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Built: Tue Dec &lt;span class="m"&gt;2&lt;/span&gt; 21:54:24 &lt;span class="m"&gt;2025&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; OS/Arch: darwin/arm64
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Context: desktop-linux
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Server: Docker Desktop 4.54.0 &lt;span class="o"&gt;(&lt;/span&gt;212467&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Engine:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Version: 29.1.2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; API version: 1.52 &lt;span class="o"&gt;(&lt;/span&gt;minimum version 1.44&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Go version: go1.25.5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Git commit: de45c2a
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Built: Tue Dec &lt;span class="m"&gt;2&lt;/span&gt; 21:55:52 &lt;span class="m"&gt;2025&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; OS/Arch: linux/arm64
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Experimental: &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; containerd:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Version: v2.2.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; GitCommit: 1c4457e00facac03ce1d75f7b6777a7a851e5c41
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; runc:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Version: 1.3.4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; GitCommit: v1.3.4-0-gd6d73eb8
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; docker-init:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Version: 0.19.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; GitCommit: de40ad0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="docker-desktop-ui-starten"&gt;Docker Desktop UI starten&lt;/h2&gt;
&lt;p&gt;Nachdem das Docker-Desktop-Symbol in der Statusleiste angezeigt wurde, können Sie das Docker Desktop Dashboard starten. Dies ist entweder über das Startmenü oder durch Klicken auf das Symbol
&lt;span class="inline-block pr-1"&gt;
&lt;svg style="height: 1em; transform: translateY(0.1em);" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"&gt;&lt;path fill="#3a4d54" fill-rule="evenodd" d="M73.8 50.8h11.3v11.5h5.7c2.6 0 5.3-.5 7.8-1.3c1.2-.4 2.6-1 3.8-1.7c-1.6-2.1-2.4-4.7-2.6-7.3c-.3-3.5.4-8.1 2.8-10.8l1.2-1.4l1.4 1.1c3.6 2.9 6.5 6.8 7.1 11.4c4.3-1.3 9.3-1 13.1 1.2l1.5.9l-.8 1.6c-3.2 6.2-9.9 8.2-16.4 7.8c-9.8 24.3-31 35.8-56.8 35.8c-13.3 0-25.5-5-32.5-16.8l-.1-.2l-1-2.1c-2.4-5.2-3.1-10.9-2.6-16.6l.2-1.7h9.6V50.8h11.3V39.6h22.5V28.3h13.5z" clip-rule="evenodd"/&gt;&lt;path fill="#00aada" d="M110.4 55.1c.8-5.9-3.6-10.5-6.4-12.7c-3.1 3.6-3.6 13.2 1.3 17.2c-2.8 2.4-8.5 4.7-14.5 4.7H18.6c-.6 6.2.5 11.9 3 16.8l.8 1.5c.5.9 1.1 1.7 1.7 2.6c3 .2 5.7.3 8.2.2c4.9-.1 8.9-.7 12-1.7c.5-.2.9.1 1.1.5c.2.5-.1.9-.5 1.1c-.4.1-.8.3-1.3.4c-2.4.7-5 1.1-8.3 1.3h-.6c-1.3.1-2.7.1-4.2.1c-1.6 0-3.1 0-4.9-.1c6 6.8 15.4 10.8 27.2 10.8c25 0 46.2-11.1 55.5-35.9c6.7.7 13.1-1 16-6.7c-4.5-2.7-10.5-1.8-13.9-.1"/&gt;&lt;path fill="#28b8eb" d="M110.4 55.1c.8-5.9-3.6-10.5-6.4-12.7c-3.1 3.6-3.6 13.2 1.3 17.2c-2.8 2.4-8.5 4.7-14.5 4.7h-68c-.3 9.5 3.2 16.7 9.5 21c4.9-.1 8.9-.7 12-1.7c.5-.2.9.1 1.1.5c.2.5-.1.9-.5 1.1c-.4.1-.8.3-1.3.4c-2.4.7-5.2 1.2-8.5 1.4l-.1-.1c8.5 4.4 20.8 4.3 35-1.1c15.8-6.1 30.6-17.7 40.9-30.9c-.2.1-.4.1-.5.2"/&gt;&lt;path fill="#028bb8" d="M18.7 71.8c.4 3.3 1.4 6.4 2.9 9.3l.8 1.5c.5.9 1.1 1.7 1.7 2.6c3 .2 5.7.3 8.2.2c4.9-.1 8.9-.7 12-1.7c.5-.2.9.1 1.1.5c.2.5-.1.9-.5 1.1c-.4.1-.8.3-1.3.4c-2.4.7-5.2 1.2-8.5 1.4h-.4c-1.3.1-2.7.1-4.1.1c-1.6 0-3.2 0-4.9-.1c6 6.8 15.5 10.8 27.3 10.8c21.4 0 40-8.1 50.8-26H18.7z"/&gt;&lt;path fill="#019bc6" d="M23.5 71.8c1.3 5.8 4.3 10.4 8.8 13.5c4.9-.1 8.9-.7 12-1.7c.5-.2.9.1 1.1.5c.2.5-.1.9-.5 1.1c-.4.1-.8.3-1.3.4c-2.4.7-5.2 1.2-8.6 1.4c8.5 4.4 20.8 4.3 34.9-1.1c8.5-3.3 16.8-8.2 24.2-14.1z"/&gt;&lt;path fill="#00acd3" fill-rule="evenodd" d="M28.4 52.7h9.8v9.8h-9.8zm.8.8h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm3-12h9.8v9.8h-9.8zm.9.8h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#23c2ee" fill-rule="evenodd" d="M39.6 52.7h9.8v9.8h-9.8zm.9.8h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#00acd3" fill-rule="evenodd" d="M50.9 52.7h9.8v9.8h-9.8zm.8.8h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#23c2ee" fill-rule="evenodd" d="M50.9 41.5h9.8v9.8h-9.8zm.8.8h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm3.1 10.4H72v9.8h-9.8zm.8.8h.8v8.1H63zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#00acd3" fill-rule="evenodd" d="M62.2 41.5H72v9.8h-9.8zm.8.8h.8v8.1H63zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#23c2ee" fill-rule="evenodd" d="M62.2 30.2H72V40h-9.8zm.8.8h.8v8.1H63zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#00acd3" fill-rule="evenodd" d="M73.5 52.7h9.8v9.8h-9.8zm.8.8h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#d4eef1" fill-rule="evenodd" d="M48.8 78.3c1.5 0 2.7 1.2 2.7 2.7s-1.2 2.7-2.7 2.7s-2.7-1.2-2.7-2.7s1.2-2.7 2.7-2.7" clip-rule="evenodd"/&gt;&lt;path fill="#3a4d54" fill-rule="evenodd" d="M48.8 79.1c.2 0 .5 0 .7.1c-.2.1-.4.4-.4.7c0 .4.4.8.8.8c.3 0 .6-.2.7-.4c.1.2.1.5.1.7c0 1.1-.9 1.9-1.9 1.9c-1.1 0-1.9-.9-1.9-1.9s.8-1.9 1.9-1.9M1.1 72.8h125.4c-2.7-.7-8.6-1.6-7.7-5.2c-5 5.7-16.9 4-20 1.2c-3.4 4.9-23 3-24.3-.8c-4.2 5-17.3 5-21.5 0c-1.4 3.8-21 5.7-24.3.8c-3 2.8-15 4.5-20-1.2c1.1 3.5-4.9 4.5-7.6 5.2" clip-rule="evenodd"/&gt;&lt;path fill="#bfdbe0" d="M56 97.8c-6.7-3.2-10.3-7.5-12.4-12.2c-2.5.7-5.5 1.2-8.9 1.4c-1.3.1-2.7.1-4.1.1c-1.7 0-3.4 0-5.2-.1c6 6 13.6 10.7 27.5 10.8z"/&gt;&lt;path fill="#d4eef1" d="M46.1 89.9c-.9-1.3-1.8-2.8-2.5-4.3c-2.5.7-5.5 1.2-8.9 1.4c2.3 1.2 5.7 2.4 11.4 2.9"/&gt;&lt;/svg&gt;
&lt;/span&gt; in der Statusleiste möglich.&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://kurse.richter.consulting/courses/container/install/docker_desktop_dashboard.png"
alt="Docker Desktop Dashboard"&gt;&lt;figcaption&gt;
&lt;h4&gt;Docker Desktop Dashboard&lt;/h4&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;</description></item><item><title>Ersten Container ausführen</title><link>https://kurse.richter.consulting/courses/container/first_container/</link><pubDate>Sat, 07 Dec 2024 00:00:00 +0000</pubDate><guid>https://kurse.richter.consulting/courses/container/first_container/</guid><description>&lt;p&gt;Nachdem Docker Desktop auf unserem System läuft, können wir nun ein erstes Container auf unserem Rechner ausführen. Dazu werden wir die das mitinstallierte Docker CLI nutzen.&lt;/p&gt;
&lt;h2 id="nginx-webserver-ausführen"&gt;nginx Webserver ausführen&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run --name mein-server &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p 1080:80 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -d nginx:alpine
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run --name mein-server -p 1080:80 -d nginx:alpine
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Unable to find image &lt;span class="s1"&gt;&amp;#39;nginx:alpine&amp;#39;&lt;/span&gt; locally
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;alpine: Pulling from library/nginx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;e1779b8a5a13: Download &lt;span class="nb"&gt;complete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;81eecc9295df: Download &lt;span class="nb"&gt;complete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;9afea992cb63: Pull &lt;span class="nb"&gt;complete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;e6b7df06dc76: Pull &lt;span class="nb"&gt;complete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;223f9efb3159: Pull &lt;span class="nb"&gt;complete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0bd713040ebb: Pull &lt;span class="nb"&gt;complete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;d85e26d0c84d: Pull &lt;span class="nb"&gt;complete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2422bf732277: Pull &lt;span class="nb"&gt;complete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;e350a0f963e3: Pull &lt;span class="nb"&gt;complete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;29b7c987abf6: Pull &lt;span class="nb"&gt;complete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Digest: sha256:289decab414250121a93c3f1b8316b9c69906de3a4993757c424cb964169ad42
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Status: Downloaded newer image &lt;span class="k"&gt;for&lt;/span&gt; nginx:alpine
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;76c073965f57bc7351a7259b6e71b70a990cb42bcc4cda7ee41c6f38bb11963d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker run&lt;/code&gt; startet ein neues Container&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--name &amp;lt;eingener_container_name&amp;gt;&lt;/code&gt; gibt dem Container den Namen &lt;code&gt;mein-server&lt;/code&gt;. Dies ist optional. Wird kein Name angegeben, &amp;ldquo;würfelt&amp;rdquo; Decker einen aus.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-p 1080:80&lt;/code&gt; Durchreichen eines Ports aus dem Container (hier Port &lt;code&gt;80&lt;/code&gt; des nginx Servers) zu dem Host-Port (hier &lt;code&gt;1080&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-d&lt;/code&gt; Starten Container als &amp;ldquo;Detached&amp;rdquo; (Hintergrundprozess), so dass die Kommandozeile weiter genutzt werden kann.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nginx:alpine&lt;/code&gt; ist der Image, das wir verwenden. &lt;code&gt;nginx&lt;/code&gt; ist dabei der Name des Images (Repository). &lt;code&gt;alpine&lt;/code&gt; ist ein Tag (Version).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In der Ausgabe sehen wir, dass Docker am Anfang das Image nicht hat (&lt;code&gt;Unable to find image 'nginx:alpine' locally&lt;/code&gt;). Aus diesem Grund stößt dieser an, das Image aus dem Docker Hub herunterzuladen. Dies kann einige Zeit dauern, abhängig von der Internetverbindung und der Größe des Images. In unserem Fall ist das Image sehr klein (ca. 20MB).&lt;/p&gt;
&lt;p&gt;Nun können wir über &lt;code&gt;http://localhost:1080&lt;/code&gt; auf unseren neuen Webserver zugreifen.&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://kurse.richter.consulting/courses/container/first_container/nginx_base_container.png"&gt;&lt;figcaption&gt;
&lt;h4&gt;Container liefert Web-Inhalt&lt;/h4&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="container-stoppen-und-löschen"&gt;Container stoppen und löschen&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker stop mein-server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker rm mein-server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="nginx-mit-eigenen-inhalt-ausführen"&gt;nginx mit eigenen Inhalt ausführen&lt;/h2&gt;
&lt;p&gt;Statt der langweiligen Standardseite von nginx können wir auch diesen dazu bewegen, unsere eigen statische Seite auszuliefern. Dazu erstellen wir zuerst einen Ordner und legen da eine einfache HTML Seite ab.&lt;/p&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;Hinweis&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Beispiel Seite finden Sie in dem verlinkten
&lt;span class="inline-block pr-1"&gt;
&lt;svg style="height: 1em; transform: translateY(0.1em);" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"&gt;&lt;g fill="#181616"&gt;&lt;path fill-rule="evenodd" d="M64 5.103c-33.347 0-60.388 27.035-60.388 60.388c0 26.682 17.303 49.317 41.297 57.303c3.017.56 4.125-1.31 4.125-2.905c0-1.44-.056-6.197-.082-11.243c-16.8 3.653-20.345-7.125-20.345-7.125c-2.747-6.98-6.705-8.836-6.705-8.836c-5.48-3.748.413-3.67.413-3.67c6.063.425 9.257 6.223 9.257 6.223c5.386 9.23 14.127 6.562 17.573 5.02c.542-3.903 2.107-6.568 3.834-8.076c-13.413-1.525-27.514-6.704-27.514-29.843c0-6.593 2.36-11.98 6.223-16.21c-.628-1.52-2.695-7.662.584-15.98c0 0 5.07-1.623 16.61 6.19C53.7 35 58.867 34.327 64 34.304c5.13.023 10.3.694 15.127 2.033c11.526-7.813 16.59-6.19 16.59-6.19c3.287 8.317 1.22 14.46.593 15.98c3.872 4.23 6.215 9.617 6.215 16.21c0 23.194-14.127 28.3-27.574 29.796c2.167 1.874 4.097 5.55 4.097 11.183c0 8.08-.07 14.583-.07 16.572c0 1.607 1.088 3.49 4.148 2.897c23.98-7.994 41.263-30.622 41.263-57.294C124.388 32.14 97.35 5.104 64 5.104z" clip-rule="evenodd"/&gt;&lt;path d="M26.484 91.806c-.133.3-.605.39-1.035.185c-.44-.196-.685-.605-.543-.906c.13-.31.603-.395 1.04-.188c.44.197.69.61.537.91zm2.446 2.729c-.287.267-.85.143-1.232-.28c-.396-.42-.47-.983-.177-1.254c.298-.266.844-.14 1.24.28c.394.426.472.984.17 1.255zm2.382 3.477c-.37.258-.976.017-1.35-.52c-.37-.538-.37-1.183.01-1.44c.373-.258.97-.025 1.35.507c.368.545.368 1.19-.01 1.452zm3.261 3.361c-.33.365-1.036.267-1.552-.23c-.527-.487-.674-1.18-.343-1.544c.336-.366 1.045-.264 1.564.23c.527.486.686 1.18.333 1.543zm4.5 1.951c-.147.473-.825.688-1.51.486c-.683-.207-1.13-.76-.99-1.238c.14-.477.823-.7 1.512-.485c.683.206 1.13.756.988 1.237m4.943.361c.017.498-.563.91-1.28.92c-.723.017-1.308-.387-1.315-.877c0-.503.568-.91 1.29-.924c.717-.013 1.306.387 1.306.88zm4.598-.782c.086.485-.413.984-1.126 1.117c-.7.13-1.35-.172-1.44-.653c-.086-.498.422-.997 1.122-1.126c.714-.123 1.354.17 1.444.663zm0 0"/&gt;&lt;/g&gt;&lt;/svg&gt;
&lt;/span&gt;
im Ordner &lt;code&gt;nginx-site&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run --name mein-server &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p 1080:80 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v ./nginx-site:/usr/share/nginx/html:ro &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -d nginx:alpine
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-v &amp;lt;ordner/pfad/auf/dem/host&amp;gt;:/usr/share/nginx/html:ro&lt;/code&gt; Mapping für Speicher (Volume)
&lt;ul&gt;
&lt;li&gt;der 2. Teil nach dem &lt;code&gt;:&lt;/code&gt; ist der Ordner innerhalb vom Container, das auf unseren lokalen Ordner gemappt werden soll. nginx erwartet Web-Inhalt in dem Ordner &lt;code&gt;/usr/share/nginx/html&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ro&lt;/code&gt; am Ende steht für &lt;code&gt;read only&lt;/code&gt;. D.h. der Container kann nur lesend auf unseren lokalen Ordner zugreifen.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;img src="https://kurse.richter.consulting/courses/container/first_container/nginx_own_page.png"&gt;&lt;figcaption&gt;
&lt;h4&gt;Eigene Web-Site mit nginx&lt;/h4&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;</description></item><item><title>Erster Container für Entwicklung</title><link>https://kurse.richter.consulting/courses/container/db_container/</link><pubDate>Sat, 07 Dec 2024 00:00:00 +0000</pubDate><guid>https://kurse.richter.consulting/courses/container/db_container/</guid><description>&lt;p&gt;Für die erste Nutzung als Entwickler, werden wir ein vorhandenes Beispielprojekt aus dem
&lt;span class="inline-block pr-1"&gt;
&lt;svg style="height: 1em; transform: translateY(0.1em);" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"&gt;&lt;g fill="#181616"&gt;&lt;path fill-rule="evenodd" d="M64 5.103c-33.347 0-60.388 27.035-60.388 60.388c0 26.682 17.303 49.317 41.297 57.303c3.017.56 4.125-1.31 4.125-2.905c0-1.44-.056-6.197-.082-11.243c-16.8 3.653-20.345-7.125-20.345-7.125c-2.747-6.98-6.705-8.836-6.705-8.836c-5.48-3.748.413-3.67.413-3.67c6.063.425 9.257 6.223 9.257 6.223c5.386 9.23 14.127 6.562 17.573 5.02c.542-3.903 2.107-6.568 3.834-8.076c-13.413-1.525-27.514-6.704-27.514-29.843c0-6.593 2.36-11.98 6.223-16.21c-.628-1.52-2.695-7.662.584-15.98c0 0 5.07-1.623 16.61 6.19C53.7 35 58.867 34.327 64 34.304c5.13.023 10.3.694 15.127 2.033c11.526-7.813 16.59-6.19 16.59-6.19c3.287 8.317 1.22 14.46.593 15.98c3.872 4.23 6.215 9.617 6.215 16.21c0 23.194-14.127 28.3-27.574 29.796c2.167 1.874 4.097 5.55 4.097 11.183c0 8.08-.07 14.583-.07 16.572c0 1.607 1.088 3.49 4.148 2.897c23.98-7.994 41.263-30.622 41.263-57.294C124.388 32.14 97.35 5.104 64 5.104z" clip-rule="evenodd"/&gt;&lt;path d="M26.484 91.806c-.133.3-.605.39-1.035.185c-.44-.196-.685-.605-.543-.906c.13-.31.603-.395 1.04-.188c.44.197.69.61.537.91zm2.446 2.729c-.287.267-.85.143-1.232-.28c-.396-.42-.47-.983-.177-1.254c.298-.266.844-.14 1.24.28c.394.426.472.984.17 1.255zm2.382 3.477c-.37.258-.976.017-1.35-.52c-.37-.538-.37-1.183.01-1.44c.373-.258.97-.025 1.35.507c.368.545.368 1.19-.01 1.452zm3.261 3.361c-.33.365-1.036.267-1.552-.23c-.527-.487-.674-1.18-.343-1.544c.336-.366 1.045-.264 1.564.23c.527.486.686 1.18.333 1.543zm4.5 1.951c-.147.473-.825.688-1.51.486c-.683-.207-1.13-.76-.99-1.238c.14-.477.823-.7 1.512-.485c.683.206 1.13.756.988 1.237m4.943.361c.017.498-.563.91-1.28.92c-.723.017-1.308-.387-1.315-.877c0-.503.568-.91 1.29-.924c.717-.013 1.306.387 1.306.88zm4.598-.782c.086.485-.413.984-1.126 1.117c-.7.13-1.35-.172-1.44-.653c-.086-.498.422-.997 1.122-1.126c.714-.123 1.354.17 1.444.663zm0 0"/&gt;&lt;/g&gt;&lt;/svg&gt;
&lt;/span&gt;
nehmen. Es liegt im Unterordner &lt;code&gt;blazor-postgres&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Wie der Name schon andeutet, handelt es sich um eine Web-Anwendung mit Blazor. Die Anwendung nutzt zur Datenspeicherung die Datenbank Postgres. Die Datenbank wollen wir als Container ausführen. Das bietet folgende Vorteile:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Keine großen Administrator Vorkenntnisse zu Postgres Datenbank notwendig&lt;/li&gt;
&lt;li&gt;Wir können jederzeit entscheiden, welche Version der Datenbank wir nutzen wollen (z.B. kann eine ältere Version der Applikation eine ältere DB Version erfordern - für Fehlerkorrekturen)&lt;/li&gt;
&lt;li&gt;Wir können sehr schnell einen &amp;ldquo;sauberen&amp;rdquo; Zustand der Datenbank erzeugen.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="starten-der-applikation"&gt;Starten der Applikation&lt;/h2&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;Hinweis&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Falls noch nicht geschehen, müssen Sie die
für Ihr Betriebssystem installieren.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Öffnen Sie den Projektordner in dem Editor Ihrer Wahl. Ich nutze dafür VS Code mit der installierten Erweiterung &amp;ldquo;C# DevKit&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Versuchen Sie die App nur zu starten, ohne dass wir aktuell eine passende Datenbank dazu haben.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet run
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Da die Anwendung bereits beim Start eine Verbindung zur Datenbank erfordert, scheitert der Start mit einer Fehlermeldung.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet run
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Die Starteinstellungen von /Users/eugen/src/container-kurs/blazor-postgres/Properties/launchSettings.json werden verwendet…
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Buildvorgang wird ausgeführt...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fail: Microsoft.EntityFrameworkCore.Database.Connection&lt;span class="o"&gt;[&lt;/span&gt;20004&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; An error occurred using the connection to database &lt;span class="s1"&gt;&amp;#39;devdb&amp;#39;&lt;/span&gt; on server &lt;span class="s1"&gt;&amp;#39;tcp://localhost:5432&amp;#39;&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Unhandled exception. Npgsql.NpgsqlException &lt;span class="o"&gt;(&lt;/span&gt;0x80004005&lt;span class="o"&gt;)&lt;/span&gt;: Failed to connect to 127.0.0.1:5432
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ---&amp;gt; System.Net.Sockets.SocketException &lt;span class="o"&gt;(&lt;/span&gt;61&lt;span class="o"&gt;)&lt;/span&gt;: Connection refused
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Npgsql.Internal.NpgsqlConnector.Connect&lt;span class="o"&gt;(&lt;/span&gt;NpgsqlTimeout timeout&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Npgsql.Internal.NpgsqlConnector.Connect&lt;span class="o"&gt;(&lt;/span&gt;NpgsqlTimeout timeout&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Npgsql.Internal.NpgsqlConnector.RawOpen&lt;span class="o"&gt;(&lt;/span&gt;NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Npgsql.Internal.NpgsqlConnector.&amp;lt;Open&amp;gt;g__OpenCore&lt;span class="p"&gt;|&lt;/span&gt;209_0&lt;span class="o"&gt;(&lt;/span&gt;NpgsqlConnector conn, String username, SslMode sslMode, GssEncryptionMode gssEncMode, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Npgsql.Internal.NpgsqlConnector.Open&lt;span class="o"&gt;(&lt;/span&gt;NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Npgsql.PoolingDataSource.OpenNewConnector&lt;span class="o"&gt;(&lt;/span&gt;NpgsqlConnection conn, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Npgsql.PoolingDataSource.&amp;lt;Get&amp;gt;g__RentAsync&lt;span class="p"&gt;|&lt;/span&gt;33_0&lt;span class="o"&gt;(&lt;/span&gt;NpgsqlConnection conn, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Npgsql.NpgsqlConnection.&amp;lt;Open&amp;gt;g__OpenAsync&lt;span class="p"&gt;|&lt;/span&gt;42_0&lt;span class="o"&gt;(&lt;/span&gt;Boolean async, CancellationToken cancellationToken&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Npgsql.NpgsqlConnection.Open&lt;span class="o"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnection&lt;span class="o"&gt;(&lt;/span&gt;Boolean errorsExpected&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenInternal&lt;span class="o"&gt;(&lt;/span&gt;Boolean errorsExpected&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open&lt;span class="o"&gt;(&lt;/span&gt;Boolean errorsExpected&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReader&lt;span class="o"&gt;(&lt;/span&gt;RelationalCommandParameterObject parameterObject&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Microsoft.EntityFrameworkCore.Migrations.HistoryRepository.GetAppliedMigrations&lt;span class="o"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Npgsql.EntityFrameworkCore.PostgreSQL.Migrations.Internal.NpgsqlHistoryRepository.GetAppliedMigrations&lt;span class="o"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.GetAppliedMigrations&lt;span class="o"&gt;(&lt;/span&gt;DatabaseFacade databaseFacade&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.GetPendingMigrations&lt;span class="o"&gt;(&lt;/span&gt;DatabaseFacade databaseFacade&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at BlazorWebAppMovies.Data.SeedData.Initialize&lt;span class="o"&gt;(&lt;/span&gt;IServiceProvider serviceProvider&lt;span class="o"&gt;)&lt;/span&gt; in /Users/eugen/src/container-kurs/blazor-postgres/Data/SeedData.cs:line &lt;span class="m"&gt;20&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Program.&amp;lt;Main&amp;gt;&lt;span class="k"&gt;$(&lt;/span&gt;String&lt;span class="o"&gt;[]&lt;/span&gt; args&lt;span class="k"&gt;)&lt;/span&gt; in /Users/eugen/src/container-kurs/blazor-postgres/Program.cs:line &lt;span class="m"&gt;23&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="start-der-postgres-datenbank"&gt;Start der Postgres Datenbank&lt;/h2&gt;
&lt;p&gt;Damit die Anwendung starten können, müssen wir die Postgres Datenbank starten. Dazu suchen wir auf dem größten Repository für Container Images, dem
von Docker Inc., nach Postgres.&lt;/p&gt;
&lt;h3 id="kategorisierung-in-docker-hub"&gt;Kategorisierung in Docker Hub&lt;/h3&gt;
&lt;p&gt;Die Suche gibt uns sehr viele Ergebnisse zu Postgres, da jeder auf diesem Hub Images veröffentlichen kann. Docker Hub hilft uns ein wenig dabei, das richtige Image herauszufinden, in dem es die Image-Repositories kategorisiert.&lt;/p&gt;
&lt;p&gt;Es gibt sogenannte &amp;ldquo;offizielle&amp;rdquo; Image, die direkt von den Entwicklern der jeweiligen Software zur Verfügung gestellt werden. Nach der Verifizierung, bekommen diese ein Siegel &amp;ldquo;Docker Official Image&amp;rdquo;. Damit sind solche Images am vertrauenswürdigsten. Man erkenn solche Images relativ einfach, an den Namen.&lt;/p&gt;
&lt;p&gt;Die Namen von den offiziellen Images, haben keinen Präfix. Das haben wir bereits bei &lt;code&gt;nginx&lt;/code&gt; gesehen. Auch da bestand der Image-Name nur aus dem Namen der Software. Bei Postgres heißt das Image auch einfach &lt;code&gt;postgres&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Eine weitere Kategorie sind die &amp;ldquo;Verified Publisher&amp;rdquo;. Dabei handelt es sich zwar nicht um die &amp;ldquo;Ersteller&amp;rdquo; der jeweiligen Software, aber um Firmen, die von Docker Inc. validiert und für vertrauenswürdig befunden worden. Es sind of Firmen, die selbst Ihr Geld mit Containern verdienen und optimierte Images für bestimmte Bereiche liefern. Zu den &amp;ldquo;Verified Publisher&amp;rdquo; gehören zum Beispiel&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CircleCI: Ein CI/CD as a Service Anbieter&lt;/li&gt;
&lt;li&gt;Microsoft&lt;/li&gt;
&lt;li&gt;Ubuntu&lt;/li&gt;
&lt;li&gt;Bitnami: Anbieter von VM Images / Container Images&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="aussuchen-der-notwendigen-parameter"&gt;Aussuchen der notwendigen Parameter&lt;/h3&gt;
&lt;p&gt;Wir nutzen für unseren Zweck das offizielle Image von Postgres. Wenn wir in der Suche diesen auswählen, erscheint die Detail-Seite des
. Hier finden wir die Beschreibung, wie das vorhandene Container-Image beim Starten mit Parametern angepasst werden kann. Oft stehen auch Informationen, welche Version, Basis-Images und Architekturen unterstützt werden.&lt;/p&gt;
&lt;p&gt;Das Postgres Repository hat zum Beispiel Images für:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Postgres-Versions: 18, 17, 16, 15, 14, 13, 12&lt;/li&gt;
&lt;li&gt;Architekturen: amd64, arm32v5, arm32v6, arm32v7, arm64v8, i386, mips64le, ppc64le, riscv64, s390x&lt;/li&gt;
&lt;li&gt;Basis-Images
&lt;ul&gt;
&lt;li&gt;alpine: Basiert auf Alpine-Linux&lt;/li&gt;
&lt;li&gt;bullseye: Basiert auf Debian Trixie (13)&lt;/li&gt;
&lt;li&gt;bookworm: Basiert auf Debian Bookworm (12)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Um auf die Datenbank in unserer Anwendung zugreifen zu können, müssen wir folgende Einstellungen für die Datenbank wissen / setzen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Benutzername
&lt;ul&gt;
&lt;li&gt;Kann im offiziellen Image über Umgebungsvariable &lt;code&gt;POSTGRES_USER&lt;/code&gt; gesetzt werden (Standardwert ist &lt;code&gt;postgres&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Passwort
&lt;ul&gt;
&lt;li&gt;Muss im offiziellen Image über Umgebungsvariable &lt;code&gt;POSTGRES_PASSWORD&lt;/code&gt; gesetzt werden&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Datenbankname
&lt;ul&gt;
&lt;li&gt;Kann im offiziellen Image über Umgebungsvariable &lt;code&gt;POSTGRES_DB&lt;/code&gt; gesetzt werden (Standardwert entspricht dem Benutzernamen)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Die Umgebungsvariablen werden an Docker Runtime mit dem Parameter &lt;code&gt;-e&lt;/code&gt; übergeben (kann auch mehrmals verwendet werden).&lt;/p&gt;
&lt;p&gt;Aus den gesammelten Informationen, können wir nun den geforderten (kürzesten) Aufruf ableiten:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -e &lt;span class="nv"&gt;POSTGRES_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;devuser &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;devpassword &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;POSTGRES_DB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;devdb &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p 5432:5432 -d postgres:18-alpine
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-e POSTGRES_USER=devuser&lt;/code&gt;: setzt den Benutzernamen auf &lt;code&gt;devuser&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-e POSTGRES_PASSWORD=devpassword&lt;/code&gt;: setzt das Passwort auf &lt;code&gt;devpassword&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-e POSTGRES_DB=devdb&lt;/code&gt;: setzt die Datenbankname auf &lt;code&gt;devdb&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-p 5432:5432&lt;/code&gt;: ordnet den Standard Port von Postgres zu demselben Port auf unserem Host zu&lt;/li&gt;
&lt;li&gt;&lt;code&gt;postgres:18-alpine&lt;/code&gt;: startet den Postgres Container mit der Version 18 und dem Alpine-Basis-Image&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;img src="https://kurse.richter.consulting/courses/container/db_container/postgres_container.png"&gt;&lt;figcaption&gt;
&lt;h4&gt;Postgres Container in Docker Desktop&lt;/h4&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="starten-der-applikation-mit-laufender-datenbank"&gt;Starten der Applikation mit laufender Datenbank&lt;/h3&gt;
&lt;p&gt;Nun läuft die Postgres Datenbank im Hintergrund (in der Version 18), so dass die App auf diese Zugreifen kann. Da wir einige Einstellungen nicht angegeben haben, werden dabei Standardwerte genutzt.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--name&lt;/code&gt;: Wir haben dem Container keinen expliziten Namen gegeben. Aus diesem Fall wird dieser durch die Runtime &amp;ldquo;gewürfelt&amp;rdquo;. Bei meinem ersten Start war der Name &lt;code&gt;funny_austin&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wenn wir jetzt die Applikation starten. In der Ausgabe wird auch die URL Angezeigt, unter der die Applikation erreichbar ist.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet run
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Using launch settings from /Users/eugen/src/container-kurs/blazor-postgres/Properties/launchSettings.json...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Building...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fail: Microsoft.EntityFrameworkCore.Database.Command&lt;span class="o"&gt;[&lt;/span&gt;20102&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Failed executing DbCommand &lt;span class="o"&gt;(&lt;/span&gt;10ms&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Parameters&lt;/span&gt;&lt;span class="o"&gt;=[]&lt;/span&gt;, &lt;span class="nv"&gt;CommandType&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Text&amp;#39;&lt;/span&gt;, &lt;span class="nv"&gt;CommandTimeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;30&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; SELECT &lt;span class="s2"&gt;&amp;#34;MigrationId&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;ProductVersion&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; FROM &lt;span class="s2"&gt;&amp;#34;__EFMigrationsHistory&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ORDER BY &lt;span class="s2"&gt;&amp;#34;MigrationId&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fail: Microsoft.EntityFrameworkCore.Database.Command&lt;span class="o"&gt;[&lt;/span&gt;20102&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Failed executing DbCommand &lt;span class="o"&gt;(&lt;/span&gt;1ms&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Parameters&lt;/span&gt;&lt;span class="o"&gt;=[]&lt;/span&gt;, &lt;span class="nv"&gt;CommandType&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Text&amp;#39;&lt;/span&gt;, &lt;span class="nv"&gt;CommandTimeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;30&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; SELECT &lt;span class="s2"&gt;&amp;#34;MigrationId&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;ProductVersion&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; FROM &lt;span class="s2"&gt;&amp;#34;__EFMigrationsHistory&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ORDER BY &lt;span class="s2"&gt;&amp;#34;MigrationId&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;info: Microsoft.EntityFrameworkCore.Migrations&lt;span class="o"&gt;[&lt;/span&gt;20411&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Acquiring an exclusive lock &lt;span class="k"&gt;for&lt;/span&gt; migration application. See https://aka.ms/efcore-docs-migrations-lock &lt;span class="k"&gt;for&lt;/span&gt; more information &lt;span class="k"&gt;if&lt;/span&gt; this takes too long.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;info: Microsoft.EntityFrameworkCore.Migrations&lt;span class="o"&gt;[&lt;/span&gt;20402&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Applying migration &lt;span class="s1"&gt;&amp;#39;20241206073458_Init&amp;#39;&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;info: Microsoft.Hosting.Lifetime&lt;span class="o"&gt;[&lt;/span&gt;14&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Now listening on: http://localhost:5216
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;info: Microsoft.Hosting.Lifetime&lt;span class="o"&gt;[&lt;/span&gt;0&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Application started. Press Ctrl+C to shut down.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Öffnen Sie die Applikation nun unter der ausgegebenen Adresse &lt;code&gt;http://localhost:5216&lt;/code&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://kurse.richter.consulting/courses/container/db_container/blazor_app.png"&gt;&lt;figcaption&gt;
&lt;h4&gt;Blazor App mit DB Verbindung&lt;/h4&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;</description></item><item><title>Orchestrierung mit Docker Compose</title><link>https://kurse.richter.consulting/courses/container/compose/</link><pubDate>Sat, 07 Dec 2024 00:00:00 +0000</pubDate><guid>https://kurse.richter.consulting/courses/container/compose/</guid><description>&lt;p&gt;Bereits in unserem kleinen Beispiel bräuchten wir normalerweise mehr als einen Container. Es wäre schön, wenn wir neben der Datenbank, auch eine Web-basierte UI für die Verwaltung der Datenbank zur Hand hätten (gibt es ja fast für alle Datenbanken). Damit müssten wir nicht für jede Datenbank auch noch ein Tool installieren, mit dem man die Daten anschauen kann.&lt;/p&gt;
&lt;p&gt;Aber bereits 2 Container bringen eine gewisse Komplexität. Zum Beispiel müssen wir die UI für die Datenbank erst starten, wenn die Datenbank bereits hochgefahren und verfügbar ist. Mit mehr Containern (z.B. Redis für Caching, Prometheus für Monitoring, Logging und Tracing, Grafana für Visualisierung dieser Daten, usw.). Alle haben eigene Voraussetzungen, Abhängigkeiten usw.&lt;/p&gt;
&lt;p&gt;Wäre es nicht schön, so eine &amp;ldquo;Laufzeitumgebung&amp;rdquo; ein Mal zu definieren und immer wieder (sauber) ausführen zu können? Eventuell diese Konfiguration direkt mit dem Projekt auch mit den Kollegen teilen?&lt;/p&gt;
&lt;p&gt;So eine Orchestrierung von unterschiedlichen Containern können wir mit &amp;ldquo;Docker Compose&amp;rdquo; umsetzten. Das ist praktisch ein kleiner Bruder von Kubernetes, das für die professionelle, hoch skalierbare, Orchestrierungen gedacht ist.&lt;/p&gt;
&lt;h2 id="orchestrierung-mit-docker-compose"&gt;Orchestrierung mit Docker Compose&lt;/h2&gt;
&lt;p&gt;Die Container, die mit &amp;ldquo;Docker Compose&amp;rdquo; orchestriert werden sollen, werden in einer &lt;abbr title="YAML Ain’t Markup Language"&gt;&lt;code&gt;YAML&lt;/code&gt;&lt;/abbr&gt; Datei definiert und konfiguriert. Die CLI dafür wird mit &amp;ldquo;Docker Desktop&amp;rdquo; mitgeliefert. Ist diese auf Ihrem System nicht installiert, können Sie den Installationsanweisungen von der offiziellen
folgen.&lt;/p&gt;
&lt;p&gt;Die Datei wird standardmäßig &lt;code&gt;docker-compose.yml&lt;/code&gt; genannt und befindet sich in dem gleichen Verzeichnis wie das Projekt. Hier ist der Grundaufbau der Datei:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Liste der Services / Container&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Datenbank Container&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Container image&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;postgres:18-alpine&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Umgebungsvariablen&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;super-secret-password&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Port Mapping&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;5432:5432&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;dbAdmin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;14&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Container image&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;15&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;dpage/pgadmin4&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;16&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Umgebungsvariablen&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;17&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;18&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;PGADMIN_DEFAULT_EMAIL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;admin@example.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;19&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;PGADMIN_DEFAULT_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;super-secret-password&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;20&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Port Mapping&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;21&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;22&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;8080:80&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Die Konfiguration enthält min. ein Service (Container) das gestartet werden soll.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In der Zeile &lt;mark&gt;4&lt;/mark&gt; starten wir die Konfiguration von Postgres Datenbank. Der Service enthält den Namen &lt;code&gt;db&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Zeile &lt;mark&gt;6&lt;/mark&gt; definiert das Image, das verwendet wird (Postgres in diesem Fall).&lt;/li&gt;
&lt;li&gt;In der Zeile &lt;mark&gt;8&lt;/mark&gt; definieren wir die Umgebungsvariablen, die beim Starten des Containers gesetzt werden sollen. In diesem Fall &lt;code&gt;POSTGRES_PASSWORD&lt;/code&gt; wird auf &lt;code&gt;super-secret-password&lt;/code&gt; gesetzt.&lt;/li&gt;
&lt;li&gt;Zeile &lt;mark&gt;10&lt;/mark&gt; definiert das Port Mapping, mit dem Containerport 5432 mit dem Hostport 5432 verbunden wird.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Der zweite Service ist eine Admin-UI für Postgres. Sie wird mit dem Namen &lt;code&gt;dbAdmin&lt;/code&gt; gestartet und verwendet die Image &lt;code&gt;dpage/pgadmin4&lt;/code&gt;. Die Umgebungsvariablen werden ebenfalls gesetzt, um den Benutzername und das Passwort für die Admin-UI zu definieren.&lt;/p&gt;
&lt;p&gt;Da bei der Definition des Images for &lt;code&gt;dbAdmin&lt;/code&gt; keine Version angegeben wird (kein &lt;code&gt;:tagName&lt;/code&gt; am Ende), wird der Tag automatisch auf &lt;code&gt;latest&lt;/code&gt; gesetzt (Docker Konvention).&lt;/p&gt;
&lt;h2 id="starten-der-orchestrierten-container"&gt;Starten der Orchestrierten Container&lt;/h2&gt;
&lt;p&gt;Um nun alle konfigurierten Services zu starten, nutzen wir die &amp;ldquo;Docker Compose&amp;rdquo; CLI. Die Aufrufe müssen in dem Ordner erfolgen, in dem die &lt;code&gt;docker-compose.yml&lt;/code&gt; Datei liegt.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure&gt;&lt;img src="https://kurse.richter.consulting/courses/container/compose/compose_up.png"&gt;&lt;figcaption&gt;
&lt;h4&gt;Gestarteten Container über Compose&lt;/h4&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Unter &lt;code&gt;http://localhost:8080&lt;/code&gt; können Sie sich nun mit den Zugangsdaten (aus der Konfiguration) anmelden und eine Verbindung zur Datenbank herstellen (Hostname &lt;code&gt;db&lt;/code&gt;, wie der Service Name).&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://kurse.richter.consulting/courses/container/compose/pgadmin_ui.png"&gt;&lt;figcaption&gt;
&lt;h4&gt;Postgres Admin Web-UI&lt;/h4&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="anpassung-der-orchestrierung-an-die-applikation"&gt;Anpassung der Orchestrierung an die Applikation&lt;/h2&gt;
&lt;p&gt;Damit passt die aktuelle minimalistische Konfiguration aber noch nicht zu unseren Anforderungen der App.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wir haben vorgegebene Anmeldedaten für die Datenbank&lt;/li&gt;
&lt;li&gt;Wir haben einem, vom Standard abweichenden Datenbanknamen&lt;/li&gt;
&lt;li&gt;Es wäre gut, wenn pgAdmin bereits die Verbindung zu unseren Datenbank hätte, ohne dass wir es jedes Mal nach Neustart eingeben müssten&lt;/li&gt;
&lt;li&gt;pgAdmin sollte erst starten, wenn die Datenbank einsatzbereit ist (&amp;ldquo;health check&amp;rdquo;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Die Konfiguration der Datenbank können wir leicht anpassen. Die entsprechenden Umgebungsvariablen-Werte kennen wir bereits aus dem direkten Start mit Docker.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;POSTGRES_USER&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;devuser&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;devpassword&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;POSTGRES_DB&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;devdb&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Für die Prüfung, ob der Container wirklich einsatzbereit ist, müssen wir einen &amp;ldquo;health check&amp;rdquo; umsetzen. Dieser ist immer abhängig vom Service. Für unsere Postgres Datenbank könnte dieser wie folgt aussehen.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;healthcheck&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CMD-SHELL&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;pg_isready -U devuser -d devdb&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;2s&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;6&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;retries&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;7&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;start_period&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;5s&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;8&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;30s&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Zeile &lt;mark&gt;3&lt;/mark&gt; startet die Definition für &amp;ldquo;health check&amp;rdquo; (
)&lt;/li&gt;
&lt;li&gt;Zeile &lt;mark&gt;4&lt;/mark&gt; beschreibt den Befehl, mit dem die &amp;ldquo;Bereitschaft&amp;rdquo; geprüft werden kann. Bei Postgres können wir dazu &lt;code&gt;pg_isready&lt;/code&gt; Tool nutzen. (
)&lt;/li&gt;
&lt;li&gt;Zeile &lt;mark&gt;5&lt;/mark&gt; gibt an, in welchen Zeitabständen der Check durchgeführt wird, nach dem Ablauf der &lt;code&gt;start_period&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Zeile &lt;mark&gt;6&lt;/mark&gt; gibt an die Anzahl der Versuche, bis der Start als fehlerhaft markiert wird&lt;/li&gt;
&lt;li&gt;Zeile &lt;mark&gt;7&lt;/mark&gt; gibt die üblich Startzeit an. In dieser Zeit wir der Container zwar getestet, die Fehler zählen in dieser Zeit aber nicht zu Wiederholungen.&lt;/li&gt;
&lt;li&gt;Zeile &lt;mark&gt;8&lt;/mark&gt; gibt an, wie lange ein Check max. dauern soll, bis der als fehlerhaft erkannt wird&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In pgAdmin können wir nun die Datenbank als Abhängigkeit eintragen, so dass der Container erst dann startet, wenn die
(auf Verbindungsversuche antwortet) ist.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;dbAdmin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;depends_on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;service_healthy&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nun fehlt uns nur noch die Konfiguration von pgAdmin, so dass unsere Datenbank da bereits &amp;ldquo;hinterlegt&amp;rdquo; ist. Dazu müssen wir (leider) die
von pgAdmin genauer ansehen.&lt;/p&gt;
&lt;p&gt;Damit wir uns nicht jedes Mal anmelden müssen (wir sind ja auf unseren eigenen Rechner und betreiben keinen Server), können wir pgAdmin ich einen &amp;ldquo;nicht&amp;rdquo; Server Modus starten&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;dbAdmin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;PGADMIN_CONFIG_MASTER_PASSWORD_REQUIRED&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;False&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;PGADMIN_CONFIG_SERVER_MODE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;False&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;PGADMIN_CONFIG_SERVER_MODE&lt;/code&gt; schaltet pgAdmin in single User Mode, so dass wir uns nicht mehr anmelden müssen&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PGADMIN_CONFIG_MASTER_PASSWORD_REQUIRED&lt;/code&gt; erlaubt uns im nächsten Schritt die Konfiguration des Servers durchzureichen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Im letzten Schritt legen wir eine Konfigurationsdatei für die Serverkonfiguration, die wir an pgAdmin durchreichen werden. Diese können wir indirekt für uns erstellen lassen, in dem wir den Server zuerst in pgAdmin konfigurieren und diese Konfiguration dann als JSON-Datei exportieren. Die exportierte Datei muss dann über Docker Desktop aus dem Container exportiert werden.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;Servers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;Name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;DB&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;Group&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Servers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;Host&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;db&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;Port&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5432&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;MaintenanceDB&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;devdb&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;Username&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;devuser&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;PasswordExecCommand&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;echo \u0027devpassword\u0027&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In Zeile &lt;mark&gt;10&lt;/mark&gt; übergeben wir das Passwort über ein &lt;code&gt;echo&lt;/code&gt; Befehl, da die Konfiguration die Speicherung von unverschlüsselten Passwörtern nicht erlaubt.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;dbAdmin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Datei und Orner Mappings&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;5&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./db_server.json:/pgadmin4/servers.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In Zeile &lt;mark&gt;5&lt;/mark&gt; Mappen wir unsere Konfigurationsdatei &lt;code&gt;servers.json&lt;/code&gt; in den Container hinein. pgAdmin erwartet die Serverkonfiguration im Ordner &lt;code&gt;/pgadmin4&lt;/code&gt; mit dem Dateinamen &lt;code&gt;servers.json&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Nun können wir unsere Konfiguration starten. In der Kommandozeile sehen wir auch, dass pgAdmin erst starten, wenn Postgres in den &amp;ldquo;healthy&amp;rdquo; Status wechselt. Wenn wir nun die pgAdmin Web-Oberfläche öffnen, gelangen wir direkt, ohne Anmeldung, hinein. Auch der Postgres Server ist für uns bereits konfiguriert.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet run
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure&gt;&lt;img src="https://kurse.richter.consulting/courses/container/compose/pgadmin_no_login.png"&gt;&lt;figcaption&gt;
&lt;h4&gt;pgAdmin ohne Anmeldung mit Serverkonfiguration&lt;/h4&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;</description></item><item><title>Eigene App in Container verpacken</title><link>https://kurse.richter.consulting/courses/container/build_image/</link><pubDate>Sun, 08 Dec 2024 00:00:00 +0000</pubDate><guid>https://kurse.richter.consulting/courses/container/build_image/</guid><description>&lt;p&gt;Wenn man eine Zeit lang die Container für sich arbeiten lässt und diese nutzt, kommt irgendwann der Gedanke, auch eigene Applikation in einen Container zu verpacken und auszuliefern. Das wollen wir am Beispiel unser Blazor Beispielprojektes ein Mal durchspielen.&lt;/p&gt;
&lt;p&gt;Um ein Image zu erstellen, benötigen wir eine Bauanleitung. Diese wird in Form eines sogenannten Docker-Files definiert. Die Datei beschreibt Schritt für Schritt, was wir am Basissystem machen müssen, um unsere Applikation zu veröffentlichen. Dazu kommen noch einige Konfigurationsangaben, wie Port oder verfügbare Umgebungsvariablen.&lt;/p&gt;
&lt;h2 id="anpassbarkeit-des-images"&gt;Anpassbarkeit des Images&lt;/h2&gt;
&lt;p&gt;Als erstes müssen wir überlegen, welche Möglichkeiten wir dem &amp;ldquo;Nutzer&amp;rdquo; des Images zur Verfügung stellen müssen (und wollen). Da es sich um eine Web-Anwendung handelt, sollten wir mindestens den Port für den Web-Server freigeben, so dass die Anwendung auch von Außen ansprechbar ist.&lt;/p&gt;
&lt;p&gt;Da unsere Anwendung eine Datenbankverbindung benötigt, sollten wir erlauben diese zu konfigurieren. Hier könnten wir entweder direkt den kompletten &amp;ldquo;Connection String&amp;rdquo; empfangen, oder diesen in Teilen konfigurierbar machen.&lt;/p&gt;
&lt;h2 id="auswahl-des-basis-images"&gt;Auswahl des Basis-Images&lt;/h2&gt;
&lt;p&gt;Unsere Anwendung basiert auf der .Net Laufzeitumgebung und benötigt das ASP .Net Core Framework. Im ersten Schritt wollen wir auch, dass die App in dem Container (einfachheitshalber) direkt gebaut wird. Die Applikation nutzt .Net 10 als Version der Laufzeitumgebung. Eine Liste mit verfügbaren (offiziellen) Repositories für .Net finden wir
.&lt;/p&gt;
&lt;p&gt;Für unsere Zwecke werden wir das &amp;ldquo;sdk&amp;rdquo; Basis-Image nutzen.&lt;/p&gt;
&lt;h2 id="dockerfile"&gt;Dockerfile&lt;/h2&gt;
&lt;p&gt;Die Datei
ist eine einfache Textdatei, die einem Schema folgt. Jede neue Zeile (Anweisung) erzeugt dabei eine neue Schicht im Dateisystem des fertigen Images. Die Datei fängt immer mit einer
Anweisung, gefolgt von dem Basis-Image, auf dem wir unsere Applikation aufbauen.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Basis-Image .Net 10 SDK&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;mcr.microsoft.com/dotnet/sdk:10.0&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="kopieren-des-projektes"&gt;Kopieren des Projektes&lt;/h3&gt;
&lt;p&gt;Im nächsten Schritt (nächste Zeile) legen wir das Verzeichnis (
) an, in dem wir &amp;ldquo;arbeiten&amp;rdquo; wollen. Und kopieren (
) den aktuellen Inhalt des Projektes in dieses Verzeichnis.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;mcr.microsoft.com/dotnet/sdk:10.0&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Verzeichnis für die App&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/build&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Kopiere das Projekt in das Arbeitsverzeichnis&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;COPY&lt;/span&gt; . ./&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="bauen-des-projektes"&gt;Bauen des Projektes&lt;/h3&gt;
&lt;p&gt;Nun folgen die Standardschritte von &lt;code&gt;dotnet&lt;/code&gt; um eine Applikation für die Veröffentlichung zu bauen. Dieser Schritt ist spezifisch für die jeweilige Sprache / Framework (und unabhängig von Docker / Containern). Die Befehle werden durch die
Anweisung ausgeführt. Jede Zeile erzeugt, wie erwähnt, eine neue Schicht im Dateisystem.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;mcr.microsoft.com/dotnet/sdk:10.0&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Wiederherstellen der Abhängigkeiten&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; dotnet resore&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Veröffentlichen der App in das Verzeichnis /app&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; dotnet publish BlazorWebAppMovies.csproj -c Release -o /app&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="konfiguration-des-ports-und-datenbankverbindung"&gt;Konfiguration des Ports und Datenbankverbindung&lt;/h3&gt;
&lt;p&gt;Da wir eine Web-Anwendung haben, die eine Datenbank benötigt, sollen wir diese parametrisieren. Für das Arbeiten einer Web-Anwendung im Container ist es wichtig, dass wir ein Port zur Verfügung stellen, über den die Applikation erreichbar ist. In dem SDK Package ist das Port für Webanwendungen auf &lt;code&gt;8080&lt;/code&gt; gesetzt (kann über die Umgebungsvariable &lt;code&gt;ASPNETCORE_HTTP_PORTS&lt;/code&gt; angepasst werden).&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://kurse.richter.consulting/courses/container/build_image/sdk_container_port.png"&gt;&lt;figcaption&gt;
&lt;h4&gt;Standard port in SDK image&lt;/h4&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Der Port wird über die Anweisung
angegeben und kann neben dem Port selbst auch dar Protokoll enthalten.&lt;/p&gt;
&lt;p&gt;Unsere Applikation ist auch von einer Datenbank abhängig. Wir müssen den &amp;ldquo;Connection String&amp;rdquo; mit übergeben, damit der Container sich mit der Datenbank verbinden kann. In .Net werden die Einstellungen in &lt;code&gt;appsettings.json&lt;/code&gt; Datei (&lt;abbr title="JavaScript Object Notation"&gt;JSON&lt;/abbr&gt; Format) gespeichert. Will man diese Einstellungen mit Umgebungsvariablen überschreiben, werden die Verschachtlungen über ein &lt;code&gt;__&lt;/code&gt; (doppeltes Unterstrich) abgebildet. Aus aktuell &lt;code&gt;{ &amp;quot;ConnectionStrings&amp;quot;: { &amp;quot;BlazorWebAppMoviesContext&amp;quot;: &amp;quot;&amp;quot; } }&lt;/code&gt; wird so &lt;code&gt;ConnectionStrings__BlazorWebAppMoviesContext&lt;/code&gt;. Da Umgebungsvariablen oft in Großbuchstaben geschrieben werden (und für .Net Konfigurationen es irrelevant ist), werden wir es als &lt;code&gt;CONNECTIONSTRINGS__BLAZORWEBAPPMOVIESCONTEXT&lt;/code&gt; schreiben.&lt;/p&gt;
&lt;p&gt;Die Umgebungsvariablen werden in Dockerfile mit der Anweisung
definiert. Schlüssel und Wert werden über &lt;code&gt;=&lt;/code&gt; getrennt.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;mcr.microsoft.com/dotnet/sdk:10.0&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Neues Arbeitsverzeichnis&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Datenbank Connection string&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ENV&lt;/span&gt; &lt;span class="nv"&gt;CONNECTIONSTRINGS__BLAZORWEBAPPMOVIESCONTEXT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Port für Webserver&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;8080&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="starten-der-anwendung"&gt;Starten der Anwendung&lt;/h3&gt;
&lt;p&gt;Der letzte Schritt ist nun die Anweisung, um die Anwendung in dem Container zu startet. Da wir die Applikation nicht manuell innerhalb des Containers starten wollen, sollte dies direkt beim &amp;ldquo;Instanziieren&amp;rdquo; des Containers geschehen.&lt;/p&gt;
&lt;p&gt;Die Anwendung selbst wird über die
Anweisung ausgeführt. Die Anweisung nimmt eine Liste an Parametern entgegen. Die Applikationen in .Net startet man mit dem &lt;code&gt;dotnet&lt;/code&gt; Befehl und dem Applikationsnamen (entspricht dem Projektnamen).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;mcr.microsoft.com/dotnet/sdk:10.0&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Start der .Net Anwendung&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dotnet&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;BlazorWebAppMovies.dll&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="image-bauen"&gt;Image bauen&lt;/h2&gt;
&lt;p&gt;Im letzten Schritt können wir nun die &amp;ldquo;Bauanleitung&amp;rdquo; dazu nutzen unser erstes Image mit unserer Anwendung zu bauen. Dazu dient der Befehl
.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker build -t blazor-movies:from-sdk .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-t&lt;/code&gt;: Tag des Images, also der Image-Name + Version. In unserem Fall vergeben wir den Namen &lt;code&gt;blazor-movies&lt;/code&gt;. Da wir einige Images bauen werden und diese miteinander vergleichen möchten, vergeben wir eine sprechenden Versionsnamen. Aktuelle Buildanleitung basiert auf dem SDK-Image. Der Versionsname ist bei uns deshalb &lt;code&gt;from-sdk&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.&lt;/code&gt;: Das &lt;code&gt;.&lt;/code&gt; hinter dem Tab bestimmt den
(Pfad). Der Build-Context steht beim Bauen zur Verfügung (wie bei uns der Quellcode der Anwendung). &lt;code&gt;.&lt;/code&gt; bedeutet dabei, der aktuelle Ordner.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;Hinweis&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Sie können die Datei der Bauanleitung auch anders benennen als &lt;code&gt;Dockerfile&lt;/code&gt;, müssen dann aber beim Bauen den Dateinamen als Parameter (&lt;code&gt;-f&lt;/code&gt;) mit übergeben. Wenn Sie zum Beispiel die Datei &lt;code&gt;Dockerfile.dev&lt;/code&gt; nennen würden, würde der Baubefehl wie folgt aussehen:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker build -t blazor-movies:dev -f Dockerfile.dev .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id="finale-version"&gt;Finale Version&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;mcr.microsoft.com/dotnet/sdk:10.0&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Verzeichnis für die App&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/build&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Kopiere das Projekt in das Arbeitsverzeichnis&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;COPY&lt;/span&gt; . ./&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Wiederherstellen der Abhängigkeiten&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; dotnet restore&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Veröffentlichen der App in das Verzeichnis /app&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; dotnet publish BlazorWebAppMovies.csproj -c Release -o /app&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Arbeitsverzeichnis für Ausführung&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Datenbank Connection string&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ENV&lt;/span&gt; &lt;span class="nv"&gt;CONNECTIONSTRINGS__BLAZORWEBAPPMOVIESCONTEXT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Port für Webserver&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;8080&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Start der .Net Anwendung&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dotnet&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;BlazorWebAppMovies.dll&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;figure&gt;&lt;img src="https://kurse.richter.consulting/courses/container/build_image/sdk_image.png"&gt;&lt;figcaption&gt;
&lt;h4&gt;Unser Image in Docker Desktop&lt;/h4&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;</description></item><item><title>Multi Stage Builds</title><link>https://kurse.richter.consulting/courses/container/multi_stage/</link><pubDate>Sun, 08 Dec 2024 00:00:00 +0000</pubDate><guid>https://kurse.richter.consulting/courses/container/multi_stage/</guid><description>&lt;p&gt;Wenn wir die Größe unseres Images in Docker Desktop anschauen (oder mit dem Docker-Befehl
auf der Kommandozeile), sehen wir, dass die Größe gewaltig ist. Auf meinem Rechner ist das Image 2.6 GB groß. Warum ist es so?&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker image ls
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;IMAGE ID DISK USAGE CONTENT SIZE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;blazor-movies:from-sdk e561bfaae17f 2.55GB 758MB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mcr.microsoft.com/dotnet/sdk:10.0 d1823fecac36 1.29GB 318MB
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ursachen-für-große-images"&gt;Ursachen für große Images&lt;/h2&gt;
&lt;p&gt;Schauen wir uns die Ursachen für die Größe an.&lt;/p&gt;
&lt;h3 id="größe-des-basisimages"&gt;Größe des Basisimages&lt;/h3&gt;
&lt;p&gt;Einen großen Einfluss auf die endgültige Größe hat natürlich das Basisimage. Unsere App kommt ja immer &amp;ldquo;on Top&amp;rdquo; von diesem Basisimage. Aktuell nutzen wir SDK-Image als Basis, das alleine bereits 1.3 GB groß ist. Das SDK-Image bringt alles mit, was notwendig ist, um eine dotnet Applikation ausführen, aber auch bauen zu können.&lt;/p&gt;
&lt;h3 id="daten-im-image"&gt;Daten im Image&lt;/h3&gt;
&lt;p&gt;Da wir die Applikation in dem Image selbst bauen, hat dieser nicht nur die fertige App, sondern auch noch:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Quellcode, den wir kopiert haben, um die Applikation bauen zu können&lt;/li&gt;
&lt;li&gt;Eventuelle &amp;ldquo;Zwischen-Dateien&amp;rdquo;, die bei einem Build-Prozess entstehen, aber nicht in die finale App reinfließen (bei dotnet z.B. die &lt;code&gt;obj&lt;/code&gt; und &lt;code&gt;bin&lt;/code&gt; Ordner)&lt;/li&gt;
&lt;li&gt;Eventuelle &amp;ldquo;Kompilate&amp;rdquo;, die auf unserem PC bereits da sind, da wir die App ja bereits local gebaut uns ausgeführt haben&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ursachen-beseitigen"&gt;Ursachen beseitigen&lt;/h2&gt;
&lt;p&gt;Beide Probleme können wir mit sogenannten &amp;ldquo;multi stage builds&amp;rdquo; lösen. Dabei werden unterschiedliche Images für das Erstellen der App (Kompilieren) und für finale Image genutzt. Dabei bekommt das finale Image nur die fertig kompilierte App.&lt;/p&gt;
&lt;p&gt;Dafür müssen wir nur wenige Änderungen an unserem Bauplan durchführen.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Image für Build
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- FROM mcr.microsoft.com/dotnet/sdk:10.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Verzeichnis für das Build
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mit &lt;code&gt;AS &amp;lt;name&amp;gt;&lt;/code&gt; vergeben wir diesen ersten Schritt (Stage) einen Namen, so dass wir später uns auf diesen beziehen können.&lt;/p&gt;
&lt;p&gt;Für den zweiten Schritt benötigen wir ein schlankeres Basis-Image. Da wir am Ende die Applikation nur ausführen möchten, ist SDK überdimensioniert. Uns reicht für unsere Zwecke die runtime (Ausführung) Version. Das Image dazu bei Microsoft heißt &lt;code&gt;mcr.microsoft.com/dotnet/aspnet:9.0&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Alle Schritte in der Bauanleitung (Dockerfile), die mit dem finalen Image zu tun haben, werden auf dem &amp;ldquo;runtime&amp;rdquo; Basis-Image ausgeführt.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;RUN dotnet publish BlazorWebAppMovies.csproj -c Release -o /app
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ # Image für Runtime
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ FROM mcr.microsoft.com/dotnet/aspnet:10.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt;# Verzeichnis für die App
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt;WORKDIR /app
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ # Kopieren des aus dem Build zu Runtime Image
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ COPY --from=build /app .
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt;# Datenbank Connection string
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt;ENV CONNECTIONSTRINGS__BLAZORWEBAPPMOVIESCONTEXT=&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;In der Zeile &lt;mark&gt;4&lt;/mark&gt; definieren wir das Image, das als Basis für unser eigenes Image dienen soll (hier &lt;code&gt;aspnet&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;In der Zeile &lt;mark&gt;8&lt;/mark&gt; kopieren wir die fertig kompilierte Applikation aus dem SDK-Schritt (´from=build´) und Ordner &lt;code&gt;/app&lt;/code&gt; in den aktuellen Arbeitsordner. Damit enthält das fertige Image weder den Quellcode, noch die &amp;ldquo;Zwischen-Dateien&amp;rdquo;, die beim Kompilieren entstehen.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bauen wir nun unser Image mit der aktuellen Version von Dockerfile und vergeben die Version &lt;code&gt;from-aspnet&lt;/code&gt; an das Image.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Image für Build&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;mcr.microsoft.com/dotnet/sdk:10.0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;build&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Verzeichnis für das Build&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/build&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Kopiere das Projekt in das Arbeitsverzeichnis&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;COPY&lt;/span&gt; . ./&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Wiederherstellen der Abhängigkeiten&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; dotnet restore&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Veröffentlichen der App in das Verzeichnis /app&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; dotnet publish BlazorWebAppMovies.csproj -c Release -o /app&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Image für Runtime&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;mcr.microsoft.com/dotnet/aspnet:10.0&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Verzeichnis für die App&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Kopieren des aus dem Build zu Runtime Image&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;COPY&lt;/span&gt; --from&lt;span class="o"&gt;=&lt;/span&gt;build /app .&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Datenbank Connection string&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ENV&lt;/span&gt; &lt;span class="nv"&gt;CONNECTIONSTRINGS__BLAZORWEBAPPMOVIESCONTEXT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Port für Webserver&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;8080&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# App in Container starten&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dotnet&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;BlazorWebAppMovies.dll&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker build -t blazor-movies:from-runtime .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Unser Image ist nun deutlich kleiner geworden. Auf meinem MacBook Air ist das Image nun 462 MB, also 2.0 GB kleiner als unser erster Versuch.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker image ls
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;IMAGE ID DISK USAGE CONTENT SIZE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;blazor-movies:from-runtime 42c8d3bed245 462MB 116MB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;blazor-movies:from-sdk e561bfaae17f 2.55GB 758MB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mcr.microsoft.com/dotnet/aspnet:10.0 eaa79205c3ad 369MB 92.4MB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mcr.microsoft.com/dotnet/sdk:10.0 d1823fecac36 1.29GB 318MB
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ein großer Teil kommt vom kleineren Basis-Image. Diese Änderung bringt bereits über 920 MB Ersparnis (von 1.3 GB runter auf 369 MB). Der Rest kommt durch das Weglassen des Quellcodes und der temporären Dateien, die beim Kompilieren entstehen.&lt;/p&gt;
&lt;h2 id="weitere-optimierungen"&gt;Weitere Optimierungen&lt;/h2&gt;
&lt;p&gt;Wir können unser Image noch weiter Optimieren. Die Standard-Images von Microsoft basieren normalerweise auf Debian, zwar einer sehr schlanken Version davon, aber immer noch mit einen vollwertigen Linux als Basis. Wir kennen bereits ein minimalistisches Linux, das selbst nur 20MG groß ist, &lt;code&gt;alpine&lt;/code&gt; Linux.&lt;/p&gt;
&lt;p&gt;Microsoft liefert alle eigene Basis-Images auch in der Alpine-Version.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Image für Build&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;mcr.microsoft.com/dotnet/sdk:10.0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;build&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Verzeichnis für das Build&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/build&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Kopiere das Projekt in das Arbeitsverzeichnis&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;COPY&lt;/span&gt; . ./&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Wiederherstellen der Abhängigkeiten&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; dotnet restore&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Veröffentlichen der App in das Verzeichnis /app&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; dotnet publish BlazorWebAppMovies.csproj -c Release -o /app&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Image für Runtime&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;mcr.microsoft.com/dotnet/aspnet:10.0-alpine&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Verzeichnis für die App&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Kopieren des aus dem Build zu Runtime Image&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;COPY&lt;/span&gt; --from&lt;span class="o"&gt;=&lt;/span&gt;build /app .&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Datenbank Connection string&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ENV&lt;/span&gt; &lt;span class="nv"&gt;CONNECTIONSTRINGS__BLAZORWEBAPPMOVIESCONTEXT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# Port für Webserver&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;8080&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# App in Container starten&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;dotnet&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;BlazorWebAppMovies.dll&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; docker build -t blazor-moviews:from-alpine .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nun sieht unser Image noch kleiner aus. Das Basis-Image ist von 369 MB runter auf 183 MB. Und unser eigener Image ist nun von 462 MB runter auf 276 MB. Das ist 11% von unseren Ausgangspunkt.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker image ls
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;IMAGE ID DISK USAGE CONTENT SIZE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;blazor-movies:from-alpine bb332d7cf91c 276MB 76MB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;blazor-movies:from-runtime 42c8d3bed245 462MB 116MB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;blazor-movies:from-sdk e561bfaae17f 2.55GB 758MB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mcr.microsoft.com/dotnet/aspnet:10.0 eaa79205c3ad 369MB 92.4MB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mcr.microsoft.com/dotnet/aspnet:10.0-alpine 1be14b20e4ec 183MB 51.9MB
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mcr.microsoft.com/dotnet/sdk:10.0 d1823fecac36 1.29GB 318MB
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Abhängig von der Programmiersprache und deren Fähigkeiten, lässt sich die finale Applikation noch weiter verkleinern (und somit auch das Image). Das erfordert aber sehr oft deutlich mehr aufwand. Mit Asp.Net wäre es möglich bei einigen Applikationen AOT (Ahead of Time) Kompilierung durchzuführen, so dass gar keine Runtime mehr benötigt wird. Mit Trimming (Abschneiden der nicht genutzten Fähigkeiten) kann die kompilierte Applikation noch weiter verkleinert werden.&lt;/p&gt;
&lt;p&gt;Mit den einfachen Mitteln haben wir aber bereits ein sehr kleines Image erstellt, das für die meisten Anforderungen gut genug ist.&lt;/p&gt;
&lt;h2 id="vorteil-von-alpine-linux"&gt;Vorteil von Alpine Linux&lt;/h2&gt;
&lt;p&gt;Der größte Vorteil von Alpine Linux ist nicht die Größe, sondern die Sicherheit. Da dieses Linux fast nichts hat, kann es weniger kompromittiert werden. Das ist direkt sichtbar in Docker Desktop. Für SDK Image liegen aktuell &lt;strong&gt;14&lt;/strong&gt; bekannte Schwachstellen (7 in Debian und 7 in SDK selbst), Runtime hat immer noch &lt;strong&gt;8&lt;/strong&gt;, Alpine hat nur &lt;strong&gt;2&lt;/strong&gt; (mit niedriger Wertung).&lt;/p&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;Hinweis&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Das Bild der Schwachstellen ist eine Momentaufnahme und wird bei Ihnen anders aussehen. Allgemeines Bild, dass Alpine-Images deutlich weniger Schwachstellen aufweisen, wird aber bleiben.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;figure&gt;&lt;img src="https://kurse.richter.consulting/courses/container/multi_stage/sdk_vulnerabilities.png"&gt;&lt;figcaption&gt;
&lt;h4&gt;14 Schwachstellen in SDK Image&lt;/h4&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;&lt;img src="https://kurse.richter.consulting/courses/container/multi_stage/alpine_vulnerabilities.png"&gt;&lt;figcaption&gt;
&lt;h4&gt;2 Schwachstellen in SDK Image&lt;/h4&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;</description></item><item><title>Eigenes Image veröffentlichen</title><link>https://kurse.richter.consulting/courses/container/publishing/</link><pubDate>Sun, 08 Dec 2024 00:00:00 +0000</pubDate><guid>https://kurse.richter.consulting/courses/container/publishing/</guid><description>&lt;p&gt;Nun haben wir das Image erstellt. Aktuell befindet sich dieses aber nur auf unserem eigenen Rechner. D.h. keiner, außer uns, kann dieses Image nutzen. Damit auch andere unser Image nutzen können, müssen wir dieses veröffentlichen. Dazu benötigen wir als erstes eine Container-Registry.&lt;/p&gt;
&lt;h2 id="container-registry"&gt;Container Registry&lt;/h2&gt;
&lt;p&gt;Container Registry ist ein zentraler Speicherort für die fertig gebauten Images.
Es gibt einige Anbieter dafür, sowohl öffentlich zugängliche als auch solche, die private Images verwalten.&lt;/p&gt;
&lt;p&gt;Die bekannteste Registry ist von der Firma Docker selbst und heißt
.
Diese erlaubt ein kostenloses privates Repository und unbegrenzt für Open Source Projekte.&lt;/p&gt;
&lt;p&gt;Daneben bietet fast jeder größerer Cloud-Anbieter eine Container-Registry in deren Cloud-Umgebung:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;und viele weitere.&lt;/p&gt;
&lt;h2 id="docker-hub"&gt;Docker Hub&lt;/h2&gt;
&lt;p&gt;Hier werden wir Docker Hub als Beispiel nutzen. Das Vorgehen mit anderen Anbietern ist oft ähnlich.
Für alle können dieselben Docker-Befehle genutzt werden.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Legen Sie als erstes ein Konto bei
an, falls Sie noch keinen haben.&lt;/li&gt;
&lt;li&gt;Erstellen Sie ein neues Repository (Speicherort für Images einer Anwendung) an, z.B. &lt;code&gt;blazor-movies&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Erstellen Sie ein &amp;ldquo;Personal Access Token&amp;rdquo;, um auf den Docker Hub einfacher zugreifen zu können (und sicherer - insbesondere in CI/CD Umgebungen).&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="personal-access-token-erstellen"&gt;Personal Access Token Erstellen&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Klicken Sie auf Ihren Avatar oben rechts, um zu den &amp;ldquo;Account Settings&amp;rdquo; zu gelangen.
&lt;figure&gt;&lt;img src="https://kurse.richter.consulting/courses/container/publishing/hub_account_settings.png"
alt="Flyout menu on avatar"&gt;
&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;Öffnen Sie nun im Bereich &amp;ldquo;Settings&amp;rdquo; die Einstellungen für &amp;ldquo;Personal access tokens&amp;rdquo;
&lt;figure&gt;&lt;img src="https://kurse.richter.consulting/courses/container/publishing/hub_pats.png"
alt="Personal access tokens menu under security settings"&gt;
&lt;/figure&gt;
&lt;/li&gt;
&lt;li&gt;Klicken Sie auf &amp;ldquo;Generate new token&amp;rdquo;, um einen neuen Token zu erstellen. Wählen Sie hier einen sprechenden Namen, die max. Gültigkeit des Tokens und dessen Berechtigung. Zum Veröffentlichen benötigen Sie min. Schreibrechte. Bei anderen Anbietern kann die Granularität der Berechtigungen deutlich granulärer sein.
&lt;figure&gt;&lt;img src="https://kurse.richter.consulting/courses/container/publishing/hub_new_pat.png"
alt="Neues Personal Access Token erstellen"&gt;
&lt;/figure&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="vorbereiten-des-images"&gt;Vorbereiten des Images&lt;/h3&gt;
&lt;p&gt;Bevor das Image hochgeladen werden kann, muss dieser zuerst angepasst werden. Der Name kann nicht mehr so einfach sein, wie in unserem Fall vorher (&lt;code&gt;balazor-moview&lt;/code&gt;). Wie wir bereits gelernt haben, sind die &amp;ldquo;einfachen&amp;rdquo; Image-Namen für offizielle Images reserviert.&lt;/p&gt;
&lt;p&gt;Unsere Images müssen im Namen folgende Bestandteile enthalten &lt;code&gt;&amp;lt;registry&amp;gt;/&amp;lt;vendor&amp;gt;/&amp;lt;repository&amp;gt;:&amp;lt;tag&amp;gt;&lt;/code&gt;. Hier am Beispiel unseres Basis-Images &lt;code&gt;mcr.microsoft.com/dotnet/aspnet:10.0-alpine&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Registry: Bei Docker-Hub fällt dieser Teil weg. Bei anderen Registrys muss der Name der Registry angegeben werden (z.B. bei unserem Basis-Image ist es &lt;code&gt;mcr.microsoft.com&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Vendor: Normalerweise Hersteller der Software oder Benutzer, der die Repositories pflegt (z.B. bei unserem Basis-Image ist es &lt;code&gt;dotnet&lt;/code&gt;). Bei offiziellen Images auf Docker Hub entfällt auch dieser Teil.&lt;/li&gt;
&lt;li&gt;Repository: Speichername für die Images einer Anwendung (z.B. bei unserem Basis-Image ist es &lt;code&gt;aspnet&lt;/code&gt;). Dieser Teil ist immer notwendig&lt;/li&gt;
&lt;li&gt;Tag: Version der Anwendung (z.B. bei unserem Basis-Image ist es &lt;code&gt;10.0-alpine&lt;/code&gt;). Dieser Teil ist wieder optional. Wird Tag nicht angegeben, vergibt Docker automatisch den Tag &lt;code&gt;latest&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wir müssen unser Image, das wir veröffentlichen wollen, zuerst nach der obigen Konvention umbenennen. Aus dem aktuellen Namen &lt;code&gt;blazor-movies:from-alpine&lt;/code&gt; muss &lt;code&gt;webducer/blazor-moviews:alpine&lt;/code&gt; werden (ersetzen Sie Benutzer- und Repository-Namen mit Ihren Werten).&lt;/p&gt;
&lt;p&gt;Auf Docker Hub erhalten Sie einen Hinweis, wie das Image heißen soll in Form des &amp;ldquo;push&amp;rdquo; Befehls auf der Repository Startseite.&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://kurse.richter.consulting/courses/container/publishing/hub_push_command.png"&gt;&lt;figcaption&gt;
&lt;h4&gt;Push command Hilfestellung auf der Repository Seite&lt;/h4&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Die Umbenennung des Images erfolgt durch das erneute Taggen des vorhandenen Images mit dem
Befehl.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker image tag blazor-movies:from-alpine webducer/blazor-movies:alpine
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="veröffentlichen"&gt;Veröffentlichen&lt;/h3&gt;
&lt;p&gt;Vor der Veröffentlichung müssen wir uns zuerst bei der Registry einloggen. Bei Docker Hub entfällt die Angabe der Registry. Bei allen anderen muss diese immer explizit mit angegeben werden. Das Anmelden erfolgt über den
Befehl (&lt;code&gt;docker login &amp;lt;server-name&amp;gt;&lt;/code&gt; bei nicht Docker Hub Registrys). Folgen Sie dabei den Anweisungen.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nun können wie unser Image veröffentlichen. Das erfolgt durch den
Befehl und der Eingabe des Image-Namens.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker push webducer/blazor-movies:alpine
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Das Veröffentlichen kann einige Zeit dauern, abhängig von der Größe des Images und Ihrer Internetverbindung. Beim &lt;code&gt;push&lt;/code&gt; wird normalerweise nicht das ganze Image übertragen, sondern nur die &amp;ldquo;unbekannten&amp;rdquo; Schichten. Da meistens das Basis-Image bereits in Registry bekannt ist, müssen nur die Schichten oberhalb von diesen Basis-Image übertragen werden.&lt;/p&gt;
&lt;figure&gt;&lt;img src="https://kurse.richter.consulting/courses/container/publishing/hub_image.png"&gt;&lt;figcaption&gt;
&lt;h4&gt;Repository nach Veröffentlichung&lt;/h4&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;&lt;img src="https://kurse.richter.consulting/courses/container/publishing/hub_image_detail.png"&gt;&lt;figcaption&gt;
&lt;h4&gt;Details des Images&lt;/h4&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;</description></item><item><title>Oft benötigte Commands</title><link>https://kurse.richter.consulting/courses/container/commands/</link><pubDate>Sat, 07 Dec 2024 00:00:00 +0000</pubDate><guid>https://kurse.richter.consulting/courses/container/commands/</guid><description>&lt;h2 id="docker-run"&gt;&lt;code&gt;docker run&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;
&lt;span class="inline-block pr-1"&gt;
&lt;svg style="height: 1em; transform: translateY(0.1em);" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"&gt;&lt;path fill="#3a4d54" fill-rule="evenodd" d="M73.8 50.8h11.3v11.5h5.7c2.6 0 5.3-.5 7.8-1.3c1.2-.4 2.6-1 3.8-1.7c-1.6-2.1-2.4-4.7-2.6-7.3c-.3-3.5.4-8.1 2.8-10.8l1.2-1.4l1.4 1.1c3.6 2.9 6.5 6.8 7.1 11.4c4.3-1.3 9.3-1 13.1 1.2l1.5.9l-.8 1.6c-3.2 6.2-9.9 8.2-16.4 7.8c-9.8 24.3-31 35.8-56.8 35.8c-13.3 0-25.5-5-32.5-16.8l-.1-.2l-1-2.1c-2.4-5.2-3.1-10.9-2.6-16.6l.2-1.7h9.6V50.8h11.3V39.6h22.5V28.3h13.5z" clip-rule="evenodd"/&gt;&lt;path fill="#00aada" d="M110.4 55.1c.8-5.9-3.6-10.5-6.4-12.7c-3.1 3.6-3.6 13.2 1.3 17.2c-2.8 2.4-8.5 4.7-14.5 4.7H18.6c-.6 6.2.5 11.9 3 16.8l.8 1.5c.5.9 1.1 1.7 1.7 2.6c3 .2 5.7.3 8.2.2c4.9-.1 8.9-.7 12-1.7c.5-.2.9.1 1.1.5c.2.5-.1.9-.5 1.1c-.4.1-.8.3-1.3.4c-2.4.7-5 1.1-8.3 1.3h-.6c-1.3.1-2.7.1-4.2.1c-1.6 0-3.1 0-4.9-.1c6 6.8 15.4 10.8 27.2 10.8c25 0 46.2-11.1 55.5-35.9c6.7.7 13.1-1 16-6.7c-4.5-2.7-10.5-1.8-13.9-.1"/&gt;&lt;path fill="#28b8eb" d="M110.4 55.1c.8-5.9-3.6-10.5-6.4-12.7c-3.1 3.6-3.6 13.2 1.3 17.2c-2.8 2.4-8.5 4.7-14.5 4.7h-68c-.3 9.5 3.2 16.7 9.5 21c4.9-.1 8.9-.7 12-1.7c.5-.2.9.1 1.1.5c.2.5-.1.9-.5 1.1c-.4.1-.8.3-1.3.4c-2.4.7-5.2 1.2-8.5 1.4l-.1-.1c8.5 4.4 20.8 4.3 35-1.1c15.8-6.1 30.6-17.7 40.9-30.9c-.2.1-.4.1-.5.2"/&gt;&lt;path fill="#028bb8" d="M18.7 71.8c.4 3.3 1.4 6.4 2.9 9.3l.8 1.5c.5.9 1.1 1.7 1.7 2.6c3 .2 5.7.3 8.2.2c4.9-.1 8.9-.7 12-1.7c.5-.2.9.1 1.1.5c.2.5-.1.9-.5 1.1c-.4.1-.8.3-1.3.4c-2.4.7-5.2 1.2-8.5 1.4h-.4c-1.3.1-2.7.1-4.1.1c-1.6 0-3.2 0-4.9-.1c6 6.8 15.5 10.8 27.3 10.8c21.4 0 40-8.1 50.8-26H18.7z"/&gt;&lt;path fill="#019bc6" d="M23.5 71.8c1.3 5.8 4.3 10.4 8.8 13.5c4.9-.1 8.9-.7 12-1.7c.5-.2.9.1 1.1.5c.2.5-.1.9-.5 1.1c-.4.1-.8.3-1.3.4c-2.4.7-5.2 1.2-8.6 1.4c8.5 4.4 20.8 4.3 34.9-1.1c8.5-3.3 16.8-8.2 24.2-14.1z"/&gt;&lt;path fill="#00acd3" fill-rule="evenodd" d="M28.4 52.7h9.8v9.8h-9.8zm.8.8h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm3-12h9.8v9.8h-9.8zm.9.8h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#23c2ee" fill-rule="evenodd" d="M39.6 52.7h9.8v9.8h-9.8zm.9.8h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#00acd3" fill-rule="evenodd" d="M50.9 52.7h9.8v9.8h-9.8zm.8.8h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#23c2ee" fill-rule="evenodd" d="M50.9 41.5h9.8v9.8h-9.8zm.8.8h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm3.1 10.4H72v9.8h-9.8zm.8.8h.8v8.1H63zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#00acd3" fill-rule="evenodd" d="M62.2 41.5H72v9.8h-9.8zm.8.8h.8v8.1H63zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#23c2ee" fill-rule="evenodd" d="M62.2 30.2H72V40h-9.8zm.8.8h.8v8.1H63zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#00acd3" fill-rule="evenodd" d="M73.5 52.7h9.8v9.8h-9.8zm.8.8h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#d4eef1" fill-rule="evenodd" d="M48.8 78.3c1.5 0 2.7 1.2 2.7 2.7s-1.2 2.7-2.7 2.7s-2.7-1.2-2.7-2.7s1.2-2.7 2.7-2.7" clip-rule="evenodd"/&gt;&lt;path fill="#3a4d54" fill-rule="evenodd" d="M48.8 79.1c.2 0 .5 0 .7.1c-.2.1-.4.4-.4.7c0 .4.4.8.8.8c.3 0 .6-.2.7-.4c.1.2.1.5.1.7c0 1.1-.9 1.9-1.9 1.9c-1.1 0-1.9-.9-1.9-1.9s.8-1.9 1.9-1.9M1.1 72.8h125.4c-2.7-.7-8.6-1.6-7.7-5.2c-5 5.7-16.9 4-20 1.2c-3.4 4.9-23 3-24.3-.8c-4.2 5-17.3 5-21.5 0c-1.4 3.8-21 5.7-24.3.8c-3 2.8-15 4.5-20-1.2c1.1 3.5-4.9 4.5-7.6 5.2" clip-rule="evenodd"/&gt;&lt;path fill="#bfdbe0" d="M56 97.8c-6.7-3.2-10.3-7.5-12.4-12.2c-2.5.7-5.5 1.2-8.9 1.4c-1.3.1-2.7.1-4.1.1c-1.7 0-3.4 0-5.2-.1c6 6 13.6 10.7 27.5 10.8z"/&gt;&lt;path fill="#d4eef1" d="M46.1 89.9c-.9-1.3-1.8-2.8-2.5-4.3c-2.5.7-5.5 1.2-8.9 1.4c2.3 1.2 5.7 2.4 11.4 2.9"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;Startet ein neues Container basierend auf den übergebenen Image. Abhängign von den Fähigkeiten des Images, können zusätliche Parameter übergeben / genutzt werden.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="wichtige-parameter"&gt;Wichtige Parameter&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--name&lt;/code&gt; Name des Containers. Wenn dieser nicht mitgegeben wird, wir der Name von der Runtime vergeben.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-d&lt;/code&gt; oder &lt;code&gt;--detach&lt;/code&gt; Detatched. D.h. die Runtime startet den Container im Hintergrund, so dass das Terminal für weitere Eingaben zur Verfügung steht.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-e&lt;/code&gt; oder &lt;code&gt;--env&lt;/code&gt; Setzen der Umgebungsvariablen innnerhalb des Containers (kann auch mehrfach genutzt werden, um mehrere Umgebungsvariablen zu setzen).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-p&lt;/code&gt; oder &lt;code&gt;--publish&lt;/code&gt; Port Publishing. Gibt an welcher Container-Port zu welchen Host-Port umgeleitet werden soll.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-v&lt;/code&gt; oder &lt;code&gt;--volume&lt;/code&gt; Mapping für Speicher (Dateien oder Orner)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-rm&lt;/code&gt; Starte einen neuen Container. Somald dieser beendet wird, wird dieser auch gleich gelöscht (praktsich für &amp;ldquo;ein Mal ausführen&amp;rdquo; Container).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-it&lt;/code&gt; Kombination aus &lt;code&gt;-i&lt;/code&gt; (&lt;code&gt;--interactive&lt;/code&gt;) und &lt;code&gt;-t&lt;/code&gt; (&lt;code&gt;--tty&lt;/code&gt;) und erlaubt interaktiv in den Container &amp;ldquo;reinzugehen&amp;rdquo;, um dessen Inhalt zum Beispiel zu untersuchen&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run --name my-homepage &lt;span class="se"&gt;\ &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p 1080:8080 &lt;span class="se"&gt;\ &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;NGINX_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;8080&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\ &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;NGINX_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;my-homepage.io&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\ &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v /www/website:/usr/share/nginx/html:ro &lt;span class="se"&gt;\ &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="docker-start"&gt;&lt;code&gt;docker start&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;
&lt;span class="inline-block pr-1"&gt;
&lt;svg style="height: 1em; transform: translateY(0.1em);" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"&gt;&lt;path fill="#3a4d54" fill-rule="evenodd" d="M73.8 50.8h11.3v11.5h5.7c2.6 0 5.3-.5 7.8-1.3c1.2-.4 2.6-1 3.8-1.7c-1.6-2.1-2.4-4.7-2.6-7.3c-.3-3.5.4-8.1 2.8-10.8l1.2-1.4l1.4 1.1c3.6 2.9 6.5 6.8 7.1 11.4c4.3-1.3 9.3-1 13.1 1.2l1.5.9l-.8 1.6c-3.2 6.2-9.9 8.2-16.4 7.8c-9.8 24.3-31 35.8-56.8 35.8c-13.3 0-25.5-5-32.5-16.8l-.1-.2l-1-2.1c-2.4-5.2-3.1-10.9-2.6-16.6l.2-1.7h9.6V50.8h11.3V39.6h22.5V28.3h13.5z" clip-rule="evenodd"/&gt;&lt;path fill="#00aada" d="M110.4 55.1c.8-5.9-3.6-10.5-6.4-12.7c-3.1 3.6-3.6 13.2 1.3 17.2c-2.8 2.4-8.5 4.7-14.5 4.7H18.6c-.6 6.2.5 11.9 3 16.8l.8 1.5c.5.9 1.1 1.7 1.7 2.6c3 .2 5.7.3 8.2.2c4.9-.1 8.9-.7 12-1.7c.5-.2.9.1 1.1.5c.2.5-.1.9-.5 1.1c-.4.1-.8.3-1.3.4c-2.4.7-5 1.1-8.3 1.3h-.6c-1.3.1-2.7.1-4.2.1c-1.6 0-3.1 0-4.9-.1c6 6.8 15.4 10.8 27.2 10.8c25 0 46.2-11.1 55.5-35.9c6.7.7 13.1-1 16-6.7c-4.5-2.7-10.5-1.8-13.9-.1"/&gt;&lt;path fill="#28b8eb" d="M110.4 55.1c.8-5.9-3.6-10.5-6.4-12.7c-3.1 3.6-3.6 13.2 1.3 17.2c-2.8 2.4-8.5 4.7-14.5 4.7h-68c-.3 9.5 3.2 16.7 9.5 21c4.9-.1 8.9-.7 12-1.7c.5-.2.9.1 1.1.5c.2.5-.1.9-.5 1.1c-.4.1-.8.3-1.3.4c-2.4.7-5.2 1.2-8.5 1.4l-.1-.1c8.5 4.4 20.8 4.3 35-1.1c15.8-6.1 30.6-17.7 40.9-30.9c-.2.1-.4.1-.5.2"/&gt;&lt;path fill="#028bb8" d="M18.7 71.8c.4 3.3 1.4 6.4 2.9 9.3l.8 1.5c.5.9 1.1 1.7 1.7 2.6c3 .2 5.7.3 8.2.2c4.9-.1 8.9-.7 12-1.7c.5-.2.9.1 1.1.5c.2.5-.1.9-.5 1.1c-.4.1-.8.3-1.3.4c-2.4.7-5.2 1.2-8.5 1.4h-.4c-1.3.1-2.7.1-4.1.1c-1.6 0-3.2 0-4.9-.1c6 6.8 15.5 10.8 27.3 10.8c21.4 0 40-8.1 50.8-26H18.7z"/&gt;&lt;path fill="#019bc6" d="M23.5 71.8c1.3 5.8 4.3 10.4 8.8 13.5c4.9-.1 8.9-.7 12-1.7c.5-.2.9.1 1.1.5c.2.5-.1.9-.5 1.1c-.4.1-.8.3-1.3.4c-2.4.7-5.2 1.2-8.6 1.4c8.5 4.4 20.8 4.3 34.9-1.1c8.5-3.3 16.8-8.2 24.2-14.1z"/&gt;&lt;path fill="#00acd3" fill-rule="evenodd" d="M28.4 52.7h9.8v9.8h-9.8zm.8.8h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm3-12h9.8v9.8h-9.8zm.9.8h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#23c2ee" fill-rule="evenodd" d="M39.6 52.7h9.8v9.8h-9.8zm.9.8h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#00acd3" fill-rule="evenodd" d="M50.9 52.7h9.8v9.8h-9.8zm.8.8h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#23c2ee" fill-rule="evenodd" d="M50.9 41.5h9.8v9.8h-9.8zm.8.8h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm3.1 10.4H72v9.8h-9.8zm.8.8h.8v8.1H63zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#00acd3" fill-rule="evenodd" d="M62.2 41.5H72v9.8h-9.8zm.8.8h.8v8.1H63zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#23c2ee" fill-rule="evenodd" d="M62.2 30.2H72V40h-9.8zm.8.8h.8v8.1H63zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#00acd3" fill-rule="evenodd" d="M73.5 52.7h9.8v9.8h-9.8zm.8.8h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#d4eef1" fill-rule="evenodd" d="M48.8 78.3c1.5 0 2.7 1.2 2.7 2.7s-1.2 2.7-2.7 2.7s-2.7-1.2-2.7-2.7s1.2-2.7 2.7-2.7" clip-rule="evenodd"/&gt;&lt;path fill="#3a4d54" fill-rule="evenodd" d="M48.8 79.1c.2 0 .5 0 .7.1c-.2.1-.4.4-.4.7c0 .4.4.8.8.8c.3 0 .6-.2.7-.4c.1.2.1.5.1.7c0 1.1-.9 1.9-1.9 1.9c-1.1 0-1.9-.9-1.9-1.9s.8-1.9 1.9-1.9M1.1 72.8h125.4c-2.7-.7-8.6-1.6-7.7-5.2c-5 5.7-16.9 4-20 1.2c-3.4 4.9-23 3-24.3-.8c-4.2 5-17.3 5-21.5 0c-1.4 3.8-21 5.7-24.3.8c-3 2.8-15 4.5-20-1.2c1.1 3.5-4.9 4.5-7.6 5.2" clip-rule="evenodd"/&gt;&lt;path fill="#bfdbe0" d="M56 97.8c-6.7-3.2-10.3-7.5-12.4-12.2c-2.5.7-5.5 1.2-8.9 1.4c-1.3.1-2.7.1-4.1.1c-1.7 0-3.4 0-5.2-.1c6 6 13.6 10.7 27.5 10.8z"/&gt;&lt;path fill="#d4eef1" d="M46.1 89.9c-.9-1.3-1.8-2.8-2.5-4.3c-2.5.7-5.5 1.2-8.9 1.4c2.3 1.2 5.7 2.4 11.4 2.9"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;Starten einen bereits vorhandenen Container. Als Parameter wird der Name oder die ID des Containers akzeptiert.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker start my-homepage
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="docker-stop"&gt;&lt;code&gt;docker stop&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;
&lt;span class="inline-block pr-1"&gt;
&lt;svg style="height: 1em; transform: translateY(0.1em);" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"&gt;&lt;path fill="#3a4d54" fill-rule="evenodd" d="M73.8 50.8h11.3v11.5h5.7c2.6 0 5.3-.5 7.8-1.3c1.2-.4 2.6-1 3.8-1.7c-1.6-2.1-2.4-4.7-2.6-7.3c-.3-3.5.4-8.1 2.8-10.8l1.2-1.4l1.4 1.1c3.6 2.9 6.5 6.8 7.1 11.4c4.3-1.3 9.3-1 13.1 1.2l1.5.9l-.8 1.6c-3.2 6.2-9.9 8.2-16.4 7.8c-9.8 24.3-31 35.8-56.8 35.8c-13.3 0-25.5-5-32.5-16.8l-.1-.2l-1-2.1c-2.4-5.2-3.1-10.9-2.6-16.6l.2-1.7h9.6V50.8h11.3V39.6h22.5V28.3h13.5z" clip-rule="evenodd"/&gt;&lt;path fill="#00aada" d="M110.4 55.1c.8-5.9-3.6-10.5-6.4-12.7c-3.1 3.6-3.6 13.2 1.3 17.2c-2.8 2.4-8.5 4.7-14.5 4.7H18.6c-.6 6.2.5 11.9 3 16.8l.8 1.5c.5.9 1.1 1.7 1.7 2.6c3 .2 5.7.3 8.2.2c4.9-.1 8.9-.7 12-1.7c.5-.2.9.1 1.1.5c.2.5-.1.9-.5 1.1c-.4.1-.8.3-1.3.4c-2.4.7-5 1.1-8.3 1.3h-.6c-1.3.1-2.7.1-4.2.1c-1.6 0-3.1 0-4.9-.1c6 6.8 15.4 10.8 27.2 10.8c25 0 46.2-11.1 55.5-35.9c6.7.7 13.1-1 16-6.7c-4.5-2.7-10.5-1.8-13.9-.1"/&gt;&lt;path fill="#28b8eb" d="M110.4 55.1c.8-5.9-3.6-10.5-6.4-12.7c-3.1 3.6-3.6 13.2 1.3 17.2c-2.8 2.4-8.5 4.7-14.5 4.7h-68c-.3 9.5 3.2 16.7 9.5 21c4.9-.1 8.9-.7 12-1.7c.5-.2.9.1 1.1.5c.2.5-.1.9-.5 1.1c-.4.1-.8.3-1.3.4c-2.4.7-5.2 1.2-8.5 1.4l-.1-.1c8.5 4.4 20.8 4.3 35-1.1c15.8-6.1 30.6-17.7 40.9-30.9c-.2.1-.4.1-.5.2"/&gt;&lt;path fill="#028bb8" d="M18.7 71.8c.4 3.3 1.4 6.4 2.9 9.3l.8 1.5c.5.9 1.1 1.7 1.7 2.6c3 .2 5.7.3 8.2.2c4.9-.1 8.9-.7 12-1.7c.5-.2.9.1 1.1.5c.2.5-.1.9-.5 1.1c-.4.1-.8.3-1.3.4c-2.4.7-5.2 1.2-8.5 1.4h-.4c-1.3.1-2.7.1-4.1.1c-1.6 0-3.2 0-4.9-.1c6 6.8 15.5 10.8 27.3 10.8c21.4 0 40-8.1 50.8-26H18.7z"/&gt;&lt;path fill="#019bc6" d="M23.5 71.8c1.3 5.8 4.3 10.4 8.8 13.5c4.9-.1 8.9-.7 12-1.7c.5-.2.9.1 1.1.5c.2.5-.1.9-.5 1.1c-.4.1-.8.3-1.3.4c-2.4.7-5.2 1.2-8.6 1.4c8.5 4.4 20.8 4.3 34.9-1.1c8.5-3.3 16.8-8.2 24.2-14.1z"/&gt;&lt;path fill="#00acd3" fill-rule="evenodd" d="M28.4 52.7h9.8v9.8h-9.8zm.8.8h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm3-12h9.8v9.8h-9.8zm.9.8h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#23c2ee" fill-rule="evenodd" d="M39.6 52.7h9.8v9.8h-9.8zm.9.8h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#00acd3" fill-rule="evenodd" d="M50.9 52.7h9.8v9.8h-9.8zm.8.8h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#23c2ee" fill-rule="evenodd" d="M50.9 41.5h9.8v9.8h-9.8zm.8.8h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm3.1 10.4H72v9.8h-9.8zm.8.8h.8v8.1H63zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#00acd3" fill-rule="evenodd" d="M62.2 41.5H72v9.8h-9.8zm.8.8h.8v8.1H63zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#23c2ee" fill-rule="evenodd" d="M62.2 30.2H72V40h-9.8zm.8.8h.8v8.1H63zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#00acd3" fill-rule="evenodd" d="M73.5 52.7h9.8v9.8h-9.8zm.8.8h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#d4eef1" fill-rule="evenodd" d="M48.8 78.3c1.5 0 2.7 1.2 2.7 2.7s-1.2 2.7-2.7 2.7s-2.7-1.2-2.7-2.7s1.2-2.7 2.7-2.7" clip-rule="evenodd"/&gt;&lt;path fill="#3a4d54" fill-rule="evenodd" d="M48.8 79.1c.2 0 .5 0 .7.1c-.2.1-.4.4-.4.7c0 .4.4.8.8.8c.3 0 .6-.2.7-.4c.1.2.1.5.1.7c0 1.1-.9 1.9-1.9 1.9c-1.1 0-1.9-.9-1.9-1.9s.8-1.9 1.9-1.9M1.1 72.8h125.4c-2.7-.7-8.6-1.6-7.7-5.2c-5 5.7-16.9 4-20 1.2c-3.4 4.9-23 3-24.3-.8c-4.2 5-17.3 5-21.5 0c-1.4 3.8-21 5.7-24.3.8c-3 2.8-15 4.5-20-1.2c1.1 3.5-4.9 4.5-7.6 5.2" clip-rule="evenodd"/&gt;&lt;path fill="#bfdbe0" d="M56 97.8c-6.7-3.2-10.3-7.5-12.4-12.2c-2.5.7-5.5 1.2-8.9 1.4c-1.3.1-2.7.1-4.1.1c-1.7 0-3.4 0-5.2-.1c6 6 13.6 10.7 27.5 10.8z"/&gt;&lt;path fill="#d4eef1" d="M46.1 89.9c-.9-1.3-1.8-2.8-2.5-4.3c-2.5.7-5.5 1.2-8.9 1.4c2.3 1.2 5.7 2.4 11.4 2.9"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;Stopt einen bereits vorhandenen und laufenden Container. Als Parameter wird der Name oder die ID des Containers akzeptiert.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker stop my-homepage
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Glossar</title><link>https://kurse.richter.consulting/courses/container/glossar/</link><pubDate>Sat, 07 Dec 2024 00:00:00 +0000</pubDate><guid>https://kurse.richter.consulting/courses/container/glossar/</guid><description>&lt;h2 id="container"&gt;Container&lt;/h2&gt;
&lt;p&gt;Ein Container ist eine Laufzeitinstanz eines
.&lt;/p&gt;
&lt;p&gt;Ein Docker-Container besteht aus&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Einem Docker-Abbild&lt;/li&gt;
&lt;li&gt;einer Ausführungsumgebung&lt;/li&gt;
&lt;li&gt;Einem Standardsatz von Anweisungen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Das Konzept ist von den Schiffscontainern abgeleitet, die einen Standard für den weltweiten Versand von Waren definieren. OCI definiert einen Standard für den Versand von Software.&lt;/p&gt;
&lt;h2 id="image--container-image"&gt;Image / Container-Image&lt;/h2&gt;
&lt;p&gt;Container-Images sind die Grundlage von Containern. Ein Image ist eine geordnete Sammlung von Dateisystemänderungen und den Ausführungsparametern zur Verwendung innerhalb einer Container-Laufzeit. Ein Image enthält in der Regel eine Vereinigung von übereinander gestapelten Dateisystemen.&lt;/p&gt;
&lt;h2 id="container-registry"&gt;Container Registry&lt;/h2&gt;
&lt;p&gt;Container Registry ist ein zentraler Speicherort für die fertig gebauten Images.&lt;/p&gt;
&lt;h2 id="repository"&gt;Repository&lt;/h2&gt;
&lt;p&gt;Ein Repository ist ein Satz von Container-Images (meist derselben Software). Ein Repository kann freigegeben werden, indem es auf einen Registry-Server gepusht wird. Die verschiedenen Images im Repository können mit Tags (Versionen) gekennzeichnet werden.&lt;/p&gt;</description></item><item><title>Weiterführende Links und Ressourcen</title><link>https://kurse.richter.consulting/courses/container/links/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kurse.richter.consulting/courses/container/links/</guid><description>&lt;h2 id="projektressourcen"&gt;Projektressourcen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;span class="inline-block pr-1"&gt;
&lt;svg style="height: 1em; transform: translateY(0.1em);" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"&gt;&lt;g fill="#181616"&gt;&lt;path fill-rule="evenodd" d="M64 5.103c-33.347 0-60.388 27.035-60.388 60.388c0 26.682 17.303 49.317 41.297 57.303c3.017.56 4.125-1.31 4.125-2.905c0-1.44-.056-6.197-.082-11.243c-16.8 3.653-20.345-7.125-20.345-7.125c-2.747-6.98-6.705-8.836-6.705-8.836c-5.48-3.748.413-3.67.413-3.67c6.063.425 9.257 6.223 9.257 6.223c5.386 9.23 14.127 6.562 17.573 5.02c.542-3.903 2.107-6.568 3.834-8.076c-13.413-1.525-27.514-6.704-27.514-29.843c0-6.593 2.36-11.98 6.223-16.21c-.628-1.52-2.695-7.662.584-15.98c0 0 5.07-1.623 16.61 6.19C53.7 35 58.867 34.327 64 34.304c5.13.023 10.3.694 15.127 2.033c11.526-7.813 16.59-6.19 16.59-6.19c3.287 8.317 1.22 14.46.593 15.98c3.872 4.23 6.215 9.617 6.215 16.21c0 23.194-14.127 28.3-27.574 29.796c2.167 1.874 4.097 5.55 4.097 11.183c0 8.08-.07 14.583-.07 16.572c0 1.607 1.088 3.49 4.148 2.897c23.98-7.994 41.263-30.622 41.263-57.294C124.388 32.14 97.35 5.104 64 5.104z" clip-rule="evenodd"/&gt;&lt;path d="M26.484 91.806c-.133.3-.605.39-1.035.185c-.44-.196-.685-.605-.543-.906c.13-.31.603-.395 1.04-.188c.44.197.69.61.537.91zm2.446 2.729c-.287.267-.85.143-1.232-.28c-.396-.42-.47-.983-.177-1.254c.298-.266.844-.14 1.24.28c.394.426.472.984.17 1.255zm2.382 3.477c-.37.258-.976.017-1.35-.52c-.37-.538-.37-1.183.01-1.44c.373-.258.97-.025 1.35.507c.368.545.368 1.19-.01 1.452zm3.261 3.361c-.33.365-1.036.267-1.552-.23c-.527-.487-.674-1.18-.343-1.544c.336-.366 1.045-.264 1.564.23c.527.486.686 1.18.333 1.543zm4.5 1.951c-.147.473-.825.688-1.51.486c-.683-.207-1.13-.76-.99-1.238c.14-.477.823-.7 1.512-.485c.683.206 1.13.756.988 1.237m4.943.361c.017.498-.563.91-1.28.92c-.723.017-1.308-.387-1.315-.877c0-.503.568-.91 1.29-.924c.717-.013 1.306.387 1.306.88zm4.598-.782c.086.485-.413.984-1.126 1.117c-.7.13-1.35-.172-1.44-.653c-.086-.498.422-.997 1.122-1.126c.714-.123 1.354.17 1.444.663zm0 0"/&gt;&lt;/g&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;span class="inline-block pr-1"&gt;
&lt;svg style="height: 1em; transform: translateY(0.1em);" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"&gt;&lt;g fill="#623697"&gt;&lt;path d="M61.195 0h4.953c12.918.535 25.688 4.89 36.043 12.676c9.809 7.289 17.473 17.437 21.727 28.906c2.441 6.387 3.664 13.18 4.082 19.992v4.211c-.414 11.293-3.664 22.52-9.73 32.082c-6.801 10.895-16.922 19.73-28.727 24.828A64.4 64.4 0 0 1 65.082 128h-2.144c-11.735-.191-23.41-3.66-33.297-9.992c-11.196-7.113-20.114-17.785-25.028-30.117C1.891 81.19.441 74.02 0 66.812v-4.957c.504-14.39 5.953-28.609 15.41-39.496C23.168 13.31 33.5 6.48 44.887 2.937C50.172 1.27 55.676.41 61.195 0M25.191 37.523c-.03 12.153-.011 24.305-.011 36.454c1.43.011 2.86.011 4.293.011c-.075-10.433.101-20.863-.106-31.293c.48.907.918 1.84 1.465 2.707C37.035 54.91 43.105 64.5 49.309 74q2.607-.035 5.214.004c-.003-12.16-.007-24.32.004-36.48a308 308 0 0 0-4.25-.012c.075 10.32-.136 20.64.125 30.949c-6.507-10.352-13.101-20.645-19.695-30.945a371 371 0 0 0-5.516.007m38.844-.011c-.129 12.16-.004 24.32-.047 36.476c6.469-.015 12.938.024 19.41-.02a83 83 0 0 1 .024-3.952c-5.012-.016-10.027.007-15.043-.02c-.074-4.21-.004-8.426-.04-12.637c4.395-.078 8.79.012 13.18-.047c-.011-1.277-.011-2.554-.019-3.832c-4.387.141-8.773-.054-13.164.012q.019-6.035.02-12.078c4.699 0 9.398-.02 14.093.012c-.008-1.301 0-2.606.016-3.906c-6.145-.016-12.29-.008-18.43-.008m22.602.054c.004 1.266.004 2.528.008 3.79c3.488-.04 6.972.109 10.46.035c-.023 10.863.004 21.718-.011 32.574c1.46.043 2.93.035 4.39-.09c-.12-5.992.118-11.988-.156-17.977c.067-2.699-.07-5.394.117-8.09c.106-2.14-.277-4.277-.035-6.417c3.516.047 7.035.015 10.55.015a60 60 0 0 1 .075-3.832c-8.469-.105-16.937-.094-25.398-.008M13.55 69.094c-1.977.91-2.106 4.023-.149 5.027c1.72 1.18 4.305-.371 4.227-2.41c.133-2.004-2.29-3.688-4.078-2.617m29.23 15.289c-4.277 3.469-4.226 11.195.5 14.25c2.668 1.695 6.102 1.344 8.922.215q.017-.93.05-1.86c-2.671 1.395-6.41 1.68-8.675-.61c-2.965-3.237-2.297-9.269 1.613-11.476c2.211-1.164 4.907-.824 7.086.239c-.007-.66-.004-1.32 0-1.98c-3.097-1.099-6.922-1.04-9.496 1.222m17.207 2.71c-1.89.22-3.758 1.22-4.633 2.966c-1.253 2.496-1.109 5.867.864 7.96c2.035 2.297 5.945 2.32 8.18.297c2.425-2.308 2.699-6.468.757-9.164c-1.148-1.629-3.273-2.183-5.168-2.058m17.887 2.722c-1.66 2.883-1.332 7.25 1.598 9.211c2.183 1.22 4.933.832 7.074-.308q-.008-.927.031-1.848c-1.687 1.07-3.937 1.856-5.812.777c-1.309-.722-1.704-2.257-1.914-3.625c2.875-.039 5.746-.082 8.625-.074c-.075-1.828-.118-3.894-1.45-5.308c-2.199-2.43-6.644-1.657-8.152 1.175M69.46 87.48v12.008q.98-.001 1.973.004c.023-2.195-.04-4.394.023-6.594c.016-1.27.527-2.558 1.484-3.414c.801-.605 1.883-.27 2.801-.246q-.018-.954-.023-1.902c-1.793-.398-3.336.652-4.242 2.117c-.02-.633-.04-1.266-.051-1.894q-.986-.037-1.965-.079m0 0"/&gt;&lt;path d="M58.758 89.223c1.652-.805 4.023-.41 4.945 1.3c1.05 1.887 1.027 4.383-.137 6.211c-1.52 2.286-5.527 1.786-6.523-.742c-1.008-2.258-.617-5.484 1.715-6.77zm20.282 3.191c.046-1.574 1.144-3.137 2.726-3.48c.976-.164 2.097.007 2.773.793c.672.714.813 1.714.98 2.64c-2.16.012-4.32-.031-6.48.047zm0 0"/&gt;&lt;/g&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="weiterführende-ressourcen"&gt;Weiterführende Ressourcen&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Container / Docker für Einsteiger*innen am eigenen Laptop</title><link>https://kurse.richter.consulting/events/docker-x486660/</link><pubDate>Tue, 02 Jun 2026 07:00:00 +0100</pubDate><guid>https://kurse.richter.consulting/events/docker-x486660/</guid><description>&lt;p&gt;Die eigene Software ist oft von externen Services abhängig. Diese können auf dem Entwicklungsrechner installiert werden. Noch einfacher, sicherer und schneller geht es aber mit den Containern. Lernen Sie in diesem Kurs die Grundlagen von Docker, Container, Images, Orchestrierung, Docker Compose, die Sie für Ihren eigenen
Entwickleralltag benötigen.&lt;/p&gt;
&lt;h2 id="voraussetzung"&gt;Voraussetzung:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;sicherer Umgang mit einem PC sowie&lt;/li&gt;
&lt;li&gt;grundlegende Programmierkenntnisse.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;Hinweis&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Bitte bringen Sie Ihren Laptop oder MacGerät inkl. Ladegerät mit.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="nächster-termin-an-der-mvhs"&gt;Nächster Termin an der MVHS&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2x, 12.12.2026 - 13.12.2026
&lt;ol&gt;
&lt;li&gt;Sa. 12.12.2026, 10:00 – 15:00 Uhr&lt;/li&gt;
&lt;li&gt;So. 13.12.2026, 10:00 – 15:00 Uhr&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Container / Docker für Einsteiger*innen am eigenen Laptop</title><link>https://kurse.richter.consulting/events/docker-w486660/</link><pubDate>Sun, 01 Feb 2026 07:00:00 +0100</pubDate><guid>https://kurse.richter.consulting/events/docker-w486660/</guid><description>&lt;p&gt;Die eigene Software ist oft von externen Services abhängig. Diese können auf dem Entwicklungsrechner installiert werden. Noch einfacher, sicherer und schneller geht es aber mit den Containern. Lernen Sie in diesem Kurs die Grundlagen von Docker, Container, Images, Orchestrierung, Docker Compose, die Sie für Ihren eigenen
Entwickleralltag benötigen.&lt;/p&gt;
&lt;h2 id="voraussetzung"&gt;Voraussetzung:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;sicherer Umgang mit einem PC sowie&lt;/li&gt;
&lt;li&gt;grundlegende Programmierkenntnisse.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;Hinweis&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Bitte bringen Sie Ihren Laptop oder MacGerät inkl. Ladegerät mit.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="nächster-termin-an-der-mvhs"&gt;Nächster Termin an der MVHS&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2x, 13.06.2026 - 14.06.2026
&lt;ol&gt;
&lt;li&gt;Sa. 13.06.2026, 10:00 – 15:00 Uhr&lt;/li&gt;
&lt;li&gt;So. 14.06.2026, 10:00 – 15:00 Uhr&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Workshop: Container / Docker für Einsteiger*innen</title><link>https://kurse.richter.consulting/courses/container/</link><pubDate>Sat, 07 Dec 2024 00:00:00 +0000</pubDate><guid>https://kurse.richter.consulting/courses/container/</guid><description>&lt;ul&gt;
&lt;li&gt;
&lt;span class="inline-block pr-1"&gt;
&lt;svg style="height: 1em; transform: translateY(0.1em);" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M3.75 3v11.25A2.25 2.25 0 0 0 6 16.5h2.25M3.75 3h-1.5m1.5 0h16.5m0 0h1.5m-1.5 0v11.25A2.25 2.25 0 0 1 18 16.5h-2.25m-7.5 0h7.5m-7.5 0l-1 3m8.5-3l1 3m0 0l.5 1.5m-.5-1.5h-9.5m0 0l-.5 1.5m.75-9l3-3l2.148 2.148A12.1 12.1 0 0 1 16.5 7.605"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;span class="inline-block pr-1"&gt;
&lt;svg style="height: 1em; transform: translateY(0.1em);" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 0 1 2.25-2.25h13.5A2.25 2.25 0 0 1 21 7.5v11.25m-18 0A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75m-18 0v-7.5A2.25 2.25 0 0 1 5.25 9h13.5A2.25 2.25 0 0 1 21 11.25v7.5m-9-6h.008v.008H12zM12 15h.008v.008H12zm0 2.25h.008v.008H12zM9.75 15h.008v.008H9.75zm0 2.25h.008v.008H9.75zM7.5 15h.008v.008H7.5zm0 2.25h.008v.008H7.5zm6.75-4.5h.008v.008h-.008zm0 2.25h.008v.008h-.008zm0 2.25h.008v.008h-.008zm2.25-4.5h.008v.008H16.5zm0 2.25h.008v.008H16.5z"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Programmierenn Sie gerne? Nervt es Sie immer wieder, die notwendigen Services (wie Datenbanken) auf Ihrem System immer in der richtigen Version pflegen zu müssen? Sind Sie es leid, dass diese Services die Ressourcen Ihres Rechners belegen, auch wenn Sie diese gar nicht benötigen?&lt;/p&gt;
&lt;p&gt;Lernen Sie, wie Sie mit Containern diese Probleme auf eine einfache Art lösen können. Starten Sie die notwendigen Services als Container wann Sie diese benötigen (in der geforderten Version) und stoppen diese zu jeder Zeit.&lt;/p&gt;
&lt;div class="callout flex px-4 py-3 mb-6 rounded-md border-l-4 bg-blue-100 dark:bg-blue-900 border-blue-500"
data-callout="note"
data-callout-metadata=""&gt;
&lt;span class="callout-icon pr-3 pt-1 text-blue-600 dark:text-blue-300"&gt;
&lt;svg height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"&gt;&lt;path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="m16.862 4.487l1.687-1.688a1.875 1.875 0 1 1 2.652 2.652L6.832 19.82a4.5 4.5 0 0 1-1.897 1.13l-2.685.8l.8-2.685a4.5 4.5 0 0 1 1.13-1.897zm0 0L19.5 7.125"/&gt;&lt;/svg&gt;
&lt;/span&gt;
&lt;div class="callout-content dark:text-neutral-300"&gt;
&lt;div class="callout-title font-semibold mb-1"&gt;Hinweis&lt;/div&gt;
&lt;div class="callout-body"&gt;&lt;p&gt;Die Code-Beispiele werden für Linux/macOS in Bash und unter Windows in PowerShell (Core) abgebildet. Sind die erforderlichen Befehle gleich, werden diese nur in Bash angezeigt. Die Anweisungen können 1:1 in PowerShell eingegeben werden.&lt;/p&gt;
&lt;p&gt;Die
sind Blazor Server Projekte, um unterschiedliche Szenarien repräsentieren zu können. Ich nutze diesen Technologie-Stack vor allem, weil ich mich hier am wohlsten fühle. .Net ist keine Voraussetzung, um Container nutzen zu können. Zum Ausführen von diesen Projekten ist installiertes
erforderlich.&lt;/p&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="hb-cards mt-4 grid gap-4 not-prose" style="--hb-cols: 1;"&gt;
&lt;a
class="hb-card group"href="install" &gt;
&lt;span class="hb-card-title p-4"&gt;
&lt;svg style="height: 1em; width: 1em;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"&gt;&lt;path fill="#293138" d="M112.205 26.129L71.8 2.142A15.3 15.3 0 0 0 64.005 0c-2.688 0-5.386.717-7.796 2.152L15.795 26.14C10.976 28.999 8 34.289 8 40.018v47.975c0 5.729 2.967 11.019 7.796 13.878L56.2 125.858A15.2 15.2 0 0 0 63.995 128a15.3 15.3 0 0 0 7.796-2.142l40.414-23.987c4.819-2.86 7.796-8.16 7.796-13.878V40.007c0-5.718-2.967-11.019-7.796-13.878m-31.29 74.907l.063 3.448c0 .418-.267.889-.588 1.06l-2.046 1.178c-.321.16-.6-.032-.6-.45l-.032-3.394c-1.745.728-3.523.9-4.647.45c-.214-.086-.31-.397-.225-.76l.739-3.117c.064-.246.193-.493.364-.643a.7.7 0 0 1 .193-.139c.117-.064.235-.075.332-.032c1.22.407 2.773.214 4.272-.535c1.907-.964 3.18-2.913 3.16-4.84c-.022-1.757-.964-2.474-3.267-2.496c-2.934.01-5.675-.567-5.718-4.894c-.032-3.555 1.81-7.26 4.744-9.595l-.032-3.48c0-.428.257-.9.589-1.07l1.98-1.264c.322-.161.6.042.6.46l.033 3.48c1.456-.578 2.72-.738 3.865-.47c.247.063.364.406.257.802l-.77 3.084a1.4 1.4 0 0 1-.354.622a.8.8 0 0 1-.203.15c-.108.053-.204.064-.3.053c-.525-.118-1.767-.385-3.727.6c-2.056 1.038-2.773 2.827-2.763 4.155c.022 1.585.825 2.066 3.63 2.11c3.738.063 5.344 1.691 5.387 5.45c.053 3.684-1.917 7.657-4.937 10.077zm28.206-64.787L70.89 59.86c-4.765 2.784-8.278 5.911-8.288 11.662v47.107c0 3.437 1.392 5.665 3.523 6.318a13 13 0 0 1-2.12.204c-2.239 0-4.445-.61-6.383-1.757L17.219 99.408c-3.951-2.345-6.403-6.725-6.403-11.426V40.007c0-4.7 2.452-9.08 6.403-11.426L57.634 4.594a12.56 12.56 0 0 1 6.382-1.756c2.238 0 4.444.61 6.382 1.756l40.415 23.987c3.33 1.981 5.579 5.397 6.21 9.242c-1.36-2.86-4.38-3.63-7.902-1.574"/&gt;&lt;path fill="#4fa847" d="m101.614 92.619l-10.066 6.018c-.268.16-.46.332-.46.653v2.635c0 .32.214.46.481.3l10.216-6.212c.268-.16.31-.45.31-.77v-2.324c0-.322-.213-.45-.481-.3"/&gt;&lt;/svg&gt;Installation von Docker Desktop&lt;/span&gt;&lt;/a&gt;
&lt;/div&gt;</description></item><item><title>Container / Docker für Einsteiger*innen</title><link>https://kurse.richter.consulting/slides/container/</link><pubDate>Sat, 07 Dec 2024 00:00:00 +0000</pubDate><guid>https://kurse.richter.consulting/slides/container/</guid><description>&lt;h1 id="container--docker-für-einsteigerinnen"&gt;Container / Docker für Einsteiger*innen&lt;/h1&gt;
&lt;blockquote class="border-l-4 border-neutral-300 dark:border-neutral-600 pl-4 italic text-neutral-600 dark:text-neutral-400 my-6"&gt;
&lt;p&gt;Dipl. Ing. (FH) Eugen Richter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="themen"&gt;Themen&lt;/h2&gt;
&lt;ul&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;Container vs. VM vs. Bare Metall&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;Container / Image&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;Orchestrierung&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;Container Hubs / Registries&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;Docker Geschichte&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;Weiterführende Themen&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;Workshop&lt;/li&gt;
&lt;/span&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="container-vs-vm-vs-bare-metall"&gt;Container vs. VM vs. Bare Metall&lt;/h3&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="./container_vs_vm_vs_bare_metal.svg" alt="Container vs. VM vs. Bare Metall" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="bare-metall"&gt;Bare Metall&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Pro
&lt;ul&gt;
&lt;li&gt;Alle Ressourcen der Hardware nutzbar&lt;/li&gt;
&lt;li&gt;Wiederverwendung von Abhängigkeiten&lt;/li&gt;
&lt;li&gt;Schnelle App Startzeiten&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Kontra
&lt;ul&gt;
&lt;li&gt;Auslastung der Hardware mit einer Applikation&lt;/li&gt;
&lt;li&gt;HW-Größe basierend am max. Auslastung&lt;/li&gt;
&lt;li&gt;App Abhängigkeiten&lt;/li&gt;
&lt;li&gt;Skalierung (neu HW + Installation)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;aside class="notes"&gt;
&lt;ul&gt;
&lt;li&gt;Pro: Es stehen alle HW Ressourcen zur Verfügung und alle Erweiterungsmöglichkeiten (Erweiterungskarten, Beschleuniger, &amp;hellip;)&lt;/li&gt;
&lt;li&gt;Kontra:
&lt;ul&gt;
&lt;li&gt;Eine Applikation kann die HW oft nicht (gleichmäßig) auslasten&lt;/li&gt;
&lt;li&gt;Dimensionierung nach max. zu erwartenden Auslastung&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;hr&gt;
&lt;h3 id="virtualisierung"&gt;Virtualisierung&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Pro
&lt;ul&gt;
&lt;li&gt;Abhängigkeiten können in der VM isoliert werden&lt;/li&gt;
&lt;li&gt;Unterschiedliche Betriebssysteme pro VM möglich&lt;/li&gt;
&lt;li&gt;Vorlagen / Images möglich (für Skalierung)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Kontra
&lt;ul&gt;
&lt;li&gt;Höher Ressourcenverbrauch pro VM (eigenständiges Betriebssystem)&lt;/li&gt;
&lt;li&gt;Lange Startzeiten (Hochfahren der VM)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;aside class="notes"&gt;
&lt;ul&gt;
&lt;li&gt;Pro
&lt;ul&gt;
&lt;li&gt;Abhängigkeiten: Pro VM könne die Bibliotheken in der Notwendigen Version vorgehalten werden&lt;/li&gt;
&lt;li&gt;OS: Pro VM kann ein anderen (optimiertes) OS gewählt werden&lt;/li&gt;
&lt;li&gt;Vorlagen: VM-Images können schnell auf einer neuen / selben HW gestartet werden&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Kontra:
&lt;ul&gt;
&lt;li&gt;Hardwareverbrauch: Jede VM hat eigenes OS mit dem Verbrauch (Arbeitsspeicher, SSD, CPU)&lt;/li&gt;
&lt;li&gt;Vor der App muss noch OS gestartet werden&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;hr&gt;
&lt;h3 id="containerisierung"&gt;Containerisierung&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Pro
&lt;ul&gt;
&lt;li&gt;Sehr schnelle Startzeit&lt;/li&gt;
&lt;li&gt;Kein Verbrauch &amp;ldquo;unnötiger&amp;rdquo; Ressourcen&lt;/li&gt;
&lt;li&gt;Isolierung der Abhängigkeiten pro Container&lt;/li&gt;
&lt;li&gt;Skalierung&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Kontra
&lt;ul&gt;
&lt;li&gt;Nur Betriebssystem des Host&lt;/li&gt;
&lt;li&gt;Nicht alle &amp;ldquo;Features&amp;rdquo; der HW können direkt genutzt werden&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;aside class="notes"&gt;
&lt;ul&gt;
&lt;li&gt;Pro
&lt;ul&gt;
&lt;li&gt;Startzeit: Nur die App muss gestartet werden (kein OS)&lt;/li&gt;
&lt;li&gt;Ressourcen: Nur App-Verbrauch. Sehr kleiner Footprint für die OS Ressourcen&lt;/li&gt;
&lt;li&gt;Isolation: Isolation durch &lt;code&gt;cgroup&lt;/code&gt;. Zuordnung der Ressourcen möglich (CPU / RAM)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Kontra:
&lt;ul&gt;
&lt;li&gt;OS: Container läuft isoliert auf dem Host-Betriebssystem (nutzt dieselben Sys-Calls)&lt;/li&gt;
&lt;li&gt;Features: Spezialhardware ist nicht einfach durch Container nutzbar (GPU geht bereits)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;hr&gt;
&lt;p&gt;
&lt;figure &gt;
&lt;div class="flex justify-center "&gt;
&lt;div class="w-full" &gt;&lt;img src="./container_vs_vm_vs_bare_metal.svg" alt="Container vs. VM vs. Bare Metall" loading="lazy" data-zoomable /&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="container--images"&gt;Container / Images&lt;/h2&gt;
&lt;hr&gt;
&lt;h3 id="image"&gt;Image&lt;/h3&gt;
&lt;span class="fragment " &gt;
&lt;ul&gt;
&lt;li&gt;Bauplan für einen Container&lt;/li&gt;
&lt;li&gt;Beschreibt die Software und ihre Abhängigkeiten&lt;/li&gt;
&lt;li&gt;Ist ein Schichten-Dateisystem&lt;/li&gt;
&lt;li&gt;Jede Schicht entspricht einer Änderung an der vorherigen Schicht&lt;/li&gt;
&lt;/ul&gt;
&lt;/span&gt;
&lt;hr&gt;
&lt;h3 id="container"&gt;Container&lt;/h3&gt;
&lt;span class="fragment " &gt;
&lt;ul&gt;
&lt;li&gt;Instanz, die aus einem Image erstellt wurde&lt;/li&gt;
&lt;li&gt;Letzter Layer im Dateisystem ist beschreibbar&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Die&amp;rdquo; laufende Applikation&lt;/li&gt;
&lt;li&gt;Kann beim Start parametrisiert werden&lt;/li&gt;
&lt;/ul&gt;
&lt;/span&gt;
&lt;hr&gt;
&lt;h2 id="orchestrierung"&gt;Orchestrierung&lt;/h2&gt;
&lt;span class="fragment " &gt;
&lt;h3 id="problem"&gt;Problem&lt;/h3&gt;
&lt;/span&gt;
&lt;ul&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;Abhängigkeiten zwischen Containern&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;Startreihenfolge&lt;/li&gt;
&lt;/span&gt;
&lt;/ul&gt;
&lt;span class="fragment " &gt;
&lt;h3 id="lösung"&gt;Lösung&lt;/h3&gt;
&lt;/span&gt;
&lt;ul&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;Orchestrierung&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;
&lt;span class="inline-block pr-1"&gt;
&lt;svg style="height: 1em; transform: translateY(0.1em);" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"&gt;&lt;path fill="#3a4d54" fill-rule="evenodd" d="M73.8 50.8h11.3v11.5h5.7c2.6 0 5.3-.5 7.8-1.3c1.2-.4 2.6-1 3.8-1.7c-1.6-2.1-2.4-4.7-2.6-7.3c-.3-3.5.4-8.1 2.8-10.8l1.2-1.4l1.4 1.1c3.6 2.9 6.5 6.8 7.1 11.4c4.3-1.3 9.3-1 13.1 1.2l1.5.9l-.8 1.6c-3.2 6.2-9.9 8.2-16.4 7.8c-9.8 24.3-31 35.8-56.8 35.8c-13.3 0-25.5-5-32.5-16.8l-.1-.2l-1-2.1c-2.4-5.2-3.1-10.9-2.6-16.6l.2-1.7h9.6V50.8h11.3V39.6h22.5V28.3h13.5z" clip-rule="evenodd"/&gt;&lt;path fill="#00aada" d="M110.4 55.1c.8-5.9-3.6-10.5-6.4-12.7c-3.1 3.6-3.6 13.2 1.3 17.2c-2.8 2.4-8.5 4.7-14.5 4.7H18.6c-.6 6.2.5 11.9 3 16.8l.8 1.5c.5.9 1.1 1.7 1.7 2.6c3 .2 5.7.3 8.2.2c4.9-.1 8.9-.7 12-1.7c.5-.2.9.1 1.1.5c.2.5-.1.9-.5 1.1c-.4.1-.8.3-1.3.4c-2.4.7-5 1.1-8.3 1.3h-.6c-1.3.1-2.7.1-4.2.1c-1.6 0-3.1 0-4.9-.1c6 6.8 15.4 10.8 27.2 10.8c25 0 46.2-11.1 55.5-35.9c6.7.7 13.1-1 16-6.7c-4.5-2.7-10.5-1.8-13.9-.1"/&gt;&lt;path fill="#28b8eb" d="M110.4 55.1c.8-5.9-3.6-10.5-6.4-12.7c-3.1 3.6-3.6 13.2 1.3 17.2c-2.8 2.4-8.5 4.7-14.5 4.7h-68c-.3 9.5 3.2 16.7 9.5 21c4.9-.1 8.9-.7 12-1.7c.5-.2.9.1 1.1.5c.2.5-.1.9-.5 1.1c-.4.1-.8.3-1.3.4c-2.4.7-5.2 1.2-8.5 1.4l-.1-.1c8.5 4.4 20.8 4.3 35-1.1c15.8-6.1 30.6-17.7 40.9-30.9c-.2.1-.4.1-.5.2"/&gt;&lt;path fill="#028bb8" d="M18.7 71.8c.4 3.3 1.4 6.4 2.9 9.3l.8 1.5c.5.9 1.1 1.7 1.7 2.6c3 .2 5.7.3 8.2.2c4.9-.1 8.9-.7 12-1.7c.5-.2.9.1 1.1.5c.2.5-.1.9-.5 1.1c-.4.1-.8.3-1.3.4c-2.4.7-5.2 1.2-8.5 1.4h-.4c-1.3.1-2.7.1-4.1.1c-1.6 0-3.2 0-4.9-.1c6 6.8 15.5 10.8 27.3 10.8c21.4 0 40-8.1 50.8-26H18.7z"/&gt;&lt;path fill="#019bc6" d="M23.5 71.8c1.3 5.8 4.3 10.4 8.8 13.5c4.9-.1 8.9-.7 12-1.7c.5-.2.9.1 1.1.5c.2.5-.1.9-.5 1.1c-.4.1-.8.3-1.3.4c-2.4.7-5.2 1.2-8.6 1.4c8.5 4.4 20.8 4.3 34.9-1.1c8.5-3.3 16.8-8.2 24.2-14.1z"/&gt;&lt;path fill="#00acd3" fill-rule="evenodd" d="M28.4 52.7h9.8v9.8h-9.8zm.8.8h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm3-12h9.8v9.8h-9.8zm.9.8h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#23c2ee" fill-rule="evenodd" d="M39.6 52.7h9.8v9.8h-9.8zm.9.8h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#00acd3" fill-rule="evenodd" d="M50.9 52.7h9.8v9.8h-9.8zm.8.8h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#23c2ee" fill-rule="evenodd" d="M50.9 41.5h9.8v9.8h-9.8zm.8.8h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm3.1 10.4H72v9.8h-9.8zm.8.8h.8v8.1H63zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#00acd3" fill-rule="evenodd" d="M62.2 41.5H72v9.8h-9.8zm.8.8h.8v8.1H63zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#23c2ee" fill-rule="evenodd" d="M62.2 30.2H72V40h-9.8zm.8.8h.8v8.1H63zm1.5 0h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#00acd3" fill-rule="evenodd" d="M73.5 52.7h9.8v9.8h-9.8zm.8.8h.8v8.1h-.8zm1.4 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8zm1.5 0h.8v8.1h-.8z" clip-rule="evenodd"/&gt;&lt;path fill="#d4eef1" fill-rule="evenodd" d="M48.8 78.3c1.5 0 2.7 1.2 2.7 2.7s-1.2 2.7-2.7 2.7s-2.7-1.2-2.7-2.7s1.2-2.7 2.7-2.7" clip-rule="evenodd"/&gt;&lt;path fill="#3a4d54" fill-rule="evenodd" d="M48.8 79.1c.2 0 .5 0 .7.1c-.2.1-.4.4-.4.7c0 .4.4.8.8.8c.3 0 .6-.2.7-.4c.1.2.1.5.1.7c0 1.1-.9 1.9-1.9 1.9c-1.1 0-1.9-.9-1.9-1.9s.8-1.9 1.9-1.9M1.1 72.8h125.4c-2.7-.7-8.6-1.6-7.7-5.2c-5 5.7-16.9 4-20 1.2c-3.4 4.9-23 3-24.3-.8c-4.2 5-17.3 5-21.5 0c-1.4 3.8-21 5.7-24.3.8c-3 2.8-15 4.5-20-1.2c1.1 3.5-4.9 4.5-7.6 5.2" clip-rule="evenodd"/&gt;&lt;path fill="#bfdbe0" d="M56 97.8c-6.7-3.2-10.3-7.5-12.4-12.2c-2.5.7-5.5 1.2-8.9 1.4c-1.3.1-2.7.1-4.1.1c-1.7 0-3.4 0-5.2-.1c6 6 13.6 10.7 27.5 10.8z"/&gt;&lt;path fill="#d4eef1" d="M46.1 89.9c-.9-1.3-1.8-2.8-2.5-4.3c-2.5.7-5.5 1.2-8.9 1.4c2.3 1.2 5.7 2.4 11.4 2.9"/&gt;&lt;/svg&gt;
&lt;/span&gt; Docker Compose&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;
&lt;span class="inline-block pr-1"&gt;
&lt;svg style="height: 1em; transform: translateY(0.1em);" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"&gt;&lt;path fill="#326ce5" d="M63.556 1.912a8.51 8.44 0 0 0-3.26.826L15.795 24a8.51 8.44 0 0 0-4.604 5.725L.214 77.485a8.51 8.44 0 0 0 1.155 6.47a8.51 8.44 0 0 0 .484.672l30.8 38.296a8.51 8.44 0 0 0 6.653 3.176l49.394-.012a8.51 8.44 0 0 0 6.653-3.17l30.789-38.301a8.51 8.44 0 0 0 1.645-7.142l-10.996-47.76a8.51 8.44 0 0 0-4.604-5.726L67.682 2.738a8.51 8.44 0 0 0-4.126-.826"/&gt;&lt;path fill="#fff" d="M63.975 18.143v.01c-1.472.014-2.664 1.336-2.664 2.972c0 .028.005.052.005.074c-.002.222-.012.49-.005.684c.035.946.24 1.668.365 2.535c.17 1.42.215 2.547.224 3.687l.036-.164a41 41 0 0 0-.118-2.394c.139 1.228.24 2.364.186 3.392c-.015-.325-.061-.677-.066-.982l-.036.164c.003.347.096.79.069 1.123c-.061.29-.291.495-.467.742l-.025.121c.173-.227.354-.444.46-.699c-.134.423-.42.796-.707 1.094c.08-.124.146-.262.24-.385l.026-.12c-.145.203-.227.457-.385.61l-.006.006l-.064 1.12a35 35 0 0 0-4.797.736a34.3 34.3 0 0 0-17.398 9.935c-.296-.202-.8-.56-.95-.672l-.005-.005l-.01.002c-.478.064-.95.207-1.57-.153c-1.187-.8-2.271-1.907-3.584-3.24c-.601-.637-1.037-1.246-1.754-1.861c-.163-.141-.41-.33-.592-.473a3.2 3.2 0 0 0-1.87-.705c-.825-.028-1.62.294-2.14.947c-.925 1.16-.628 2.933.658 3.96l.04.026c.174.143.39.326.552.446c.762.561 1.457.849 2.21 1.293c1.594.984 2.91 1.798 3.956 2.779c.402.427.474 1.19.53 1.525v.008l.847.754c-4.561 6.874-6.675 15.36-5.432 24.006l-1.103.324l-.004.006c-.295.381-.712.972-1.135 1.147c-1.366.43-2.908.588-4.77.783c-.872.073-1.626.031-2.556.207c-.205.04-.49.112-.713.164l-.023.006l-.04.011c-1.58.383-2.6 1.837-2.27 3.272c.327 1.435 1.873 2.306 3.464 1.963l.039-.006h.002c.02-.005.038-.015.05-.018c.22-.048.496-.101.69-.154c.913-.245 1.574-.603 2.393-.916c1.76-.632 3.218-1.16 4.637-1.365c.582-.046 1.204.362 1.517.537l.008.004l1.152-.197c2.674 8.274 8.266 14.96 15.346 19.162l-.48 1.152l.003.01c.174.45.364 1.057.237 1.492c-.516 1.336-1.4 2.749-2.408 4.326c-.488.728-.99 1.295-1.43 2.131c-.107.201-.24.507-.342.717c-.69 1.475-.184 3.177 1.143 3.816c1.335.643 2.99-.036 3.707-1.513l.007-.008v-.01c.1-.207.242-.478.329-.674c.378-.866.505-1.607.77-2.441h-.003c.706-1.773 1.094-3.627 2.059-4.778c.26-.31.688-.432 1.136-.552l.01-.004l.6-1.084a34.44 34.44 0 0 0 24.556.062c.172.303.478.865.563 1.01l.004.006l.008.004c.458.149.948.223 1.35.816c.722 1.237 1.218 2.703 1.822 4.475c.265.832.397 1.575.775 2.441c.087.2.23.475.33.684c.715 1.482 2.375 2.163 3.713 1.52c1.326-.64 1.832-2.34 1.143-3.815c-.102-.21-.243-.518-.348-.719c-.441-.836-.943-1.397-1.43-2.125c-1.01-1.577-1.843-2.885-2.36-4.222c-.213-.685.036-1.104.206-1.555l.006-.014l-.01-.01a1 1 0 0 1-.09-.168a6 6 0 0 1-.12-.29c-.08-.21-.16-.442-.224-.596c7.358-4.35 12.786-11.285 15.34-19.295c.347.054.93.155 1.12.193l.01.002l.009-.004c.402-.265.76-.606 1.475-.549c1.419.205 2.876.734 4.638 1.366c.817.312 1.479.677 2.393.921c.194.052.47.101.69.149c.012.003.029.012.05.017h.002l.04.004c1.59.341 3.137-.528 3.464-1.963s-.691-2.888-2.272-3.269c-.227-.052-.551-.141-.775-.184c-.93-.176-1.683-.132-2.557-.205c-1.86-.195-3.402-.353-4.77-.783c-.547-.213-.942-.872-1.138-1.148l-.006-.006l-1.066-.31a34.4 34.4 0 0 0-.56-12.425a34.5 34.5 0 0 0-4.983-11.525c.278-.252.785-.701.932-.836l.007-.006v-.01c.044-.48.006-.97.495-1.494c1.045-.98 2.364-1.797 3.957-2.779c.754-.444 1.454-.731 2.214-1.293c.174-.128.408-.328.588-.473c1.286-1.026 1.584-2.798.658-3.959c-.925-1.16-2.718-1.267-4.003-.242c-.182.145-.43.332-.594.473c-.717.618-1.16 1.226-1.76 1.863c-1.313 1.335-2.398 2.446-3.586 3.246c-.507.294-1.258.193-1.603.172h-.008l-1.004.719c-5.775-6.048-13.63-9.916-22.09-10.672a64 64 0 0 1-.064-1.174v-.008l-.006-.006c-.35-.333-.76-.61-.864-1.318v-.002c-.115-1.428.077-2.967.3-4.824c.125-.867.332-1.59.366-2.535c.009-.216-.005-.527-.005-.758c0-1.645-1.203-2.982-2.688-2.982zm-3.514 13.7a35 35 0 0 0-3.59.552a35 35 0 0 1 3.59-.551zm-4.781.823a34 34 0 0 0-3.711 1.133a34 34 0 0 1 3.71-1.133zm-4.825 1.564a34 34 0 0 0-3.496 1.666a34 34 0 0 1 3.496-1.666M28.8 35.377q.212.03.418.086a3 3 0 0 0-.418-.086m.943.283q.198.096.38.219a3 3 0 0 0-.38-.219m16.549.848a34 34 0 0 0-3.176 2.14a34 34 0 0 1 3.176-2.14m14.346 2.344l-.787 13.93l-.057.029l-.002.013c-.002.05-.014.095-.02.143a2.4 2.4 0 0 1-.263.857q-.055.106-.121.207a2.35 2.35 0 0 1-.69.662c-.07.045-.147.08-.222.118a2.4 2.4 0 0 1-.873.226c-.045.003-.088.014-.133.014c-.05 0-.094-.022-.143-.026a2.3 2.3 0 0 1-.943-.304c-.045-.026-.094-.041-.137-.069l-.006.022l.004-.022c-.044-.027-.102-.016-.144-.047l-.012-.01l-.022.014l-11.421-8.097c.093-.091.192-.174.287-.264a27.4 27.4 0 0 1 3.23-2.635c.237-.165.473-.332.715-.49a27.4 27.4 0 0 1 3.816-2.078c.24-.107.487-.204.73-.305a27.4 27.4 0 0 1 4.044-1.312c.12-.03.238-.067.36-.094c.576-.13 1.162-.206 1.745-.299l.006-.025h.004l-.006.025c.355-.056.704-.14 1.06-.183zm6.726.002c.197.024.39.068.586.097a28 28 0 0 1 3.16.656q.618.166 1.225.36a28 28 0 0 1 3.033 1.168q.562.255 1.112.535a28 28 0 0 1 2.83 1.662q.514.346 1.015.717a28 28 0 0 1 2.496 2.074c.144.134.297.257.438.395l-11.346 8.044l-.04-.015l-.01.008c-.045.032-.094.045-.14.074a2.35 2.35 0 0 1-.882.334c-.077.012-.153.03-.23.033a2.35 2.35 0 0 1-.99-.176a2 2 0 0 1-.265-.127a2.35 2.35 0 0 1-.746-.65c-.05-.069-.088-.146-.13-.22a2.4 2.4 0 0 1-.288-.887c-.006-.055-.026-.103-.03-.159v-.011l-.011-.006zm-25.238.576a34 34 0 0 0-2.81 2.576a34 34 0 0 1 2.81-2.576m50.916 8.14a35 35 0 0 1 1.522 2.594a35 35 0 0 0-1.522-2.594m1.994 3.508q.732 1.491 1.317 3.045a35 35 0 0 0-1.317-3.045m-54.576.69l10.43 9.328l-.012.056l.01.008c.94.817 1.07 2.23.293 3.203c-.028.035-.068.057-.098.09a2.35 2.35 0 0 1-.986.65c-.043.015-.078.043-.121.055l-.014.002l-.012.047l-13.367 3.86c-.02-.185-.02-.37-.037-.555a27 27 0 0 1-.092-3.344q.019-.58.063-1.158a27 27 0 0 1 .457-3.307q.121-.61.273-1.215a27 27 0 0 1 .99-3.162q.21-.554.448-1.097a27 27 0 0 1 1.51-2.987c.09-.156.17-.32.265-.474m47.002.007c.097.158.176.324.27.483a28 28 0 0 1 1.53 3.01c.15.346.298.694.434 1.046a28 28 0 0 1 1.04 3.288c.045.175.104.346.144.523c.69 3.002.86 5.999.578 8.896l-13.434-3.87l-.011-.057l-.014-.004c-.045-.012-.084-.034-.127-.049a2.4 2.4 0 0 1-.79-.455q-.088-.076-.17-.16a2.35 2.35 0 0 1-.491-.824c-.027-.078-.044-.158-.063-.239a2.4 2.4 0 0 1-.03-.892c.009-.049.01-.096.02-.145c.01-.045.038-.084.05-.129a2.3 2.3 0 0 1 .599-.996c.034-.033.054-.076.09-.107l.01-.01l-.006-.03zm9.228 3.305q.497 1.448.864 2.938a35 35 0 0 0-.864-2.938m-34.824 6.752h4.262l2.65 3.314l-.95 4.133l-3.83 1.84l-3.837-1.848l-.953-4.132zm13.727 11.395c.18-.01.357.008.533.04l.014.003l.023-.03l13.828 2.338c-.064.18-.147.351-.215.53a28 28 0 0 1-1.36 3.011q-.284.544-.593 1.074a28 28 0 0 1-1.853 2.768q-.364.48-.748.941a28 28 0 0 1-2.29 2.432q-.436.41-.892.8a28 28 0 0 1-2.64 2.012c-.16.107-.31.225-.471.329l-5.365-12.967l.015-.022l-.004-.011c-.02-.045-.026-.092-.043-.137a2.4 2.4 0 0 1-.135-.889c.004-.081.006-.162.018-.242a2.35 2.35 0 0 1 .334-.89c.045-.072.098-.137.15-.204a2.4 2.4 0 0 1 .68-.578c.043-.024.079-.055.123-.076c.289-.139.59-.218.89-.232zm-23.31.056l.013.002c.03 0 .06.008.092.01a2.35 2.35 0 0 1 1.226.445q.103.074.196.158a2.35 2.35 0 0 1 .689 1.106c.008.03.022.059.03.09c.11.479.065.98-.13 1.431l-.005.012l.04.05l-5.31 12.837c-.155-.1-.3-.212-.451-.315a28 28 0 0 1-2.64-2.011a28 28 0 0 1-.891-.803a28 28 0 0 1-2.272-2.408q-.39-.468-.76-.951a28 28 0 0 1-1.82-2.704a27 27 0 0 1-.627-1.123a28 28 0 0 1-1.346-2.947c-.07-.181-.154-.356-.22-.539l13.707-2.326l.023.03l.014-.005q.22-.04.443-.039zm2.304 1.994a2 2 0 0 1 .02.344a2 2 0 0 0-.02-.344m-.008.703a2.3 2.3 0 0 1-.1.4q.067-.195.1-.4m9.334 2.944c.058-.002.114.013.172.015a2.3 2.3 0 0 1 .752.159c.054.021.112.03.164.056v.002a2.3 2.3 0 0 1 1.043.99l.006.012h.053l6.757 12.213c-.276.092-.557.173-.836.256a28 28 0 0 1-.996.277c-.283.074-.564.15-.85.215c-.124.029-.25.046-.376.072a27.5 27.5 0 0 1-4.18.561c-.28.016-.558.035-.838.043a27.5 27.5 0 0 1-4.32-.223c-.28-.036-.56-.085-.838-.13a27.5 27.5 0 0 1-4.055-.975c-.127-.041-.257-.072-.384-.115l6.742-12.188h.01l.007-.012c.026-.048.065-.085.094-.13a2.4 2.4 0 0 1 .606-.647q.123-.09.26-.164a2.4 2.4 0 0 1 .85-.262c.054-.005.103-.023.157-.025M52.297 98.69a34 34 0 0 0 3.758 1.137a34 34 0 0 1-3.758-1.137m23.385.09q-1.605.572-3.258.983a35 35 0 0 0 3.258-.983m-4.575 1.281a34 34 0 0 1-3.718.563a34 34 0 0 0 3.718-.563m-13.937.016a34 34 0 0 0 3.898.572a34 34 0 0 1-3.898-.572m8.91.649a34 34 0 0 1-3.851.005a34 34 0 0 0 3.85-.005z"/&gt;&lt;/svg&gt;
&lt;/span&gt; Kubernetes&lt;/li&gt;
&lt;/span&gt;
&lt;/ul&gt;
&lt;aside class="notes"&gt;
&lt;ul&gt;
&lt;li&gt;Docker Compose: Einfache Definition der Startreihenfolge und Abhängigkeiten in einer YAML Datei. Gut geeignet für lokale Entwicklung, Tests und kleinere Deployments.&lt;/li&gt;
&lt;li&gt;Kubernetes: Komplexere Orchestrierungen mit mehreren Nodes, Services, Replikas. Sinnvoll für große Deployments für Produktion, mit Autoscaling, Self-Healing &amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;hr&gt;
&lt;h2 id="hubs--registries"&gt;Hubs / Registries&lt;/h2&gt;
&lt;span class="fragment " &gt;
Speicherorte für veröffentlichte Images mit Versionen und meistens einer Beschreibung, wie das Image zu nutzen ist.
&lt;/span&gt;
&lt;hr&gt;
&lt;h3 id="bekannteste-anbieter-von-container-repositories"&gt;Bekannteste Anbieter von Container Repositories&lt;/h3&gt;
&lt;ul&gt;
&lt;span class="fragment " &gt;
&lt;li&gt;Docker Hub - hub.docker.com&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment " &gt;
&lt;li&gt;Quay.io - quay.io&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment " &gt;
&lt;li&gt;GitHub Container Registry&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment " &gt;
&lt;li&gt;Azure Container Registry&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment " &gt;
&lt;li&gt;Google Container Registry&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment " &gt;
&lt;li&gt;Amazon Elastic Container Registry&lt;/li&gt;
&lt;/span&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="docker---geschichte"&gt;Docker - Geschichte&lt;/h2&gt;
&lt;ul&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;2008: cgroup kommen in Linux an&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;2008: Gründung als dotCloud&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;2013: Ankündigung von Docker (mit RedHat)&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;2014: Partnerschaft mit Microsoft&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;2015: OCI Projekt&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;2015: Kubernetes 1.0&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;2018: GKS, AKS, EKS (Managed Kubernetes)&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;2021: Änderung der Linzenzierung&lt;/li&gt;
&lt;/span&gt;
&lt;/ul&gt;
&lt;aside class="notes"&gt;
&lt;ul&gt;
&lt;li&gt;2008: Gründung als dotCloud&lt;/li&gt;
&lt;li&gt;2013: Ankündigung von Docker für RedHat Open Shift. Umbenennung in Docker&lt;/li&gt;
&lt;li&gt;2014: Partnerschaft mit Microsoft (Docker for Windows) und Ankündigung für AWS&lt;/li&gt;
&lt;li&gt;2021: Kostenlos für kleine Firmen. Kostenpflichtig für Größere&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;hr&gt;
&lt;h2 id="weiterführende-themen"&gt;Weiterführende Themen&lt;/h2&gt;
&lt;ul&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;Kubernetes (Orchestrierung)&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;OCI - Open Container Initiative&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;CNCF - Cloud Native Computing Foundation&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;Alpine Linux&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;UNRAID (NAS auf Container Basis)&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;WebAssembly&lt;/li&gt;
&lt;/span&gt;
&lt;/ul&gt;
&lt;aside class="notes"&gt;
&lt;ul&gt;
&lt;li&gt;Kubernetes: Einarbeitung in die professionelle Orchestrierung von Containern und verwandten Diensten, wie Authorisierung, Persistenz, Discovery, &amp;hellip;&lt;/li&gt;
&lt;li&gt;OCI: Format für die Container Images&lt;/li&gt;
&lt;li&gt;CNCF: Viele Projekte in unterschiedlichen Stadien (von Sandbox bis Graduated). Projekte oft (aber nicht immer) mit Kubernetes verbunden.&lt;/li&gt;
&lt;li&gt;Alpine Linux: Sehr beliebtes, sehr kleines Basisimage (ca. 4MB)&lt;/li&gt;
&lt;li&gt;WebAssembly: Soll es noch &amp;ldquo;leichtgewichtiger&amp;rdquo; sein?&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;hr&gt;
&lt;h2 id="workshop"&gt;Workshop&lt;/h2&gt;
&lt;ul&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;Installation&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;Starten von vorhandenen Images&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;Nutzung als Entwickler (Beispiel Applikation)&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;Docker Compose (Orchestrierung)&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;Nutzung als Entwickler (Beispiel Applikation)&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;Eigenen Code als Image verpacken&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;Multi Step Builds&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;&lt;em&gt;Veröffentlichung der Images&lt;/em&gt;&lt;/li&gt;
&lt;/span&gt;
&lt;span class="fragment fade-in-then-semi-out" &gt;
&lt;li&gt;&lt;em&gt;Dev / Test Container&lt;/em&gt;&lt;/li&gt;
&lt;/span&gt;
&lt;/ul&gt;</description></item></channel></rss>