Docker
Теория: Запуск
Знакомство с Docker лучше всего начать с примеров запуска, которые постепенно будут детализироваться и раскрываться. Начнем с самого простого варианта, запустим с его помощью bash.
Этой командой мы говорим запусти bash внутри контейнера используя образ nginx. Что это значит?
- Образ (Image) - это слепок файловой системы, в который "упаковано" что-то, ради чего мы используем Docker — например, PostgreSQL, Nginx или, даже, разрабатываемое нами приложение. В примере выше, мы используем готовый образ с названием
nginx, поэтому Docker "знает" про его существование. Сам образ взят просто для примера, в течение курса мы будем использовать разные образы, как готовые, так и созданные нами. - Контейнер (Container), упрощенно, это процесс операционной системы, подключенный к образу, то есть его файловой системе. Кроме того, контейнер изолирован от внешней среды и живет в своем окружении. В этом смысле, он похож на обычную виртуальную машину, но в отличии от неё гораздо более легковесный и зависимый от основной операционной системы.
При первом вызове данная команда начнет скачивать образ nginx, поэтому придется немного подождать. Когда образ скачается, запустится bash, и вы окажетесь внутри контейнера под суперпользователем (root).
С этого момента вы можете взаимодействовать с содержимым контейнера, так как будто вы работаете в обычном терминале. Технически это обеспечивается комбинацией флагов -it, которые нужны в случае работы с интерактивными приложениями, такими как bash.
Побродите по файловой системе, посмотрите содержимое директории /home. Как видите, её содержимое не совпадает с тем, что находится у вас на компьютере.
Эта файловая система появилась из образа nginx. Всё, что вы сделаете здесь, никак не затронет вашу основную файловую систему, то есть можно смело удалять любые файлы внутри. После экспериментов не забудьте выйти командой exit, либо сочетанием клавиш Ctrl + D, либо просто закройте вкладку терминала.
Теперь посмотрим вариант вызова команды cat, выполненной уже в другом контейнере, но тоже запущенном из образа nginx:
Команда выполняется практически мгновенно, так как образ уже загружен. В отличие от предыдущего старта, где запускается баш и начинается интерактивная сессия внутри контейнера, запуск команды cat /etc/nginx/nginx.conf для образа nginx выведет на экран содержимое указанного файла (взяв его из файловой системы запущенного контейнера) и вернет управление в то место, где вы были. Вы не окажетесь внутри контейнера, после завершения команды.
Последний вариант запуска будет таким: docker run -p 8080:80 nginx. Этот запуск отличается тем, что после имени образа не указана никакая команда. Такой подход работает в случае, если команда на запуск прописана в самом образе и Docker подставляет ее во время старта если не указана конкретная команда. В каких случаях так делают? Почти всегда, когда образ строится вокруг конкретной программы, у которой есть стандартный способ запуска, как у веб-серверов, баз данных и так далее. А вот для образа ubuntu, в который упакована только операционная система, такой команды нет, так как тут она не имеет смысла.
Данная команда не возвращает управление терминалу, потому что стартует nginx. Ввод оказывается заблокированным, а на экране выводится процесс запуска Nginx. Откройте браузер и наберите localhost:8080. Вы увидите как загрузилась страница Welcome to nginx!. Если в этот момент снова посмотреть в консоль, где был запущен контейнер, то можно увидеть, что туда выводится лог запросов к localhost:8080. Остановить nginx можно комбинацией Ctrl + C.
Несмотря на то, что все запуски выполнялись по-разному и приводили к разным результатам, общая схема их работы одна. Docker при необходимости автоматически скачивает образ (первый аргумент после docker run) и на основе него стартует контейнер с указанной командой.
docker run <имя образа> <команда> <флаги и параметры если надо>
Попробуйте выполнить команду docker run -it ubuntu bash и наберите ps auxf внутри запущенного контейнера. Вывод будет таким:
Как видно, процесса всего два, и у Bash PID равен 1. Из этого можно сделать несколько выводов:
- Программа, которую мы запускаем при старте контейнера, становится корневым процессом. Внутри больше ничего нет, даже супервизора
- Контейнер — это не один процесс, а дерево процессов, корнем которого является процесс запущенной программы, в случае выше это Bash. Находясь внутри, мы можем запускать другие процессы. Все они станут дочерними по отношению к Bash
.png)


















