{"id":1172,"date":"2016-02-03T23:10:36","date_gmt":"2016-02-03T22:10:36","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=1172"},"modified":"2023-09-29T15:57:18","modified_gmt":"2023-09-29T13:57:18","slug":"docker-wprowadzenie","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/docker-wprowadzenie\/","title":{"rendered":"Docker: wprowadzenie"},"content":{"rendered":"\n<p>Docker umo\u017cliwia uruchamianie proces\u00f3w w odizolowanym \u015brodowisku nazywanym kontenerem. Kontener dostarcza procesowi wszystkich zale\u017cno\u015bci, czyni\u0105c z niego autonomiczn\u0105 jednostk\u0119 wykonuj\u0105c\u0105 okre\u015blon\u0105 funkcj\u0119.<\/p>\n\n\n\n<p> W tym wpisie zosta\u0142y opisane: zastosowanie Dockera, jego podstawy dzia\u0142ania i r\u00f3\u017cnice pomi\u0119dzy wirtualn\u0105 maszyn\u0105.<\/p>\n\n\n\n<p>* Zach\u0119camy r\u00f3wnie\u017c do <strong>zapoznania si\u0119 z od\u015bwie\u017conymi w grudniu 2021 i styczniu 2022 artyku\u0142ami nt. Dockera<\/strong>, kt\u00f3re znajdziecie pod tym wpisem.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Zastosowanie<\/h2>\n\n\n\n<p>Docker to zbi\u00f3r narz\u0119dzi, kt\u00f3re umo\u017cliwiaj\u0105:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Podzia\u0142 system\u00f3w informatycznych na niezale\u017cne komponenty, nazywane kontenerami.<\/li>\n\n\n\n<li>Zarz\u0105dzanie kontenerami.<\/li>\n\n\n\n<li>Automatyzacj\u0119 proces\u00f3w zwi\u0105zanych z wdra\u017caniem skonteneryzowanego oprogramowania.<\/li>\n<\/ul>\n\n\n\n<p>Kontener to centralne poj\u0119cie Dockera. Jego pe\u0142ne zrozumienie wymaga czasu. Na tym etapie kontener mo\u017cna pojmowa\u0107 jako komponent systemu informatycznego, kt\u00f3ry pe\u0142ni pojedyncz\u0105 funkcj\u0119 w&nbsp;jego architekturze, czy serwer bazy danych, serwer http.<\/p>\n\n\n\n<p>Z racji swojej lekko\u015bci i specjalizacji kontenery naturalnie sprawdzaj\u0105 si\u0119 w tworzeniu system\u00f3w o&nbsp;architekturze zorientowanej na mikrous\u0142ugi [<a href=\"https:\/\/medium.com\/aws-activate-startup-blog\/using-containers-to-build-a-microservices-architecture-6e1b8bacb7d1\" rel=\"nofollow\" >1<\/a>]. Kontenery nie redukuj\u0105 z\u0142o\u017cono\u015bci system\u00f3w, a&nbsp;jedynie przenosz\u0105 j\u0105 w&nbsp;inne miejsce. Ponadto dekompozycja systemu na mikrous\u0142ugi mo\u017ce wi\u0105za\u0107 si\u0119 ze zwi\u0119kszonymi nak\u0142adami na utrzymanie i&nbsp;testowanie. W&nbsp;por\u00f3wnaniu z&nbsp;systemami o&nbsp;architekturze monolitycznej lub zorientowanej na us\u0142ugi zastosowanie kontener\u00f3w pozwala uzyska\u0107 wi\u0119ksz\u0105 elastyczno\u015b\u0107, wydajno\u015b\u0107 i&nbsp;\u0142atwo\u015b\u0107 skalowania.<\/p>\n\n\n\n<p>Kontenery dzia\u0142aj\u0105 tak samo niezale\u017cne od oprogramowania (ang. platform agnostic) jak i&nbsp;urz\u0105dzenia (ang. hardware agnostic), na kt\u00f3rym s\u0105 uruchomione. Skonfigurowane \u015brodowisko komunikuj\u0105cych si\u0119 ze sob\u0105 komponent\u00f3w mo\u017ce zosta\u0107 uruchomione za pomoc\u0105 jednego polecenia. Dzi\u0119ki temu rozpocz\u0119cie pracy ze skonteneryzowanym projektem odbywa si\u0119 bez dodatkowych nak\u0142ad\u00f3w pracy ze strony nowych cz\u0142onk\u00f3w zespo\u0142\u00f3w projektowych.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2015\/12\/1.png\"><img decoding=\"async\" width=\"840\" height=\"594\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2015\/12\/1.png\" alt=\"Por\u00f3wanie wybranych architektur i infrastruktur system\u00f3w informatycznych.\" class=\"wp-image-1203\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2015\/12\/1.png 840w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2015\/12\/1-300x212.png 300w\" sizes=\"(max-width: 840px) 100vw, 840px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 1. Por\u00f3wnanie wybranych architektur i infrastruktur system\u00f3w informatycznych.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Powi\u0105zane technologie<\/h2>\n\n\n\n<p>Warunkiem korzystania z Dockera jest posiadanie 64-bitowego systemu z&nbsp;rodziny Linux z&nbsp;j\u0105drem w&nbsp;wersji co najmniej 3.10.<\/p>\n\n\n\n<p>Docker w&nbsp;du\u017cej mierze wykorzystuje ju\u017c istniej\u0105ce rozwi\u0105zania stosowane w&nbsp;systemach z&nbsp;rodziny Linux:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Grupy kontrolne i przestrzenie nazw.<\/li>\n\n\n\n<li>Kontenery Linuxa.<\/li>\n\n\n\n<li>Ujednolicony system plik\u00f3w.<\/li>\n<\/ul>\n\n\n\n<p>Przestrzenie nazw (ang. namespaces) i&nbsp;grupy kontrolne (ang. cgroups) pozwalaj\u0105 na zarz\u0105dzenie dost\u0119pem do zasob\u00f3w systemowych (procesor, pami\u0119\u0107, sie\u0107 itd.) przez poszczeg\u00f3lne procesy.<\/p>\n\n\n\n<p>Kontenery linuxa (LXC, ang. Linux Containers) pozwalaj\u0105 na uruchomienie wielu system\u00f3w go\u015bci w obr\u0119bie jednego systemu gospodarza, zarz\u0105dzanie ich zasobami (cgroups) i&nbsp;odizolowanie ich od systemu operacyjnego (namespaces). Docker wprowadzi\u0142 nowy format kontener\u00f3w: runC, kt\u00f3ry implementuje standard OCF (ang. Open Container Format) [<a href=\"https:\/\/blog.docker.com\/2015\/06\/open-container-project-foundation\/\" rel=\"nofollow\" >1<\/a>, <a href=\"https:\/\/blog.docker.com\/2015\/06\/runc\/\" rel=\"nofollow\" >2<\/a>, <a href=\"http:\/\/www.opencontainers.org\/\" rel=\"nofollow\" >3<\/a>, <a href=\"https:\/\/runc.io\/\" rel=\"nofollow\" >4<\/a>].<\/p>\n\n\n\n<p>Ujednolicony system plik\u00f3w (UFS, ang. Union File System) umo\u017cliwia zarz\u0105dzanie plikami i&nbsp;katalogami pochodz\u0105cymi z&nbsp;r\u00f3\u017cnych system\u00f3w plik\u00f3w tak jakby stanowi\u0142y jeden system plik\u00f3w. Ujednolicony system plik\u00f3w jest budowany warstwowo. Je\u017celi dwa sk\u0142adowe systemy plik\u00f3w zawieraj\u0105 zas\u00f3b o&nbsp;takiej samej \u015bcie\u017cce, wtedy zas\u00f3b z&nbsp;systemu zamontowanego p\u00f3\u017aniej przykrywa zas\u00f3b z&nbsp;systemu zamontowanego wcze\u015bniej.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Architektura<\/h2>\n\n\n\n<p>Podstawowymi komponentami Dockera s\u0105: demon Dockera, komunikuj\u0105cy si\u0119 z&nbsp;nim klient i&nbsp;repozytorium obraz\u00f3w.<\/p>\n\n\n\n<p>Demon Dockera jest odpowiedzialny za zarz\u0105dzanie obrazami i&nbsp;kontenerami, np.: pobiera obrazy z&nbsp;repozytorium, buduje obrazy, uruchamia kontenery.<\/p>\n\n\n\n<p>Klient Dockera umo\u017cliwia wydawanie polece\u0144 demonowi. Komunikacja pomi\u0119dzy klientem a&nbsp;demonem odbywa si\u0119 za pomoc\u0105 protoko\u0142u HTTP. W&nbsp;przypadku komunikacji lokalnej wykorzystywane s\u0105 do tego gniazda UNIX, a&nbsp;w&nbsp;przypadku komunikacji zdalnej gniazda TCP.<\/p>\n\n\n\n<p>Repozytorium obraz\u00f3w przechowuje obrazy kontener\u00f3w Dockera. W&nbsp;ekosystemie Dockera znajduje si\u0119 jedno oficjalne repozytorium (<a href=\"https:\/\/hub.docker.com\/\" target=\"_blank\" rel=\"noopener\" rel=\"nofollow\" >docker hub<\/a>). Zawiera ono oficjalne obrazy oraz obrazy udost\u0119pnione przez innych u\u017cytkownik\u00f3w. Istnieje r\u00f3wnie\u017c mo\u017cliwo\u015b\u0107 uruchomienia prywatnego repozytorium.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2015\/12\/3.png\"><img decoding=\"async\" width=\"840\" height=\"594\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2015\/12\/3.png\" alt=\"G\u0142\u00f3wne komponenty Dockera.\" class=\"wp-image-1205\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2015\/12\/3.png 840w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2015\/12\/3-300x212.png 300w\" sizes=\"(max-width: 840px) 100vw, 840px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 2. G\u0142\u00f3wne komponenty Dockera.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Kontener a wirtualna maszyna<\/h2>\n\n\n\n<p>Kontenery Dockera, w&nbsp;por\u00f3wnaniu z&nbsp;wirtualnymi maszynami, pozwalaj\u0105 osi\u0105gn\u0105\u0107 istotnie ni\u017csze zu\u017cycie pami\u0119ci dyskowej i&nbsp;ni\u017csze czasy uruchomienia. Obie te zalety zosta\u0142y osi\u0105gni\u0119te kosztem zmniejszenia izolacji pomi\u0119dzy kontenerami i&nbsp;systemem gospodarza.<\/p>\n\n\n\n<p>Ni\u017csze zu\u017cycie pami\u0119ci dyskowej jest&nbsp;mo\u017cliwe dzi\u0119ki wsp\u00f3\u0142dzieleniu warstw UFS pomi\u0119dzy kontenerami. Za\u0142\u00f3\u017cmy, \u017ce mamy obraz kontenera zajmuj\u0105cy 1&nbsp;GB oraz obraz wirtualnej maszyny o&nbsp;takim samym rozmiarze. Je\u017celi chcieliby\u015bmy za ich pomoc\u0105 stworzy\u0107 <em>n<\/em>&nbsp;wirtualnych maszyn i&nbsp;<em>n<\/em> kontener\u00f3w to w&nbsp;przypadku wirtualnych maszyn potrzebowaliby\u015bmy <em>n<\/em>&nbsp;GB, a&nbsp;w&nbsp;przypadku kontener\u00f3w 1&nbsp;GB. Kontenery s\u0105 w&nbsp;stanie wsp\u00f3\u0142dzieli\u0107 warstwy UFS obraz\u00f3w (warstwy tylko do odczytu). Jedyny narzut pami\u0119ci dyskowej, jaki niesie ze sob\u0105 kontener jest zwi\u0105zany ze zmianami, jakie wprowadza do obrazu, na podstawie kt\u00f3rego zosta\u0142 stworzony. Zmiany te zapisywane s\u0105 w&nbsp;warstwie kontenera (warstwa do odczytu i&nbsp;do zapisu) i&nbsp;w&nbsp;wi\u0119kszo\u015bci przypadk\u00f3w s\u0105 to dane generowane przez proces uruchomiony w&nbsp;kontenerze lub zale\u017cno\u015bci potrzebne do jego uruchomienia.<\/p>\n\n\n\n<p>Ni\u017csze czasy uruchomienia s\u0105 mo\u017cliwe poprzez wsp\u00f3\u0142dzielenie j\u0105dra systemu pomi\u0119dzy kontenerami, a&nbsp;systemem gospodarza. Dzi\u0119ki temu rozwi\u0105zaniu kontenery nie s\u0105 obarczone narzutem czasowym zwi\u0105zanym z&nbsp;uruchomieniem wirtualnej maszyny i&nbsp;dzia\u0142aniem hipernadzorcy. Wszystkie operacje wykonywane w kontenerze s\u0105 niemal tak samo wydajnie jakby by\u0142y wykonywane w&nbsp;systemie gospodarza. Wsp\u00f3\u0142dzielenie j\u0105dra systemu jest przyczyn\u0105, przez kt\u00f3r\u0105 kontenery mog\u0105 dzia\u0142a\u0107 tylko w oparciu o&nbsp;dystrybucje system\u00f3w z&nbsp;rodziny Linux.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2015\/12\/2.png\"><img decoding=\"async\" width=\"840\" height=\"594\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2015\/12\/2.png\" alt=\"Por\u00f3wnanie wirtualnej maszyny z kontenerem.\" class=\"wp-image-1204\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2015\/12\/2.png 840w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2015\/12\/2-300x212.png 300w\" sizes=\"(max-width: 840px) 100vw, 840px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 3. Por\u00f3wnanie wirtualnej maszyny z kontenerem.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">* Zaktualizowane w 2021 i 2022 artyku\u0142y nt. Dockera<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/sii.pl\/blog\/docker-dla-programistow-co-to-jest\/?category=development-na-twardo&amp;tag=devops,docker,kontener\" target=\"_blank\" rel=\"noopener\">Docker dla programist\u00f3w: co to jest?<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/sii.pl\/blog\/docker-dla-programistow-instalacja-i-budowanie-pierwszego-srodowiska\/?category=development-na-twardo&amp;tag=devops,docker,postgresql\" target=\"_blank\" rel=\"noopener\">Docker dla programist\u00f3w &#8211; budowa pierwszego \u015brodowiska. Cz\u0119\u015b\u0107 I<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/sii.pl\/blog\/docker-dla-programistow-budowa-srodowiska-rozwojowego-cz-2\/?category=development-na-twardo&amp;tag=camunda,devops,docker\" target=\"_blank\" rel=\"noopener\">Docker dla programist\u00f3w &#8211; budowa \u015brodowiska rozwojowego. Cz\u0119\u015b\u0107 II<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/sii.pl\/blog\/docker-dla-programistow-dystrybucja-aplikacji-cz-3\/?category=development-na-twardo&amp;tag=devops,docker,docker-maven-plugin\" target=\"_blank\" rel=\"noopener\">Docker dla programist\u00f3w &#8211; dystrybucja aplikacji&nbsp;<\/a><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Co dalej?<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/sii.pl\/blog\/docker-obraz-podstawowe-operacje\/?category=development-na-twardo&amp;tag=docker,obraz\" target=\"_blank\" rel=\"noopener\">Obraz: podstawowe operacje<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/sii.pl\/blog\/docker-kontener-podstawowe-operacje\/?category=development-na-twardo&amp;tag=docker,kontener\" target=\"_blank\" rel=\"noopener\" class=\"ek-link\">Kontener: podstawowe operacje<\/a><\/li>\n<\/ul>\n\n\n\n<p><strong>Kolejna seria post\u00f3w dost\u0119pna od 10.02.2016<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/sii.pl\/blog\/docker-kontener-polecenia\/?category=development-na-twardo&amp;tag=docker,kontener\" target=\"_blank\" rel=\"noopener\">Kontener: polecenia<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/sii.pl\/blog\/docker-kontener-strumienie-wewy-i-przegladanie-plikow\/?category=development-na-twardo&amp;tag=docker,kontener\" target=\"_blank\" rel=\"noopener\">Kontener: strumienie we\/wy i przegl\u0105danie plik\u00f3w<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/sii.pl\/blog\/docker-kontener-udostepnianie-portow\/?category=development-na-twardo&amp;tag=docker,kontener\" target=\"_blank\" rel=\"noopener\">Kontener: udost\u0119pnianie port\u00f3w<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/sii.pl\/blog\/docker-kontener-wspoldzielenie-plikow\/?category=development-na-twardo&amp;tag=docker,kontener\" target=\"_blank\" rel=\"noopener\">Kontener: wsp\u00f3\u0142dzielenie plik\u00f3w<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/sii.pl\/blog\/docker-kontener-zmienne-srodowiskowe\/?category=development-na-twardo&amp;tag=docker,kontener\" target=\"_blank\" rel=\"noopener\">Kontener: zmienne \u015brodowiskowe<\/a><\/li>\n<\/ul>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;1172&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;13&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;4.5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;4.5\\\/5 ( votes: 13)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Docker: wprowadzenie&quot;,&quot;width&quot;:&quot;125&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 125px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            4.5\/5 ( votes: 13)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Docker umo\u017cliwia uruchamianie proces\u00f3w w odizolowanym \u015brodowisku nazywanym kontenerem. Kontener dostarcza procesowi wszystkich zale\u017cno\u015bci, czyni\u0105c z niego autonomiczn\u0105 jednostk\u0119 wykonuj\u0105c\u0105 &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/docker-wprowadzenie\/\">Continued<\/a><\/p>\n","protected":false},"author":61,"featured_media":15403,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":3,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[153,224,223],"class_list":["post-1172","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-docker","tag-kontener","tag-wirtualna-maszyna"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/02\/25_docker_1-1.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/1172"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/61"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=1172"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/1172\/revisions"}],"predecessor-version":[{"id":24589,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/1172\/revisions\/24589"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/15403"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=1172"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=1172"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=1172"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}