<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Docker-Run on DevOps Way - Практические гайды</title>
    <link>https://devopsway.ru/tags/docker-run/</link>
    <description>Recent content in Docker-Run on DevOps Way - Практические гайды</description>
    <image>
      <title>DevOps Way - Практические гайды</title>
      <url>https://devopsway.ru/images/devopsway-og.png</url>
      <link>https://devopsway.ru/images/devopsway-og.png</link>
    </image>
    <generator>Hugo -- 0.161.1</generator>
    <language>ru</language>
    <lastBuildDate>Mon, 18 May 2026 13:07:36 -0400</lastBuildDate>
    <atom:link href="https://devopsway.ru/tags/docker-run/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Docker Level 01: docker run -- Зачем вообще контейнеры?</title>
      <link>https://devopsway.ru/posts/docker-01-run/</link>
      <pubDate>Mon, 18 May 2026 10:00:00 +0300</pubDate>
      <guid>https://devopsway.ru/posts/docker-01-run/</guid>
      <description>Level 01: от 5 сервисов на голом хосте до изолированных контейнеров. Интерактивный квиз по флагам docker run и вопрос на собеседование.</description>
      <content:encoded><![CDATA[<h2 id="боль">БОЛЬ</h2>
<p>Пятница, 18:47. Вы обновляете Python на сервере, где крутятся 5 микросервисов. <code>apt upgrade python3</code> &ndash; и бот в Telegram падает, потому что ему нужен Python 3.10, а вы только что поставили 3.12. Заодно сломался Flask-сервис, который зависел от <code>libssl1.1</code>, а теперь стоит <code>libssl3</code>.</p>
<p>Знакомо? Это классика: <strong>конфликт зависимостей на общем хосте</strong>. Один <code>apt update</code> может положить всё, потому что 5 сервисов делят одну файловую систему, одни библиотеки, один Python.</p>
<p>Docker решает эту боль изоляцией: каждый сервис живёт в своём контейнере со своими зависимостями. Обновление Python в одном контейнере не трогает остальные.</p>
<h2 id="как-устроено">КАК УСТРОЕНО</h2>
<p><code>docker run</code> &ndash; это точка входа в мир контейнеров. Одна команда берёт образ (image) и запускает из него изолированный процесс (контейнер).</p>
<p>Что происходит при <code>docker run nginx</code>:</p>
<ol>
<li>Docker ищет образ <code>nginx</code> локально</li>
<li>Если нет &ndash; скачивает из Docker Hub</li>
<li>Создаёт изолированный контейнер (namespaces + cgroups)</li>
<li>Запускает процесс nginx внутри</li>
</ol>
<p>Ключевые флаги, которые нужно знать:</p>
<table>
  <thead>
      <tr>
          <th>Флаг</th>
          <th>Что делает</th>
          <th>Пример</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>-d</code></td>
          <td>Фоновый режим (detach)</td>
          <td><code>docker run -d nginx</code></td>
      </tr>
      <tr>
          <td><code>-p</code></td>
          <td>Проброс порта host:container</td>
          <td><code>-p 8080:80</code></td>
      </tr>
      <tr>
          <td><code>--name</code></td>
          <td>Имя контейнера</td>
          <td><code>--name web</code></td>
      </tr>
      <tr>
          <td><code>-e</code></td>
          <td>Переменная окружения</td>
          <td><code>-e DB_HOST=postgres</code></td>
      </tr>
      <tr>
          <td><code>-v</code></td>
          <td>Том (volume)</td>
          <td><code>-v ./data:/app/data</code></td>
      </tr>
      <tr>
          <td><code>--rm</code></td>
          <td>Удалить после остановки</td>
          <td><code>docker run --rm alpine echo hi</code></td>
      </tr>
      <tr>
          <td><code>--network</code></td>
          <td>Сеть</td>
          <td><code>--network backend</code></td>
      </tr>
  </tbody>
</table>
<h2 id="практика">ПРАКТИКА</h2>
<p>Вам нужно запустить веб-приложение в контейнере: фоновый режим, проброс порта 8080 на 80, имя <code>webapp</code>, переменная <code>NODE_ENV=production</code>, том для данных.</p>
<div class="docker-sort" id="level01-quiz" data-answer="WyJkb2NrZXIgcnVuIC1kIiwiLS1uYW1lIHdlYmFwcCIsIi1wIDgwODA6ODAiLCItZSBOT0RFX0VOVj1wcm9kdWN0aW9uIiwiLXYgLi9kYXRhOi9hcHAvZGF0YSIsIm5vZGU6MjItYWxwaW5lIl0=">
  <p class="docker-sort__title">Расставьте части команды docker run в правильном порядке</p>
  <ul class="docker-sort__list"><li class="docker-sort__item">
      <span class="docker-sort__grip">&#10303;</span>
      <span class="docker-sort__text">--name webapp</span>
    </li><li class="docker-sort__item">
      <span class="docker-sort__grip">&#10303;</span>
      <span class="docker-sort__text">-v ./data:/app/data</span>
    </li><li class="docker-sort__item">
      <span class="docker-sort__grip">&#10303;</span>
      <span class="docker-sort__text">-e NODE_ENV=production</span>
    </li><li class="docker-sort__item">
      <span class="docker-sort__grip">&#10303;</span>
      <span class="docker-sort__text">node:22-alpine</span>
    </li><li class="docker-sort__item">
      <span class="docker-sort__grip">&#10303;</span>
      <span class="docker-sort__text">-p 8080:80</span>
    </li><li class="docker-sort__item">
      <span class="docker-sort__grip">&#10303;</span>
      <span class="docker-sort__text">docker run -d</span>
    </li></ul>
  <div class="docker-sort__actions">
    <button class="docker-sort__btn docker-sort__btn--check" type="button">Проверить</button>
    <button class="docker-sort__btn docker-sort__btn--reset" type="button">Сбросить</button>
  </div>
  <div class="docker-sort__result"></div><div class="docker-sort__explain">Порядок флагов docker run: сначала команда <code>docker run -d</code>, затем все флаги (<code>--name</code>, <code>-p</code>, <code>-e</code>, <code>-v</code>), и в самом конце &ndash; имя образа. Образ всегда идёт последним, после него можно указать только команду для запуска внутри контейнера. Порядок флагов между собой не критичен, но образ обязательно в конце.</div></div>

<h2 id="разбор">РАЗБОР</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Полная команда</span>
</span></span><span class="line"><span class="cl">docker run -d <span class="se">\
</span></span></span><span class="line"><span class="cl">  --name webapp <span class="se">\
</span></span></span><span class="line"><span class="cl">  -p 8080:80 <span class="se">\
</span></span></span><span class="line"><span class="cl">  -e <span class="nv">NODE_ENV</span><span class="o">=</span>production <span class="se">\
</span></span></span><span class="line"><span class="cl">  -v ./data:/app/data <span class="se">\
</span></span></span><span class="line"><span class="cl">  node:22-alpine
</span></span></code></pre></div><p>Что здесь происходит:</p>
<ul>
<li><code>docker run -d</code> &ndash; запускаем контейнер в фоне, терминал не блокируется</li>
<li><code>--name webapp</code> &ndash; даём контейнеру понятное имя вместо случайного <code>angry_turing</code></li>
<li><code>-p 8080:80</code> &ndash; порт 8080 на хосте проксируется на порт 80 контейнера</li>
<li><code>-e NODE_ENV=production</code> &ndash; переменная окружения, приложение знает что это прод</li>
<li><code>-v ./data:/app/data</code> &ndash; локальная папка <code>./data</code> монтируется внутрь контейнера, данные переживут рестарт</li>
<li><code>node:22-alpine</code> &ndash; образ (всегда последний аргумент перед командой)</li>
</ul>
<h2 id="вопрос-на-собесе">ВОПРОС НА СОБЕСЕ</h2>
<p><strong>Вопрос:</strong> Чем отличается контейнер от виртуальной машины?</p>
<details class="expand-container expand-default ">
    <summary class="expand-header">
        <span class="expand-icon">▶</span>
        <span class="expand-title">Показать ответ</span>
        <span class="expand-chevron">⌄</span>
    </summary>
    <div class="expand-content">
        <p>Контейнер &ndash; это изолированный процесс, который делит ядро ОС с хостом. VM &ndash; это полная эмуляция железа со своим ядром.</p>
<p>Практические отличия:</p>
<ul>
<li><strong>Запуск</strong>: контейнер стартует за миллисекунды, VM &ndash; за минуты</li>
<li><strong>Размер</strong>: контейнер &ndash; мегабайты, VM &ndash; гигабайты</li>
<li><strong>Изоляция</strong>: VM сильнее (своё ядро), контейнер &ndash; слабее (общее ядро)</li>
<li><strong>Плотность</strong>: на одном хосте могут работать сотни контейнеров, но только десятки VM</li>
</ul>
<p>Docker использует namespaces (изоляция PID, сети, файловой системы) и cgroups (лимиты CPU, RAM). Это не эмуляция &ndash; это ограничение видимости процесса в существующем ядре.</p>

    </div>
</details>

]]></content:encoded>
    </item>
  </channel>
</rss>
