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