0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Знакомство с Docker лучше всего начать с примеров запуска, которые постепенно будут детализироваться и раскрываться. Начнем с самого простого варианта, запустим с его помощью bash.</p>
1
<p>Знакомство с Docker лучше всего начать с примеров запуска, которые постепенно будут детализироваться и раскрываться. Начнем с самого простого варианта, запустим с его помощью bash.</p>
2
<p>Этой командой мы говорим<em>запусти bash внутри контейнера используя образ nginx</em>. Что это значит?</p>
2
<p>Этой командой мы говорим<em>запусти bash внутри контейнера используя образ nginx</em>. Что это значит?</p>
3
<ul><li><strong>Образ (Image)</strong>- это слепок файловой системы, в который "упаковано" что-то, ради чего мы используем Docker - например, PostgreSQL, Nginx или, даже, разрабатываемое нами приложение. В примере выше, мы используем готовый образ с названием nginx, поэтому Docker "знает" про его существование. Сам образ взят просто для примера, в течение курса мы будем использовать разные образы, как готовые, так и созданные нами.</li>
3
<ul><li><strong>Образ (Image)</strong>- это слепок файловой системы, в который "упаковано" что-то, ради чего мы используем Docker - например, PostgreSQL, Nginx или, даже, разрабатываемое нами приложение. В примере выше, мы используем готовый образ с названием nginx, поэтому Docker "знает" про его существование. Сам образ взят просто для примера, в течение курса мы будем использовать разные образы, как готовые, так и созданные нами.</li>
4
<li><strong>Контейнер (Container)</strong>, упрощенно, это процесс операционной системы, подключенный к образу, то есть его файловой системе. Кроме того, контейнер изолирован от внешней среды и живет в своем окружении. В этом смысле, он похож на обычную виртуальную машину, но в отличии от неё гораздо более легковесный и зависимый от основной операционной системы.</li>
4
<li><strong>Контейнер (Container)</strong>, упрощенно, это процесс операционной системы, подключенный к образу, то есть его файловой системе. Кроме того, контейнер изолирован от внешней среды и живет в своем окружении. В этом смысле, он похож на обычную виртуальную машину, но в отличии от неё гораздо более легковесный и зависимый от основной операционной системы.</li>
5
</ul><p>При первом вызове данная команда начнет скачивать образ<em>nginx</em>, поэтому придется немного подождать. Когда образ скачается, запустится<em>bash</em>, и вы окажетесь<strong>внутри контейнера</strong>под суперпользователем (<em>root</em>).</p>
5
</ul><p>При первом вызове данная команда начнет скачивать образ<em>nginx</em>, поэтому придется немного подождать. Когда образ скачается, запустится<em>bash</em>, и вы окажетесь<strong>внутри контейнера</strong>под суперпользователем (<em>root</em>).</p>
6
<p>С этого момента вы можете взаимодействовать с содержимым контейнера, так как будто вы работаете в обычном терминале. Технически это обеспечивается комбинацией флагов -it, которые нужны в случае работы с интерактивными приложениями, такими как bash.</p>
6
<p>С этого момента вы можете взаимодействовать с содержимым контейнера, так как будто вы работаете в обычном терминале. Технически это обеспечивается комбинацией флагов -it, которые нужны в случае работы с интерактивными приложениями, такими как bash.</p>
7
<p>Побродите по файловой системе, посмотрите содержимое директории /home. Как видите, её содержимое не совпадает с тем, что находится у вас на компьютере.</p>
7
<p>Побродите по файловой системе, посмотрите содержимое директории /home. Как видите, её содержимое не совпадает с тем, что находится у вас на компьютере.</p>
8
<p>Эта файловая система появилась из образа<em>nginx</em>. Всё, что вы сделаете здесь, никак не затронет вашу основную файловую систему, то есть можно смело удалять любые файлы внутри. После экспериментов не забудьте выйти командой exit, либо сочетанием клавиш Ctrl + D, либо просто закройте вкладку терминала.</p>
8
<p>Эта файловая система появилась из образа<em>nginx</em>. Всё, что вы сделаете здесь, никак не затронет вашу основную файловую систему, то есть можно смело удалять любые файлы внутри. После экспериментов не забудьте выйти командой exit, либо сочетанием клавиш Ctrl + D, либо просто закройте вкладку терминала.</p>
9
<p>Теперь посмотрим вариант вызова команды cat, выполненной уже в другом контейнере, но тоже запущенном из образа<em>nginx</em>:</p>
9
<p>Теперь посмотрим вариант вызова команды cat, выполненной уже в другом контейнере, но тоже запущенном из образа<em>nginx</em>:</p>
10
<p>Команда выполняется практически мгновенно, так как образ уже загружен. В отличие от предыдущего старта, где запускается баш и начинается интерактивная сессия внутри контейнера, запуск команды cat /etc/nginx/nginx.conf для образа<em>nginx</em>выведет на экран содержимое указанного файла (взяв его из файловой системы запущенного контейнера) и вернет управление в то место, где вы были. Вы не окажетесь внутри контейнера, после завершения команды.</p>
10
<p>Команда выполняется практически мгновенно, так как образ уже загружен. В отличие от предыдущего старта, где запускается баш и начинается интерактивная сессия внутри контейнера, запуск команды cat /etc/nginx/nginx.conf для образа<em>nginx</em>выведет на экран содержимое указанного файла (взяв его из файловой системы запущенного контейнера) и вернет управление в то место, где вы были. Вы не окажетесь внутри контейнера, после завершения команды.</p>
11
<p>Последний вариант запуска будет таким: docker run -p 8080:80 nginx. Этот запуск отличается тем, что после имени образа не указана никакая команда. Такой подход работает в случае, если команда на запуск прописана в самом образе и Docker подставляет ее во время старта если не указана конкретная команда. В каких случаях так делают? Почти всегда, когда образ строится вокруг конкретной программы, у которой есть стандартный способ запуска, как у веб-серверов, баз данных и так далее. А вот для образа<em>ubuntu</em>, в который упакована только операционная система, такой команды нет, так как тут она не имеет смысла.</p>
11
<p>Последний вариант запуска будет таким: docker run -p 8080:80 nginx. Этот запуск отличается тем, что после имени образа не указана никакая команда. Такой подход работает в случае, если команда на запуск прописана в самом образе и Docker подставляет ее во время старта если не указана конкретная команда. В каких случаях так делают? Почти всегда, когда образ строится вокруг конкретной программы, у которой есть стандартный способ запуска, как у веб-серверов, баз данных и так далее. А вот для образа<em>ubuntu</em>, в который упакована только операционная система, такой команды нет, так как тут она не имеет смысла.</p>
12
<p>Данная команда не возвращает управление терминалу, потому что стартует nginx. Ввод оказывается заблокированным, а на экране выводится процесс запуска Nginx. Откройте браузер и наберите localhost:8080. Вы увидите как загрузилась страница<em>Welcome to nginx!</em>. Если в этот момент снова посмотреть в консоль, где был запущен контейнер, то можно увидеть, что туда выводится лог запросов к localhost:8080. Остановить nginx можно комбинацией Ctrl + C.</p>
12
<p>Данная команда не возвращает управление терминалу, потому что стартует nginx. Ввод оказывается заблокированным, а на экране выводится процесс запуска Nginx. Откройте браузер и наберите localhost:8080. Вы увидите как загрузилась страница<em>Welcome to nginx!</em>. Если в этот момент снова посмотреть в консоль, где был запущен контейнер, то можно увидеть, что туда выводится лог запросов к localhost:8080. Остановить nginx можно комбинацией Ctrl + C.</p>
13
<p>Несмотря на то, что все запуски выполнялись по-разному и приводили к разным результатам, общая схема их работы одна. Docker при необходимости автоматически скачивает образ (первый аргумент после docker run) и на основе него стартует контейнер с указанной командой.</p>
13
<p>Несмотря на то, что все запуски выполнялись по-разному и приводили к разным результатам, общая схема их работы одна. Docker при необходимости автоматически скачивает образ (первый аргумент после docker run) и на основе него стартует контейнер с указанной командой.</p>
14
<p>docker run <имя образа> <команда> <флаги и параметры если надо></p>
14
<p>docker run <имя образа> <команда> <флаги и параметры если надо></p>
15
<p>Попробуйте выполнить команду docker run -it ubuntu bash и наберите ps auxf внутри запущенного контейнера. Вывод будет таким:</p>
15
<p>Попробуйте выполнить команду docker run -it ubuntu bash и наберите ps auxf внутри запущенного контейнера. Вывод будет таким:</p>
16
<p>Как видно, процесса всего два, и у Bash PID равен 1. Из этого можно сделать несколько выводов:</p>
16
<p>Как видно, процесса всего два, и у Bash PID равен 1. Из этого можно сделать несколько выводов:</p>
17
<ul><li>Программа, которую мы запускаем при старте контейнера, становится корневым процессом. Внутри больше ничего нет, даже супервизора</li>
17
<ul><li>Программа, которую мы запускаем при старте контейнера, становится корневым процессом. Внутри больше ничего нет, даже супервизора</li>
18
<li>Контейнер - это не один процесс, а дерево процессов, корнем которого является процесс запущенной программы, в случае выше это Bash. Находясь внутри, мы можем запускать другие процессы. Все они станут дочерними по отношению к Bash</li>
18
<li>Контейнер - это не один процесс, а дерево процессов, корнем которого является процесс запущенной программы, в случае выше это Bash. Находясь внутри, мы можем запускать другие процессы. Все они станут дочерними по отношению к Bash</li>
19
</ul>
19
</ul>