[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"page-ru-/guides/linux/docker-basics":3,"mdc--7myhcp-key":1481,"mdc-y5atfz-key":1492,"mdc-6nm5tz-key":1508,"mdc-evwvbq-key":1532,"mdc-8u79qj-key":1540,"mdc-nlavfm-key":1548,"mdc-95o079-key":1565,"mdc-oaif48-key":1573,"mdc--a8q4op-key":1581,"related-/guides/linux/docker-compose-basics,/guides/linux/dockerfile-best-practices,/errors/linux/docker-permission-denied":1589},{"id":4,"title":5,"appliesTo":6,"author":11,"body":12,"canonical":1417,"code":1417,"createdAt":1418,"description":1419,"difficulty":1420,"draft":1421,"estimatedTime":1422,"extension":1423,"faq":1424,"howToSteps":1437,"howToTotalTime":1453,"image":1417,"keywords":1454,"locale":1463,"meta":1464,"navigation":148,"path":1465,"platform":1466,"related":1467,"section":1471,"seo":1472,"severity":1417,"stem":1473,"summary":1474,"tags":1475,"twitterCreator":1417,"twitterSite":1417,"type":1479,"updatedAt":1418,"__hash__":1480},"content_ru/guides/linux/docker-basics.md","Docker для Linux: установка и базовые команды с примерами",[7,8,9,10],"Ubuntu 22.04+","Debian 11+","CentOS 8+","Docker 20.10+","FixPedia Team",{"type":13,"value":14,"toc":1386},"minimark",[15,20,24,40,43,47,50,81,85,88,93,347,351,433,437,452,455,459,471,518,524,539,546,549,553,560,564,579,596,600,615,621,625,637,652,656,670,673,677,683,687,713,733,737,764,784,788,800,814,821,836,840,916,920,934,945,949,952,1200,1204,1207,1271,1275,1282,1302,1306,1326,1330,1338,1382],[16,17,19],"h2",{"id":18},"введение-зачем-это-нужно","Введение / Зачем это нужно",[21,22,23],"p",{},"Docker — это платформа для контейнеризации, которая позволяет упаковывать приложения и их зависимости в изолированные, переносимые среды — контейнеры. На Linux это особенно удобно, поскольку Docker использует встроенные возможности ядра (cgroups, namespaces). После прохождения этого гайда вы сможете:",[25,26,27,31,34,37],"ul",{},[28,29,30],"li",{},"Установить и настроить Docker Engine на свой сервер или рабочую станциюю.",[28,32,33],{},"Запускать, останавливать и удалять контейнеры.",[28,35,36],{},"Работать с образами: искать, скачивать, создавать свои.",[28,38,39],{},"Понять базовый синтаксис Dockerfile для автоматизации сборки.",[21,41,42],{},"Это основа для дальнейшего изучения оркестрации (Kubernetes) и CI/CD-пайплайнов.",[16,44,46],{"id":45},"требования-подготовка","Требования / Подготовка",[21,48,49],{},"Перед началом убедитесь, что:",[51,52,53,61,64,67],"ol",{},[28,54,55,56,60],{},"У вас есть доступ к терминалу Linux (Ubuntu, Debian, CentOS, Fedora и т.д.) с правами ",[57,58,59],"code",{},"sudo",".",[28,62,63],{},"Система 64-битная (x86_64/amd64 или arm64).",[28,65,66],{},"Подключение к интернету для загрузки пакетов и образов.",[28,68,69,70,73,74,73,77,80],{},"(Опционально) Базовое понимание командной строки и управления пакетами (",[57,71,72],{},"apt",", ",[57,75,76],{},"yum",[57,78,79],{},"dnf",").",[16,82,84],{"id":83},"шаг-1-установка-docker-engine","Шаг 1: Установка Docker Engine",[21,86,87],{},"Установка через официальный репозиторий — самый надежный способ.",[89,90,92],"h3",{"id":91},"для-ubuntudebian","Для Ubuntu/Debian:",[94,95,100],"pre",{"className":96,"code":97,"language":98,"meta":99,"style":99},"language-bash shiki shiki-themes github-light github-dark","# 1. Обновите индекс пакетов и установите зависимости\nsudo apt-get update\nsudo apt-get install ca-certificates curl gnupg\n\n# 2. Добавьте официальный GPG-ключ Docker\nsudo install -m 0755 -d /etc/apt/keyrings\ncurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg\nsudo chmod a+r /etc/apt/keyrings/docker.gpg\n\n# 3. Добавьте репозиторий Docker в sources.list\necho \\\n  \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \\\n  $(. /etc/os-release && echo \"$VERSION_CODENAME\") stable\" | \\\n  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null\n\n# 4. Установите Docker Engine, containerd и Docker Compose (plugin)\nsudo apt-get update\nsudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin\n","bash","",[57,101,102,111,124,143,150,156,176,207,220,225,231,240,258,285,303,308,314,323],{"__ignoreMap":99},[103,104,107],"span",{"class":105,"line":106},"line",1,[103,108,110],{"class":109},"sJ8bj","# 1. Обновите индекс пакетов и установите зависимости\n",[103,112,114,117,121],{"class":105,"line":113},2,[103,115,59],{"class":116},"sScJk",[103,118,120],{"class":119},"sZZnC"," apt-get",[103,122,123],{"class":119}," update\n",[103,125,127,129,131,134,137,140],{"class":105,"line":126},3,[103,128,59],{"class":116},[103,130,120],{"class":119},[103,132,133],{"class":119}," install",[103,135,136],{"class":119}," ca-certificates",[103,138,139],{"class":119}," curl",[103,141,142],{"class":119}," gnupg\n",[103,144,146],{"class":105,"line":145},4,[103,147,149],{"emptyLinePlaceholder":148},true,"\n",[103,151,153],{"class":105,"line":152},5,[103,154,155],{"class":109},"# 2. Добавьте официальный GPG-ключ Docker\n",[103,157,159,161,163,167,170,173],{"class":105,"line":158},6,[103,160,59],{"class":116},[103,162,133],{"class":119},[103,164,166],{"class":165},"sj4cs"," -m",[103,168,169],{"class":165}," 0755",[103,171,172],{"class":165}," -d",[103,174,175],{"class":119}," /etc/apt/keyrings\n",[103,177,179,182,185,188,192,195,198,201,204],{"class":105,"line":178},7,[103,180,181],{"class":116},"curl",[103,183,184],{"class":165}," -fsSL",[103,186,187],{"class":119}," https://download.docker.com/linux/ubuntu/gpg",[103,189,191],{"class":190},"szBVR"," |",[103,193,194],{"class":116}," sudo",[103,196,197],{"class":119}," gpg",[103,199,200],{"class":165}," --dearmor",[103,202,203],{"class":165}," -o",[103,205,206],{"class":119}," /etc/apt/keyrings/docker.gpg\n",[103,208,210,212,215,218],{"class":105,"line":209},8,[103,211,59],{"class":116},[103,213,214],{"class":119}," chmod",[103,216,217],{"class":119}," a+r",[103,219,206],{"class":119},[103,221,223],{"class":105,"line":222},9,[103,224,149],{"emptyLinePlaceholder":148},[103,226,228],{"class":105,"line":227},10,[103,229,230],{"class":109},"# 3. Добавьте репозиторий Docker в sources.list\n",[103,232,234,237],{"class":105,"line":233},11,[103,235,236],{"class":165},"echo",[103,238,239],{"class":165}," \\\n",[103,241,243,246,249,252,255],{"class":105,"line":242},12,[103,244,245],{"class":119},"  \"deb [arch=$(",[103,247,248],{"class":116},"dpkg",[103,250,251],{"class":165}," --print-architecture",[103,253,254],{"class":119},") signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu ",[103,256,257],{"class":165},"\\\n",[103,259,261,264,266,269,271,274,278,281,283],{"class":105,"line":260},13,[103,262,263],{"class":119},"  $(",[103,265,60],{"class":165},[103,267,268],{"class":119}," /etc/os-release && ",[103,270,236],{"class":165},[103,272,273],{"class":119}," \"",[103,275,277],{"class":276},"sVt8B","$VERSION_CODENAME",[103,279,280],{"class":119},"\") stable\"",[103,282,191],{"class":190},[103,284,239],{"class":165},[103,286,288,291,294,297,300],{"class":105,"line":287},14,[103,289,290],{"class":116},"  sudo",[103,292,293],{"class":119}," tee",[103,295,296],{"class":119}," /etc/apt/sources.list.d/docker.list",[103,298,299],{"class":190}," >",[103,301,302],{"class":119}," /dev/null\n",[103,304,306],{"class":105,"line":305},15,[103,307,149],{"emptyLinePlaceholder":148},[103,309,311],{"class":105,"line":310},16,[103,312,313],{"class":109},"# 4. Установите Docker Engine, containerd и Docker Compose (plugin)\n",[103,315,317,319,321],{"class":105,"line":316},17,[103,318,59],{"class":116},[103,320,120],{"class":119},[103,322,123],{"class":119},[103,324,326,328,330,332,335,338,341,344],{"class":105,"line":325},18,[103,327,59],{"class":116},[103,329,120],{"class":119},[103,331,133],{"class":119},[103,333,334],{"class":119}," docker-ce",[103,336,337],{"class":119}," docker-ce-cli",[103,339,340],{"class":119}," containerd.io",[103,342,343],{"class":119}," docker-buildx-plugin",[103,345,346],{"class":119}," docker-compose-plugin\n",[89,348,350],{"id":349},"для-centosrhelfedora","Для CentOS/RHEL/Fedora:",[94,352,354],{"className":96,"code":353,"language":98,"meta":99,"style":99},"# 1. Установите yum-utils (для управления репозиториями)\nsudo yum install -y yum-utils\n\n# 2. Добавьте репозиторий Docker\nsudo yum-config-manager \\\n    --add-repo \\\n    https://download.docker.com/linux/centos/docker-ce.repo\n\n# 3. Установите Docker Engine\nsudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin\n",[57,355,356,361,376,380,385,394,401,406,410,415],{"__ignoreMap":99},[103,357,358],{"class":105,"line":106},[103,359,360],{"class":109},"# 1. Установите yum-utils (для управления репозиториями)\n",[103,362,363,365,368,370,373],{"class":105,"line":113},[103,364,59],{"class":116},[103,366,367],{"class":119}," yum",[103,369,133],{"class":119},[103,371,372],{"class":165}," -y",[103,374,375],{"class":119}," yum-utils\n",[103,377,378],{"class":105,"line":126},[103,379,149],{"emptyLinePlaceholder":148},[103,381,382],{"class":105,"line":145},[103,383,384],{"class":109},"# 2. Добавьте репозиторий Docker\n",[103,386,387,389,392],{"class":105,"line":152},[103,388,59],{"class":116},[103,390,391],{"class":119}," yum-config-manager",[103,393,239],{"class":165},[103,395,396,399],{"class":105,"line":158},[103,397,398],{"class":165},"    --add-repo",[103,400,239],{"class":165},[103,402,403],{"class":105,"line":178},[103,404,405],{"class":119},"    https://download.docker.com/linux/centos/docker-ce.repo\n",[103,407,408],{"class":105,"line":209},[103,409,149],{"emptyLinePlaceholder":148},[103,411,412],{"class":105,"line":222},[103,413,414],{"class":109},"# 3. Установите Docker Engine\n",[103,416,417,419,421,423,425,427,429,431],{"class":105,"line":227},[103,418,59],{"class":116},[103,420,367],{"class":119},[103,422,133],{"class":119},[103,424,334],{"class":119},[103,426,337],{"class":119},[103,428,340],{"class":119},[103,430,343],{"class":119},[103,432,346],{"class":119},[89,434,436],{"id":435},"проверьте-установку","Проверьте установку:",[94,438,440],{"className":96,"code":439,"language":98,"meta":99,"style":99},"sudo docker version\n",[57,441,442],{"__ignoreMap":99},[103,443,444,446,449],{"class":105,"line":106},[103,445,59],{"class":116},[103,447,448],{"class":119}," docker",[103,450,451],{"class":119}," version\n",[21,453,454],{},"Вывод должен показать клиент и сервер (Engine) с версиями.",[16,456,458],{"id":457},"шаг-2-настройка-прав-доступа-и-первая-проверка","Шаг 2: Настройка прав доступа и первая проверка",[21,460,461,462,465,466,468,469,60],{},"По умолчанию команды ",[57,463,464],{},"docker"," требуют прав ",[57,467,59],{},". Чтобы запускать контейнеры от обычного пользователя, добавьте его в группу ",[57,470,464],{},[94,472,474],{"className":96,"code":473,"language":98,"meta":99,"style":99},"# Добавьте текущего пользователя в группу docker\nsudo usermod -aG docker $USER\n\n# Чтобы изменения вступили в силу, выйдите из системы и зайдите заново,\n# или выполните в текущей сессии:\nnewgrp docker\n",[57,475,476,481,496,500,505,510],{"__ignoreMap":99},[103,477,478],{"class":105,"line":106},[103,479,480],{"class":109},"# Добавьте текущего пользователя в группу docker\n",[103,482,483,485,488,491,493],{"class":105,"line":113},[103,484,59],{"class":116},[103,486,487],{"class":119}," usermod",[103,489,490],{"class":165}," -aG",[103,492,448],{"class":119},[103,494,495],{"class":276}," $USER\n",[103,497,498],{"class":105,"line":126},[103,499,149],{"emptyLinePlaceholder":148},[103,501,502],{"class":105,"line":145},[103,503,504],{"class":109},"# Чтобы изменения вступили в силу, выйдите из системы и зайдите заново,\n",[103,506,507],{"class":105,"line":152},[103,508,509],{"class":109},"# или выполните в текущей сессии:\n",[103,511,512,515],{"class":105,"line":158},[103,513,514],{"class":116},"newgrp",[103,516,517],{"class":119}," docker\n",[21,519,520,521,523],{},"Теперь проверьте, что всё работает без ",[57,522,59],{},":",[94,525,527],{"className":96,"code":526,"language":98,"meta":99,"style":99},"docker run hello-world\n",[57,528,529],{"__ignoreMap":99},[103,530,531,533,536],{"class":105,"line":106},[103,532,464],{"class":116},[103,534,535],{"class":119}," run",[103,537,538],{"class":119}," hello-world\n",[21,540,541,542,545],{},"Вы должны увидеть приветственное сообщение от Docker, подтверждающее успешную загрузку образа ",[57,543,544],{},"hello-world"," и запуск контейнера.",[547,548],"in-article-ad",{},[16,550,552],{"id":551},"шаг-3-основные-команды-для-работы-с-образами","Шаг 3: Основные команды для работы с образами",[21,554,555,559],{},[556,557,558],"strong",{},"Образ (image)"," — это шаблон (файловая система + метаданные) для создания контейнеров.",[89,561,563],{"id":562},"поиск-образа-в-docker-hub-официальном-репозитории","Поиск образа в Docker Hub (официальном репозитории)",[94,565,567],{"className":96,"code":566,"language":98,"meta":99,"style":99},"docker search nginx\n",[57,568,569],{"__ignoreMap":99},[103,570,571,573,576],{"class":105,"line":106},[103,572,464],{"class":116},[103,574,575],{"class":119}," search",[103,577,578],{"class":119}," nginx\n",[21,580,581,582,585,586,589,590,73,593,60],{},"Ключевые колонки: ",[57,583,584],{},"NAME"," (официальные образы помечены как ",[57,587,588],{},"[OK]","), ",[57,591,592],{},"DESCRIPTION",[57,594,595],{},"STARS",[89,597,599],{"id":598},"загрузка-образа-локально","Загрузка образа локально",[94,601,603],{"className":96,"code":602,"language":98,"meta":99,"style":99},"docker pull ubuntu:22.04\n",[57,604,605],{"__ignoreMap":99},[103,606,607,609,612],{"class":105,"line":106},[103,608,464],{"class":116},[103,610,611],{"class":119}," pull",[103,613,614],{"class":119}," ubuntu:22.04\n",[21,616,617,618,60],{},"Эта команда скачает последний LTS-образ Ubuntu 22.04. Если тег не указан, используется ",[57,619,620],{},"latest",[89,622,624],{"id":623},"список-локальных-образов","Список локальных образов",[94,626,628],{"className":96,"code":627,"language":98,"meta":99,"style":99},"docker images\n",[57,629,630],{"__ignoreMap":99},[103,631,632,634],{"class":105,"line":106},[103,633,464],{"class":116},[103,635,636],{"class":119}," images\n",[21,638,639,640,73,643,73,646,73,649,60],{},"Обратите внимание на колонки: ",[57,641,642],{},"REPOSITORY",[57,644,645],{},"TAG",[57,647,648],{},"IMAGE ID",[57,650,651],{},"SIZE",[89,653,655],{"id":654},"удаление-образа","Удаление образа",[94,657,659],{"className":96,"code":658,"language":98,"meta":99,"style":99},"docker rmi ubuntu:22.04\n",[57,660,661],{"__ignoreMap":99},[103,662,663,665,668],{"class":105,"line":106},[103,664,464],{"class":116},[103,666,667],{"class":119}," rmi",[103,669,614],{"class":119},[21,671,672],{},"Если образ используется запущенным контейнером, его удаление невозможно. Сначала удалите контейнер.",[16,674,676],{"id":675},"шаг-4-запуск-и-управление-контейнерами","Шаг 4: Запуск и управление контейнерами",[21,678,679,682],{},[556,680,681],{},"Контейнер (container)"," — это запущенный экземпляр образа.",[89,684,686],{"id":685},"запуск-контейнера-в-интерактивном-режиме","Запуск контейнера в интерактивном режиме",[94,688,690],{"className":96,"code":689,"language":98,"meta":99,"style":99},"docker run -it --name my-ubuntu ubuntu:22.04 /bin/bash\n",[57,691,692],{"__ignoreMap":99},[103,693,694,696,698,701,704,707,710],{"class":105,"line":106},[103,695,464],{"class":116},[103,697,535],{"class":119},[103,699,700],{"class":165}," -it",[103,702,703],{"class":165}," --name",[103,705,706],{"class":119}," my-ubuntu",[103,708,709],{"class":119}," ubuntu:22.04",[103,711,712],{"class":119}," /bin/bash\n",[25,714,715,721,727],{},[28,716,717,720],{},[57,718,719],{},"-it"," — интерактивный режим с TTY (терминал).",[28,722,723,726],{},[57,724,725],{},"--name"," — задаёт удобное имя контейнеру (иначе генерируется случайное).",[28,728,729,730,60],{},"После команды вы окажетесь внутри shell контейнера. Для выхода используйте ",[57,731,732],{},"exit",[89,734,736],{"id":735},"запуск-контейнера-в-фоновом-режиме-daemon","Запуск контейнера в фоновом режиме (daemon)",[94,738,740],{"className":96,"code":739,"language":98,"meta":99,"style":99},"docker run -d --name web-server -p 8080:80 nginx:alpine\n",[57,741,742],{"__ignoreMap":99},[103,743,744,746,748,750,752,755,758,761],{"class":105,"line":106},[103,745,464],{"class":116},[103,747,535],{"class":119},[103,749,172],{"class":165},[103,751,703],{"class":165},[103,753,754],{"class":119}," web-server",[103,756,757],{"class":165}," -p",[103,759,760],{"class":119}," 8080:80",[103,762,763],{"class":119}," nginx:alpine\n",[25,765,766,772,778],{},[28,767,768,771],{},[57,769,770],{},"-d"," — detached mode (контейнер работает в фоне).",[28,773,774,777],{},[57,775,776],{},"-p 8080:80"," — проброс портов: хост:контейнер. Веб-сервер внутри контейнера слушает порт 80, а снаружи доступен на порту 8080 вашего хоста.",[28,779,780,781,60],{},"Проверить работу: откройте в браузере ",[57,782,783],{},"http://localhost:8080",[89,785,787],{"id":786},"просмотр-запущенных-контейнеров","Просмотр запущенных контейнеров",[94,789,791],{"className":96,"code":790,"language":98,"meta":99,"style":99},"docker ps\n",[57,792,793],{"__ignoreMap":99},[103,794,795,797],{"class":105,"line":106},[103,796,464],{"class":116},[103,798,799],{"class":119}," ps\n",[21,801,581,802,73,805,73,808,73,811,60],{},[57,803,804],{},"CONTAINER ID",[57,806,807],{},"NAMES",[57,809,810],{},"STATUS",[57,812,813],{},"PORTS",[21,815,816,817,820],{},"Чтобы увидеть ",[556,818,819],{},"все"," контейнеры (включая остановленные):",[94,822,824],{"className":96,"code":823,"language":98,"meta":99,"style":99},"docker ps -a\n",[57,825,826],{"__ignoreMap":99},[103,827,828,830,833],{"class":105,"line":106},[103,829,464],{"class":116},[103,831,832],{"class":119}," ps",[103,834,835],{"class":165}," -a\n",[89,837,839],{"id":838},"остановка-и-удаление-контейнера","Остановка и удаление контейнера",[94,841,843],{"className":96,"code":842,"language":98,"meta":99,"style":99},"# Остановить контейнер (сохраняет файловую систему)\ndocker stop web-server\n\n# Запустить остановленный контейнер\ndocker start web-server\n\n# Удалить остановленный контейнер\ndocker rm web-server\n\n# Принудительно удалить запущенный контейнер (данные потеряются!)\ndocker rm -f web-server\n",[57,844,845,850,860,864,869,878,882,887,896,900,905],{"__ignoreMap":99},[103,846,847],{"class":105,"line":106},[103,848,849],{"class":109},"# Остановить контейнер (сохраняет файловую систему)\n",[103,851,852,854,857],{"class":105,"line":113},[103,853,464],{"class":116},[103,855,856],{"class":119}," stop",[103,858,859],{"class":119}," web-server\n",[103,861,862],{"class":105,"line":126},[103,863,149],{"emptyLinePlaceholder":148},[103,865,866],{"class":105,"line":145},[103,867,868],{"class":109},"# Запустить остановленный контейнер\n",[103,870,871,873,876],{"class":105,"line":152},[103,872,464],{"class":116},[103,874,875],{"class":119}," start",[103,877,859],{"class":119},[103,879,880],{"class":105,"line":158},[103,881,149],{"emptyLinePlaceholder":148},[103,883,884],{"class":105,"line":178},[103,885,886],{"class":109},"# Удалить остановленный контейнер\n",[103,888,889,891,894],{"class":105,"line":209},[103,890,464],{"class":116},[103,892,893],{"class":119}," rm",[103,895,859],{"class":119},[103,897,898],{"class":105,"line":222},[103,899,149],{"emptyLinePlaceholder":148},[103,901,902],{"class":105,"line":227},[103,903,904],{"class":109},"# Принудительно удалить запущенный контейнер (данные потеряются!)\n",[103,906,907,909,911,914],{"class":105,"line":233},[103,908,464],{"class":116},[103,910,893],{"class":119},[103,912,913],{"class":165}," -f",[103,915,859],{"class":119},[89,917,919],{"id":918},"просмотр-логов-контейнера","Просмотр логов контейнера",[94,921,923],{"className":96,"code":922,"language":98,"meta":99,"style":99},"docker logs web-server\n",[57,924,925],{"__ignoreMap":99},[103,926,927,929,932],{"class":105,"line":106},[103,928,464],{"class":116},[103,930,931],{"class":119}," logs",[103,933,859],{"class":119},[21,935,936,937,940,941,944],{},"Добавьте ",[57,938,939],{},"-f"," или ",[57,942,943],{},"--follow"," для отслеживания логов в реальном времени.",[16,946,948],{"id":947},"шаг-5-создание-собственного-образа-через-dockerfile","Шаг 5: Создание собственного образа через Dockerfile",[21,950,951],{},"Dockerfile — это текстовый файл с инструкциями для сборки образа.",[51,953,954,1102,1126,1163],{},[28,955,956,957,523,960],{},"Создайте пустую директорию и в ней файл ",[57,958,959],{},"Dockerfile",[94,961,963],{"className":96,"code":962,"language":98,"meta":99,"style":99},"mkdir my-nginx && cd my-nginx\ncat > Dockerfile \u003C\u003C 'EOF'\n# Используем официальный легковесный образ Alpine Linux\nFROM alpine:3.18\n\n# Устанавливаем nginx\nRUN apk add --no-cache nginx\n\n# Копируем кастомный конфиг (если есть) или используем дефолтный\n# COPY nginx.conf /etc/nginx/nginx.conf\n\n# Создаём директорию для файлов сайта\nRUN mkdir -p /var/www/html\n\n# Копируем локальный файл index.html в образ\nCOPY index.html /var/www/html/index.html\n\n# Открываем порт 80\nEXPOSE 80\n\n# Запускаем nginx в foreground\nCMD [\"nginx\", \"-g\", \"daemon off;\"]\nEOF\n",[57,964,965,982,998,1003,1008,1012,1017,1022,1026,1031,1036,1040,1045,1050,1054,1059,1064,1068,1073,1079,1084,1090,1096],{"__ignoreMap":99},[103,966,967,970,973,976,979],{"class":105,"line":106},[103,968,969],{"class":116},"mkdir",[103,971,972],{"class":119}," my-nginx",[103,974,975],{"class":276}," && ",[103,977,978],{"class":165},"cd",[103,980,981],{"class":119}," my-nginx\n",[103,983,984,987,989,992,995],{"class":105,"line":113},[103,985,986],{"class":116},"cat",[103,988,299],{"class":190},[103,990,991],{"class":119}," Dockerfile",[103,993,994],{"class":190}," \u003C\u003C",[103,996,997],{"class":119}," 'EOF'\n",[103,999,1000],{"class":105,"line":126},[103,1001,1002],{"class":119},"# Используем официальный легковесный образ Alpine Linux\n",[103,1004,1005],{"class":105,"line":145},[103,1006,1007],{"class":119},"FROM alpine:3.18\n",[103,1009,1010],{"class":105,"line":152},[103,1011,149],{"emptyLinePlaceholder":148},[103,1013,1014],{"class":105,"line":158},[103,1015,1016],{"class":119},"# Устанавливаем nginx\n",[103,1018,1019],{"class":105,"line":178},[103,1020,1021],{"class":119},"RUN apk add --no-cache nginx\n",[103,1023,1024],{"class":105,"line":209},[103,1025,149],{"emptyLinePlaceholder":148},[103,1027,1028],{"class":105,"line":222},[103,1029,1030],{"class":119},"# Копируем кастомный конфиг (если есть) или используем дефолтный\n",[103,1032,1033],{"class":105,"line":227},[103,1034,1035],{"class":119},"# COPY nginx.conf /etc/nginx/nginx.conf\n",[103,1037,1038],{"class":105,"line":233},[103,1039,149],{"emptyLinePlaceholder":148},[103,1041,1042],{"class":105,"line":242},[103,1043,1044],{"class":119},"# Создаём директорию для файлов сайта\n",[103,1046,1047],{"class":105,"line":260},[103,1048,1049],{"class":119},"RUN mkdir -p /var/www/html\n",[103,1051,1052],{"class":105,"line":287},[103,1053,149],{"emptyLinePlaceholder":148},[103,1055,1056],{"class":105,"line":305},[103,1057,1058],{"class":119},"# Копируем локальный файл index.html в образ\n",[103,1060,1061],{"class":105,"line":310},[103,1062,1063],{"class":119},"COPY index.html /var/www/html/index.html\n",[103,1065,1066],{"class":105,"line":316},[103,1067,149],{"emptyLinePlaceholder":148},[103,1069,1070],{"class":105,"line":325},[103,1071,1072],{"class":119},"# Открываем порт 80\n",[103,1074,1076],{"class":105,"line":1075},19,[103,1077,1078],{"class":119},"EXPOSE 80\n",[103,1080,1082],{"class":105,"line":1081},20,[103,1083,149],{"emptyLinePlaceholder":148},[103,1085,1087],{"class":105,"line":1086},21,[103,1088,1089],{"class":119},"# Запускаем nginx в foreground\n",[103,1091,1093],{"class":105,"line":1092},22,[103,1094,1095],{"class":119},"CMD [\"nginx\", \"-g\", \"daemon off;\"]\n",[103,1097,1099],{"class":105,"line":1098},23,[103,1100,1101],{"class":119},"EOF\n",[28,1103,1104,1105,1108,1109],{},"Создайте простой ",[57,1106,1107],{},"index.html"," в той же директории:",[94,1110,1112],{"className":96,"code":1111,"language":98,"meta":99,"style":99},"echo \"\u003Ch1>Hello from my custom Docker image!\u003C/h1>\" > index.html\n",[57,1113,1114],{"__ignoreMap":99},[103,1115,1116,1118,1121,1123],{"class":105,"line":106},[103,1117,236],{"class":165},[103,1119,1120],{"class":119}," \"\u003Ch1>Hello from my custom Docker image!\u003C/h1>\"",[103,1122,299],{"class":190},[103,1124,1125],{"class":119}," index.html\n",[28,1127,1128,1129,1150],{},"Соберите образ:",[94,1130,1132],{"className":96,"code":1131,"language":98,"meta":99,"style":99},"docker build -t my-custom-nginx:latest .\n",[57,1133,1134],{"__ignoreMap":99},[103,1135,1136,1138,1141,1144,1147],{"class":105,"line":106},[103,1137,464],{"class":116},[103,1139,1140],{"class":119}," build",[103,1142,1143],{"class":165}," -t",[103,1145,1146],{"class":119}," my-custom-nginx:latest",[103,1148,1149],{"class":119}," .\n",[25,1151,1152,1158],{},[28,1153,1154,1157],{},[57,1155,1156],{},"-t"," — тег (имя:версия) образа.",[28,1159,1160,1162],{},[57,1161,60],{}," — контекст сборки (текущая директория).",[28,1164,1165,1166,1192,1195,1196,1199],{},"Запустите контейнер из нового образа:",[94,1167,1169],{"className":96,"code":1168,"language":98,"meta":99,"style":99},"docker run -d -p 8081:80 --name my-app my-custom-nginx:latest\n",[57,1170,1171],{"__ignoreMap":99},[103,1172,1173,1175,1177,1179,1181,1184,1186,1189],{"class":105,"line":106},[103,1174,464],{"class":116},[103,1176,535],{"class":119},[103,1178,172],{"class":165},[103,1180,757],{"class":165},[103,1182,1183],{"class":119}," 8081:80",[103,1185,703],{"class":165},[103,1187,1188],{"class":119}," my-app",[103,1190,1191],{"class":119}," my-custom-nginx:latest\n",[1193,1194],"br",{},"Откройте ",[57,1197,1198],{},"http://localhost:8081"," — вы увидите свой заголовок.",[16,1201,1203],{"id":1202},"проверка-результата","Проверка результата",[21,1205,1206],{},"Вы успешно освоили базовый цикл работы с Docker, если можете:",[51,1208,1209,1212,1219,1225],{},[28,1210,1211],{},"Установить Docker на чистую систему Linux.",[28,1213,1214,1215,1218],{},"Запустить контейнер из образа ",[57,1216,1217],{},"nginx"," и увидеть страницу в браузере.",[28,1220,1221,1222,1224],{},"Создать ",[57,1223,959],{},", собрать из него образ и запустить контейнер.",[28,1226,1227,1228],{},"Остановить и удалить все созданные ресурсы:\n",[94,1229,1231],{"className":96,"code":1230,"language":98,"meta":99,"style":99},"docker stop my-ubuntu web-server my-app\ndocker rm my-ubuntu web-server my-app\ndocker rmi ubuntu:22.04 nginx:alpine my-custom-nginx:latest\n",[57,1232,1233,1246,1258],{"__ignoreMap":99},[103,1234,1235,1237,1239,1241,1243],{"class":105,"line":106},[103,1236,464],{"class":116},[103,1238,856],{"class":119},[103,1240,706],{"class":119},[103,1242,754],{"class":119},[103,1244,1245],{"class":119}," my-app\n",[103,1247,1248,1250,1252,1254,1256],{"class":105,"line":113},[103,1249,464],{"class":116},[103,1251,893],{"class":119},[103,1253,706],{"class":119},[103,1255,754],{"class":119},[103,1257,1245],{"class":119},[103,1259,1260,1262,1264,1266,1269],{"class":105,"line":126},[103,1261,464],{"class":116},[103,1263,667],{"class":119},[103,1265,709],{"class":119},[103,1267,1268],{"class":119}," nginx:alpine",[103,1270,1191],{"class":119},[16,1272,1274],{"id":1273},"возможные-проблемы","Возможные проблемы",[89,1276,1278,1279],{"id":1277},"ошибка-got-permission-denied-while-trying-to-connect-to-the-docker-daemon-socket","Ошибка: ",[57,1280,1281],{},"Got permission denied while trying to connect to the Docker daemon socket...",[21,1283,1284,1287,1288,1290,1291,1294,1295,1298,1299,80],{},[556,1285,1286],{},"Причина:"," Текущий пользователь не в группе ",[57,1289,464],{}," или сессия не перезагружена.\n",[556,1292,1293],{},"Решение:"," Выполните ",[57,1296,1297],{},"sudo usermod -aG docker $USER",", выйдите из терминала и зайдите заново (или ",[57,1300,1301],{},"newgrp docker",[89,1303,1305],{"id":1304},"контейнер-мгновенно-завершается-после-запуска","Контейнер мгновенно завершается после запуска",[21,1307,1308,1310,1311,1314,1315,1317,1318,1321,1322,1325],{},[556,1309,1286],{}," Основной процесс внутри контейнера завершился (например, команда ",[57,1312,1313],{},"docker run ubuntu echo \"test\"",").\n",[556,1316,1293],{}," Для долгоживущих контейнеров (веб-серверы, базы) основной процесс должен работать в foreground (как ",[57,1319,1320],{},"nginx -g 'daemon off;'","). Используйте ",[57,1323,1324],{},"docker logs \u003Ccontainer_id>"," для просмотра причины завершения.",[89,1327,1329],{"id":1328},"не-хватает-места-на-диске","Не хватает места на диске",[21,1331,1332,1334,1335,1337],{},[556,1333,1286],{}," Накопление образов, контейнеров, вольюмов.\n",[556,1336,1293],{}," Очистите неиспользуемые ресурсы:",[94,1339,1341],{"className":96,"code":1340,"language":98,"meta":99,"style":99},"# Удалить все остановленные контейнеры, неиспользуемые сети и dangling-образы\ndocker system prune\n\n# Удалить ВСЕ неиспользуемые данные (осторожно!)\ndocker system prune -a --volumes\n",[57,1342,1343,1348,1358,1362,1367],{"__ignoreMap":99},[103,1344,1345],{"class":105,"line":106},[103,1346,1347],{"class":109},"# Удалить все остановленные контейнеры, неиспользуемые сети и dangling-образы\n",[103,1349,1350,1352,1355],{"class":105,"line":113},[103,1351,464],{"class":116},[103,1353,1354],{"class":119}," system",[103,1356,1357],{"class":119}," prune\n",[103,1359,1360],{"class":105,"line":126},[103,1361,149],{"emptyLinePlaceholder":148},[103,1363,1364],{"class":105,"line":145},[103,1365,1366],{"class":109},"# Удалить ВСЕ неиспользуемые данные (осторожно!)\n",[103,1368,1369,1371,1373,1376,1379],{"class":105,"line":152},[103,1370,464],{"class":116},[103,1372,1354],{"class":119},[103,1374,1375],{"class":119}," prune",[103,1377,1378],{"class":165}," -a",[103,1380,1381],{"class":165}," --volumes\n",[1383,1384,1385],"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 .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}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);}",{"title":99,"searchDepth":113,"depth":113,"links":1387},[1388,1389,1390,1395,1396,1402,1409,1410,1411],{"id":18,"depth":113,"text":19},{"id":45,"depth":113,"text":46},{"id":83,"depth":113,"text":84,"children":1391},[1392,1393,1394],{"id":91,"depth":126,"text":92},{"id":349,"depth":126,"text":350},{"id":435,"depth":126,"text":436},{"id":457,"depth":113,"text":458},{"id":551,"depth":113,"text":552,"children":1397},[1398,1399,1400,1401],{"id":562,"depth":126,"text":563},{"id":598,"depth":126,"text":599},{"id":623,"depth":126,"text":624},{"id":654,"depth":126,"text":655},{"id":675,"depth":113,"text":676,"children":1403},[1404,1405,1406,1407,1408],{"id":685,"depth":126,"text":686},{"id":735,"depth":126,"text":736},{"id":786,"depth":126,"text":787},{"id":838,"depth":126,"text":839},{"id":918,"depth":126,"text":919},{"id":947,"depth":113,"text":948},{"id":1202,"depth":113,"text":1203},{"id":1273,"depth":113,"text":1274,"children":1412},[1413,1415,1416],{"id":1277,"depth":126,"text":1414},"Ошибка: Got permission denied while trying to connect to the Docker daemon socket...",{"id":1304,"depth":126,"text":1305},{"id":1328,"depth":126,"text":1329},null,"2026-02-17 16:41:25","Пошаговая инструкция по Docker для начинающих. Установка, управление контейнерами и образы. Начните работать с контейнеризацией за 10 минут.","easy",false,"10-15 мин","md",[1425,1428,1431,1434],{"question":1426,"answer":1427},"В чём разница между Docker-образом и контейнером?","Образ — это неизменяемый шаблон (как рецепт), а контейнер — запущенный экземпляр этого образа (как приготовленное блюдо).",{"question":1429,"answer":1430},"Нужно ли использовать sudo с каждой командой docker?","По умолчанию — да. Чтобы избежать этого, добавьте текущего пользователя в группу docker: `sudo usermod -aG docker $USER` и перезайдите в систему.",{"question":1432,"answer":1433},"Как удалить все остановленные контейнеры?","Используйте команду `docker container prune`. Она удалит все остановленные контейнеры, сети и неиспользуемые образы (с флагом `--all`).",{"question":1435,"answer":1436},"Можно ли запускать Docker без root-прав в production?","Да, но это требует тонкой настройки безопасности (user namespaces, seccomp-профили). Для продакшена рекомендуется использовать rootless Docker или изолированные среды.",[1438,1441,1444,1447,1450],{"name":1439,"text":1440},"Установите Docker Engine","Установите официальный пакет Docker для вашего дистрибутива через репозиторий. Это гарантирует получение обновлений.",{"name":1442,"text":1443},"Запустите тестовый контейнер","Выполните простую команду `docker run hello-world` для проверки корректности установки и настройки прав.",{"name":1445,"text":1446},"Управление образами","Изучите основные команды для поиска, загрузки и удаления образов из Docker Hub или приватного реестра.",{"name":1448,"text":1449},"Запуск и управление контейнерами","Научитесь запускать контейнеры в фоновом режиме, просматривать логи и останавливать/удалять их.",{"name":1451,"text":1452},"Создайте простой Dockerfile","Напишите минимальный Dockerfile для сборки собственного образа на основе Alpine Linux с веб-сервером.","PT15M",[1455,1456,1457,1458,1459,1460,1461,1462],"docker установка ubuntu","docker команды для начинающих","что такое docker контейнер","docker run пример","управление образами docker","docker linux инструкция","как запустить docker контейнер","dockerfile простой пример","ru_RU",{},"/guides/linux/docker-basics","linux",[1468,1469,1470],"/guides/linux/docker-compose-basics","/guides/linux/dockerfile-best-practices","/errors/linux/docker-permission-denied","Гайды Docker",{"title":5,"description":1419},"guides/linux/docker-basics","Это руководство поможет новичкам освоить Docker на Linux: от установки до управления контейнерами. Вы сможете запускать изолированные приложения и создавать собственные образы.",[1476,464,1466,1477,1478],"контейнеризация","cli","devops","guide","-eMjuBTBf9JPaBLzCojzmY0S5u31tg0Z94a-1R7Q7Ag",{"data":1482,"body":1483},{},{"type":1484,"children":1485},"root",[1486],{"type":1487,"tag":21,"props":1488,"children":1489},"element",{},[1490],{"type":1491,"value":1427},"text",{"data":1493,"body":1494},{},{"type":1484,"children":1495},[1496],{"type":1487,"tag":21,"props":1497,"children":1498},{},[1499,1501,1506],{"type":1491,"value":1500},"По умолчанию — да. Чтобы избежать этого, добавьте текущего пользователя в группу docker: ",{"type":1487,"tag":57,"props":1502,"children":1504},{"className":1503},[],[1505],{"type":1491,"value":1297},{"type":1491,"value":1507}," и перезайдите в систему.",{"data":1509,"body":1510},{},{"type":1484,"children":1511},[1512],{"type":1487,"tag":21,"props":1513,"children":1514},{},[1515,1517,1523,1525,1531],{"type":1491,"value":1516},"Используйте команду ",{"type":1487,"tag":57,"props":1518,"children":1520},{"className":1519},[],[1521],{"type":1491,"value":1522},"docker container prune",{"type":1491,"value":1524},". Она удалит все остановленные контейнеры, сети и неиспользуемые образы (с флагом ",{"type":1487,"tag":57,"props":1526,"children":1528},{"className":1527},[],[1529],{"type":1491,"value":1530},"--all",{"type":1491,"value":80},{"data":1533,"body":1534},{},{"type":1484,"children":1535},[1536],{"type":1487,"tag":21,"props":1537,"children":1538},{},[1539],{"type":1491,"value":1436},{"data":1541,"body":1542},{},{"type":1484,"children":1543},[1544],{"type":1487,"tag":21,"props":1545,"children":1546},{},[1547],{"type":1491,"value":1440},{"data":1549,"body":1550},{},{"type":1484,"children":1551},[1552],{"type":1487,"tag":21,"props":1553,"children":1554},{},[1555,1557,1563],{"type":1491,"value":1556},"Выполните простую команду ",{"type":1487,"tag":57,"props":1558,"children":1560},{"className":1559},[],[1561],{"type":1491,"value":1562},"docker run hello-world",{"type":1491,"value":1564}," для проверки корректности установки и настройки прав.",{"data":1566,"body":1567},{},{"type":1484,"children":1568},[1569],{"type":1487,"tag":21,"props":1570,"children":1571},{},[1572],{"type":1491,"value":1446},{"data":1574,"body":1575},{},{"type":1484,"children":1576},[1577],{"type":1487,"tag":21,"props":1578,"children":1579},{},[1580],{"type":1491,"value":1449},{"data":1582,"body":1583},{},{"type":1484,"children":1584},[1585],{"type":1487,"tag":21,"props":1586,"children":1587},{},[1588],{"type":1491,"value":1452},[1590,2933],{"id":1591,"title":1592,"appliesTo":1593,"author":11,"body":1598,"canonical":1417,"code":1417,"createdAt":2874,"description":2875,"difficulty":1420,"draft":1421,"estimatedTime":2876,"extension":1423,"faq":2877,"howToSteps":2890,"howToTotalTime":2909,"image":1417,"keywords":2910,"locale":1463,"meta":2921,"navigation":148,"path":1468,"platform":1466,"related":2922,"section":1471,"seo":2926,"severity":1417,"stem":2927,"summary":2928,"tags":2929,"twitterCreator":1417,"twitterSite":1417,"type":1479,"updatedAt":2874,"__hash__":2932},"content_ru/guides/linux/docker-compose-basics.md","Docker Compose для Linux: создайте первый стек сервисов",[1594,1595,1596,1597],"Docker Engine 20.10+","Docker Compose v2.0+","Ubuntu 20.04/22.04","CentOS 8/Rocky 9",{"type":13,"value":1599,"toc":2850},[1600,1602,1605,1608,1622,1624,1627,1653,1655,1676,1679,1703,1706,1721,1725,1728,1747,1753,1772,1776,1782,2113,2117,2231,2235,2241,2258,2261,2289,2299,2303,2422,2424,2428,2431,2523,2526,2542,2546,2555,2573,2576,2594,2596,2602,2628,2631,2648,2650,2656,2665,2685,2691,2698,2730,2736,2746,2769,2775,2782,2792,2815,2819,2826,2847],[16,1601,19],{"id":18},[21,1603,1604],{},"Docker Compose — это инструмент, который позволяет описывать и управлять многоконтейнерными приложениями с помощью одного YAML-файла. Вместо того чтобы вручную запускать десяток контейнеров, настраивать сети и тома, вы описываете всю инфраструктуру как код. Это особенно полезно для разработки, тестирования и локального развёртывания.",[21,1606,1607],{},"После выполнения этого гайда вы:",[25,1609,1610,1616,1619],{},[28,1611,1612,1613],{},"Поймёте базовый синтаксис ",[57,1614,1615],{},"docker-compose.yml",[28,1617,1618],{},"Научитесь запускать стек из веб-сервиса и базы данных",[28,1620,1621],{},"Узнаете, как управлять жизненным циклом контейнеров одной командой",[16,1623,46],{"id":45},[21,1625,1626],{},"Перед началом убедитесь, что у вас установлено:",[51,1628,1629,1635,1645],{},[28,1630,1631,1634],{},[556,1632,1633],{},"Docker Engine"," (версия 20.10 или новее)",[28,1636,1637,1640,1641,1644],{},[556,1638,1639],{},"Docker Compose v2"," (входит в состав Docker Desktop для Linux или как плагин ",[57,1642,1643],{},"docker-compose-plugin",")",[28,1646,1647,1650,1651,1644],{},[556,1648,1649],{},"Права sudo"," (или пользователь в группе ",[57,1652,464],{},[21,1654,436],{},[94,1656,1658],{"className":96,"code":1657,"language":98,"meta":99,"style":99},"docker --version\ndocker compose version\n",[57,1659,1660,1667],{"__ignoreMap":99},[103,1661,1662,1664],{"class":105,"line":106},[103,1663,464],{"class":116},[103,1665,1666],{"class":165}," --version\n",[103,1668,1669,1671,1674],{"class":105,"line":113},[103,1670,464],{"class":116},[103,1672,1673],{"class":119}," compose",[103,1675,451],{"class":119},[21,1677,1678],{},"Если Docker Compose не установлен, на Ubuntu/Debian:",[94,1680,1682],{"className":96,"code":1681,"language":98,"meta":99,"style":99},"sudo apt update\nsudo apt install docker-compose-plugin\n",[57,1683,1684,1693],{"__ignoreMap":99},[103,1685,1686,1688,1691],{"class":105,"line":106},[103,1687,59],{"class":116},[103,1689,1690],{"class":119}," apt",[103,1692,123],{"class":119},[103,1694,1695,1697,1699,1701],{"class":105,"line":113},[103,1696,59],{"class":116},[103,1698,1690],{"class":119},[103,1700,133],{"class":119},[103,1702,346],{"class":119},[21,1704,1705],{},"На CentOS/Rocky/AlmaLinux:",[94,1707,1709],{"className":96,"code":1708,"language":98,"meta":99,"style":99},"sudo yum install docker-compose-plugin\n",[57,1710,1711],{"__ignoreMap":99},[103,1712,1713,1715,1717,1719],{"class":105,"line":106},[103,1714,59],{"class":116},[103,1716,367],{"class":119},[103,1718,133],{"class":119},[103,1720,346],{"class":119},[16,1722,1724],{"id":1723},"шаг-1-создайте-структуру-проекта","Шаг 1: Создайте структуру проекта",[21,1726,1727],{},"Создайте каталог для вашего приложения и перейдите в него:",[94,1729,1731],{"className":96,"code":1730,"language":98,"meta":99,"style":99},"mkdir myapp && cd myapp\n",[57,1732,1733],{"__ignoreMap":99},[103,1734,1735,1737,1740,1742,1744],{"class":105,"line":106},[103,1736,969],{"class":116},[103,1738,1739],{"class":119}," myapp",[103,1741,975],{"class":276},[103,1743,978],{"class":165},[103,1745,1746],{"class":119}," myapp\n",[21,1748,1749,1750,1752],{},"В этом каталоге создайте файл ",[57,1751,1615],{},". Мы будем разворачивать простой стек:",[25,1754,1755,1764],{},[28,1756,1757,1763],{},[556,1758,1759,1760],{},"Сервис ",[57,1761,1762],{},"web",": Python Flask-приложение",[28,1765,1766,1771],{},[556,1767,1759,1768],{},[57,1769,1770],{},"db",": PostgreSQL",[16,1773,1775],{"id":1774},"шаг-2-напишите-файл-docker-composeyml","Шаг 2: Напишите файл docker-compose.yml",[21,1777,1778,1779,1781],{},"Создайте файл ",[57,1780,1615],{}," со следующим содержимым:",[94,1783,1787],{"className":1784,"code":1785,"language":1786,"meta":99,"style":99},"language-yaml shiki shiki-themes github-light github-dark","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","yaml",[57,1788,1789,1801,1805,1813,1820,1830,1840,1845,1850,1855,1862,1870,1877,1884,1891,1898,1905,1912,1916,1923,1932,1938,1948,1958,1969,1977,1985,1992,1999,2007,2027,2038,2049,2060,2065,2073,2081,2086,2094,2102],{"__ignoreMap":99},[103,1790,1791,1795,1798],{"class":105,"line":106},[103,1792,1794],{"class":1793},"s9eBZ","version",[103,1796,1797],{"class":276},": ",[103,1799,1800],{"class":119},"'3.8'\n",[103,1802,1803],{"class":105,"line":113},[103,1804,149],{"emptyLinePlaceholder":148},[103,1806,1807,1810],{"class":105,"line":126},[103,1808,1809],{"class":1793},"services",[103,1811,1812],{"class":276},":\n",[103,1814,1815,1818],{"class":105,"line":145},[103,1816,1817],{"class":1793},"  web",[103,1819,1812],{"class":276},[103,1821,1822,1825,1827],{"class":105,"line":152},[103,1823,1824],{"class":1793},"    image",[103,1826,1797],{"class":276},[103,1828,1829],{"class":119},"python:3.11-slim\n",[103,1831,1832,1835,1837],{"class":105,"line":158},[103,1833,1834],{"class":1793},"    command",[103,1836,1797],{"class":276},[103,1838,1839],{"class":190},">\n",[103,1841,1842],{"class":105,"line":178},[103,1843,1844],{"class":119},"      sh -c \"pip install flask psycopg2-binary &&\n",[103,1846,1847],{"class":105,"line":209},[103,1848,1849],{"class":119},"             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",[103,1851,1852],{"class":105,"line":222},[103,1853,1854],{"class":119},"             python app.py\"\n",[103,1856,1857,1860],{"class":105,"line":227},[103,1858,1859],{"class":1793},"    ports",[103,1861,1812],{"class":276},[103,1863,1864,1867],{"class":105,"line":233},[103,1865,1866],{"class":276},"      - ",[103,1868,1869],{"class":119},"\"5000:5000\"\n",[103,1871,1872,1875],{"class":105,"line":242},[103,1873,1874],{"class":1793},"    depends_on",[103,1876,1812],{"class":276},[103,1878,1879,1881],{"class":105,"line":260},[103,1880,1866],{"class":276},[103,1882,1883],{"class":119},"db\n",[103,1885,1886,1889],{"class":105,"line":287},[103,1887,1888],{"class":1793},"    environment",[103,1890,1812],{"class":276},[103,1892,1893,1895],{"class":105,"line":305},[103,1894,1866],{"class":276},[103,1896,1897],{"class":119},"DATABASE_URL=postgresql://user:password@db/testdb\n",[103,1899,1900,1903],{"class":105,"line":310},[103,1901,1902],{"class":1793},"    networks",[103,1904,1812],{"class":276},[103,1906,1907,1909],{"class":105,"line":316},[103,1908,1866],{"class":276},[103,1910,1911],{"class":119},"app-network\n",[103,1913,1914],{"class":105,"line":325},[103,1915,149],{"emptyLinePlaceholder":148},[103,1917,1918,1921],{"class":105,"line":1075},[103,1919,1920],{"class":1793},"  db",[103,1922,1812],{"class":276},[103,1924,1925,1927,1929],{"class":105,"line":1081},[103,1926,1824],{"class":1793},[103,1928,1797],{"class":276},[103,1930,1931],{"class":119},"postgres:15-alpine\n",[103,1933,1934,1936],{"class":105,"line":1086},[103,1935,1888],{"class":1793},[103,1937,1812],{"class":276},[103,1939,1940,1943,1945],{"class":105,"line":1092},[103,1941,1942],{"class":1793},"      POSTGRES_USER",[103,1944,1797],{"class":276},[103,1946,1947],{"class":119},"user\n",[103,1949,1950,1953,1955],{"class":105,"line":1098},[103,1951,1952],{"class":1793},"      POSTGRES_PASSWORD",[103,1954,1797],{"class":276},[103,1956,1957],{"class":119},"password\n",[103,1959,1961,1964,1966],{"class":105,"line":1960},24,[103,1962,1963],{"class":1793},"      POSTGRES_DB",[103,1965,1797],{"class":276},[103,1967,1968],{"class":119},"testdb\n",[103,1970,1972,1975],{"class":105,"line":1971},25,[103,1973,1974],{"class":1793},"    volumes",[103,1976,1812],{"class":276},[103,1978,1980,1982],{"class":105,"line":1979},26,[103,1981,1866],{"class":276},[103,1983,1984],{"class":119},"postgres_data:/var/lib/postgresql/data\n",[103,1986,1988,1990],{"class":105,"line":1987},27,[103,1989,1902],{"class":1793},[103,1991,1812],{"class":276},[103,1993,1995,1997],{"class":105,"line":1994},28,[103,1996,1866],{"class":276},[103,1998,1911],{"class":119},[103,2000,2002,2005],{"class":105,"line":2001},29,[103,2003,2004],{"class":1793},"    healthcheck",[103,2006,1812],{"class":276},[103,2008,2010,2013,2016,2019,2021,2024],{"class":105,"line":2009},30,[103,2011,2012],{"class":1793},"      test",[103,2014,2015],{"class":276},": [",[103,2017,2018],{"class":119},"\"CMD-SHELL\"",[103,2020,73],{"class":276},[103,2022,2023],{"class":119},"\"pg_isready -U user\"",[103,2025,2026],{"class":276},"]\n",[103,2028,2030,2033,2035],{"class":105,"line":2029},31,[103,2031,2032],{"class":1793},"      interval",[103,2034,1797],{"class":276},[103,2036,2037],{"class":119},"10s\n",[103,2039,2041,2044,2046],{"class":105,"line":2040},32,[103,2042,2043],{"class":1793},"      timeout",[103,2045,1797],{"class":276},[103,2047,2048],{"class":119},"5s\n",[103,2050,2052,2055,2057],{"class":105,"line":2051},33,[103,2053,2054],{"class":1793},"      retries",[103,2056,1797],{"class":276},[103,2058,2059],{"class":165},"5\n",[103,2061,2063],{"class":105,"line":2062},34,[103,2064,149],{"emptyLinePlaceholder":148},[103,2066,2068,2071],{"class":105,"line":2067},35,[103,2069,2070],{"class":1793},"volumes",[103,2072,1812],{"class":276},[103,2074,2076,2079],{"class":105,"line":2075},36,[103,2077,2078],{"class":1793},"  postgres_data",[103,2080,1812],{"class":276},[103,2082,2084],{"class":105,"line":2083},37,[103,2085,149],{"emptyLinePlaceholder":148},[103,2087,2089,2092],{"class":105,"line":2088},38,[103,2090,2091],{"class":1793},"networks",[103,2093,1812],{"class":276},[103,2095,2097,2100],{"class":105,"line":2096},39,[103,2098,2099],{"class":1793},"  app-network",[103,2101,1812],{"class":276},[103,2103,2105,2108,2110],{"class":105,"line":2104},40,[103,2106,2107],{"class":1793},"    driver",[103,2109,1797],{"class":276},[103,2111,2112],{"class":119},"bridge\n",[89,2114,2116],{"id":2115},"пояснения-к-файлу","Пояснения к файлу:",[25,2118,2119,2124,2213,2220],{},[28,2120,2121,2123],{},[556,2122,1794],{},": указывает версию схемы Compose (используйте 3.8 для совместимости)",[28,2125,2126,2128,2129],{},[556,2127,1809],{},": список контейнеров (сервисов)\n",[25,2130,2131,2180],{},[28,2132,2133,1812,2135],{},[556,2134,1762],{},[25,2136,2137,2143,2149,2155,2166,2172],{},[28,2138,2139,2142],{},[57,2140,2141],{},"image",": базовый образ Python",[28,2144,2145,2148],{},[57,2146,2147],{},"command",": запускает скрипт, который устанавливает Flask, создаёт простое приложение и запускает его",[28,2150,2151,2154],{},[57,2152,2153],{},"ports",": пробрасывает порт 5000 контейнера на порт 5000 хоста",[28,2156,2157,2160,2161,2163,2164],{},[57,2158,2159],{},"depends_on",": гарантирует, что ",[57,2162,1770],{}," запустится до ",[57,2165,1762],{},[28,2167,2168,2171],{},[57,2169,2170],{},"environment",": переменные окружения (используются в приложении)",[28,2173,2174,2176,2177],{},[57,2175,2091],{},": присоединяет сервис к пользовательской сети ",[57,2178,2179],{},"app-network",[28,2181,2182,1812,2184],{},[556,2183,1770],{},[25,2185,2186,2191,2196,2205],{},[28,2187,2188,2190],{},[57,2189,2141],{},": образ PostgreSQL 15",[28,2192,2193,2195],{},[57,2194,2170],{},": учётные данные БД",[28,2197,2198,2200,2201,2204],{},[57,2199,2070],{},": том ",[57,2202,2203],{},"postgres_data"," сохраняет данные БД на хосте (даже после удаления контейнера)",[28,2206,2207,2210,2211,1644],{},[57,2208,2209],{},"healthcheck",": проверка готовности PostgreSQL (важно для ",[57,2212,2159],{},[28,2214,2215,2217,2218],{},[556,2216,2070],{},": объявляет именованный том ",[57,2219,2203],{},[28,2221,2222,2224,2225,2227,2228,1644],{},[556,2223,2091],{},": создаёт сеть ",[57,2226,2179],{}," (по умолчанию driver ",[57,2229,2230],{},"bridge",[16,2232,2234],{"id":2233},"шаг-3-запустите-стек","Шаг 3: Запустите стек",[21,2236,2237,2238,2240],{},"В каталоге с ",[57,2239,1615],{}," выполните:",[94,2242,2244],{"className":96,"code":2243,"language":98,"meta":99,"style":99},"docker compose up -d\n",[57,2245,2246],{"__ignoreMap":99},[103,2247,2248,2250,2252,2255],{"class":105,"line":106},[103,2249,464],{"class":116},[103,2251,1673],{"class":119},[103,2253,2254],{"class":119}," up",[103,2256,2257],{"class":165}," -d\n",[21,2259,2260],{},"Что произойдёт:",[51,2262,2263,2266,2273,2284],{},[28,2264,2265],{},"Docker Compose прочитает конфигурацию",[28,2267,2268,2269,2272],{},"Создаст сеть ",[57,2270,2271],{},"myapp_app-network"," (префикс — имя каталога)",[28,2274,2275,2276,2279,2280,2283],{},"Загрузит образы ",[57,2277,2278],{},"python:3.11-slim"," и ",[57,2281,2282],{},"postgres:15-alpine"," (если их нет локально)",[28,2285,2286,2287,1644],{},"Запустит контейнеры в фоновом режиме (",[57,2288,770],{},[2290,2291,2292],"blockquote",{},[21,2293,2294,2295,2298],{},"💡 ",[556,2296,2297],{},"Совет",": Первый запуск может занять минуту — Docker скачивает образы (около 500 МБ).",[16,2300,2302],{"id":2301},"шаг-4-проверьте-работу","Шаг 4: Проверьте работу",[51,2304,2305,2329,2362,2382],{},[28,2306,2307,523,2310,2323,2325,2326,60],{},[556,2308,2309],{},"Посмотрите статус контейнеров",[94,2311,2313],{"className":96,"code":2312,"language":98,"meta":99,"style":99},"docker compose ps\n",[57,2314,2315],{"__ignoreMap":99},[103,2316,2317,2319,2321],{"class":105,"line":106},[103,2318,464],{"class":116},[103,2320,1673],{"class":119},[103,2322,799],{"class":119},[1193,2324],{},"Вывод должен показать оба сервиса в состоянии ",[57,2327,2328],{},"Up",[28,2330,2331,2334,2335],{},[556,2332,2333],{},"Проверьте логи"," (если что-то не работает):",[94,2336,2338],{"className":96,"code":2337,"language":98,"meta":99,"style":99},"docker compose logs web\ndocker compose logs db\n",[57,2339,2340,2351],{"__ignoreMap":99},[103,2341,2342,2344,2346,2348],{"class":105,"line":106},[103,2343,464],{"class":116},[103,2345,1673],{"class":119},[103,2347,931],{"class":119},[103,2349,2350],{"class":119}," web\n",[103,2352,2353,2355,2357,2359],{"class":105,"line":113},[103,2354,464],{"class":116},[103,2356,1673],{"class":119},[103,2358,931],{"class":119},[103,2360,2361],{"class":119}," db\n",[28,2363,2364,2367,2368,2371,2372,2379,2381],{},[556,2365,2366],{},"Тестируйте приложение",":\nОткройте браузер и перейдите по адресу ",[57,2369,2370],{},"http://localhost:5000",". Должны увидеть:",[94,2373,2377],{"className":2374,"code":2376,"language":1491},[2375],"language-text","Hello from Docker Compose! DB connection: OK\n",[57,2378,2376],{"__ignoreMap":99},[1193,2380],{},"Это значит, что веб-контейнер успешно подключился к PostgreSQL.",[28,2383,2384,523,2387],{},[556,2385,2386],{},"Проверьте сеть",[94,2388,2390],{"className":96,"code":2389,"language":98,"meta":99,"style":99},"docker network ls | grep app-network\ndocker network inspect myapp_app-network\n",[57,2391,2392,2410],{"__ignoreMap":99},[103,2393,2394,2396,2399,2402,2404,2407],{"class":105,"line":106},[103,2395,464],{"class":116},[103,2397,2398],{"class":119}," network",[103,2400,2401],{"class":119}," ls",[103,2403,191],{"class":190},[103,2405,2406],{"class":116}," grep",[103,2408,2409],{"class":119}," app-network\n",[103,2411,2412,2414,2416,2419],{"class":105,"line":113},[103,2413,464],{"class":116},[103,2415,2398],{"class":119},[103,2417,2418],{"class":119}," inspect",[103,2420,2421],{"class":119}," myapp_app-network\n",[547,2423],{},[16,2425,2427],{"id":2426},"шаг-5-управление-стеком","Шаг 5: Управление стеком",[21,2429,2430],{},"Основные команды:",[2432,2433,2434,2447],"table",{},[2435,2436,2437],"thead",{},[2438,2439,2440,2444],"tr",{},[2441,2442,2443],"th",{},"Команда",[2441,2445,2446],{},"Действие",[2448,2449,2450,2461,2471,2481,2493,2503,2513],"tbody",{},[2438,2451,2452,2458],{},[2453,2454,2455],"td",{},[57,2456,2457],{},"docker compose down",[2453,2459,2460],{},"Останавливает и удаляет контейнеры, сети (тома остаются)",[2438,2462,2463,2468],{},[2453,2464,2465],{},[57,2466,2467],{},"docker compose down -v",[2453,2469,2470],{},"Удаляет также тома (данные БД будут потеряны!)",[2438,2472,2473,2478],{},[2453,2474,2475],{},[57,2476,2477],{},"docker compose logs -f",[2453,2479,2480],{},"Отслеживает логи в реальном времени",[2438,2482,2483,2488],{},[2453,2484,2485],{},[57,2486,2487],{},"docker compose exec web bash",[2453,2489,2490,2491],{},"Заходит в контейнер ",[57,2492,1762],{},[2438,2494,2495,2500],{},[2453,2496,2497],{},[57,2498,2499],{},"docker compose stop",[2453,2501,2502],{},"Останавливает контейнеры (без удаления)",[2438,2504,2505,2510],{},[2453,2506,2507],{},[57,2508,2509],{},"docker compose start",[2453,2511,2512],{},"Запускает остановленные контейнеры",[2438,2514,2515,2520],{},[2453,2516,2517],{},[57,2518,2519],{},"docker compose rm",[2453,2521,2522],{},"Удаляет остановленные контейнеры",[21,2524,2525],{},"Пример перезапуска только одного сервиса:",[94,2527,2529],{"className":96,"code":2528,"language":98,"meta":99,"style":99},"docker compose restart web\n",[57,2530,2531],{"__ignoreMap":99},[103,2532,2533,2535,2537,2540],{"class":105,"line":106},[103,2534,464],{"class":116},[103,2536,1673],{"class":119},[103,2538,2539],{"class":119}," restart",[103,2541,2350],{"class":119},[16,2543,2545],{"id":2544},"шаг-6-модификация-и-пересборка","Шаг 6: Модификация и пересборка",[21,2547,2548,2549,2551,2552,2554],{},"Если вы изменили ",[57,2550,1615],{}," или нужно пересобрать образ (например, добавили ",[57,2553,959],{},"), используйте:",[94,2556,2558],{"className":96,"code":2557,"language":98,"meta":99,"style":99},"docker compose up -d --build\n",[57,2559,2560],{"__ignoreMap":99},[103,2561,2562,2564,2566,2568,2570],{"class":105,"line":106},[103,2563,464],{"class":116},[103,2565,1673],{"class":119},[103,2567,2254],{"class":119},[103,2569,172],{"class":165},[103,2571,2572],{"class":165}," --build\n",[21,2574,2575],{},"Для принудительной перезагрузки контейнеров без сборки:",[94,2577,2579],{"className":96,"code":2578,"language":98,"meta":99,"style":99},"docker compose up -d --force-recreate\n",[57,2580,2581],{"__ignoreMap":99},[103,2582,2583,2585,2587,2589,2591],{"class":105,"line":106},[103,2584,464],{"class":116},[103,2586,1673],{"class":119},[103,2588,2254],{"class":119},[103,2590,172],{"class":165},[103,2592,2593],{"class":165}," --force-recreate\n",[16,2595,1203],{"id":1202},[21,2597,2598,2599,523],{},"✅ ",[556,2600,2601],{},"Критерии успеха",[25,2603,2604,2613,2619],{},[28,2605,2606,2607,2610,2611,1644],{},"Контейнеры запущены (",[57,2608,2609],{},"docker compose ps"," показывает ",[57,2612,2328],{},[28,2614,2615,2616,2618],{},"Веб-приложение отвечает на ",[57,2617,2370],{}," и сообщает об успешном подключении к БД",[28,2620,2621,2622,2624,2625,1644],{},"Данные PostgreSQL сохраняются в томе ",[57,2623,2203],{}," (проверьте ",[57,2626,2627],{},"docker volume ls",[21,2629,2630],{},"Если что-то не работает:",[51,2632,2633,2639,2642],{},[28,2634,2635,2636],{},"Проверьте логи: ",[57,2637,2638],{},"docker compose logs",[28,2640,2641],{},"Убедитесь, что порт 5000 не занят другим приложением",[28,2643,2644,2645],{},"Проверьте, что оба сервиса в одной сети: ",[57,2646,2647],{},"docker network inspect myapp_app-network",[16,2649,1274],{"id":1273},[89,2651,1278,2653],{"id":2652},"ошибка-error-response-from-daemon-port-is-already-allocated",[57,2654,2655],{},"Error response from daemon: port is already allocated",[21,2657,2658,2661,2662,523],{},[556,2659,2660],{},"Причина",": Порт 5000 уже используется другим процессом.\n",[556,2663,2664],{},"Решение",[25,2666,2667,2676],{},[28,2668,2669,2670,2279,2673,1644],{},"Остановите конфликтующий процесс (",[57,2671,2672],{},"sudo lsof -i:5000",[57,2674,2675],{},"kill",[28,2677,2678,2679,2681,2682,1644],{},"Или измените проброс портов в ",[57,2680,1615],{}," (например, ",[57,2683,2684],{},"\"8080:5000\"",[89,2686,1278,2688],{"id":2687},"ошибка-postgres-connection-to-server-at-db-1722002-port-5432-failed-connection-refused",[57,2689,2690],{},"postgres: connection to server at \"db\" (172.20.0.2), port 5432 failed: Connection refused",[21,2692,2693,2695,2696,523],{},[556,2694,2660],{},": Веб-контейнер пытается подключиться к БД до её полной готовности.\n",[556,2697,2664],{},[25,2699,2700,2709,2721],{},[28,2701,2702,2703,2705,2706,2708],{},"Убедитесь, что в ",[57,2704,1770],{}," есть ",[57,2707,2209],{}," (как в примере)",[28,2710,2711,2712,2714,2715,940,2718,1644],{},"Добавьте в команду ",[57,2713,1762],{}," ожидание (например, через ",[57,2716,2717],{},"wait-for-it.sh",[57,2719,2720],{},"dockerize",[28,2722,2723,2724,2726,2727],{},"Или увеличьте ",[57,2725,2159],{}," с условием ",[57,2728,2729],{},"condition: service_healthy",[89,2731,1278,2733],{"id":2732},"ошибка-permission-denied-while-trying-to-connect-to-the-docker-daemon-socket",[57,2734,2735],{},"permission denied while trying to connect to the Docker daemon socket",[21,2737,2738,2740,2741,2743,2744,523],{},[556,2739,2660],{},": Текущий пользователь не в группе ",[57,2742,464],{},".\n",[556,2745,2664],{},[94,2747,2749],{"className":96,"code":2748,"language":98,"meta":99,"style":99},"sudo usermod -aG docker $USER\nnewgrp docker\n",[57,2750,2751,2763],{"__ignoreMap":99},[103,2752,2753,2755,2757,2759,2761],{"class":105,"line":106},[103,2754,59],{"class":116},[103,2756,487],{"class":119},[103,2758,490],{"class":165},[103,2760,448],{"class":119},[103,2762,495],{"class":276},[103,2764,2765,2767],{"class":105,"line":113},[103,2766,514],{"class":116},[103,2768,517],{"class":119},[21,2770,2771,2772,2774],{},"Или используйте ",[57,2773,59],{}," для команд Docker.",[89,2776,2778,2779,2781],{"id":2777},"том-postgres_data-не-создаётся","Том ",[57,2780,2203],{}," не создаётся",[21,2783,2784,2786,2787,2789,2790,523],{},[556,2785,2660],{},": Ошибка в синтаксисе ",[57,2788,2070],{}," или недостаточно прав.\n",[556,2791,2664],{},[25,2793,2794,2797,2806],{},[28,2795,2796],{},"Проверьте отступы в YAML (пробелы, не табы)",[28,2798,2702,2799,2801,2802,2805],{},[57,2800,1770],{}," путь тома ",[57,2803,2804],{},"/var/lib/postgresql/data"," существует в образе PostgreSQL",[28,2807,2808,2809,2811,2812],{},"Посмотрите ",[57,2810,2627],{}," — том должен называться ",[57,2813,2814],{},"[каталог]_postgres_data",[89,2816,2818],{"id":2817},"образы-не-скачиваются-ошибки-сети","Образы не скачиваются (ошибки сети)",[21,2820,2821,2823,2824,523],{},[556,2822,2660],{},": Проблемы с доступом к Docker Hub.\n",[556,2825,2664],{},[25,2827,2828,2834,2841],{},[28,2829,2830,2831,1644],{},"Настройте DNS в Docker (",[57,2832,2833],{},"/etc/docker/daemon.json",[28,2835,2836,2837,2840],{},"Используйте зеркало (например, ",[57,2838,2839],{},"registry-mirrors"," для Kubernetes/OpenShift)",[28,2842,2843,2844],{},"Или загрузите образы вручную: ",[57,2845,2846],{},"docker pull python:3.11-slim",[1383,2848,2849],{},"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":99,"searchDepth":113,"depth":113,"links":2851},[2852,2853,2854,2855,2858,2859,2860,2861,2862,2863],{"id":18,"depth":113,"text":19},{"id":45,"depth":113,"text":46},{"id":1723,"depth":113,"text":1724},{"id":1774,"depth":113,"text":1775,"children":2856},[2857],{"id":2115,"depth":126,"text":2116},{"id":2233,"depth":113,"text":2234},{"id":2301,"depth":113,"text":2302},{"id":2426,"depth":113,"text":2427},{"id":2544,"depth":113,"text":2545},{"id":1202,"depth":113,"text":1203},{"id":1273,"depth":113,"text":1274,"children":2864},[2865,2867,2869,2871,2873],{"id":2652,"depth":126,"text":2866},"Ошибка: Error response from daemon: port is already allocated",{"id":2687,"depth":126,"text":2868},"Ошибка: postgres: connection to server at \"db\" (172.20.0.2), port 5432 failed: Connection refused",{"id":2732,"depth":126,"text":2870},"Ошибка: permission denied while trying to connect to the Docker daemon socket",{"id":2777,"depth":126,"text":2872},"Том postgres_data не создаётся",{"id":2817,"depth":126,"text":2818},"2026-02-17 15:01:14","Полное руководство по Docker Compose на Linux. Узнайте, как с помощью одного файла поднять многоконтейнерное приложение с базой данных. Пошагово, с примерами.","15-20 мин",[2878,2881,2884,2887],{"question":2879,"answer":2880},"Что такое Docker Compose и зачем он нужен?","Docker Compose — это инструмент для определения и запуска многоконтейнерных Docker-приложений. С помощью одного файла `docker-compose.yml` вы описываете сервисы, сети и тома, а затем управляете всем стеком одной командой.",{"question":2882,"answer":2883},"Как установить Docker Compose на Linux?","Для современных дистрибутивов Docker Compose поставляется как плагин Docker CLI (`docker compose`). Установите пакет `docker-compose-plugin` через менеджер пакетов (apt, yum) или скачайте бинарник с GitHub.",{"question":2885,"answer":2886},"В чём разница между `docker-compose` и `docker compose`?","`docker compose` — это встроенный плагин Docker CLI (рекомендуемый способ с Docker Compose v2). `docker-compose` — отдельный бинарный файл (устаревший v1). Команды практически идентичны.",{"question":2888,"answer":2889},"Как запустить docker-compose в фоновом режиме?","Используйте флаг `-d` (detached): `docker compose up -d`. Для остановки: `docker compose down`.",[2891,2894,2897,2900,2903,2906],{"name":2892,"text":2893},"Установите Docker Compose (если не установлен)","Убедитесь, что у вас установлен Docker Engine и плагин Compose. Проверьте командой `docker compose version`. Если нет — установите пакет `docker-compose-plugin`.",{"name":2895,"text":2896},"Создайте каталог проекта и файл docker-compose.yml","Создайте отдельную папку для проекта. Внутри создайте файл `docker-compose.yml` с определением сервисов. Пример ниже включает веб-приложение (Python Flask) и базу данных PostgreSQL.",{"name":2898,"text":2899},"Настройте сервисы в docker-compose.yml","Опишите каждый сервис: образ, порты, переменные окружения, зависимости и тома. Для базы данных задайте volume для сохранения данных между перезапусками.",{"name":2901,"text":2902},"Запустите стек командой docker compose up","В каталоге с `docker-compose.yml` выполните `docker compose up -d`. Docker загрузит образы, создаст сеть и запустит контейнеры. Флаг `-d` запускает в фоне.",{"name":2904,"text":2905},"Проверьте статус контейнеров","Выполните `docker compose ps` для просмотра состояния сервисов. Также можно использовать `docker compose logs` для просмотра логов.",{"name":2907,"text":2908},"Остановите и удалите контейнеры","Когда работа завершена, выполните `docker compose down`. Для удаления также томов (данные базы) добавьте флаг `-v`.","PT20M",[2911,2912,2913,2914,2915,2916,2917,2918,2919,2920],"docker-compose основы","как использовать docker-compose linux","docker-compose пример.yml","запуск многоконтейнерного приложения docker","docker-compose up команда","файл docker-compose.yml структура","docker-compose для начинающих","оркестрация контейнеров docker","docker compose сервисы","docker-compose volumes сети",{},[2923,2924,2925],"/guides/linux/docker-installation","/guides/linux/docker-volumes","/errors/linux/docker-compose-command-not-found",{"title":1592,"description":2875},"guides/linux/docker-compose-basics","Это руководство познакомит вас с Docker Compose — инструментом для оркестрации контейнеров. Вы создадите файл docker-compose.yml и запустите стек из веб-сервиса и PostgreSQL. Подходит для начинающих разработчиков и админов Linux.",[464,2930,1476,1478,1466,2931],"docker-compose","multicontainer","33EXhExfWVN_ZYS36r7_wvaVlC2ux1mJm7yZx_Qv8d4",{"id":2934,"title":2935,"appliesTo":2936,"author":11,"body":2940,"canonical":1417,"code":2977,"createdAt":3907,"description":3908,"difficulty":3909,"draft":1421,"estimatedTime":3910,"extension":1423,"faq":3911,"howToSteps":3924,"howToTotalTime":1417,"image":1417,"keywords":3937,"locale":1463,"meta":3948,"navigation":148,"path":1470,"platform":1466,"related":3949,"section":3953,"seo":3954,"severity":3955,"stem":3956,"summary":3957,"tags":3958,"twitterCreator":1417,"twitterSite":1417,"type":3962,"updatedAt":3907,"__hash__":3963},"content_ru/errors/linux/docker-permission-denied.md","Docker permission denied: причины и 5 проверенных способов решения",[2937,8,9,2938,2939],"Ubuntu 20.04+","RHEL 8+","Fedora 35+",{"type":13,"value":2941,"toc":3893},[2942,2949,2958,2961,2969,2983,2986,3060,3063,3116,3122,3126,3219,3226,3229,3236,3253,3260,3268,3277,3282,3289,3301,3304,3317,3324,3327,3348,3353,3364,3368,3374,3379,3395,3398,3404,3412,3417,3445,3450,3466,3477,3481,3491,3496,3519,3524,3539,3542,3562,3582,3591,3607,3612,3626,3630,3635,3653,3659,3664,3679,3682,3702,3707,3726,3728,3732,3781,3785,3803,3824,3839,3858,3878,3890],[21,2943,2944,2945,2948],{},"-",[57,2946,2947],{},"и владелец","root:docker`.\"",[25,2950,2951],{},[28,2952,2953,2954,2957],{},"name: \"Временное решение через sudo\"\ntext: \"Для срочного запуска используйте ",[57,2955,2956],{},"sudo docker ...",", но это не рекомендуется для повседневной работы из-за рисков безопасности.\"\nhowToTotalTime: \"PT15M\"",[2959,2960],"hr",{},[16,2962,2964,2965,2968],{"id":2963},"что-означает-ошибка-permission-denied-в-docker","Что означает ошибка ",[57,2966,2967],{},"permission denied"," в Docker",[21,2970,2971,2972,2974,2975,2978,2979,2982],{},"Ошибка ",[57,2973,2967],{}," (иногда с кодом ",[57,2976,2977],{},"EACCES",") означает, что текущий пользователь Linux не имеет прав на доступ к демону Docker (через сокет ",[57,2980,2981],{},"/var/run/docker.sock",") или к файлам/директориям внутри контейнера/образов.",[21,2984,2985],{},"Типичный полный текст:",[94,2987,2989],{"className":96,"code":2988,"language":98,"meta":99,"style":99},"docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post \"http://%2Fvar%2Frun%2Fdocker.sock/v1.41/containers/create\": dial unix /var/run/docker.sock: connect: permission denied.\n",[57,2990,2991],{"__ignoreMap":99},[103,2992,2993,2996,2999,3002,3005,3008,3011,3014,3017,3019,3022,3025,3028,3031,3034,3037,3040,3043,3046,3049,3052,3055,3057],{"class":105,"line":106},[103,2994,2995],{"class":116},"docker:",[103,2997,2998],{"class":119}," Got",[103,3000,3001],{"class":119}," permission",[103,3003,3004],{"class":119}," denied",[103,3006,3007],{"class":119}," while",[103,3009,3010],{"class":119}," trying",[103,3012,3013],{"class":119}," to",[103,3015,3016],{"class":119}," connect",[103,3018,3013],{"class":119},[103,3020,3021],{"class":119}," the",[103,3023,3024],{"class":119}," Docker",[103,3026,3027],{"class":119}," daemon",[103,3029,3030],{"class":119}," socket",[103,3032,3033],{"class":119}," at",[103,3035,3036],{"class":119}," unix:///var/run/docker.sock:",[103,3038,3039],{"class":119}," Post",[103,3041,3042],{"class":119}," \"http://%2Fvar%2Frun%2Fdocker.sock/v1.41/containers/create\":",[103,3044,3045],{"class":119}," dial",[103,3047,3048],{"class":119}," unix",[103,3050,3051],{"class":119}," /var/run/docker.sock:",[103,3053,3054],{"class":119}," connect:",[103,3056,3001],{"class":119},[103,3058,3059],{"class":119}," denied.\n",[21,3061,3062],{},"Или при работе с файлами:",[94,3064,3066],{"className":96,"code":3065,"language":98,"meta":99,"style":99},"docker: Error response from daemon: Get \"https://registry-1.docker.io/v2/\": dial tcp: lookup registry-1.docker.io: Temporary failure in name resolution.\n",[57,3067,3068],{"__ignoreMap":99},[103,3069,3070,3072,3075,3078,3081,3084,3087,3090,3092,3095,3098,3101,3104,3107,3110,3113],{"class":105,"line":106},[103,3071,2995],{"class":116},[103,3073,3074],{"class":119}," Error",[103,3076,3077],{"class":119}," response",[103,3079,3080],{"class":119}," from",[103,3082,3083],{"class":119}," daemon:",[103,3085,3086],{"class":119}," Get",[103,3088,3089],{"class":119}," \"https://registry-1.docker.io/v2/\":",[103,3091,3045],{"class":119},[103,3093,3094],{"class":119}," tcp:",[103,3096,3097],{"class":119}," lookup",[103,3099,3100],{"class":119}," registry-1.docker.io:",[103,3102,3103],{"class":119}," Temporary",[103,3105,3106],{"class":119}," failure",[103,3108,3109],{"class":119}," in",[103,3111,3112],{"class":119}," name",[103,3114,3115],{"class":119}," resolution.\n",[21,3117,3118,3119,3121],{},"Ошибка появляется при выполнении любых команд ",[57,3120,464],{}," (run, ps, build, pull) от обычного пользователя.",[16,3123,3125],{"id":3124},"причины-возникновения","Причины возникновения",[51,3127,3128,3144,3161,3176,3190,3205],{},[28,3129,3130,3135,3137,3138,3140,3141,3143],{},[556,3131,3132,3133],{},"Пользователь не состоит в группе ",[57,3134,464],{},[1193,3136],{},"\nПо умолчанию сокет ",[57,3139,2981],{}," принадлежит группе ",[57,3142,464],{},". Если пользователь не в этой группе, доступ запрещён.",[28,3145,3146,3151,3153,3154,3157,3158,60],{},[556,3147,3148,3149],{},"Неправильные права на сокет ",[57,3150,2981],{},[1193,3152],{},"\nНапример, если сокет создан с правами ",[57,3155,3156],{},"600"," (только root) или владельцем ",[57,3159,3160],{},"root:root",[28,3162,3163,3166,3168,3169,3172,3173,60],{},[556,3164,3165],{},"SELinux в режиме enforcing (RHEL/CentOS/Fedora)",[1193,3167],{},"\nSELinux может блокировать доступ Docker к сокету или файлам. Часто проявляется в сообщениях ",[57,3170,3171],{},"avc: denied"," в ",[57,3174,3175],{},"audit.log",[28,3177,3178,3181,3183,3184,940,3187,60],{},[556,3179,3180],{},"AppArmor (Ubuntu/Debian)",[1193,3182],{},"\nПрофили AppArmor могут ограничивать доступ Docker. Ошибки в ",[57,3185,3186],{},"syslog",[57,3188,3189],{},"dmesg",[28,3191,3192,3195,3197,3198,3201,3202,60],{},[556,3193,3194],{},"Попытка монтирования хостовой директории без прав",[1193,3196],{},"\nПри ",[57,3199,3200],{},"docker run -v /host/path:/container"," если у пользователя нет прав на чтение/запись в ",[57,3203,3204],{},"/host/path",[28,3206,3207,3216,3218],{},[556,3208,3209,3210,940,3213],{},"Файловая система смонтирована с опцией ",[57,3211,3212],{},"noexec",[57,3214,3215],{},"nosuid",[1193,3217],{},"\nМожет мешать выполнению бинарников внутри контейнера.",[16,3220,3222,3223,3225],{"id":3221},"способ-1-добавить-пользователя-в-группу-docker-рекомендуемый","Способ 1: Добавить пользователя в группу ",[57,3224,464],{}," (рекомендуемый)",[21,3227,3228],{},"Это каноническое решение для большинства дистрибутивов.",[51,3230,3231],{},[28,3232,3233,3234,523],{},"Добавьте текущего пользователя в группу ",[57,3235,464],{},[94,3237,3239],{"className":96,"code":3238,"language":98,"meta":99,"style":99},"sudo usermod -aG docker $USER\n",[57,3240,3241],{"__ignoreMap":99},[103,3242,3243,3245,3247,3249,3251],{"class":105,"line":106},[103,3244,59],{"class":116},[103,3246,487],{"class":119},[103,3248,490],{"class":165},[103,3250,448],{"class":119},[103,3252,495],{"class":276},[21,3254,3255,3256,3259],{},"Флаг ",[57,3257,3258],{},"-aG"," (append to group) критически важен — без него пользователь может быть удалён из других групп.",[51,3261,3262],{"start":113},[28,3263,3264,3267],{},[556,3265,3266],{},"Примените изменения",": выйдите из терминала и системы (или перезагрузите). В новом сеансе проверьте:",[94,3269,3271],{"className":96,"code":3270,"language":98,"meta":99,"style":99},"groups\n",[57,3272,3273],{"__ignoreMap":99},[103,3274,3275],{"class":105,"line":106},[103,3276,3270],{"class":116},[21,3278,3279,3280,60],{},"В списке должна быть ",[57,3281,464],{},[51,3283,3284],{"start":126},[28,3285,3286,3287,523],{},"Проверьте, что команды работают без ",[57,3288,59],{},[94,3290,3291],{"className":96,"code":526,"language":98,"meta":99,"style":99},[57,3292,3293],{"__ignoreMap":99},[103,3294,3295,3297,3299],{"class":105,"line":106},[103,3296,464],{"class":116},[103,3298,535],{"class":119},[103,3300,538],{"class":119},[21,3302,3303],{},"Если контейнер запустился — проблема решена.",[2290,3305,3306],{},[21,3307,3308,3309,3312,3313,3316],{},"⚠️ ",[556,3310,3311],{},"Важно:"," После добавления в группу необходимо ",[556,3314,3315],{},"новый логин",". Это распространённая ошибка.",[16,3318,3320,3321,3323],{"id":3319},"способ-2-временный-запуск-через-sudo-не-для-продакшена","Способ 2: Временный запуск через ",[57,3322,59],{}," (не для продакшена)",[21,3325,3326],{},"Если нужно срочно запустить контейнер, а настройку групп сделать нельзя:",[94,3328,3330],{"className":96,"code":3329,"language":98,"meta":99,"style":99},"sudo docker run -it ubuntu bash\n",[57,3331,3332],{"__ignoreMap":99},[103,3333,3334,3336,3338,3340,3342,3345],{"class":105,"line":106},[103,3335,59],{"class":116},[103,3337,448],{"class":119},[103,3339,535],{"class":119},[103,3341,700],{"class":165},[103,3343,3344],{"class":119}," ubuntu",[103,3346,3347],{"class":119}," bash\n",[21,3349,3350],{},[556,3351,3352],{},"Недостатки:",[25,3354,3355,3358,3361],{},[28,3356,3357],{},"Контейнер получает root-права хоста (опасность).",[28,3359,3360],{},"Файлы, созданные в контейнере, будут принадлежать root на хосте.",[28,3362,3363],{},"Неудобно для повседневной работы.",[16,3365,3367],{"id":3366},"способ-3-проверитьисправить-права-на-сокет-вручную","Способ 3: Проверить/исправить права на сокет вручную",[21,3369,3370,3371,3373],{},"Если группа ",[57,3372,464],{}," есть, но доступ всё равно denied:",[51,3375,3376],{},[28,3377,3378],{},"Проверьте текущие права:",[94,3380,3382],{"className":96,"code":3381,"language":98,"meta":99,"style":99},"ls -l /var/run/docker.sock\n",[57,3383,3384],{"__ignoreMap":99},[103,3385,3386,3389,3392],{"class":105,"line":106},[103,3387,3388],{"class":116},"ls",[103,3390,3391],{"class":165}," -l",[103,3393,3394],{"class":119}," /var/run/docker.sock\n",[21,3396,3397],{},"Ожидаемый вывод:",[94,3399,3402],{"className":3400,"code":3401,"language":1491},[2375],"srw-rw---- 1 root docker 0 Фев 16 12:00 /var/run/docker.sock\n",[57,3403,3401],{"__ignoreMap":99},[21,3405,3406,3407,3409,3410,523],{},"Если группа не ",[57,3408,464],{}," или права ",[57,3411,3156],{},[51,3413,3414],{"start":113},[28,3415,3416],{},"Установите правильного владельца и права:",[94,3418,3420],{"className":96,"code":3419,"language":98,"meta":99,"style":99},"sudo chown root:docker /var/run/docker.sock\nsudo chmod 660 /var/run/docker.sock\n",[57,3421,3422,3434],{"__ignoreMap":99},[103,3423,3424,3426,3429,3432],{"class":105,"line":106},[103,3425,59],{"class":116},[103,3427,3428],{"class":119}," chown",[103,3430,3431],{"class":119}," root:docker",[103,3433,3394],{"class":119},[103,3435,3436,3438,3440,3443],{"class":105,"line":113},[103,3437,59],{"class":116},[103,3439,214],{"class":119},[103,3441,3442],{"class":165}," 660",[103,3444,3394],{"class":119},[51,3446,3447],{"start":126},[28,3448,3449],{},"Перезапустите Docker (на всякий случай):",[94,3451,3453],{"className":96,"code":3452,"language":98,"meta":99,"style":99},"sudo systemctl restart docker\n",[57,3454,3455],{"__ignoreMap":99},[103,3456,3457,3459,3462,3464],{"class":105,"line":106},[103,3458,59],{"class":116},[103,3460,3461],{"class":119}," systemctl",[103,3463,2539],{"class":119},[103,3465,517],{"class":119},[2290,3467,3468],{},[21,3469,2294,3470,3473,3474,3476],{},[556,3471,3472],{},"Совет:"," Права на сокет сбрасываются при перезагрузке Docker. Если проблема возвращается, проверьте конфигурацию демона (",[57,3475,2833],{},") или системные unit-файлы.",[16,3478,3480],{"id":3479},"способ-4-настройка-selinux-для-rhelcentosfedora","Способ 4: Настройка SELinux (для RHEL/CentOS/Fedora)",[21,3482,3483,3484,3487,3488,523],{},"Если ",[57,3485,3486],{},"getenforce"," возвращает ",[57,3489,3490],{},"Enforcing",[51,3492,3493],{},[28,3494,3495],{},"Проверьте логи SELinux на наличие отказов:",[94,3497,3499],{"className":96,"code":3498,"language":98,"meta":99,"style":99},"sudo ausearch -m avc -ts recent\n",[57,3500,3501],{"__ignoreMap":99},[103,3502,3503,3505,3508,3510,3513,3516],{"class":105,"line":106},[103,3504,59],{"class":116},[103,3506,3507],{"class":119}," ausearch",[103,3509,166],{"class":165},[103,3511,3512],{"class":119}," avc",[103,3514,3515],{"class":165}," -ts",[103,3517,3518],{"class":119}," recent\n",[51,3520,3521],{"start":113},[28,3522,3523],{},"Самый быстрый способ (временно, до перезагрузки):",[94,3525,3527],{"className":96,"code":3526,"language":98,"meta":99,"style":99},"sudo setenforce 0\n",[57,3528,3529],{"__ignoreMap":99},[103,3530,3531,3533,3536],{"class":105,"line":106},[103,3532,59],{"class":116},[103,3534,3535],{"class":119}," setenforce",[103,3537,3538],{"class":165}," 0\n",[21,3540,3541],{},"Попробуйте запустить Docker. Если сработало — проблема в SELinux.",[51,3543,3544],{"start":126},[28,3545,3546,3547],{},"Для постоянного решения:\n",[25,3548,3549,3559],{},[28,3550,3551,3552,3172,3555,3558],{},"Либо переведите SELinux в режим ",[57,3553,3554],{},"permissive",[57,3556,3557],{},"/etc/selinux/config"," (небезопасно).",[28,3560,3561],{},"Либо создайте правильный политику:",[94,3563,3565],{"className":96,"code":3564,"language":98,"meta":99,"style":99},"sudo semanage permissive -a docker_t\n",[57,3566,3567],{"__ignoreMap":99},[103,3568,3569,3571,3574,3577,3579],{"class":105,"line":106},[103,3570,59],{"class":116},[103,3572,3573],{"class":119}," semanage",[103,3575,3576],{"class":119}," permissive",[103,3578,1378],{"class":165},[103,3580,3581],{"class":119}," docker_t\n",[25,3583,3584],{},[28,3585,3586,3587,3590],{},"Или установите пакет ",[57,3588,3589],{},"docker-selinux"," (если не установлен):",[94,3592,3594],{"className":96,"code":3593,"language":98,"meta":99,"style":99},"sudo yum install docker-selinux\n",[57,3595,3596],{"__ignoreMap":99},[103,3597,3598,3600,3602,3604],{"class":105,"line":106},[103,3599,59],{"class":116},[103,3601,367],{"class":119},[103,3603,133],{"class":119},[103,3605,3606],{"class":119}," docker-selinux\n",[51,3608,3609],{"start":145},[28,3610,3611],{},"Верните enforcing:",[94,3613,3615],{"className":96,"code":3614,"language":98,"meta":99,"style":99},"sudo setenforce 1\n",[57,3616,3617],{"__ignoreMap":99},[103,3618,3619,3621,3623],{"class":105,"line":106},[103,3620,59],{"class":116},[103,3622,3535],{"class":119},[103,3624,3625],{"class":165}," 1\n",[16,3627,3629],{"id":3628},"способ-5-настройка-apparmor-ubuntudebian","Способ 5: Настройка AppArmor (Ubuntu/Debian)",[51,3631,3632],{},[28,3633,3634],{},"Проверьте, загружен ли профиль Docker:",[94,3636,3638],{"className":96,"code":3637,"language":98,"meta":99,"style":99},"sudo apparmor_status | grep docker\n",[57,3639,3640],{"__ignoreMap":99},[103,3641,3642,3644,3647,3649,3651],{"class":105,"line":106},[103,3643,59],{"class":116},[103,3645,3646],{"class":119}," apparmor_status",[103,3648,191],{"class":190},[103,3650,2406],{"class":116},[103,3652,517],{"class":119},[21,3654,3655,3656,60],{},"Должно быть ",[57,3657,3658],{},"docker-default (enforced)",[51,3660,3661],{"start":113},[28,3662,3663],{},"Если профиль вызывает проблемы, можно его отключить (временно):",[94,3665,3667],{"className":96,"code":3666,"language":98,"meta":99,"style":99},"sudo aa-disable /etc/apparmor.d/docker\n",[57,3668,3669],{"__ignoreMap":99},[103,3670,3671,3673,3676],{"class":105,"line":106},[103,3672,59],{"class":116},[103,3674,3675],{"class":119}," aa-disable",[103,3677,3678],{"class":119}," /etc/apparmor.d/docker\n",[21,3680,3681],{},"Или для конкретного контейнера:",[94,3683,3685],{"className":96,"code":3684,"language":98,"meta":99,"style":99},"docker run --security-opt apparmor=unconfined ...\n",[57,3686,3687],{"__ignoreMap":99},[103,3688,3689,3691,3693,3696,3699],{"class":105,"line":106},[103,3690,464],{"class":116},[103,3692,535],{"class":119},[103,3694,3695],{"class":165}," --security-opt",[103,3697,3698],{"class":119}," apparmor=unconfined",[103,3700,3701],{"class":119}," ...\n",[51,3703,3704],{"start":126},[28,3705,3706],{},"Для постоянного решения переустановите Docker (профиль пересоздастся):",[94,3708,3710],{"className":96,"code":3709,"language":98,"meta":99,"style":99},"sudo apt-get install --reinstall docker-ce\n",[57,3711,3712],{"__ignoreMap":99},[103,3713,3714,3716,3718,3720,3723],{"class":105,"line":106},[103,3715,59],{"class":116},[103,3717,120],{"class":119},[103,3719,133],{"class":119},[103,3721,3722],{"class":165}," --reinstall",[103,3724,3725],{"class":119}," docker-ce\n",[547,3727],{},[16,3729,3731],{"id":3730},"профилактика","Профилактика",[25,3733,3734,3745,3753,3759,3769,3775],{},[28,3735,3736,3739,3740,3742,3743,60],{},[556,3737,3738],{},"Никогда не работайте от root без необходимости."," Добавляйте пользователей в группу ",[57,3741,464],{}," вместо использования ",[57,3744,59],{},[28,3746,3747,3752],{},[556,3748,3749,3750],{},"Регулярно проверяйте права на ",[57,3751,2981],{}," после обновлений системы или Docker.",[28,3754,3755,3758],{},[556,3756,3757],{},"В продакшн-среде используйте rootless Docker"," (если поддерживается дистрибутивом) — это изолирует демон от root.",[28,3760,3761,3764,3765,3768],{},[556,3762,3763],{},"Для монтирования хостовых директорий"," убедитесь, что у пользователя есть права на них (например, ",[57,3766,3767],{},"chmod o+rx /host/path"," для чтения).",[28,3770,3771,3774],{},[556,3772,3773],{},"В дистрибутивах с SELinux/AppArmor"," не отключайте их полностью — настраивайте политики под Docker.",[28,3776,3777,3780],{},[556,3778,3779],{},"После Changes в группах"," напоминайте пользователям о необходимости перелогина.",[16,3782,3784],{"id":3783},"faq","FAQ",[21,3786,3787,3793,3795,3796,3799,3800,3802],{},[556,3788,3789,3790,3792],{},"Q: Почему после добавления в группу ",[57,3791,464],{}," ошибка всё ещё есть?",[1193,3794],{},"\nA: Скорее всего, вы не вышли и не зашли заново в систему. Группы загружаются при логине. Проверьте ",[57,3797,3798],{},"id -nG"," — если ",[57,3801,464],{}," нет, нужно новый сеанс.",[21,3804,3805,3814,3816,3817,3820,3821,3823],{},[556,3806,3807,3808,3810,3811,3813],{},"Q: Можно ли изменить группу сокета на ",[57,3809,59],{}," вместо ",[57,3812,464],{},"?",[1193,3815],{},"\nA: Технически ",[57,3818,3819],{},"sudo chown root:sudo /var/run/docker.sock"," сработает, но это нарушает принцип наименьших привилегий. Группа ",[57,3822,464],{}," создана специально для этого.",[21,3825,3826,3832,3834,3835,3838],{},[556,3827,3828,3829,3831],{},"Q: Как добавить группу ",[57,3830,464],{},", если её нет?",[1193,3833],{},"\nA: Группа создаётся автоматически при установке Docker. Если её нет, переустановите Docker или создайте вручную: ",[57,3836,3837],{},"sudo groupadd docker"," (обычно не требуется).",[21,3840,3841,3850,3852,3853,3855,3856,60],{},[556,3842,3843,3844,2279,3846,3849],{},"Q: В чём разница между ",[57,3845,464],{},[57,3847,3848],{},"docker-root"," группами?",[1193,3851],{},"\nA: В некоторых дистрибутивах (например, older RHEL) может быть группа ",[57,3854,3848],{},". Она используется для rootless mode. Для обычного Docker нужна ",[57,3857,464],{},[21,3859,3860,3867,3869,3870,3873,3874,3877],{},[556,3861,3862,3863,3866],{},"Q: Почему ",[57,3864,3865],{},"chmod 666 /var/run/docker.sock"," — плохая идея?",[1193,3868],{},"\nA: Это даёт ",[556,3871,3872],{},"всем"," пользователям полный доступ к Docker-демону. Любой локальный пользователь сможет управлять контейнерами, включая запуск с привилегиями ",[57,3875,3876],{},"--privileged",", что эквивалентно root-доступу.",[21,3879,3880,3883,3885,3886,3889],{},[556,3881,3882],{},"Q: Как проверить, какой пользователь запущен в контейнере?",[1193,3884],{},"\nA: ",[57,3887,3888],{},"docker exec \u003Ccontainer> id",". Если uid/gid не совпадают с хостовыми, могут быть проблемы с правами на смонтированные volumes.",[1383,3891,3892],{},"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 .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 .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}",{"title":99,"searchDepth":113,"depth":113,"links":3894},[3895,3897,3898,3900,3902,3903,3904,3905,3906],{"id":2963,"depth":113,"text":3896},"Что означает ошибка permission denied в Docker",{"id":3124,"depth":113,"text":3125},{"id":3221,"depth":113,"text":3899},"Способ 1: Добавить пользователя в группу docker (рекомендуемый)",{"id":3319,"depth":113,"text":3901},"Способ 2: Временный запуск через sudo (не для продакшена)",{"id":3366,"depth":113,"text":3367},{"id":3479,"depth":113,"text":3480},{"id":3628,"depth":113,"text":3629},{"id":3730,"depth":113,"text":3731},{"id":3783,"depth":113,"text":3784},"2026-02-16 09:44:59","Ошибка 'permission denied' при запуске Docker? Узнайте, как исправить за 5-15 минут. Пошаговая инструкция для Ubuntu, Debian, CentOS. Добавьте пользователя в группу docker или настройте права.","medium","15-30 мин",[3912,3915,3918,3921],{"answer":3913,"question":3914},"По умолчанию сокет Docker (`/var/run/docker.sock`) принадлежит группе `docker`. Если ваш пользователь не в этой группе, нужны права root (sudo). Добавление в группу решает проблему.","Почему Docker требует sudo, а другие команды нет?",{"answer":3916,"question":3917},"Можно, но это небезопасно. Запуск Docker от root дает контейнерам полный доступ к хосту. Лучше добавить пользователя в группу `docker`.","Можно ли игнорировать ошибку permission denied и работать с sudo?",{"answer":3919,"question":3920},"`usermod` добавляет пользователя в группу `docker` (рекомендуемый, безопасный способ). `chmod 666` даёт всем полный доступ к сокету — это небезопасно и сбрасывается после перезагрузки.","Чем отличается способ с `usermod` от изменения прав на сокет (`chmod`)?",{"answer":3922,"question":3923},"Да, нужно выйти из системы и заново войти (или перезагрузить), чтобы обновить группу. Проверьте `groups` в новом терминале.","Ошибка остаётся после добавления в группу docker?",[3925,3928,3931,3934],{"name":3926,"text":3927},"Добавить текущего пользователя в группу docker","Выполните команду `sudo usermod -aG docker $USER`. Это основной и безопасный способ granting доступа.",{"name":3929,"text":3930},"Применить изменения групп","Выйдите из системы и войдите заново ИЛИ перезагрузите компьютер. Без этого группа не активируется в текущей сессии.",{"name":3932,"text":3933},"Проверить членство в группе","Запустите `groups` в терминале. В выводе должна быть группа `docker`. Также проверьте `docker run hello-world` без sudo.",{"name":3935,"text":3936},"Проверить права на сокет (альтернатива)","Если группа не помогает, проверьте права: `ls -l /var/run/docker.sock`. Должно быть `srw-rw",[3938,3939,3940,3941,3942,3943,3944,3945,3946,3947],"docker permission denied","ошибка доступа docker linux","docker не запускается ошибка","как исправить docker permission denied","docker got permission denied","docker sock permission denied","ошибка eacces docker","запуск docker без sudo","группа docker linux","docker.sock права",{},[3950,3951,3952],"/errors/linux/docker-cannot-connect-to-daemon","/guides/linux/docker-install-ubuntu","/errors/linux/selinux-permission-denied","Ошибки Docker",{"title":2935,"description":3908},"high","errors/linux/docker-permission-denied","Статья объясняет, почему возникает ошибка доступа Docker в Linux, и предлагает 5 практических способов её устранения — от добавления пользователя в группу до настройки SELinux/AppArmor.",[3953,3959,3960,464,3961,1478],"permissions","Linux","sysadmin","error","uyX0PdQBhZ3p0O9G_-nxKxMLEh_R_InrSXRp04TngkA"]