{"id":1180,"date":"2026-02-19T16:20:52","date_gmt":"2026-02-19T16:20:52","guid":{"rendered":"https:\/\/sudoit.pl\/?p=1180"},"modified":"2026-02-21T12:19:46","modified_gmt":"2026-02-21T12:19:46","slug":"docker-w-praktyce-na-debianie","status":"publish","type":"post","link":"https:\/\/sudoit.pl\/index.php\/2026\/02\/19\/docker-w-praktyce-na-debianie\/","title":{"rendered":"Docker w praktyce na Debianie"},"content":{"rendered":"\n<p>W poprzednim wpisie om\u00f3wi\u0142em podstawy teoretyczne konteneryzacji, kt\u00f3re moim zdaniem ka\u017cdy powinien zna\u0107. Je\u015bli jeszcze go nie czyta\u0142e\u015b, zacznij <a href=\"https:\/\/sudoit.pl\/index.php\/2026\/02\/16\/docker-dla-poczatkujacych-jak-rozwiazuje-problem-u-mnie-dziala\/\" type=\"link\" id=\"https:\/\/sudoit.pl\/index.php\/2026\/02\/16\/docker-dla-poczatkujacych-jak-rozwiazuje-problem-u-mnie-dziala\/\">tutaj<\/a>.<\/p>\n\n\n\n<p>Nadszed\u0142 wi\u0119c czas, aby zademonstrowa\u0107 dockera od strony praktycznej. Poka\u017c\u0119 Ci <strong>Dockera od strony praktycznej<\/strong> &#8211; od instalacji, przez pierwsze komendy, a\u017c po <strong>wolumeny<\/strong>, <strong>mapowanie port\u00f3w<\/strong> i spakowanie w\u0142asnej aplikacji <strong>Node.js<\/strong> do obrazu.<\/p>\n\n\n\n<p>Do demonstracji u\u017cywam <strong>maszyny wirtualnej z Debianem<\/strong> (interfejs sieciowy w trybie <strong>zmostkowanym<\/strong>), \u017ceby wygodnie wej\u015b\u0107 na kontener z poziomu przegl\u0105darki na ho\u015bcie. Je\u015bli nie wiesz, jak przygotowa\u0107 VM, zerknij do artyku\u0142u dotycz\u0105cego obs\u0142ugi <a href=\"https:\/\/sudoit.pl\/index.php\/2025\/12\/24\/virtualbox-dla-poczatkujacych-podstawy-instalacja-i-konfiguracja-maszyn-wirtualnych\/\">Virtualboxa<\/a>.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Instalacja Dockera i potrzebnych zale\u017cno\u015bci<\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<p>Najbardziej aktualny spos\u00f3b na instalacje Dockera na Debianie jak i innych systemach znajdziesz na oficjalnej stronie Dockera https:\/\/docs.docker.com\/engine\/install\/debian\/.<\/p>\n\n\n\n<p>Poni\u017cej masz sprawdzone przeze mnie kroki, kt\u00f3re musisz wykona\u0107, aby mie\u0107 gotowego do dzia\u0142ania Dockera wraz z pluginem Docker Compose.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Usu\u0144 stare paczki, kt\u00f3re mog\u0105 powodowa\u0107 konflikty<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-doc podman-docker containerd runc | cut -f1)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Skonfiguruj repozytorium apt Dockera<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update\nsudo apt install ca-certificates curl\nsudo install -m 0755 -d \/etc\/apt\/keyrings\nsudo curl -fsSL https:\/\/download.docker.com\/linux\/debian\/gpg -o \/etc\/apt\/keyrings\/docker.asc\nsudo chmod a+r \/etc\/apt\/keyrings\/docker.asc\n\nsudo tee \/etc\/apt\/sources.list.d\/docker.sources &lt;&lt;EOF\nTypes: deb\nURIs: https:\/\/download.docker.com\/linux\/debian\nSuites: $(. \/etc\/os-release &amp;&amp; echo \"$VERSION_CODENAME\")\nComponents: stable\nSigned-By: \/etc\/apt\/keyrings\/docker.asc\nEOF\n\nsudo apt update<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Zainstaluj Dockera<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Sprawd\u017a czy us\u0142uga dzia\u0142a (zwykle startuje automatycznie)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl status docker<\/code><\/pre>\n\n\n\n<p>Je\u015bli u Ciebie nie startuje automatycznie, w\u00f3wczas uruchom go r\u0119cznie<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl start docker<\/code><\/pre>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Uruchomienie pierwszego kontenera<\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<p>Okej, maj\u0105c zainstalowanego ju\u017c Dockera, mo\u017cesz przej\u015b\u0107 do uruchomienia pierwszego kontenera. Wyja\u015bni\u0119 Ci, co si\u0119 dzieje pod mask\u0105 i poka\u017ce Ci kilka komend, kt\u00f3re b\u0119dziesz wykorzystywa\u0142 praktycznie codziennie podczas pracy z kontenerami.<\/p>\n\n\n\n<p>Na pocz\u0105tek zademonstruj\u0119 jak uruchomi\u0107 najbardziej klasyczn\u0105 aplikacj\u0119 o nazwie <strong>hello-world<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"684\" src=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_run-1024x684.png\" alt=\"\" class=\"wp-image-1183\" srcset=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_run-1024x684.png 1024w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_run-300x200.png 300w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_run-768x513.png 768w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_run-585x391.png 585w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_run-263x175.png 263w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_run.png 1042w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Co si\u0119 dzieje po uruchomieniu tego polecenia?<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Je\u015bli nie masz obrazu <strong>hello-world<\/strong> lokalnie, Docker go pobierze z repozytori\u00f3w <strong>(pull)<\/strong>,<\/li>\n\n\n\n<li>potem go <strong>uruchomi<\/strong> jako kontener (run),<\/li>\n\n\n\n<li>kontener wypisze komunikat i\u2026 <strong>zako\u0144czy dzia\u0142anie<\/strong>.<\/li>\n<\/ul>\n\n\n\n<p>Kontenery nie musz\u0105 dzia\u0142a\u0107 ca\u0142y czas. Cz\u0119sto jest tak, \u017ce wykona zadanie i si\u0119 wy\u0142\u0105czy.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Sprawdzenie uruchomionych kontener\u00f3w<\/h3>\n\n\n\n<p>Mo\u017cesz \u0142atwo podejrze\u0107, kt\u00f3re kontenery aktualnie dzia\u0142aj\u0105 za pomoc\u0105 polecenia <strong>docker ps<\/strong>. Polecenie to jednak nie wy\u015bwietli zatrzymanych kontener\u00f3w, aby je wy\u015bwietli\u0107 nale\u017cy doda\u0107 prze\u0142\u0105cznik <strong>-a<\/strong> do polecenia.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"129\" src=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker-ps-1024x129.png\" alt=\"\" class=\"wp-image-1184\" srcset=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker-ps-1024x129.png 1024w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker-ps-300x38.png 300w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker-ps-768x97.png 768w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker-ps-1170x147.png 1170w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker-ps-585x74.png 585w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker-ps.png 1337w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Usuwanie kontener\u00f3w<\/h3>\n\n\n\n<p>Nieu\u017cywane kontenery mo\u017cna w \u0142atwy spos\u00f3b usun\u0105\u0107 za pomoc\u0105 polecenia <strong>docker rm<\/strong>, po kt\u00f3rym nale\u017cy wskaza\u0107 jego nazw\u0119 lub ID. Aby sprawdzi\u0107 identyfikator mo\u017cesz skorzysta\u0107 z polecenia, o kt\u00f3rym wspomnia\u0142em wy\u017cej. Mo\u017cna r\u00f3wnie\u017c usun\u0105\u0107 wszystkie wstrzymane kontenery za jednym zamachem za pomoc\u0105 polecenia <strong>docker system prune<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"165\" src=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker-rm-1024x165.png\" alt=\"\" class=\"wp-image-1185\" srcset=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker-rm-1024x165.png 1024w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker-rm-300x48.png 300w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker-rm-768x124.png 768w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker-rm-1170x188.png 1170w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker-rm-585x94.png 585w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker-rm.png 1435w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Wej\u015bcie do shella kontenera<\/h3>\n\n\n\n<p>Mo\u017ce zaj\u015b\u0107 potrzeba, \u017ce chcemy zajrze\u0107 do systemu kontenera i podejrze\u0107 co si\u0119 w nim znajduje, np. poleceniem ls. Do shella mo\u017cna si\u0119 dosta\u0107 w poni\u017cszy spos\u00f3b. Aby wyj\u015b\u0107 z shella, nale\u017cy skorzysta\u0107 z kombinacji klawiszy <strong>ctrl+D<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"995\" height=\"223\" src=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_exec-1.png\" alt=\"\" class=\"wp-image-1187\" srcset=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_exec-1.png 995w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_exec-1-300x67.png 300w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_exec-1-768x172.png 768w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_exec-1-585x131.png 585w\" sizes=\"(max-width: 995px) 100vw, 995px\" \/><\/figure>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Uruchamianie kontener\u00f3w na okre\u015blonym porcie<\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<p>Uruchamiaj\u0105c kontenery warto wiedzie\u0107 jak ustawia\u0107 porty. Bez wskazania port\u00f3w aplikacja uruchomi si\u0119 tylko wewn\u0105trz Dockera, z Twojej przegl\u0105darki na ho\u015bcie nie wejdziesz na niego po adresie. Dzieje si\u0119 tak poniewa\u017c aplikacja uruchomiona w kontenerze ma swoje porty <strong>wewn\u0105trz kontenera<\/strong>. Tw\u00f3j komputer (host) ich nie widzi, dop\u00f3ki mu nie powiesz:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u201eHej Docker, wystaw ten port na zewn\u0105trz\u201d.<\/p>\n<\/blockquote>\n\n\n\n<p>Do tego s\u0142u\u017cy mapowanie port\u00f3w. Najwa\u017cniejsze aby\u015b zapami\u0119ta\u0142, \u017ce: <\/p>\n\n\n\n<p class=\"has-vivid-green-cyan-color has-text-color has-link-color has-medium-font-size wp-elements-3861e088c48aba1006f20e3fb689891e\"><strong>host:kontener<\/strong><\/p>\n\n\n\n<p>czyli: port na Twoim komputerze \u2192 port w kontenerze.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Przyk\u0142ad dzia\u0142ania mapowania port\u00f3w<\/h3>\n\n\n\n<p>Do zademonstrowania mapowania port\u00f3w wykorzystam popularny serwer www o nazwie Nginx. Uruchomi\u0119 go w kontenerze na maszynie wirtualnej i spr\u00f3buje wej\u015b\u0107 na niego w przegl\u0105darce na ho\u015bcie.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -d --name web nginx<\/code><\/pre>\n\n\n\n<p>Zanim odpalisz przegl\u0105dark\u0119, musisz dowiedzie\u0107 si\u0119 jaki adres IP dosta\u0142a wirtualna maszyna. Mo\u017cesz to sprawdzi\u0107 poleceniem <strong>ip a<\/strong>. Pod podanym adresem powinien dzia\u0142a\u0107 serwer nginx. Na ten moment jednak otrzymasz b\u0142\u0105d ze wzgl\u0119du na to, \u017ce nie zdefiniowano mapowania portu dla hosta.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"409\" src=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/nginx-1024x409.png\" alt=\"\" class=\"wp-image-1190\" srcset=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/nginx-1024x409.png 1024w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/nginx-300x120.png 300w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/nginx-768x307.png 768w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/nginx-1536x613.png 1536w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/nginx-1170x467.png 1170w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/nginx-585x234.png 585w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/nginx.png 1916w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Po testach zatrzymaj i usu\u0144 kontener poni\u017cszymi poleceniami. Do zatrzymywania kontenera s\u0142u\u017cy polecenie <strong>docker stop<\/strong>. Polecenie to w bezpieczny spos\u00f3b zatrzymuje kontener. Istnieje r\u00f3wnie\u017c polecenie <strong>docker kill<\/strong>, kt\u00f3re robi to natychmiast.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"181\" src=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/nginx2-1024x181.png\" alt=\"\" class=\"wp-image-1191\" srcset=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/nginx2-1024x181.png 1024w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/nginx2-300x53.png 300w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/nginx2-768x135.png 768w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/nginx2-1170x206.png 1170w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/nginx2-585x103.png 585w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/nginx2.png 1332w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Aby naprawi\u0107 ten problem, wystarczy zmapowa\u0107 port, na kt\u00f3rym dzia\u0142a nginx w kontenerze, na przyk\u0142adowo port 8080 w systemie hosta<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -d --name web -p 8080:80 nginx<\/code><\/pre>\n\n\n\n<p>Teraz wejd\u017a w przegl\u0105darce na adres swojego serwera (u mnie 192.168.0.110). Dopisz tak\u017ce port po dwukropku. Powinna pojawi\u0107 si\u0119 strona powitalna serwera nginx.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"270\" src=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/nginx3-1024x270.png\" alt=\"\" class=\"wp-image-1192\" srcset=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/nginx3-1024x270.png 1024w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/nginx3-300x79.png 300w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/nginx3-768x202.png 768w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/nginx3-1536x404.png 1536w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/nginx3-1170x308.png 1170w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/nginx3-585x154.png 585w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/nginx3.png 1918w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Przywracanie nieaktywnych kontener\u00f3w<\/h3>\n\n\n\n<p>Wspomina\u0142em o mo\u017cliwo\u015bci zatrzymywania kontener\u00f3w za pomoc\u0105 polecenia <strong>docker stop<\/strong>. Mo\u017cemy r\u00f3wnie\u017c przywraca\u0107 zatrzymany w ten spos\u00f3b kontenery za pomoc\u0105 polecenia <strong>docker start<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"207\" src=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker-start-1024x207.png\" alt=\"\" class=\"wp-image-1193\" srcset=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker-start-1024x207.png 1024w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker-start-300x61.png 300w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker-start-768x155.png 768w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker-start-1536x310.png 1536w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker-start-1170x236.png 1170w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker-start-585x118.png 585w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker-start.png 1882w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Wolumeny w dockerze<\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<p>Kontener ma sw\u00f3j w\u0142asny system plik\u00f3w, ale jest on traktowany jako <strong>nietrwa\u0142y<\/strong>. Gdy usuniesz kontener, usuwasz te\u017c jego \u201edysk\u201d. Je\u015bli masz jakie\u015b dane generowane i wykorzystywane przez kontenery Dockera to znikaj\u0105 one po usuni\u0119ciu kontenera. Istnieje jednak spos\u00f3b na zachowanie tych danych i do tego w\u0142a\u015bnie s\u0142u\u017c\u0105 wolumeny. Om\u00f3wi\u0142em je ju\u017c cz\u0119\u015bciowo w artykule teoretycznym, dlatego od razu  przejd\u0119 do praktyki.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Bind mount<\/h3>\n\n\n\n<p>Montowanie typu \u201ebind\u201d mapuje katalog lub plik z systemu plik\u00f3w hosta do kontenera. Umo\u017cliwia to bezpo\u015bredni dost\u0119p do systemu plik\u00f3w hosta, co czyni je idealnym rozwi\u0105zaniem w sytuacjach, w kt\u00f3rych dane musz\u0105 by\u0107 wsp\u00f3\u0142dzielone mi\u0119dzy hostem a kontenerem.<\/p>\n\n\n\n<p>Na pocz\u0105tku utw\u00f3rz plik index.html i wype\u0142nij go dowolnym tekstem.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir -p www\/nginx-demo \necho \"&lt;h1&gt;Hej! To jest plik z hosta&lt;\/h1&gt;\" &gt; www\/nginx-demo\/index.html<\/code><\/pre>\n\n\n\n<p>Nast\u0119pnie uruchamiamy kontener wskazuj\u0105c folder z hosta i miejsce gdzie ma zosta\u0107 zamontowany w kontenerze. Parametr <strong>ro<\/strong> oznacza <strong>read-only<\/strong>. Nginx ma korzysta\u0107 z plik\u00f3w, nie zmienia\u0107 ich. Nale\u017cy okre\u015bli\u0107 r\u00f3wnie\u017c \u015bcie\u017cke hosta i \u015bcie\u017ck\u0119 kontenera.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -d --name website -p 8081:80 -v \/root\/www\/nginx-demo:\/usr\/share\/nginx\/html:ro nginx<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"327\" src=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_wolumeny-1024x327.png\" alt=\"\" class=\"wp-image-1194\" srcset=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_wolumeny-1024x327.png 1024w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_wolumeny-300x96.png 300w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_wolumeny-768x246.png 768w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_wolumeny-1170x374.png 1170w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_wolumeny-585x187.png 585w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_wolumeny.png 1392w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Do przetestowania dzia\u0142ania wystarczy zmieni\u0107 plik na ho\u015bcie i od\u015bwie\u017cy\u0107 stron\u0119. Zmiana b\u0119dzie od razu widoczna.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"356\" src=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_wolumeny2-1024x356.png\" alt=\"\" class=\"wp-image-1195\" srcset=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_wolumeny2-1024x356.png 1024w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_wolumeny2-300x104.png 300w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_wolumeny2-768x267.png 768w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_wolumeny2-585x204.png 585w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_wolumeny2.png 1083w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Je\u015bli usuniesz kontener i uruchomisz go na nowo, zauwa\u017cysz, \u017ce wci\u0105\u017c b\u0119dzie mia\u0142 dost\u0119p do tego katalogu, poniewa\u017c istnieje On poza kontenerem i nie znika wraz z usuni\u0119ciem kontenera.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Named Volume<\/h3>\n\n\n\n<p>Wolumeny nazwane to wolumeny zdefiniowane przez u\u017cytkownika, do kt\u00f3rych mo\u017cna \u0142atwo odwo\u0142ywa\u0107 si\u0119 po nazwie i kt\u00f3re mo\u017cna ponownie wykorzystywa\u0107 w wielu kontenerach. S\u0105 one przechowywane w wewn\u0119trznym magazynie wolumin\u00f3w Dockera.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1) Utw\u00f3rz named volume<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>docker volume create webdata<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">2) Zapisz index.html do volume (trik z kontenerem pomocniczym)<\/h4>\n\n\n\n<p>U\u017cyjemy lekkiego kontenera (<code>busybox<\/code>), \u017ceby wrzuci\u0107 plik do wolumenu:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run --rm -v webdata:\/data busybox sh -c 'echo \"&lt;h1&gt;Strona z DOCKER VOLUME&lt;\/h1&gt;\" &gt; \/data\/index.html<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">3) Uruchom Nginx z podpi\u0119tym wolumenem<\/h4>\n\n\n\n<p>Po wydaniu poni\u017cszego polecenia widzimy, \u017ce strona dzia\u0142a. Teraz, gdyby\u015b usun\u0105\u0142 kontener i utworzy\u0142 go na nowo, strona wygl\u0105da\u0142aby tak samo. Wolumen wszak jest poza kontenerem.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"286\" src=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/Docker_volume-1024x286.png\" alt=\"\" class=\"wp-image-1196\" srcset=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/Docker_volume-1024x286.png 1024w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/Docker_volume-300x84.png 300w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/Docker_volume-768x214.png 768w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/Docker_volume-1170x326.png 1170w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/Docker_volume-585x163.png 585w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/Docker_volume.png 1226w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Za pomoc\u0105 polecenia <strong>docker volume inspect<\/strong> mo\u017cna sprawdzi\u0107 wolumen i wy\u015bwietli\u0107 jego szczeg\u00f3\u0142y. Polecenie <strong>docker volume ls<\/strong> za\u015b mo\u017cemy wylistowa\u0107 wszystkie wolumeny.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"680\" height=\"470\" src=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/Docker-_Volume1.png\" alt=\"\" class=\"wp-image-1197\" srcset=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/Docker-_Volume1.png 680w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/Docker-_Volume1-300x207.png 300w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/Docker-_Volume1-585x404.png 585w\" sizes=\"(max-width: 680px) 100vw, 680px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Kiedy stosujemy bind mount, a kiedy named volume?<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Bind mount<\/strong> wybierz wtedy, gdy pracujesz lokalnie i chcesz szybko edytowa\u0107 pliki na swoim komputerze (np. HTML\/CSS\/JS, konfiguracje). To najlepsza opcja do <strong>developmentu<\/strong>, bo zmiany widzisz od razu po od\u015bwie\u017ceniu strony. Minusy: cz\u0119\u015bciej trafiaj\u0105 si\u0119 problemy z <strong>uprawnieniami<\/strong> (szczeg\u00f3lnie na Linuxie) i r\u00f3\u017cnice w \u015bcie\u017ckach mi\u0119dzy systemami.<\/li>\n\n\n\n<li><strong>Named volume<\/strong> wybierz wtedy, gdy zale\u017cy Ci na <strong>trwa\u0142o\u015bci danych<\/strong> i stabilno\u015bci. Najcz\u0119\u015bciej u\u017cywa si\u0119 go do baz danych (Postgres\/MySQL\/Mongo), upload\u00f3w, cache\u2019y -czyli wszystkiego, co ma przetrwa\u0107 restart\/usuni\u0119cie kontenera. Jest bardziej \u201edockerowe\u201d, bo Docker sam zarz\u0105dza miejscem na dane, a Ty nie musisz pilnowa\u0107 katalog\u00f3w na ho\u015bcie.<\/li>\n<\/ul>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Przyk\u0142ad prostej aplikacji z Node.js<\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<p>Do tej pory pokazywa\u0142em podstawy na bazie gotowego obrazu nginx. Teraz zademonstruj\u0119 Ci jak spakowa\u0107 w\u0142asn\u0105 aplikacj\u0119 do obrazu Dockera, \u017ceby uruchamia\u0142a si\u0119 tak samo na ka\u017cdym komputerze.<\/p>\n\n\n\n<p>Najpierw utw\u00f3rz poni\u017csz\u0105 struktur\u0119 projektu:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir my-app\ncd my-app\ntouch package.json\ntouch app.js\ntouch Dockerfile\ntouch .dockerignore<\/code><\/pre>\n\n\n\n<p>Poni\u017cej umieszczam zawarto\u015b\u0107 poszczeg\u00f3lnych plik\u00f3w wraz z wyja\u015bnieniem zawarto\u015bci. Zacznijmy od pliku <strong>package.json<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"907\" height=\"348\" src=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/package_json.png\" alt=\"\" class=\"wp-image-1199\" srcset=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/package_json.png 907w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/package_json-300x115.png 300w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/package_json-768x295.png 768w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/package_json-585x224.png 585w\" sizes=\"(max-width: 907px) 100vw, 907px\" \/><\/figure>\n\n\n\n<p>Plik ten opisuje konfiguracje projektu Node.js. Zawiera nazw\u0119 i wersje projektu, a tak\u017ce wskazuj\u0119 g\u0142\u00f3wny plik ze skryptem. W skr\u00f3cie plik ten m\u00f3wi mi\u0119dzy innymi npm-owi jak uruchomi\u0107 aplikacj\u0119 i jakie biblioteki ma zainstalowa\u0107. Dzi\u0119ki temu p\u00f3\u017aniej w pliku Dockerfile wystarczy, \u017ce wpiszemy komend\u0119 <strong>npm install<\/strong> i npm b\u0119dzia\u0142, \u017ce ma zainstalowa\u0107 expressa.<\/p>\n\n\n\n<p>Kolejnym plikiem, kt\u00f3ry warto utworzy\u0107 jest <strong>app.js<\/strong>. W pliku tym b\u0119dzie znajdowa\u0142 si\u0119 kod aplikacji uruchamianej w kontenerze. Nie wchodz\u0105c w szczeg\u00f3\u0142y programowania jest to prosty serwer HTTP z Node.js z u\u017cyciem Expressa. Kod ten sprawi, \u017ce gdy kto\u015b wejdzie na ho\u015bcie na adres serwera z portem 3000, w\u00f3wczas dostanie odpowied\u017a &#8220;Hello from Docker!&#8221;.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"905\" height=\"331\" src=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/app_js.png\" alt=\"\" class=\"wp-image-1200\" srcset=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/app_js.png 905w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/app_js-300x110.png 300w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/app_js-768x281.png 768w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/app_js-585x214.png 585w\" sizes=\"(max-width: 905px) 100vw, 905px\" \/><\/figure>\n\n\n\n<p>Teraz najwa\u017cniejsza cz\u0119\u015b\u0107 czyli plik Dockerfile. Jak wspomina\u0142em w cz\u0119\u015bci teoretycznej jest to skrypt b\u0119d\u0105cy&nbsp;<strong>instrukcj\u0105 dotycz\u0105c\u0105 tworzenia obrazu Dockera<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"906\" height=\"303\" src=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/Dockerfile.png\" alt=\"\" class=\"wp-image-1201\" srcset=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/Dockerfile.png 906w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/Dockerfile-300x100.png 300w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/Dockerfile-768x257.png 768w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/Dockerfile-585x196.png 585w\" sizes=\"(max-width: 906px) 100vw, 906px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>FROM<\/code> &#8211;<\/strong> okre\u015bla obraz bazowy, z kt\u00f3rego b\u0119dzie korzysta\u0142a aplikacja.<\/li>\n\n\n\n<li><strong><code>WORKDIR<\/code> &#8211;<\/strong> ustawia katalog roboczy w kontenerze. Od tej pory polecenia typu <strong><em>COPY, RUN<\/em><\/strong> dzia\u0142aj\u0105 wzgl\u0119dem <strong><span style=\"text-decoration: underline;\">\/usr\/app<\/span><\/strong>.<\/li>\n\n\n\n<li><strong><code>COPY<\/code> &#8211;<\/strong> kopiuje pliki z hosta do kontenera <strong><em>(do \/usr\/app)<\/em><\/strong>.<\/li>\n\n\n\n<li><strong><code>RUN<\/code> &#8211;<\/strong> wykonuje polecenia w kontenerze. W tym przypadku Instaluje zale\u017cno\u015bci z <code>package.json<\/code> (np. Express).<\/li>\n\n\n\n<li><strong><code>CMD<\/code> &#8211;<\/strong> okre\u015bla polecenie do uruchomienia. Odpala skrypt <strong>start<\/strong> z <em><strong>package.json<\/strong>,<\/em> czyli w tym przypadku <strong><em>node app.js<\/em><\/strong><\/li>\n<\/ul>\n\n\n\n<p>Ostatnim plikiem w projekcie jest plik .dockerignore. M\u00f3wi Dockerowi, <strong>kt\u00f3rych plik\u00f3w\/katalog\u00f3w nie kopiowa\u0107 do obrazu<\/strong> podczas docker build. Dzi\u0119ki temu build obraziu trwa szybciej. Nie wszystkie pliki znajduj\u0105 si\u0119 w projekcie, wypisa\u0142em je jednak aby pokaza\u0107 Ci, kt\u00f3re pliki mog\u0105 znale\u017a\u0107 si\u0119 w dockerignore. Plik .env cz\u0119sto zawiera sekrety\/zmienne \u015brodowiskowe, bezpieczniej jest nie kopiowa\u0107 go do obrazu.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"775\" height=\"248\" src=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/dockerignore.png\" alt=\"\" class=\"wp-image-1202\" srcset=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/dockerignore.png 775w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/dockerignore-300x96.png 300w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/dockerignore-768x246.png 768w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/dockerignore-585x187.png 585w\" sizes=\"(max-width: 775px) 100vw, 775px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Uruchamianie projektu<\/h3>\n\n\n\n<p>Przejd\u017a do katalogu projektu a nast\u0119pnie wykonaj poni\u017csze polecenie.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker build -t my-app:1.0 .<\/code><\/pre>\n\n\n\n<p>Polecenie to buduje obraz z pliku Dockerfile w bie\u017c\u0105cym katalogu. Aby aplikacja by\u0142a dost\u0119pna w przegl\u0105darce nale\u017cy wykona\u0107 poni\u017csze polecenie.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -p 4000:3000 my-app:1.0<\/code><\/pre>\n\n\n\n<p>Po uruchomieniu kontenera aplikacja b\u0119dzie dost\u0119pna na ho\u015bcie pod adresem maszyny wirtualnej na porcie 4000.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"306\" src=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_run_p-1024x306.png\" alt=\"\" class=\"wp-image-1203\" srcset=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_run_p-1024x306.png 1024w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_run_p-300x90.png 300w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_run_p-768x230.png 768w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_run_p-1170x350.png 1170w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_run_p-585x175.png 585w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_run_p.png 1497w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Przyspieszenie build\u00f3w: cache warstw Dockera<\/h3>\n\n\n\n<p>Docker buduje obraz \u201ewarstwami\u201d. Je\u015bli jaka\u015b warstwa si\u0119 nie zmieni\u0142a, Docker mo\u017ce j\u0105 wzi\u0105\u0107 z cache i nie robi\u0107 jej od nowa.<\/p>\n\n\n\n<p>Dlatego:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>najpierw kopiuj pliki, kt\u00f3re zmieniaj\u0105 si\u0119 rzadko (<strong>package.json \/ package-lock.json<\/strong>),<\/li>\n\n\n\n<li>r\u00f3b npm install,<\/li>\n\n\n\n<li>dopiero potem reszt\u0119 kodu.<\/li>\n<\/ul>\n\n\n\n<p>\u2705 Dobrze:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>COPY package*.json .\/ \nRUN npm install \nCOPY . .<\/code><\/pre>\n\n\n\n<p>\u274c S\u0142abo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>COPY . . \nRUN npm install<\/code><\/pre>\n\n\n\n<p>W tej wersji je\u015bli zmienisz co\u015b w Dockerfile, to wszystkie kroki <strong>poni\u017cej<\/strong> te\u017c polec\u0105 od nowa.<\/p>\n\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Docker Compose<\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<p>W realnych projektach aplikacja rzadko dzia\u0142a sama. Najcz\u0119\u015bciej potrzebujesz te\u017c bazy danych (Postgres\/MySQL), cache (Redis) lub gotowej aplikacji (Nextcloud) . <strong>Docker Compose<\/strong> dzia\u0142a w oparciu o zestaw deklaracji zapisanych w jednym pliku konfiguracyjnym &#8211; najcz\u0119\u015bciej <code><strong>compose.yaml<\/strong><\/code>. Ten plik w formacie YAML opisuje ca\u0142y \u201estos\u201d aplikacji jakie maj\u0105 powsta\u0107, jak maj\u0105 si\u0119 ze sob\u0105 komunikowa\u0107, jakie porty wystawi\u0107 i gdzie trzyma\u0107 dane.<\/p>\n\n\n\n<p>Najwi\u0119ksza zaleta? Zamiast odpala\u0107 kilka d\u0142ugich komend <code>docker run<\/code> i pilnowa\u0107 kolejno\u015bci uruchamiania, wystarczy jedna:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker compose up<\/code><\/pre>\n\n\n\n<p>Compose zrobi za nas ca\u0142\u0105 \u201erobot\u0119 pod mask\u0105\u201d: utworzy sie\u0107, uruchomi kontenery, podepnie woluminy, ustawi zmienne \u015brodowiskowe i reszt\u0119 konfiguracji. Dzi\u0119ki temu nie trzeba klei\u0107 w\u0142asnych skrypt\u00f3w w Bashu ani pami\u0119ta\u0107 dziesi\u0105tek parametr\u00f3w.<\/p>\n\n\n\n<p>Zademonstruj\u0119 dzia\u0142anie Compose na przyk\u0142adzie aplikacji Nextcloud. To jeden z najprostszych, a jednocze\u015bnie bardzo praktycznych przyk\u0142ad\u00f3w u\u017cycia Docker Compose: uruchamiamy <strong>Nextcloud (web)<\/strong> oraz <strong>PostgreSQL (baza danych)<\/strong> jako dwa serwisy.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Struktura projektu<\/h3>\n\n\n\n<p>Wystarcz\u0105 dwa pliki:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\n\u251c\u2500\u2500 compose.yaml\n\u2514\u2500\u2500 README.md   (opcjonalnie)<\/code><\/pre>\n\n\n\n<p>Poni\u017cej przyk\u0142ad bazowej konfiguracji. Nextcloud dzia\u0142a na Apache, a baza to Postgres. Doda\u0142em te\u017c wolumeny, \u017ceby dane przetrwa\u0142y restart kontener\u00f3w.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>services:\n  db:\n    image: postgres:alpine\n    restart: unless-stopped\n    environment:\n      POSTGRES_DB: nextcloud\n      POSTGRES_USER: nextcloud\n      POSTGRES_PASSWORD: change_me\n    volumes:\n      - db_data:\/var\/lib\/postgresql\/data\n\n  nc:\n    image: nextcloud:apache\n    restart: unless-stopped\n    ports:\n      - \"80:80\"\n    depends_on:\n      - db\n    volumes:\n      - nc_data:\/var\/www\/html\n\nvolumes:\n  db_data:\n  nc_data:<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">o tu jest najwa\u017cniejsze?<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>ports: \"80:80\"<\/code> \u2192 <strong>port 80 kontenera Nextcloud jest mapowany na port 80 hosta<\/strong>, wi\u0119c wejdziesz w przegl\u0105darce na <code>http:\/\/adres_serwera:80<\/code>.<\/li>\n\n\n\n<li><code>depends_on<\/code> \u2192 Nextcloud wystartuje po bazie.<\/li>\n\n\n\n<li><code>volumes<\/code> \u2192 dane Nextclouda i Postgresa s\u0105 trwa\u0142e.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Uruchomienie projektu<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">W katalogu projektu odpal poni\u017csze polecenie, kt\u00f3re uruchomi wszystkie aplikacje z projektu<\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>docker compose up -d<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"203\" src=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_compose-1024x203.png\" alt=\"\" class=\"wp-image-1208\" srcset=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_compose-1024x203.png 1024w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_compose-300x59.png 300w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_compose-768x152.png 768w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_compose-1170x232.png 1170w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_compose-585x116.png 585w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_compose.png 1172w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Po zako\u0144czeniu sprawd\u017a wynik polecenia docker ps aby potwierdzi\u0107 czy kontenery s\u0105 uruchomione, powiniene\u015b zobaczy\u0107 poni\u017cszy wynik.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"96\" src=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_ps_compose-1024x96.png\" alt=\"\" class=\"wp-image-1210\" srcset=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_ps_compose-1024x96.png 1024w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_ps_compose-300x28.png 300w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_ps_compose-768x72.png 768w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_ps_compose-1170x110.png 1170w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_ps_compose-585x55.png 585w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_ps_compose.png 1490w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Finalnie wchodz\u0105c w przegl\u0105darce na adres serwera na porcie 80 ujrzysz stron\u0119 pocz\u0105tkow\u0105 Nextclouda. Przy pierwszym uruchomieniu Nextcloud poka\u017ce kreator instalacji. Wybierz baz\u0119 <strong>PostgreSQL<\/strong> i podaj dane zgodne z <code><strong>compose.yaml<\/strong><\/code>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>nazwa bazy:<\/strong> <code>nextcloud<\/code><\/li>\n\n\n\n<li><strong>host bazy:<\/strong> <code>db<\/code><\/li>\n\n\n\n<li><strong>u\u017cytkownik:<\/strong> <code>nextcloud<\/code><\/li>\n\n\n\n<li><strong>has\u0142o:<\/strong> <code>change_me<\/code><\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"982\" height=\"732\" src=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/compose_nextcloud.png\" alt=\"\" class=\"wp-image-1209\" srcset=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/compose_nextcloud.png 982w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/compose_nextcloud-300x224.png 300w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/compose_nextcloud-768x572.png 768w, https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/compose_nextcloud-585x436.png 585w\" sizes=\"(max-width: 982px) 100vw, 982px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>W poprzednim wpisie om\u00f3wi\u0142em podstawy teoretyczne konteneryzacji, kt\u00f3re moim zdaniem ka\u017cdy powinien zna\u0107. Je\u015bli jeszcze go nie czyta\u0142e\u015b, zacznij tutaj. Nadszed\u0142&hellip;<\/p>\n","protected":false},"author":3,"featured_media":1181,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_lmt_disableupdate":"","_lmt_disable":"","footnotes":""},"categories":[31],"tags":[],"class_list":["post-1180","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kontenery_i_vm"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Docker w praktyce na Debianie - SudoIT<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/sudoit.pl\/index.php\/2026\/02\/19\/docker-w-praktyce-na-debianie\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Docker w praktyce na Debianie - SudoIT\" \/>\n<meta property=\"og:description\" content=\"W poprzednim wpisie om\u00f3wi\u0142em podstawy teoretyczne konteneryzacji, kt\u00f3re moim zdaniem ka\u017cdy powinien zna\u0107. Je\u015bli jeszcze go nie czyta\u0142e\u015b, zacznij tutaj. Nadszed\u0142&hellip;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/sudoit.pl\/index.php\/2026\/02\/19\/docker-w-praktyce-na-debianie\/\" \/>\n<meta property=\"og:site_name\" content=\"SudoIT\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-19T16:20:52+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-02-21T12:19:46+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_w_praktyce.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1536\" \/>\n\t<meta property=\"og:image:height\" content=\"1024\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Patryk\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Patryk\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/sudoit.pl\\\/index.php\\\/2026\\\/02\\\/19\\\/docker-w-praktyce-na-debianie\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/sudoit.pl\\\/index.php\\\/2026\\\/02\\\/19\\\/docker-w-praktyce-na-debianie\\\/\"},\"author\":{\"name\":\"Patryk\",\"@id\":\"https:\\\/\\\/sudoit.pl\\\/#\\\/schema\\\/person\\\/62b95033a7a8937fbb692e81d5e0b8bd\"},\"headline\":\"Docker w praktyce na Debianie\",\"datePublished\":\"2026-02-19T16:20:52+00:00\",\"dateModified\":\"2026-02-21T12:19:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/sudoit.pl\\\/index.php\\\/2026\\\/02\\\/19\\\/docker-w-praktyce-na-debianie\\\/\"},\"wordCount\":2012,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/sudoit.pl\\\/index.php\\\/2026\\\/02\\\/19\\\/docker-w-praktyce-na-debianie\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/sudoit.pl\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/docker_w_praktyce.png\",\"articleSection\":[\"Kontenery i VM\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/sudoit.pl\\\/index.php\\\/2026\\\/02\\\/19\\\/docker-w-praktyce-na-debianie\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/sudoit.pl\\\/index.php\\\/2026\\\/02\\\/19\\\/docker-w-praktyce-na-debianie\\\/\",\"url\":\"https:\\\/\\\/sudoit.pl\\\/index.php\\\/2026\\\/02\\\/19\\\/docker-w-praktyce-na-debianie\\\/\",\"name\":\"Docker w praktyce na Debianie - SudoIT\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/sudoit.pl\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/sudoit.pl\\\/index.php\\\/2026\\\/02\\\/19\\\/docker-w-praktyce-na-debianie\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/sudoit.pl\\\/index.php\\\/2026\\\/02\\\/19\\\/docker-w-praktyce-na-debianie\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/sudoit.pl\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/docker_w_praktyce.png\",\"datePublished\":\"2026-02-19T16:20:52+00:00\",\"dateModified\":\"2026-02-21T12:19:46+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/sudoit.pl\\\/#\\\/schema\\\/person\\\/62b95033a7a8937fbb692e81d5e0b8bd\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/sudoit.pl\\\/index.php\\\/2026\\\/02\\\/19\\\/docker-w-praktyce-na-debianie\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/sudoit.pl\\\/index.php\\\/2026\\\/02\\\/19\\\/docker-w-praktyce-na-debianie\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/sudoit.pl\\\/index.php\\\/2026\\\/02\\\/19\\\/docker-w-praktyce-na-debianie\\\/#primaryimage\",\"url\":\"https:\\\/\\\/sudoit.pl\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/docker_w_praktyce.png\",\"contentUrl\":\"https:\\\/\\\/sudoit.pl\\\/wp-content\\\/uploads\\\/2026\\\/02\\\/docker_w_praktyce.png\",\"width\":1536,\"height\":1024},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/sudoit.pl\\\/index.php\\\/2026\\\/02\\\/19\\\/docker-w-praktyce-na-debianie\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/sudoit.pl\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Docker w praktyce na Debianie\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/sudoit.pl\\\/#website\",\"url\":\"https:\\\/\\\/sudoit.pl\\\/\",\"name\":\"SudoIT\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/sudoit.pl\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/sudoit.pl\\\/#\\\/schema\\\/person\\\/62b95033a7a8937fbb692e81d5e0b8bd\",\"name\":\"Patryk\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d933a3eef1e4f0026a85747cca61f1ae9043bf2753554c0427f1a2dc8ca46096?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d933a3eef1e4f0026a85747cca61f1ae9043bf2753554c0427f1a2dc8ca46096?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/d933a3eef1e4f0026a85747cca61f1ae9043bf2753554c0427f1a2dc8ca46096?s=96&d=mm&r=g\",\"caption\":\"Patryk\"},\"url\":\"https:\\\/\\\/sudoit.pl\\\/index.php\\\/author\\\/patryk\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Docker w praktyce na Debianie - SudoIT","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/sudoit.pl\/index.php\/2026\/02\/19\/docker-w-praktyce-na-debianie\/","og_locale":"en_US","og_type":"article","og_title":"Docker w praktyce na Debianie - SudoIT","og_description":"W poprzednim wpisie om\u00f3wi\u0142em podstawy teoretyczne konteneryzacji, kt\u00f3re moim zdaniem ka\u017cdy powinien zna\u0107. Je\u015bli jeszcze go nie czyta\u0142e\u015b, zacznij tutaj. Nadszed\u0142&hellip;","og_url":"https:\/\/sudoit.pl\/index.php\/2026\/02\/19\/docker-w-praktyce-na-debianie\/","og_site_name":"SudoIT","article_published_time":"2026-02-19T16:20:52+00:00","article_modified_time":"2026-02-21T12:19:46+00:00","og_image":[{"width":1536,"height":1024,"url":"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_w_praktyce.png","type":"image\/png"}],"author":"Patryk","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Patryk","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/sudoit.pl\/index.php\/2026\/02\/19\/docker-w-praktyce-na-debianie\/#article","isPartOf":{"@id":"https:\/\/sudoit.pl\/index.php\/2026\/02\/19\/docker-w-praktyce-na-debianie\/"},"author":{"name":"Patryk","@id":"https:\/\/sudoit.pl\/#\/schema\/person\/62b95033a7a8937fbb692e81d5e0b8bd"},"headline":"Docker w praktyce na Debianie","datePublished":"2026-02-19T16:20:52+00:00","dateModified":"2026-02-21T12:19:46+00:00","mainEntityOfPage":{"@id":"https:\/\/sudoit.pl\/index.php\/2026\/02\/19\/docker-w-praktyce-na-debianie\/"},"wordCount":2012,"commentCount":0,"image":{"@id":"https:\/\/sudoit.pl\/index.php\/2026\/02\/19\/docker-w-praktyce-na-debianie\/#primaryimage"},"thumbnailUrl":"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_w_praktyce.png","articleSection":["Kontenery i VM"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/sudoit.pl\/index.php\/2026\/02\/19\/docker-w-praktyce-na-debianie\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/sudoit.pl\/index.php\/2026\/02\/19\/docker-w-praktyce-na-debianie\/","url":"https:\/\/sudoit.pl\/index.php\/2026\/02\/19\/docker-w-praktyce-na-debianie\/","name":"Docker w praktyce na Debianie - SudoIT","isPartOf":{"@id":"https:\/\/sudoit.pl\/#website"},"primaryImageOfPage":{"@id":"https:\/\/sudoit.pl\/index.php\/2026\/02\/19\/docker-w-praktyce-na-debianie\/#primaryimage"},"image":{"@id":"https:\/\/sudoit.pl\/index.php\/2026\/02\/19\/docker-w-praktyce-na-debianie\/#primaryimage"},"thumbnailUrl":"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_w_praktyce.png","datePublished":"2026-02-19T16:20:52+00:00","dateModified":"2026-02-21T12:19:46+00:00","author":{"@id":"https:\/\/sudoit.pl\/#\/schema\/person\/62b95033a7a8937fbb692e81d5e0b8bd"},"breadcrumb":{"@id":"https:\/\/sudoit.pl\/index.php\/2026\/02\/19\/docker-w-praktyce-na-debianie\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/sudoit.pl\/index.php\/2026\/02\/19\/docker-w-praktyce-na-debianie\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/sudoit.pl\/index.php\/2026\/02\/19\/docker-w-praktyce-na-debianie\/#primaryimage","url":"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_w_praktyce.png","contentUrl":"https:\/\/sudoit.pl\/wp-content\/uploads\/2026\/02\/docker_w_praktyce.png","width":1536,"height":1024},{"@type":"BreadcrumbList","@id":"https:\/\/sudoit.pl\/index.php\/2026\/02\/19\/docker-w-praktyce-na-debianie\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/sudoit.pl\/"},{"@type":"ListItem","position":2,"name":"Docker w praktyce na Debianie"}]},{"@type":"WebSite","@id":"https:\/\/sudoit.pl\/#website","url":"https:\/\/sudoit.pl\/","name":"SudoIT","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/sudoit.pl\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/sudoit.pl\/#\/schema\/person\/62b95033a7a8937fbb692e81d5e0b8bd","name":"Patryk","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/d933a3eef1e4f0026a85747cca61f1ae9043bf2753554c0427f1a2dc8ca46096?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/d933a3eef1e4f0026a85747cca61f1ae9043bf2753554c0427f1a2dc8ca46096?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d933a3eef1e4f0026a85747cca61f1ae9043bf2753554c0427f1a2dc8ca46096?s=96&d=mm&r=g","caption":"Patryk"},"url":"https:\/\/sudoit.pl\/index.php\/author\/patryk\/"}]}},"_links":{"self":[{"href":"https:\/\/sudoit.pl\/index.php\/wp-json\/wp\/v2\/posts\/1180","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sudoit.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sudoit.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sudoit.pl\/index.php\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/sudoit.pl\/index.php\/wp-json\/wp\/v2\/comments?post=1180"}],"version-history":[{"count":7,"href":"https:\/\/sudoit.pl\/index.php\/wp-json\/wp\/v2\/posts\/1180\/revisions"}],"predecessor-version":[{"id":1211,"href":"https:\/\/sudoit.pl\/index.php\/wp-json\/wp\/v2\/posts\/1180\/revisions\/1211"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sudoit.pl\/index.php\/wp-json\/wp\/v2\/media\/1181"}],"wp:attachment":[{"href":"https:\/\/sudoit.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1180"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sudoit.pl\/index.php\/wp-json\/wp\/v2\/categories?post=1180"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sudoit.pl\/index.php\/wp-json\/wp\/v2\/tags?post=1180"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}