[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"page-ru-/guides/linux/docker-compose-networks":3,"mdc-bzwfbt-key":735,"mdc--nm29mq-key":746,"mdc-mh8pnk-key":768,"mdc-otiwnc-key":790,"mdc-xy2fse-key":806,"mdc--lvacys-key":822,"mdc-bohr7f-key":851,"mdc-9xrfb-key":873,"mdc-qj3t7v-key":890,"related-/guides/linux/docker-compose-basics,/guides/linux/docker-compose-volumes,/guides/linux/docker-compose-environment":907},{"id":4,"title":5,"appliesTo":6,"author":11,"body":12,"canonical":671,"code":71,"createdAt":672,"description":673,"difficulty":674,"draft":675,"estimatedTime":676,"extension":677,"faq":678,"howToSteps":691,"howToTotalTime":707,"image":671,"keywords":708,"locale":716,"meta":717,"navigation":188,"path":718,"platform":719,"related":720,"section":724,"seo":725,"severity":71,"stem":726,"summary":727,"tags":728,"twitterCreator":671,"twitterSite":671,"type":733,"updatedAt":672,"__hash__":734},"content_ru/guides/linux/docker-compose-networks.md","Как настроить сети Docker Compose: полное руководство",[7,8,9,10],"Docker 20.10+","Docker Compose 2.0+","Ubuntu 20.04+","CentOS 8+","FixPedia Team",{"type":13,"value":14,"toc":658},"minimark",[15,20,24,28,53,57,62,65,141,151,155,165,301,305,311,402,406,409,487,490,494,569,577,580,584,609,612,616,651,654],[16,17,19],"h2",{"id":18},"введение-зачем-это-нужно","Введение / Зачем это нужно",[21,22,23],"p",{},"Сети в Docker Compose упрощают взаимодействие контейнеров друг с другом без публикации портов. Правильно настроенная сеть позволяет использовать имена хостов, изолирует трафик и ускоряет разработку и запуск приложений. После выполнения этого руководства у вас будет рабочая сеть для любого набора сервисов Docker Compose.",[16,25,27],{"id":26},"требования-подготовка","Требования / Подготовка",[29,30,31,35,46],"ul",{},[32,33,34],"li",{},"Docker Engine ≥ 20.10 и Docker Compose ≥ 2.0 (установлены и работают).",[32,36,37,38,42,43,45],{},"Права на выполнение команд ",[39,40,41],"code",{},"docker"," (обычно требуется пользователь в группе ",[39,44,41],{},").",[32,47,48,49,52],{},"Базовый проект Docker Compose (",[39,50,51],{},"docker-compose.yml","), который вы хотите расширить сетью.",[16,54,56],{"id":55},"пошаговая-инструкция","Пошаговая инструкция",[58,59,61],"h3",{"id":60},"шаг-1-установите-docker-и-docker-compose","Шаг 1: Установите Docker и Docker Compose",[21,63,64],{},"Установите необходимые пакеты.",[66,67,72],"pre",{"className":68,"code":69,"language":70,"meta":71,"style":71},"language-bash shiki shiki-themes github-light github-dark","# Ubuntu/Debian\nsudo apt update && sudo apt install docker.io docker-compose\n# CentOS/RHEL\nsudo yum install docker docker-compose\n# Либо через установщик Docker (https://docs.docker.com/engine/install/)\n","bash","",[39,73,74,83,114,120,135],{"__ignoreMap":71},[75,76,79],"span",{"class":77,"line":78},"line",1,[75,80,82],{"class":81},"sJ8bj","# Ubuntu/Debian\n",[75,84,86,90,94,97,101,103,105,108,111],{"class":77,"line":85},2,[75,87,89],{"class":88},"sScJk","sudo",[75,91,93],{"class":92},"sZZnC"," apt",[75,95,96],{"class":92}," update",[75,98,100],{"class":99},"sVt8B"," && ",[75,102,89],{"class":88},[75,104,93],{"class":92},[75,106,107],{"class":92}," install",[75,109,110],{"class":92}," docker.io",[75,112,113],{"class":92}," docker-compose\n",[75,115,117],{"class":77,"line":116},3,[75,118,119],{"class":81},"# CentOS/RHEL\n",[75,121,123,125,128,130,133],{"class":77,"line":122},4,[75,124,89],{"class":88},[75,126,127],{"class":92}," yum",[75,129,107],{"class":92},[75,131,132],{"class":92}," docker",[75,134,113],{"class":92},[75,136,138],{"class":77,"line":137},5,[75,139,140],{"class":81},"# Либо через установщик Docker (https://docs.docker.com/engine/install/)\n",[142,143,144],"blockquote",{},[21,145,146,147,150],{},"💡 Совет: После установки перезапустите службу Docker: ",[39,148,149],{},"sudo systemctl restart docker",".",[58,152,154],{"id":153},"шаг-2-определите-сеть-в-docker-composeyml","Шаг 2: Определите сеть в docker-compose.yml",[21,156,157,158,161,162,164],{},"Добавьте секцию ",[39,159,160],{},"networks:"," в корневой раздел файла ",[39,163,51],{},". Пример для bridge-сети:",[66,166,170],{"className":167,"code":168,"language":169,"meta":71,"style":71},"language-yaml shiki shiki-themes github-light github-dark","version: \"3.9\"\n\nservices:\n  web:\n    image: nginx:alpine\n    ports:\n      - \"80:80\"\n  db:\n    image: postgres:15\n    environment:\n      POSTGRES_PASSWORD: example\n\nnetworks:\n  appnet:\n    driver: bridge\n","yaml",[39,171,172,184,190,198,205,215,223,232,240,250,258,269,274,282,290],{"__ignoreMap":71},[75,173,174,178,181],{"class":77,"line":78},[75,175,177],{"class":176},"s9eBZ","version",[75,179,180],{"class":99},": ",[75,182,183],{"class":92},"\"3.9\"\n",[75,185,186],{"class":77,"line":85},[75,187,189],{"emptyLinePlaceholder":188},true,"\n",[75,191,192,195],{"class":77,"line":116},[75,193,194],{"class":176},"services",[75,196,197],{"class":99},":\n",[75,199,200,203],{"class":77,"line":122},[75,201,202],{"class":176},"  web",[75,204,197],{"class":99},[75,206,207,210,212],{"class":77,"line":137},[75,208,209],{"class":176},"    image",[75,211,180],{"class":99},[75,213,214],{"class":92},"nginx:alpine\n",[75,216,218,221],{"class":77,"line":217},6,[75,219,220],{"class":176},"    ports",[75,222,197],{"class":99},[75,224,226,229],{"class":77,"line":225},7,[75,227,228],{"class":99},"      - ",[75,230,231],{"class":92},"\"80:80\"\n",[75,233,235,238],{"class":77,"line":234},8,[75,236,237],{"class":176},"  db",[75,239,197],{"class":99},[75,241,243,245,247],{"class":77,"line":242},9,[75,244,209],{"class":176},[75,246,180],{"class":99},[75,248,249],{"class":92},"postgres:15\n",[75,251,253,256],{"class":77,"line":252},10,[75,254,255],{"class":176},"    environment",[75,257,197],{"class":99},[75,259,261,264,266],{"class":77,"line":260},11,[75,262,263],{"class":176},"      POSTGRES_PASSWORD",[75,265,180],{"class":99},[75,267,268],{"class":92},"example\n",[75,270,272],{"class":77,"line":271},12,[75,273,189],{"emptyLinePlaceholder":188},[75,275,277,280],{"class":77,"line":276},13,[75,278,279],{"class":176},"networks",[75,281,197],{"class":99},[75,283,285,288],{"class":77,"line":284},14,[75,286,287],{"class":176},"  appnet",[75,289,197],{"class":99},[75,291,293,296,298],{"class":77,"line":292},15,[75,294,295],{"class":176},"    driver",[75,297,180],{"class":99},[75,299,300],{"class":92},"bridge\n",[58,302,304],{"id":303},"шаг-3-подключите-сервисы-к-сети","Шаг 3: Подключите сервисы к сети",[21,306,307,308,310],{},"Для каждого сервиса, который должен быть в сети, укажите ",[39,309,160],{}," со списком сетей. Если сервис использует только одну сеть, можете передать её как строку:",[66,312,314],{"className":167,"code":313,"language":169,"meta":71,"style":71},"services:\n  web:\n    image: nginx:alpine\n    ports:\n      - \"80:80\"\n    networks:\n      - appnet\n  db:\n    image: postgres:15\n    environment:\n      POSTGRES_PASSWORD: example\n    networks:\n      - appnet\n",[39,315,316,322,328,336,342,348,355,362,368,376,382,390,396],{"__ignoreMap":71},[75,317,318,320],{"class":77,"line":78},[75,319,194],{"class":176},[75,321,197],{"class":99},[75,323,324,326],{"class":77,"line":85},[75,325,202],{"class":176},[75,327,197],{"class":99},[75,329,330,332,334],{"class":77,"line":116},[75,331,209],{"class":176},[75,333,180],{"class":99},[75,335,214],{"class":92},[75,337,338,340],{"class":77,"line":122},[75,339,220],{"class":176},[75,341,197],{"class":99},[75,343,344,346],{"class":77,"line":137},[75,345,228],{"class":99},[75,347,231],{"class":92},[75,349,350,353],{"class":77,"line":217},[75,351,352],{"class":176},"    networks",[75,354,197],{"class":99},[75,356,357,359],{"class":77,"line":225},[75,358,228],{"class":99},[75,360,361],{"class":92},"appnet\n",[75,363,364,366],{"class":77,"line":234},[75,365,237],{"class":176},[75,367,197],{"class":99},[75,369,370,372,374],{"class":77,"line":242},[75,371,209],{"class":176},[75,373,180],{"class":99},[75,375,249],{"class":92},[75,377,378,380],{"class":77,"line":252},[75,379,255],{"class":176},[75,381,197],{"class":99},[75,383,384,386,388],{"class":77,"line":260},[75,385,263],{"class":176},[75,387,180],{"class":99},[75,389,268],{"class":92},[75,391,392,394],{"class":77,"line":271},[75,393,352],{"class":176},[75,395,197],{"class":99},[75,397,398,400],{"class":77,"line":276},[75,399,228],{"class":99},[75,401,361],{"class":92},[58,403,405],{"id":404},"шаг-4-проверьте-подключение","Шаг 4: Проверьте подключение",[21,407,408],{},"Запустите проект и проверьте сетевое взаимодействие:",[66,410,412],{"className":68,"code":411,"language":70,"meta":71,"style":71},"docker compose up -d\n# Проверьте пингом внутри контейнера web\ndocker exec \u003Ccontainer_id_web> ping db\n# Либо через curl, если сервис предоставляет HTTP\ndocker exec \u003Ccontainer_id_web> curl -s http://db:5432\n",[39,413,414,428,433,459,464],{"__ignoreMap":71},[75,415,416,418,421,424],{"class":77,"line":78},[75,417,41],{"class":88},[75,419,420],{"class":92}," compose",[75,422,423],{"class":92}," up",[75,425,427],{"class":426},"sj4cs"," -d\n",[75,429,430],{"class":77,"line":85},[75,431,432],{"class":81},"# Проверьте пингом внутри контейнера web\n",[75,434,435,437,440,444,447,450,453,456],{"class":77,"line":116},[75,436,41],{"class":88},[75,438,439],{"class":92}," exec",[75,441,443],{"class":442},"szBVR"," \u003C",[75,445,446],{"class":92},"container_id_we",[75,448,449],{"class":99},"b",[75,451,452],{"class":442},">",[75,454,455],{"class":92}," ping",[75,457,458],{"class":92}," db\n",[75,460,461],{"class":77,"line":122},[75,462,463],{"class":81},"# Либо через curl, если сервис предоставляет HTTP\n",[75,465,466,468,470,472,474,476,478,481,484],{"class":77,"line":137},[75,467,41],{"class":88},[75,469,439],{"class":92},[75,471,443],{"class":442},[75,473,446],{"class":92},[75,475,449],{"class":99},[75,477,452],{"class":442},[75,479,480],{"class":92}," curl",[75,482,483],{"class":426}," -s",[75,485,486],{"class":92}," http://db:5432\n",[21,488,489],{},"Если пинг успешен, сеть работает правильно.",[58,491,493],{"id":492},"шаг-5-диагностика-типичных-проблем","Шаг 5: Диагностика типичных проблем",[495,496,497,513],"table",{},[498,499,500],"thead",{},[501,502,503,507,510],"tr",{},[504,505,506],"th",{},"Симптом",[504,508,509],{},"Возможная причина",[504,511,512],{},"Решение",[514,515,516,530,551],"tbody",{},[501,517,518,522,527],{},[519,520,521],"td",{},"Контейнеры не видят друг друга",[519,523,524,525],{},"Сеть не определена в корневом разделе ",[39,526,160],{},[519,528,529],{},"Убедитесь, что сети указаны в корне файла.",[501,531,532,538,541],{},[519,533,534,537],{},[39,535,536],{},"ping"," не успешен",[519,539,540],{},"Контейнер подключён к другой сети или отсутствует DNS",[519,542,543,544,547,548,550],{},"Проверьте ",[39,545,546],{},"docker inspect \u003Cконтейнер>"," на наличие сетевых алиасов; переопределите ",[39,549,160],{}," в сервисе.",[501,552,553,556,563],{},[519,554,555],{},"Контейнер не может разрешить DNS по имени хоста",[519,557,558,559,562],{},"Отсутствует сетевой драйвер ",[39,560,561],{},"bridge"," или используется пользовательская сеть без DNS",[519,564,565,566,568],{},"Используйте стандартный драйвер ",[39,567,561],{}," или настройте сетевую подсеть вручную.",[142,570,571],{},[21,572,573,574,45],{},"⚠️ Важно: Если вы используете пользовательскую сеть, убедитесь, что драйвер установлен (",[39,575,576],{},"docker network create --driver \u003Cdriver> \u003Cname>",[578,579],"in-article-ad",{},[16,581,583],{"id":582},"проверка-результата","Проверка результата",[29,585,586,592,598],{},[32,587,588,589,45],{},"Каждый сервис должен иметь корректный IP-адрес в подсети сети (",[39,590,591],{},"docker network inspect appnet",[32,593,594,597],{},[39,595,596],{},"docker compose ps"," показывает состояние сервисов как «up».",[32,599,600,601,604,605,608],{},"Внутри контейнера ",[39,602,603],{},"ping \u003Cимя-соседа>"," успешен, а ",[39,606,607],{},"curl http://\u003Cимя-сервиса>"," возвращает ответ.",[21,610,611],{},"Если всё вышеперечисленное работает, сеть настроена корректно и готова к использованию в производстве или разработке.",[16,613,615],{"id":614},"возможные-проблемы","Возможные проблемы",[29,617,618,632,638],{},[32,619,620,624,625,628,629,45],{},[621,622,623],"strong",{},"Разрешение DNS не работает",": Убедитесь, что сетевые алиасы сервисов определены корректно (",[39,626,627],{},"networks: - appnet"," или ",[39,630,631],{},"aliases: [...]",[32,633,634,637],{},[621,635,636],{},"Конфликт портов",": Избегайте публикации одного и того же хост-порта несколькими сервисами; используйте уникальные порты или перенаправления внутри сети.",[32,639,640,643,644,647,648,150],{},[621,641,642],{},"Утечка IP-адресов",": После удаления сервисов удалите неиспользуемые сети: ",[39,645,646],{},"docker compose down --remove-orphans"," и ",[39,649,650],{},"docker network prune",[21,652,653],{},"Следуя этим рекомендациям, вы сможете быстро настроить надёжные сети Docker Compose и избежать типичных ошибок.",[655,656,657],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}",{"title":71,"searchDepth":85,"depth":85,"links":659},[660,661,662,669,670],{"id":18,"depth":85,"text":19},{"id":26,"depth":85,"text":27},{"id":55,"depth":85,"text":56,"children":663},[664,665,666,667,668],{"id":60,"depth":116,"text":61},{"id":153,"depth":116,"text":154},{"id":303,"depth":116,"text":304},{"id":404,"depth":116,"text":405},{"id":492,"depth":116,"text":493},{"id":582,"depth":85,"text":583},{"id":614,"depth":85,"text":615},null,"2026-08-09 08:47:33","Узнайте, как быстро настроить сети Docker Compose за 5 минут. Пошаговая инструкция с примерами, проверкой подключения и решением типичных проблем.","medium",false,"10-15 мин","md",[679,682,685,688],{"question":680,"answer":681},"Зачем в Docker Compose нужна отдельная сеть?","Сеть позволяет контейнерам взаимодействовать по имени хоста, избегать публикаций портов и изолировать трафик.",{"question":683,"answer":684},"Можно ли подключить один сервис к нескольким сетям?","Да, укажите `networks:` со списком сетей в сервисе в `docker-compose.yml`.",{"question":686,"answer":687},"Как проверить, что контейнер подключён к сети?","Используйте `docker exec \u003Cконтейнер> ping \u003Cимя-соседа>` или `curl http://\u003Cимя-сервиса>`.",{"question":689,"answer":690},"Что делать, если контейнеры не видят друг друга после добавления в сеть?","Убедитесь, что сети определены в корневом разделе `networks:` и сервисы подключены к той же сети.",[692,695,698,701,704],{"name":693,"text":694},"Установите Docker и Docker Compose","Установите Docker Engine (≥20.10) и Docker Compose Plugin или отдельный бинарный файл. На Ubuntu: `sudo apt update && sudo apt install docker.io docker-compose`.",{"name":696,"text":697},"Определите сеть в docker-compose.yml","Добавьте секцию `networks:` в корневой раздел файла. Пример: `networks: mynetwork:` с драйвером `bridge`.",{"name":699,"text":700},"Подключите сервисы к сети","Для каждого сервиса, который должен быть в сети, укажите `networks:` со списком сетей, например `networks: - mynetwork`.",{"name":702,"text":703},"Проверьте подключение","Запустите стек командой `docker compose up -d`, затем проверьте пингом или curl внутри контейнера.",{"name":705,"text":706},"Диагностика типичных проблем","Если контейнеры не видят друг друга, проверьте `docker inspect` на наличие IP-адресов, убедитесь, что сети определены в корневом разделе и нет конфликтующих сетевых алиасов.","PT15M",[709,710,711,712,713,714,715],"docker compose networks","настройка сетей docker compose","создание сети в docker compose","docker-compose.yml networks","docker compose bridge network","docker compose network aliases","docker compose networks troubleshooting","ru_RU",{},"/guides/linux/docker-compose-networks","linux",[721,722,723],"/guides/linux/docker-compose-basics","/guides/linux/docker-compose-volumes","/guides/linux/docker-compose-environment","Гайды Docker",{"title":5,"description":673},"guides/linux/docker-compose-networks","В этом руководстве вы научитесь создавать и настраивать сети Docker Compose, подключать контейнеры и диагностировать сетевые проблемы.",[729,730,731,732],"Docker","docker-compose","networking","Linux","guide","CkVs0W-nha68uflTpS4RpIUHoDKjkydhGyo8uEKDUXQ",{"data":736,"body":737},{},{"type":738,"children":739},"root",[740],{"type":741,"tag":21,"props":742,"children":743},"element",{},[744],{"type":745,"value":681},"text",{"data":747,"body":748},{},{"type":738,"children":749},[750],{"type":741,"tag":21,"props":751,"children":752},{},[753,755,760,762,767],{"type":745,"value":754},"Да, укажите ",{"type":741,"tag":39,"props":756,"children":758},{"className":757},[],[759],{"type":745,"value":160},{"type":745,"value":761}," со списком сетей в сервисе в ",{"type":741,"tag":39,"props":763,"children":765},{"className":764},[],[766],{"type":745,"value":51},{"type":745,"value":150},{"data":769,"body":770},{},{"type":738,"children":771},[772],{"type":741,"tag":21,"props":773,"children":774},{},[775,777,783,784,789],{"type":745,"value":776},"Используйте ",{"type":741,"tag":39,"props":778,"children":780},{"className":779},[],[781],{"type":745,"value":782},"docker exec \u003Cконтейнер> ping \u003Cимя-соседа>",{"type":745,"value":628},{"type":741,"tag":39,"props":785,"children":787},{"className":786},[],[788],{"type":745,"value":607},{"type":745,"value":150},{"data":791,"body":792},{},{"type":738,"children":793},[794],{"type":741,"tag":21,"props":795,"children":796},{},[797,799,804],{"type":745,"value":798},"Убедитесь, что сети определены в корневом разделе ",{"type":741,"tag":39,"props":800,"children":802},{"className":801},[],[803],{"type":745,"value":160},{"type":745,"value":805}," и сервисы подключены к той же сети.",{"data":807,"body":808},{},{"type":738,"children":809},[810],{"type":741,"tag":21,"props":811,"children":812},{},[813,815,821],{"type":745,"value":814},"Установите Docker Engine (≥20.10) и Docker Compose Plugin или отдельный бинарный файл. На Ubuntu: ",{"type":741,"tag":39,"props":816,"children":818},{"className":817},[],[819],{"type":745,"value":820},"sudo apt update && sudo apt install docker.io docker-compose",{"type":745,"value":150},{"data":823,"body":824},{},{"type":738,"children":825},[826],{"type":741,"tag":21,"props":827,"children":828},{},[829,830,835,837,843,845,850],{"type":745,"value":157},{"type":741,"tag":39,"props":831,"children":833},{"className":832},[],[834],{"type":745,"value":160},{"type":745,"value":836}," в корневой раздел файла. Пример: ",{"type":741,"tag":39,"props":838,"children":840},{"className":839},[],[841],{"type":745,"value":842},"networks: mynetwork:",{"type":745,"value":844}," с драйвером ",{"type":741,"tag":39,"props":846,"children":848},{"className":847},[],[849],{"type":745,"value":561},{"type":745,"value":150},{"data":852,"body":853},{},{"type":738,"children":854},[855],{"type":741,"tag":21,"props":856,"children":857},{},[858,859,864,866,872],{"type":745,"value":307},{"type":741,"tag":39,"props":860,"children":862},{"className":861},[],[863],{"type":745,"value":160},{"type":745,"value":865}," со списком сетей, например ",{"type":741,"tag":39,"props":867,"children":869},{"className":868},[],[870],{"type":745,"value":871},"networks: - mynetwork",{"type":745,"value":150},{"data":874,"body":875},{},{"type":738,"children":876},[877],{"type":741,"tag":21,"props":878,"children":879},{},[880,882,888],{"type":745,"value":881},"Запустите стек командой ",{"type":741,"tag":39,"props":883,"children":885},{"className":884},[],[886],{"type":745,"value":887},"docker compose up -d",{"type":745,"value":889},", затем проверьте пингом или curl внутри контейнера.",{"data":891,"body":892},{},{"type":738,"children":893},[894],{"type":741,"tag":21,"props":895,"children":896},{},[897,899,905],{"type":745,"value":898},"Если контейнеры не видят друг друга, проверьте ",{"type":741,"tag":39,"props":900,"children":902},{"className":901},[],[903],{"type":745,"value":904},"docker inspect",{"type":745,"value":906}," на наличие IP-адресов, убедитесь, что сети определены в корневом разделе и нет конфликтующих сетевых алиасов.",[908],{"id":909,"title":910,"appliesTo":911,"author":11,"body":916,"canonical":671,"code":671,"createdAt":2187,"description":2188,"difficulty":2189,"draft":675,"estimatedTime":2190,"extension":677,"faq":2191,"howToSteps":2204,"howToTotalTime":2223,"image":671,"keywords":2224,"locale":716,"meta":2235,"navigation":188,"path":721,"platform":719,"related":2236,"section":724,"seo":2240,"severity":671,"stem":2241,"summary":2242,"tags":2243,"twitterCreator":671,"twitterSite":671,"type":733,"updatedAt":2187,"__hash__":2247},"content_ru/guides/linux/docker-compose-basics.md","Docker Compose для Linux: создайте первый стек сервисов",[912,913,914,915],"Docker Engine 20.10+","Docker Compose v2.0+","Ubuntu 20.04/22.04","CentOS 8/Rocky 9",{"type":13,"value":917,"toc":2163},[918,920,923,926,939,941,944,971,974,995,998,1023,1026,1041,1045,1048,1069,1075,1094,1098,1104,1426,1430,1543,1547,1553,1568,1571,1599,1608,1612,1735,1737,1741,1744,1830,1833,1849,1853,1863,1882,1885,1903,1905,1911,1936,1939,1956,1958,1965,1973,1993,1999,2006,2038,2044,2054,2082,2088,2095,2105,2128,2132,2139,2160],[16,919,19],{"id":18},[21,921,922],{},"Docker Compose — это инструмент, который позволяет описывать и управлять многоконтейнерными приложениями с помощью одного YAML-файла. Вместо того чтобы вручную запускать десяток контейнеров, настраивать сети и тома, вы описываете всю инфраструктуру как код. Это особенно полезно для разработки, тестирования и локального развёртывания.",[21,924,925],{},"После выполнения этого гайда вы:",[29,927,928,933,936],{},[32,929,930,931],{},"Поймёте базовый синтаксис ",[39,932,51],{},[32,934,935],{},"Научитесь запускать стек из веб-сервиса и базы данных",[32,937,938],{},"Узнаете, как управлять жизненным циклом контейнеров одной командой",[16,940,27],{"id":26},[21,942,943],{},"Перед началом убедитесь, что у вас установлено:",[945,946,947,953,963],"ol",{},[32,948,949,952],{},[621,950,951],{},"Docker Engine"," (версия 20.10 или новее)",[32,954,955,958,959,962],{},[621,956,957],{},"Docker Compose v2"," (входит в состав Docker Desktop для Linux или как плагин ",[39,960,961],{},"docker-compose-plugin",")",[32,964,965,968,969,962],{},[621,966,967],{},"Права sudo"," (или пользователь в группе ",[39,970,41],{},[21,972,973],{},"Проверьте установку:",[66,975,977],{"className":68,"code":976,"language":70,"meta":71,"style":71},"docker --version\ndocker compose version\n",[39,978,979,986],{"__ignoreMap":71},[75,980,981,983],{"class":77,"line":78},[75,982,41],{"class":88},[75,984,985],{"class":426}," --version\n",[75,987,988,990,992],{"class":77,"line":85},[75,989,41],{"class":88},[75,991,420],{"class":92},[75,993,994],{"class":92}," version\n",[21,996,997],{},"Если Docker Compose не установлен, на Ubuntu/Debian:",[66,999,1001],{"className":68,"code":1000,"language":70,"meta":71,"style":71},"sudo apt update\nsudo apt install docker-compose-plugin\n",[39,1002,1003,1012],{"__ignoreMap":71},[75,1004,1005,1007,1009],{"class":77,"line":78},[75,1006,89],{"class":88},[75,1008,93],{"class":92},[75,1010,1011],{"class":92}," update\n",[75,1013,1014,1016,1018,1020],{"class":77,"line":85},[75,1015,89],{"class":88},[75,1017,93],{"class":92},[75,1019,107],{"class":92},[75,1021,1022],{"class":92}," docker-compose-plugin\n",[21,1024,1025],{},"На CentOS/Rocky/AlmaLinux:",[66,1027,1029],{"className":68,"code":1028,"language":70,"meta":71,"style":71},"sudo yum install docker-compose-plugin\n",[39,1030,1031],{"__ignoreMap":71},[75,1032,1033,1035,1037,1039],{"class":77,"line":78},[75,1034,89],{"class":88},[75,1036,127],{"class":92},[75,1038,107],{"class":92},[75,1040,1022],{"class":92},[16,1042,1044],{"id":1043},"шаг-1-создайте-структуру-проекта","Шаг 1: Создайте структуру проекта",[21,1046,1047],{},"Создайте каталог для вашего приложения и перейдите в него:",[66,1049,1051],{"className":68,"code":1050,"language":70,"meta":71,"style":71},"mkdir myapp && cd myapp\n",[39,1052,1053],{"__ignoreMap":71},[75,1054,1055,1058,1061,1063,1066],{"class":77,"line":78},[75,1056,1057],{"class":88},"mkdir",[75,1059,1060],{"class":92}," myapp",[75,1062,100],{"class":99},[75,1064,1065],{"class":426},"cd",[75,1067,1068],{"class":92}," myapp\n",[21,1070,1071,1072,1074],{},"В этом каталоге создайте файл ",[39,1073,51],{},". Мы будем разворачивать простой стек:",[29,1076,1077,1086],{},[32,1078,1079,1085],{},[621,1080,1081,1082],{},"Сервис ",[39,1083,1084],{},"web",": Python Flask-приложение",[32,1087,1088,1093],{},[621,1089,1081,1090],{},[39,1091,1092],{},"db",": PostgreSQL",[16,1095,1097],{"id":1096},"шаг-2-напишите-файл-docker-composeyml","Шаг 2: Напишите файл docker-compose.yml",[21,1099,1100,1101,1103],{},"Создайте файл ",[39,1102,51],{}," со следующим содержимым:",[66,1105,1107],{"className":167,"code":1106,"language":169,"meta":71,"style":71},"version: '3.8'\n\nservices:\n  web:\n    image: python:3.11-slim\n    command: >\n      sh -c \"pip install flask psycopg2-binary &&\n             echo 'from flask import Flask\\nfrom psycopg2 import connect\\napp = Flask(__name__)\\n@app.route(\\\"/\\\")\\ndef hello():\\n    try:\\n        conn = connect(dbname=\\\"testdb\\\", user=\\\"user\\\", password=\\\"password\\\", host=\\\"db\\\")\\n        return \\\"Hello from Docker Compose! DB connection: OK\\\"\\n    except Exception as e:\\n        return f\\\"DB error: {e}\\\"\\nif __name__ == \\\"__main__\\\":\\n    app.run(host=\\\"0.0.0.0\\\", port=5000)' > app.py &&\n             python app.py\"\n    ports:\n      - \"5000:5000\"\n    depends_on:\n      - db\n    environment:\n      - DATABASE_URL=postgresql://user:password@db/testdb\n    networks:\n      - app-network\n\n  db:\n    image: postgres:15-alpine\n    environment:\n      POSTGRES_USER: user\n      POSTGRES_PASSWORD: password\n      POSTGRES_DB: testdb\n    volumes:\n      - postgres_data:/var/lib/postgresql/data\n    networks:\n      - app-network\n    healthcheck:\n      test: [\"CMD-SHELL\", \"pg_isready -U user\"]\n      interval: 10s\n      timeout: 5s\n      retries: 5\n\nvolumes:\n  postgres_data:\n\nnetworks:\n  app-network:\n    driver: bridge\n",[39,1108,1109,1118,1122,1128,1134,1143,1153,1158,1163,1168,1174,1181,1188,1195,1201,1208,1215,1223,1228,1235,1245,1252,1263,1273,1284,1292,1300,1307,1314,1322,1343,1354,1365,1376,1381,1389,1397,1402,1409,1417],{"__ignoreMap":71},[75,1110,1111,1113,1115],{"class":77,"line":78},[75,1112,177],{"class":176},[75,1114,180],{"class":99},[75,1116,1117],{"class":92},"'3.8'\n",[75,1119,1120],{"class":77,"line":85},[75,1121,189],{"emptyLinePlaceholder":188},[75,1123,1124,1126],{"class":77,"line":116},[75,1125,194],{"class":176},[75,1127,197],{"class":99},[75,1129,1130,1132],{"class":77,"line":122},[75,1131,202],{"class":176},[75,1133,197],{"class":99},[75,1135,1136,1138,1140],{"class":77,"line":137},[75,1137,209],{"class":176},[75,1139,180],{"class":99},[75,1141,1142],{"class":92},"python:3.11-slim\n",[75,1144,1145,1148,1150],{"class":77,"line":217},[75,1146,1147],{"class":176},"    command",[75,1149,180],{"class":99},[75,1151,1152],{"class":442},">\n",[75,1154,1155],{"class":77,"line":225},[75,1156,1157],{"class":92},"      sh -c \"pip install flask psycopg2-binary &&\n",[75,1159,1160],{"class":77,"line":234},[75,1161,1162],{"class":92},"             echo 'from flask import Flask\\nfrom psycopg2 import connect\\napp = Flask(__name__)\\n@app.route(\\\"/\\\")\\ndef hello():\\n    try:\\n        conn = connect(dbname=\\\"testdb\\\", user=\\\"user\\\", password=\\\"password\\\", host=\\\"db\\\")\\n        return \\\"Hello from Docker Compose! DB connection: OK\\\"\\n    except Exception as e:\\n        return f\\\"DB error: {e}\\\"\\nif __name__ == \\\"__main__\\\":\\n    app.run(host=\\\"0.0.0.0\\\", port=5000)' > app.py &&\n",[75,1164,1165],{"class":77,"line":242},[75,1166,1167],{"class":92},"             python app.py\"\n",[75,1169,1170,1172],{"class":77,"line":252},[75,1171,220],{"class":176},[75,1173,197],{"class":99},[75,1175,1176,1178],{"class":77,"line":260},[75,1177,228],{"class":99},[75,1179,1180],{"class":92},"\"5000:5000\"\n",[75,1182,1183,1186],{"class":77,"line":271},[75,1184,1185],{"class":176},"    depends_on",[75,1187,197],{"class":99},[75,1189,1190,1192],{"class":77,"line":276},[75,1191,228],{"class":99},[75,1193,1194],{"class":92},"db\n",[75,1196,1197,1199],{"class":77,"line":284},[75,1198,255],{"class":176},[75,1200,197],{"class":99},[75,1202,1203,1205],{"class":77,"line":292},[75,1204,228],{"class":99},[75,1206,1207],{"class":92},"DATABASE_URL=postgresql://user:password@db/testdb\n",[75,1209,1211,1213],{"class":77,"line":1210},16,[75,1212,352],{"class":176},[75,1214,197],{"class":99},[75,1216,1218,1220],{"class":77,"line":1217},17,[75,1219,228],{"class":99},[75,1221,1222],{"class":92},"app-network\n",[75,1224,1226],{"class":77,"line":1225},18,[75,1227,189],{"emptyLinePlaceholder":188},[75,1229,1231,1233],{"class":77,"line":1230},19,[75,1232,237],{"class":176},[75,1234,197],{"class":99},[75,1236,1238,1240,1242],{"class":77,"line":1237},20,[75,1239,209],{"class":176},[75,1241,180],{"class":99},[75,1243,1244],{"class":92},"postgres:15-alpine\n",[75,1246,1248,1250],{"class":77,"line":1247},21,[75,1249,255],{"class":176},[75,1251,197],{"class":99},[75,1253,1255,1258,1260],{"class":77,"line":1254},22,[75,1256,1257],{"class":176},"      POSTGRES_USER",[75,1259,180],{"class":99},[75,1261,1262],{"class":92},"user\n",[75,1264,1266,1268,1270],{"class":77,"line":1265},23,[75,1267,263],{"class":176},[75,1269,180],{"class":99},[75,1271,1272],{"class":92},"password\n",[75,1274,1276,1279,1281],{"class":77,"line":1275},24,[75,1277,1278],{"class":176},"      POSTGRES_DB",[75,1280,180],{"class":99},[75,1282,1283],{"class":92},"testdb\n",[75,1285,1287,1290],{"class":77,"line":1286},25,[75,1288,1289],{"class":176},"    volumes",[75,1291,197],{"class":99},[75,1293,1295,1297],{"class":77,"line":1294},26,[75,1296,228],{"class":99},[75,1298,1299],{"class":92},"postgres_data:/var/lib/postgresql/data\n",[75,1301,1303,1305],{"class":77,"line":1302},27,[75,1304,352],{"class":176},[75,1306,197],{"class":99},[75,1308,1310,1312],{"class":77,"line":1309},28,[75,1311,228],{"class":99},[75,1313,1222],{"class":92},[75,1315,1317,1320],{"class":77,"line":1316},29,[75,1318,1319],{"class":176},"    healthcheck",[75,1321,197],{"class":99},[75,1323,1325,1328,1331,1334,1337,1340],{"class":77,"line":1324},30,[75,1326,1327],{"class":176},"      test",[75,1329,1330],{"class":99},": [",[75,1332,1333],{"class":92},"\"CMD-SHELL\"",[75,1335,1336],{"class":99},", ",[75,1338,1339],{"class":92},"\"pg_isready -U user\"",[75,1341,1342],{"class":99},"]\n",[75,1344,1346,1349,1351],{"class":77,"line":1345},31,[75,1347,1348],{"class":176},"      interval",[75,1350,180],{"class":99},[75,1352,1353],{"class":92},"10s\n",[75,1355,1357,1360,1362],{"class":77,"line":1356},32,[75,1358,1359],{"class":176},"      timeout",[75,1361,180],{"class":99},[75,1363,1364],{"class":92},"5s\n",[75,1366,1368,1371,1373],{"class":77,"line":1367},33,[75,1369,1370],{"class":176},"      retries",[75,1372,180],{"class":99},[75,1374,1375],{"class":426},"5\n",[75,1377,1379],{"class":77,"line":1378},34,[75,1380,189],{"emptyLinePlaceholder":188},[75,1382,1384,1387],{"class":77,"line":1383},35,[75,1385,1386],{"class":176},"volumes",[75,1388,197],{"class":99},[75,1390,1392,1395],{"class":77,"line":1391},36,[75,1393,1394],{"class":176},"  postgres_data",[75,1396,197],{"class":99},[75,1398,1400],{"class":77,"line":1399},37,[75,1401,189],{"emptyLinePlaceholder":188},[75,1403,1405,1407],{"class":77,"line":1404},38,[75,1406,279],{"class":176},[75,1408,197],{"class":99},[75,1410,1412,1415],{"class":77,"line":1411},39,[75,1413,1414],{"class":176},"  app-network",[75,1416,197],{"class":99},[75,1418,1420,1422,1424],{"class":77,"line":1419},40,[75,1421,295],{"class":176},[75,1423,180],{"class":99},[75,1425,300],{"class":92},[58,1427,1429],{"id":1428},"пояснения-к-файлу","Пояснения к файлу:",[29,1431,1432,1437,1526,1533],{},[32,1433,1434,1436],{},[621,1435,177],{},": указывает версию схемы Compose (используйте 3.8 для совместимости)",[32,1438,1439,1441,1442],{},[621,1440,194],{},": список контейнеров (сервисов)\n",[29,1443,1444,1493],{},[32,1445,1446,197,1448],{},[621,1447,1084],{},[29,1449,1450,1456,1462,1468,1479,1485],{},[32,1451,1452,1455],{},[39,1453,1454],{},"image",": базовый образ Python",[32,1457,1458,1461],{},[39,1459,1460],{},"command",": запускает скрипт, который устанавливает Flask, создаёт простое приложение и запускает его",[32,1463,1464,1467],{},[39,1465,1466],{},"ports",": пробрасывает порт 5000 контейнера на порт 5000 хоста",[32,1469,1470,1473,1474,1476,1477],{},[39,1471,1472],{},"depends_on",": гарантирует, что ",[39,1475,1092],{}," запустится до ",[39,1478,1084],{},[32,1480,1481,1484],{},[39,1482,1483],{},"environment",": переменные окружения (используются в приложении)",[32,1486,1487,1489,1490],{},[39,1488,279],{},": присоединяет сервис к пользовательской сети ",[39,1491,1492],{},"app-network",[32,1494,1495,197,1497],{},[621,1496,1092],{},[29,1498,1499,1504,1509,1518],{},[32,1500,1501,1503],{},[39,1502,1454],{},": образ PostgreSQL 15",[32,1505,1506,1508],{},[39,1507,1483],{},": учётные данные БД",[32,1510,1511,1513,1514,1517],{},[39,1512,1386],{},": том ",[39,1515,1516],{},"postgres_data"," сохраняет данные БД на хосте (даже после удаления контейнера)",[32,1519,1520,1523,1524,962],{},[39,1521,1522],{},"healthcheck",": проверка готовности PostgreSQL (важно для ",[39,1525,1472],{},[32,1527,1528,1530,1531],{},[621,1529,1386],{},": объявляет именованный том ",[39,1532,1516],{},[32,1534,1535,1537,1538,1540,1541,962],{},[621,1536,279],{},": создаёт сеть ",[39,1539,1492],{}," (по умолчанию driver ",[39,1542,561],{},[16,1544,1546],{"id":1545},"шаг-3-запустите-стек","Шаг 3: Запустите стек",[21,1548,1549,1550,1552],{},"В каталоге с ",[39,1551,51],{}," выполните:",[66,1554,1556],{"className":68,"code":1555,"language":70,"meta":71,"style":71},"docker compose up -d\n",[39,1557,1558],{"__ignoreMap":71},[75,1559,1560,1562,1564,1566],{"class":77,"line":78},[75,1561,41],{"class":88},[75,1563,420],{"class":92},[75,1565,423],{"class":92},[75,1567,427],{"class":426},[21,1569,1570],{},"Что произойдёт:",[945,1572,1573,1576,1583,1593],{},[32,1574,1575],{},"Docker Compose прочитает конфигурацию",[32,1577,1578,1579,1582],{},"Создаст сеть ",[39,1580,1581],{},"myapp_app-network"," (префикс — имя каталога)",[32,1584,1585,1586,647,1589,1592],{},"Загрузит образы ",[39,1587,1588],{},"python:3.11-slim",[39,1590,1591],{},"postgres:15-alpine"," (если их нет локально)",[32,1594,1595,1596,962],{},"Запустит контейнеры в фоновом режиме (",[39,1597,1598],{},"-d",[142,1600,1601],{},[21,1602,1603,1604,1607],{},"💡 ",[621,1605,1606],{},"Совет",": Первый запуск может занять минуту — Docker скачивает образы (около 500 МБ).",[16,1609,1611],{"id":1610},"шаг-4-проверьте-работу","Шаг 4: Проверьте работу",[945,1613,1614,1641,1674,1694],{},[32,1615,1616,1619,1620,1634,1637,1638,150],{},[621,1617,1618],{},"Посмотрите статус контейнеров",":",[66,1621,1623],{"className":68,"code":1622,"language":70,"meta":71,"style":71},"docker compose ps\n",[39,1624,1625],{"__ignoreMap":71},[75,1626,1627,1629,1631],{"class":77,"line":78},[75,1628,41],{"class":88},[75,1630,420],{"class":92},[75,1632,1633],{"class":92}," ps\n",[1635,1636],"br",{},"Вывод должен показать оба сервиса в состоянии ",[39,1639,1640],{},"Up",[32,1642,1643,1646,1647],{},[621,1644,1645],{},"Проверьте логи"," (если что-то не работает):",[66,1648,1650],{"className":68,"code":1649,"language":70,"meta":71,"style":71},"docker compose logs web\ndocker compose logs db\n",[39,1651,1652,1664],{"__ignoreMap":71},[75,1653,1654,1656,1658,1661],{"class":77,"line":78},[75,1655,41],{"class":88},[75,1657,420],{"class":92},[75,1659,1660],{"class":92}," logs",[75,1662,1663],{"class":92}," web\n",[75,1665,1666,1668,1670,1672],{"class":77,"line":85},[75,1667,41],{"class":88},[75,1669,420],{"class":92},[75,1671,1660],{"class":92},[75,1673,458],{"class":92},[32,1675,1676,1679,1680,1683,1684,1691,1693],{},[621,1677,1678],{},"Тестируйте приложение",":\nОткройте браузер и перейдите по адресу ",[39,1681,1682],{},"http://localhost:5000",". Должны увидеть:",[66,1685,1689],{"className":1686,"code":1688,"language":745},[1687],"language-text","Hello from Docker Compose! DB connection: OK\n",[39,1690,1688],{"__ignoreMap":71},[1635,1692],{},"Это значит, что веб-контейнер успешно подключился к PostgreSQL.",[32,1695,1696,1619,1699],{},[621,1697,1698],{},"Проверьте сеть",[66,1700,1702],{"className":68,"code":1701,"language":70,"meta":71,"style":71},"docker network ls | grep app-network\ndocker network inspect myapp_app-network\n",[39,1703,1704,1723],{"__ignoreMap":71},[75,1705,1706,1708,1711,1714,1717,1720],{"class":77,"line":78},[75,1707,41],{"class":88},[75,1709,1710],{"class":92}," network",[75,1712,1713],{"class":92}," ls",[75,1715,1716],{"class":442}," |",[75,1718,1719],{"class":88}," grep",[75,1721,1722],{"class":92}," app-network\n",[75,1724,1725,1727,1729,1732],{"class":77,"line":85},[75,1726,41],{"class":88},[75,1728,1710],{"class":92},[75,1730,1731],{"class":92}," inspect",[75,1733,1734],{"class":92}," myapp_app-network\n",[578,1736],{},[16,1738,1740],{"id":1739},"шаг-5-управление-стеком","Шаг 5: Управление стеком",[21,1742,1743],{},"Основные команды:",[495,1745,1746,1756],{},[498,1747,1748],{},[501,1749,1750,1753],{},[504,1751,1752],{},"Команда",[504,1754,1755],{},"Действие",[514,1757,1758,1768,1778,1788,1800,1810,1820],{},[501,1759,1760,1765],{},[519,1761,1762],{},[39,1763,1764],{},"docker compose down",[519,1766,1767],{},"Останавливает и удаляет контейнеры, сети (тома остаются)",[501,1769,1770,1775],{},[519,1771,1772],{},[39,1773,1774],{},"docker compose down -v",[519,1776,1777],{},"Удаляет также тома (данные БД будут потеряны!)",[501,1779,1780,1785],{},[519,1781,1782],{},[39,1783,1784],{},"docker compose logs -f",[519,1786,1787],{},"Отслеживает логи в реальном времени",[501,1789,1790,1795],{},[519,1791,1792],{},[39,1793,1794],{},"docker compose exec web bash",[519,1796,1797,1798],{},"Заходит в контейнер ",[39,1799,1084],{},[501,1801,1802,1807],{},[519,1803,1804],{},[39,1805,1806],{},"docker compose stop",[519,1808,1809],{},"Останавливает контейнеры (без удаления)",[501,1811,1812,1817],{},[519,1813,1814],{},[39,1815,1816],{},"docker compose start",[519,1818,1819],{},"Запускает остановленные контейнеры",[501,1821,1822,1827],{},[519,1823,1824],{},[39,1825,1826],{},"docker compose rm",[519,1828,1829],{},"Удаляет остановленные контейнеры",[21,1831,1832],{},"Пример перезапуска только одного сервиса:",[66,1834,1836],{"className":68,"code":1835,"language":70,"meta":71,"style":71},"docker compose restart web\n",[39,1837,1838],{"__ignoreMap":71},[75,1839,1840,1842,1844,1847],{"class":77,"line":78},[75,1841,41],{"class":88},[75,1843,420],{"class":92},[75,1845,1846],{"class":92}," restart",[75,1848,1663],{"class":92},[16,1850,1852],{"id":1851},"шаг-6-модификация-и-пересборка","Шаг 6: Модификация и пересборка",[21,1854,1855,1856,1858,1859,1862],{},"Если вы изменили ",[39,1857,51],{}," или нужно пересобрать образ (например, добавили ",[39,1860,1861],{},"Dockerfile","), используйте:",[66,1864,1866],{"className":68,"code":1865,"language":70,"meta":71,"style":71},"docker compose up -d --build\n",[39,1867,1868],{"__ignoreMap":71},[75,1869,1870,1872,1874,1876,1879],{"class":77,"line":78},[75,1871,41],{"class":88},[75,1873,420],{"class":92},[75,1875,423],{"class":92},[75,1877,1878],{"class":426}," -d",[75,1880,1881],{"class":426}," --build\n",[21,1883,1884],{},"Для принудительной перезагрузки контейнеров без сборки:",[66,1886,1888],{"className":68,"code":1887,"language":70,"meta":71,"style":71},"docker compose up -d --force-recreate\n",[39,1889,1890],{"__ignoreMap":71},[75,1891,1892,1894,1896,1898,1900],{"class":77,"line":78},[75,1893,41],{"class":88},[75,1895,420],{"class":92},[75,1897,423],{"class":92},[75,1899,1878],{"class":426},[75,1901,1902],{"class":426}," --force-recreate\n",[16,1904,583],{"id":582},[21,1906,1907,1908,1619],{},"✅ ",[621,1909,1910],{},"Критерии успеха",[29,1912,1913,1921,1927],{},[32,1914,1915,1916,1918,1919,962],{},"Контейнеры запущены (",[39,1917,596],{}," показывает ",[39,1920,1640],{},[32,1922,1923,1924,1926],{},"Веб-приложение отвечает на ",[39,1925,1682],{}," и сообщает об успешном подключении к БД",[32,1928,1929,1930,1932,1933,962],{},"Данные PostgreSQL сохраняются в томе ",[39,1931,1516],{}," (проверьте ",[39,1934,1935],{},"docker volume ls",[21,1937,1938],{},"Если что-то не работает:",[945,1940,1941,1947,1950],{},[32,1942,1943,1944],{},"Проверьте логи: ",[39,1945,1946],{},"docker compose logs",[32,1948,1949],{},"Убедитесь, что порт 5000 не занят другим приложением",[32,1951,1952,1953],{},"Проверьте, что оба сервиса в одной сети: ",[39,1954,1955],{},"docker network inspect myapp_app-network",[16,1957,615],{"id":614},[58,1959,1961,1962],{"id":1960},"ошибка-error-response-from-daemon-port-is-already-allocated","Ошибка: ",[39,1963,1964],{},"Error response from daemon: port is already allocated",[21,1966,1967,1970,1971,1619],{},[621,1968,1969],{},"Причина",": Порт 5000 уже используется другим процессом.\n",[621,1972,512],{},[29,1974,1975,1984],{},[32,1976,1977,1978,647,1981,962],{},"Остановите конфликтующий процесс (",[39,1979,1980],{},"sudo lsof -i:5000",[39,1982,1983],{},"kill",[32,1985,1986,1987,1989,1990,962],{},"Или измените проброс портов в ",[39,1988,51],{}," (например, ",[39,1991,1992],{},"\"8080:5000\"",[58,1994,1961,1996],{"id":1995},"ошибка-postgres-connection-to-server-at-db-1722002-port-5432-failed-connection-refused",[39,1997,1998],{},"postgres: connection to server at \"db\" (172.20.0.2), port 5432 failed: Connection refused",[21,2000,2001,2003,2004,1619],{},[621,2002,1969],{},": Веб-контейнер пытается подключиться к БД до её полной готовности.\n",[621,2005,512],{},[29,2007,2008,2017,2029],{},[32,2009,2010,2011,2013,2014,2016],{},"Убедитесь, что в ",[39,2012,1092],{}," есть ",[39,2015,1522],{}," (как в примере)",[32,2018,2019,2020,2022,2023,628,2026,962],{},"Добавьте в команду ",[39,2021,1084],{}," ожидание (например, через ",[39,2024,2025],{},"wait-for-it.sh",[39,2027,2028],{},"dockerize",[32,2030,2031,2032,2034,2035],{},"Или увеличьте ",[39,2033,1472],{}," с условием ",[39,2036,2037],{},"condition: service_healthy",[58,2039,1961,2041],{"id":2040},"ошибка-permission-denied-while-trying-to-connect-to-the-docker-daemon-socket",[39,2042,2043],{},"permission denied while trying to connect to the Docker daemon socket",[21,2045,2046,2048,2049,2051,2052,1619],{},[621,2047,1969],{},": Текущий пользователь не в группе ",[39,2050,41],{},".\n",[621,2053,512],{},[66,2055,2057],{"className":68,"code":2056,"language":70,"meta":71,"style":71},"sudo usermod -aG docker $USER\nnewgrp docker\n",[39,2058,2059,2074],{"__ignoreMap":71},[75,2060,2061,2063,2066,2069,2071],{"class":77,"line":78},[75,2062,89],{"class":88},[75,2064,2065],{"class":92}," usermod",[75,2067,2068],{"class":426}," -aG",[75,2070,132],{"class":92},[75,2072,2073],{"class":99}," $USER\n",[75,2075,2076,2079],{"class":77,"line":85},[75,2077,2078],{"class":88},"newgrp",[75,2080,2081],{"class":92}," docker\n",[21,2083,2084,2085,2087],{},"Или используйте ",[39,2086,89],{}," для команд Docker.",[58,2089,2091,2092,2094],{"id":2090},"том-postgres_data-не-создаётся","Том ",[39,2093,1516],{}," не создаётся",[21,2096,2097,2099,2100,2102,2103,1619],{},[621,2098,1969],{},": Ошибка в синтаксисе ",[39,2101,1386],{}," или недостаточно прав.\n",[621,2104,512],{},[29,2106,2107,2110,2119],{},[32,2108,2109],{},"Проверьте отступы в YAML (пробелы, не табы)",[32,2111,2010,2112,2114,2115,2118],{},[39,2113,1092],{}," путь тома ",[39,2116,2117],{},"/var/lib/postgresql/data"," существует в образе PostgreSQL",[32,2120,2121,2122,2124,2125],{},"Посмотрите ",[39,2123,1935],{}," — том должен называться ",[39,2126,2127],{},"[каталог]_postgres_data",[58,2129,2131],{"id":2130},"образы-не-скачиваются-ошибки-сети","Образы не скачиваются (ошибки сети)",[21,2133,2134,2136,2137,1619],{},[621,2135,1969],{},": Проблемы с доступом к Docker Hub.\n",[621,2138,512],{},[29,2140,2141,2147,2154],{},[32,2142,2143,2144,962],{},"Настройте DNS в Docker (",[39,2145,2146],{},"/etc/docker/daemon.json",[32,2148,2149,2150,2153],{},"Используйте зеркало (например, ",[39,2151,2152],{},"registry-mirrors"," для Kubernetes/OpenShift)",[32,2155,2156,2157],{},"Или загрузите образы вручную: ",[39,2158,2159],{},"docker pull python:3.11-slim",[655,2161,2162],{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}",{"title":71,"searchDepth":85,"depth":85,"links":2164},[2165,2166,2167,2168,2171,2172,2173,2174,2175,2176],{"id":18,"depth":85,"text":19},{"id":26,"depth":85,"text":27},{"id":1043,"depth":85,"text":1044},{"id":1096,"depth":85,"text":1097,"children":2169},[2170],{"id":1428,"depth":116,"text":1429},{"id":1545,"depth":85,"text":1546},{"id":1610,"depth":85,"text":1611},{"id":1739,"depth":85,"text":1740},{"id":1851,"depth":85,"text":1852},{"id":582,"depth":85,"text":583},{"id":614,"depth":85,"text":615,"children":2177},[2178,2180,2182,2184,2186],{"id":1960,"depth":116,"text":2179},"Ошибка: Error response from daemon: port is already allocated",{"id":1995,"depth":116,"text":2181},"Ошибка: postgres: connection to server at \"db\" (172.20.0.2), port 5432 failed: Connection refused",{"id":2040,"depth":116,"text":2183},"Ошибка: permission denied while trying to connect to the Docker daemon socket",{"id":2090,"depth":116,"text":2185},"Том postgres_data не создаётся",{"id":2130,"depth":116,"text":2131},"2026-02-17 15:01:14","Полное руководство по Docker Compose на Linux. Узнайте, как с помощью одного файла поднять многоконтейнерное приложение с базой данных. Пошагово, с примерами.","easy","15-20 мин",[2192,2195,2198,2201],{"question":2193,"answer":2194},"Что такое Docker Compose и зачем он нужен?","Docker Compose — это инструмент для определения и запуска многоконтейнерных Docker-приложений. С помощью одного файла `docker-compose.yml` вы описываете сервисы, сети и тома, а затем управляете всем стеком одной командой.",{"question":2196,"answer":2197},"Как установить Docker Compose на Linux?","Для современных дистрибутивов Docker Compose поставляется как плагин Docker CLI (`docker compose`). Установите пакет `docker-compose-plugin` через менеджер пакетов (apt, yum) или скачайте бинарник с GitHub.",{"question":2199,"answer":2200},"В чём разница между `docker-compose` и `docker compose`?","`docker compose` — это встроенный плагин Docker CLI (рекомендуемый способ с Docker Compose v2). `docker-compose` — отдельный бинарный файл (устаревший v1). Команды практически идентичны.",{"question":2202,"answer":2203},"Как запустить docker-compose в фоновом режиме?","Используйте флаг `-d` (detached): `docker compose up -d`. Для остановки: `docker compose down`.",[2205,2208,2211,2214,2217,2220],{"name":2206,"text":2207},"Установите Docker Compose (если не установлен)","Убедитесь, что у вас установлен Docker Engine и плагин Compose. Проверьте командой `docker compose version`. Если нет — установите пакет `docker-compose-plugin`.",{"name":2209,"text":2210},"Создайте каталог проекта и файл docker-compose.yml","Создайте отдельную папку для проекта. Внутри создайте файл `docker-compose.yml` с определением сервисов. Пример ниже включает веб-приложение (Python Flask) и базу данных PostgreSQL.",{"name":2212,"text":2213},"Настройте сервисы в docker-compose.yml","Опишите каждый сервис: образ, порты, переменные окружения, зависимости и тома. Для базы данных задайте volume для сохранения данных между перезапусками.",{"name":2215,"text":2216},"Запустите стек командой docker compose up","В каталоге с `docker-compose.yml` выполните `docker compose up -d`. Docker загрузит образы, создаст сеть и запустит контейнеры. Флаг `-d` запускает в фоне.",{"name":2218,"text":2219},"Проверьте статус контейнеров","Выполните `docker compose ps` для просмотра состояния сервисов. Также можно использовать `docker compose logs` для просмотра логов.",{"name":2221,"text":2222},"Остановите и удалите контейнеры","Когда работа завершена, выполните `docker compose down`. Для удаления также томов (данные базы) добавьте флаг `-v`.","PT20M",[2225,2226,2227,2228,2229,2230,2231,2232,2233,2234],"docker-compose основы","как использовать docker-compose linux","docker-compose пример.yml","запуск многоконтейнерного приложения docker","docker-compose up команда","файл docker-compose.yml структура","docker-compose для начинающих","оркестрация контейнеров docker","docker compose сервисы","docker-compose volumes сети",{},[2237,2238,2239],"/guides/linux/docker-installation","/guides/linux/docker-volumes","/errors/linux/docker-compose-command-not-found",{"title":910,"description":2188},"guides/linux/docker-compose-basics","Это руководство познакомит вас с Docker Compose — инструментом для оркестрации контейнеров. Вы создадите файл docker-compose.yml и запустите стек из веб-сервиса и PostgreSQL. Подходит для начинающих разработчиков и админов Linux.",[41,730,2244,2245,719,2246],"контейнеризация","devops","multicontainer","33EXhExfWVN_ZYS36r7_wvaVlC2ux1mJm7yZx_Qv8d4"]