{"id":1044,"date":"2021-12-15T09:26:14","date_gmt":"2021-12-15T08:26:14","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=1044"},"modified":"2023-03-23T13:57:58","modified_gmt":"2023-03-23T12:57:58","slug":"docker-dla-programistow-instalacja-i-budowanie-pierwszego-srodowiska","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/docker-dla-programistow-instalacja-i-budowanie-pierwszego-srodowiska\/","title":{"rendered":"Docker dla programist\u00f3w \u2013 budowa pierwszego \u015brodowiska. Cz\u0119\u015b\u0107 I"},"content":{"rendered":"\n<p><a href=\"https:\/\/sii.pl\/blog\/docker-dla-programistow-co-to-jest\/?category=development-na-twardo&amp;tag=devops,docker,kontener\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">Poprzedni artyku\u0142<\/a> opisuje zalety, jakie niesie za sob\u0105 konteneryzacja, w por\u00f3wnaniu do klasycznej wirtualizacji system\u00f3w.<\/p>\n\n\n\n<p>W pierwszej kolejno\u015bci zalety te s\u0105 istotne z punktu widzenia docelowych \u015brodowisk uruchomieniowych i ciesz\u0105 administrator\u00f3w oraz mened\u017cer\u00f3w zarz\u0105dzaj\u0105cych finansami projekt\u00f3w. Jednak w codziennej pracy programist\u00f3w konteneryzacja r\u00f3wnie\u017c przynosi liczne korzy\u015bci, z kt\u00f3rymi najlepiej zapozna\u0107 si\u0119 w praktyce \ud83d\ude0a<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Budowa \u015brodowiska deweloperskiego<\/strong><\/h2>\n\n\n\n<p>Aby zapozna\u0107 si\u0119 z samym procesem instalacji Dockera, polecam przejrze\u0107 <a href=\"https:\/\/docs.docker.com\/get-docker.\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >dokumentacj\u0119, w kt\u00f3rej ten temat zosta\u0142 wyczerpany<\/a>.<\/p>\n\n\n\n<p>Zbudujemy zatem \u015brodowisko deweloperskie dla naszej aplikacji. Na pocz\u0105tku ograniczymy si\u0119 do bazy danych, kt\u00f3r\u0105 b\u0119dzie PostgreSQL. Oficjalny obraz kontenera z zainstalowan\u0105 baz\u0105 mo\u017cna znale\u017a\u0107 <a href=\"https:\/\/hub.docker.com\/_\/postgres\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >w publicznym repozytorium.<\/a><\/p>\n\n\n\n<p>Z repozytorium dowiemy si\u0119, \u017ce jest kilka dost\u0119pnych wersji. Najnowsza, stabilna wersja, jest oznaczona tagiem \u201elatest\u201d, dzi\u0119ki czemu staje si\u0119 wersj\u0105 domy\u015blnie u\u017cywan\u0105. Je\u015bli chcemy skorzysta\u0107 z innej, musimy dopisa\u0107 tag wybranej wersji, pobieraj\u0105c obraz kontenera.<\/p>\n\n\n\n<p>Obraz pobieramy poleceniem:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n$ docker pull postgres:latest\n<\/pre><\/div>\n\n\n<p>a list\u0119 pobranych obraz\u00f3w mo\u017cemy sprawdzi\u0107 poleceniem:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n$ docker images\n<\/pre><\/div>\n\n\n<p>Je\u015bli chcemy uruchomi\u0107 kontener z baz\u0105, mo\u017cemy to zrobi\u0107 od razu, ale musimy pami\u0119ta\u0107 o tym, \u017ce kontener jest uruchamiany ka\u017cdorazowo z innym adresem IP. Mo\u017ce to by\u0107 do\u015b\u0107 niewygodne. Je\u015bli <strong>nie chcemy za ka\u017cdym razem zmienia\u0107 tego adresu<\/strong>, w parametrach po\u0142\u0105czenia mo\u017cemy przekierowa\u0107 wskazany port kontenera na port naszej lokalnej maszyny.<\/p>\n\n\n\n<p>Ca\u0142o\u015b\u0107 wykonujemy poleceniem:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n$ docker run -e POSTGRES_PASSWORD=password -d -p 5432:5432 --name psqldb postgres \n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\"><strong>Oznaczenia paramer\u00f3w<\/strong><\/h3>\n\n\n\n<p>Kolejne parametry oznaczaj\u0105:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>-e \u2013 ustawianie zmiennej \u015brodowiskowej POSTGRES_PASSWORD,<\/li><li>-d \u2013 uruchomienie w tle,<\/li><li>-p 5432:5432 \u2013 przekierowanie portu (port host-a:port kontener-a),<\/li><li>&#8211;name \u2013 nazw\u0119 kontenera,<\/li><li>&nbsp;postgres \u2013 to nazwa obrazu.<\/li><\/ul>\n\n\n\n<p>Poni\u017csze polecenie wy\u015bwietla wszystkie uruchomione kontenery:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n$ docker ps\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\"><strong>Zmiana ustawie\u0144<\/strong><\/h3>\n\n\n\n<p>Kontener dzia\u0142a ju\u017c w domy\u015blnej konfiguracji. Pojawia si\u0119 pytanie, co zrobi\u0107 w przypadku, gdyby\u015bmy chcieli zmieni\u0107 pewne ustawienia.<\/p>\n\n\n\n<p>Wed\u0142ug <a href=\"https:\/\/hub.docker.com\/_\/postgres\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >dokumentacji<\/a> jest to mo\u017cliwe z u\u017cyciem zmiennych \u015brodowiskowych ustawianych w trakcie uruchamiania kontenera. Prze\u0142\u0105cznik -e w linii polece\u0144 mo\u017ce pos\u0142u\u017cy\u0107 do ustawienia zmiennej \u015brodowiskowej i mo\u017cemy go u\u017cy\u0107 wielokrotnie.<\/p>\n\n\n\n<p>Za\u0142\u00f3\u017cmy, \u017ce chcemy uruchomi\u0107 kontener postgresql z u\u017cytkownikiem i baz\u0105 danych o nazwie \u201ecamunda\u201d oraz identycznym has\u0142em do bazy. W\u00f3wczas pe\u0142ne polecenie b\u0119dzie wygl\u0105da\u0107 nast\u0119puj\u0105co:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n$ docker run -d -e POSTGRES_PASSWORD=camunda -e POSTGRES_USER=camunda -p 5432:5432 --name psqldb postgres:9.4\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\"><strong>Docker Compose<\/strong><\/h2>\n\n\n\n<p>Mamy wi\u0119c mo\u017cliwo\u015b\u0107 uruchomienia skonfigurowanego kontenera, przekazuj\u0105c wszystkie parametry w wierszu polece\u0144.&nbsp;\u0141atwo jednak doj\u015b\u0107 do wniosku, \u017ce pisanie pe\u0142nego polecenia nie jest szczytem ergonomii.<\/p>\n\n\n\n<p>Z pomoc\u0105 przychodzi kolejne narz\u0119dzie \u2013 <a href=\"https:\/\/eur02.safelinks.protection.outlook.com\/?url=https%3A%2F%2Fdocs.docker.com%2Fcompose%2F&amp;data=04%7C01%7Cdbaldyga%40sii.pl%7C10d74240562347c5b87e08d9b81486d4%7Cf9bd6df6c449481fabb537bd036beb76%7C0%7C0%7C637743220557706635%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&amp;sdata=c5d%2BYFcwZg3Q1GPoejG6j6NvpGe5ypGpEsIXrLomBR8%3D&amp;reserved=0\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Docker Compose&nbsp;<\/a>(jego <a href=\"https:\/\/docs.docker.com\/compose\/install\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >proces instalacyjny znajdziecie tutaj<\/a>). Umo\u017cliwia deklaratywne zdefiniowanie kontenera lub kilku kontener\u00f3w w jednym pliku docker-compose.yml i pos\u0142ugiwanie si\u0119 nim w celu uruchomienia ca\u0142ego \u015brodowiska rozwojowego.<\/p>\n\n\n\n<p>Poni\u017cej przyk\u0142ad pliku, zawieraj\u0105cy konfiguracj\u0119 odpowiadaj\u0105c\u0105 temu, co do tej pory skonfigurowa\u0142em w wierszu polece\u0144 (nazwa: docker-compose.yml):<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\ndb:\n  image: postgres:9.4\n  environment:\n- POSTGRES_PASSWORD=camunda\n- POSTGRES_USER=camunda\n  ports:\n- &quot;5432:5432&quot;\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\"><strong>Oznaczenia parametr\u00f3w<\/strong><\/h3>\n\n\n\n<p>Pokr\u00f3tce:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>db \u2013 identyfikator kontenera,<\/li><li>image \u2013 wskazuje oczekiwany obraz,<\/li><li>environment \u2013 definiuje zmienne \u015brodowiskowe,<\/li><li>ports \u2013 definiuje mapowanie port\u00f3w.<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Uruchamianie kontener\u00f3w<\/strong><\/h3>\n\n\n\n<p>Uruchomienie kontenera z baz\u0105 danych wymaga teraz u\u017cycia znacznie prostszego polecenia:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n$ docker-compose up -d\n<\/pre><\/div>\n\n\n<p>Oznaczenia:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>up \u2013 oznacza uruchomienie zdefiniowanych kontener\u00f3w,<\/li><li>parametr -d \u2013 uruchamia w tle.<\/li><\/ul>\n\n\n\n<p>Id\u0105c dalej, mo\u017cemy doj\u015b\u0107 do wniosku, \u017ce w \u015brodowisku rozwojowym baza danych powinna by\u0107 uruchamiana z zainstalowanym schematem dostarczonym z zewn\u0105trz.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Dodanie skrypt\u00f3w SQL<\/strong><\/h2>\n\n\n\n<p>Oficjalny kontener PostgreSQL pozwala na <strong>dodanie w odpowiednim miejscu skrypt\u00f3w SQL<\/strong>, kt\u00f3re zostan\u0105 wykonane podczas pierwszego startu kontenera.<\/p>\n\n\n\n<p>Aby je dostarczy\u0107 do kontenera mamy dwie mo\u017cliwo\u015bci:<br><br>1. pierwsza polega na zbudowaniu nowego obrazu zawieraj\u0105cego skrypty,<br>2. druga, wygodniejsza, polega na zamontowaniu do uruchamianego kontenera plik\u00f3w lub katalogu ze skryptami.&nbsp;&nbsp;<\/p>\n\n\n\n<p>W poni\u017cszym przyk\u0142adzie sekcja volumes definiuje wpisy w formacie [\u015bcie\u017cka \u017ar\u00f3d\u0142owa]:[\u015bcie\u017cka docelowa]. Podane \u015bcie\u017cki s\u0105 tylko przyk\u0142adem, w jaki mo\u017cna zrealizowa\u0107 montowanie plik\u00f3w do kontenera:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\ndb:\n  image: postgres:9.4\n  environment:\n- POSTGRES_PASSWORD=camunda\n- POSTGRES_USER=camunda\n  ports:\n- &quot;5432:5432&quot;\n  volumes:\n- .\/src\/sql\/postgres_engine_7.3.0.sql:\/docker-entrypoint-initdb.d\/postgres_engine_7.3.0.sql\n- .\/src\/sql\/postgres_identity_7.3.0.sql:\/docker-entrypoint-initdb.d\/postgres_identity_7.3.0.sql\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\"><strong>Kilka s\u0142\u00f3w podsumowania<\/strong><\/h2>\n\n\n\n<p>Plik docker-compose.yml mo\u017ce zosta\u0107 dodany do repozytorium kodu wraz z projektem i pos\u0142u\u017cy\u0107 ka\u017cdemu z programist\u00f3w do odtworzenia identycznego \u015brodowiska, jak to, kt\u00f3re uruchomili\u015bmy.&nbsp;<\/p>\n\n\n\n<p>W <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\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">nast\u0119pnym artykule<\/a> opisz\u0119 spos\u00f3b na dodanie drugiego kontenera z serwerem aplikacyjnym i powi\u0105\u017c\u0119 go z kontenerem bazy danych.<\/p>\n\n\n\n<p>***<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Zaktualizowane w 2021 i 2022 artyku\u0142y nt. Dockera<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\"><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=\"noreferrer noopener\" class=\"ek-link\">Docker dla programist\u00f3w: co to jest?<\/a><\/li><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=\"noreferrer noopener\">Docker dla programist\u00f3w \u2013 budowa pierwszego \u015brodowiska. Cz\u0119\u015b\u0107 I<\/a><\/li><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=\"noreferrer noopener\">Docker dla programist\u00f3w \u2013 budowa \u015brodowiska rozwojowego. Cz\u0119\u015b\u0107 II<\/a><\/li><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=\"noreferrer noopener\">Docker dla programist\u00f3w \u2013 dystrybucja aplikacji&nbsp;<\/a><\/li><\/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;1044&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;19&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;4.6&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.6\\\/5 ( votes: 19)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Docker dla programist\u00f3w \u2013 budowa pierwszego \u015brodowiska. Cz\u0119\u015b\u0107 I&quot;,&quot;width&quot;:&quot;127.9&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: 127.9px;\">\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.6\/5 ( votes: 19)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Poprzedni artyku\u0142 opisuje zalety, jakie niesie za sob\u0105 konteneryzacja, w por\u00f3wnaniu do klasycznej wirtualizacji system\u00f3w. W pierwszej kolejno\u015bci zalety te &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/docker-dla-programistow-instalacja-i-budowanie-pierwszego-srodowiska\/\">Continued<\/a><\/p>\n","protected":false},"author":324,"featured_media":1697,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":2,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[154,153,163],"class_list":["post-1044","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-devops","tag-docker","tag-postgresql"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2015\/12\/docker1.png","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/1044"}],"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\/324"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=1044"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/1044\/revisions"}],"predecessor-version":[{"id":20503,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/1044\/revisions\/20503"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/1697"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=1044"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=1044"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=1044"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}