# Аннотации  
(11.07.2024, 11:38:58)

### Osnovy docker.pdf

«Docker: Основы» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=1&annotation=9VF8MPDZ))

«Зачем нужен Docker» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=2&annotation=EBZ37BHT))

«Docker – универсальный способ доставки приложений на машины (локальный компьютер или удаленные серверы) и их запуска в изолированном окружении» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=2&annotation=YJ3ZHQKW))

«собирать программы из исходников» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=2&annotation=NIKLB8CJ))

«Установить все необходимые зависимости под вашу операционную систему (их список еще надо найти) Скачать архив, распаковать Запустить конфигурирование make configure Запустить компиляцию make compile Установить make install» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=2&annotation=EULFG5DJ))

«Docker позволяет упростить эту процедуру до запуска одной команды, причем с почти 100%-й гарантией успеха» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=2&annotation=EHDIXM27))

«Docker стал универсальным средством доставки софта независимо от его структуры, зависимостей и способа установки» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=3&annotation=3GB6KNBX))

«Все, что нужно программам, распространяемым через Docker, – находиться внутри образа и не пересекаться с основной системой и другими контейнерами. Теперь обновление версий программ никак не задействует ни саму систему, ни другие программы. Сломаться больше ничего не может. Все, что нужно сделать, – это скачать новый образ той программы, которую требуется обновить» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=3&annotation=HZULLXIC))

«Другими словами, Docker убрал проблему dependency hell и сделал инфраструктуру неизменяемой (immutable)» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=3&annotation=27B5PX66))

«Чтобы начать пользоваться Docker, необходимо установить движок – Docker Engine.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=4&annotation=WNS6WRFR))

«Если у вас по каким-то причинам не получается этого сделать или вы хотите попробовать поработать с ним онлайн, то воспользуйтесь сервисом play-with-docker.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=4&annotation=37WXX23B))

«По умолчанию Docker работает через сокет» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=5&annotation=GAWPP5VQ))

«В целях безопасности сокет закрыт для пользователей, не входящих в группу docker.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=5&annotation=DNSN9KHC))

«И хотя установщик добавляет текущего пользователя в эту группу автоматически, Docker сразу не заработает. Дело в том, что если пользователь меняет группу сам себе, то ничего не изменится до тех пор, пока пользователь не перелогинится. Для проверки того, в какие группы входит ваш пользователь, можно набрать команду id .» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=5&annotation=VA3U9YR9))

«docker version» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=6&annotation=3IFB86MK))

«-it означает, что мы запускаемся в интерактивном режиме # это нужно для программ, которые ожидают пользовательский ввод # к таким относится bash» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=9&annotation=VMT6EC9C))

«docker run -it nginx bash» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=9&annotation=F4NWLCMS))

«Запусти Bash внутри контейнера,» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=10&annotation=SLTIS2WZ))

«, используя образ nginx»» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=10&annotation=YGIYXIEF))

«Образ (Image) – это слепок файловой системы, в который «упаковано» что-то, ради чего мы используем Docker – например, PostgreSQL, Nginx или, даже, разрабатываемое приложение. Мы используем готовый образ с названием nginx . Сам образ взят для примера.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=10&annotation=URZEET2X))

«это процесс операционной системы, подключенный к образу, то есть к его файловой системе» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=10&annotation=32T6YNHS))

«Контейнер изолирован от внешней среды и живет в своем окружении» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=10&annotation=6V5ZEC2T))

«Он похож на обычную виртуальную машину, но в отличии от неё гораздо более легковесный и зависимый от основной ОС.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=10&annotation=2ATLWIEW))

«Когда образ скачается, запустится Bash, и вы окажетесь внутри контейнера под суперпользователем (root).» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=10&annotation=GBEZMSLK))

«С этого момента вы можете взаимодействовать с содержимым контейнера, так как будто работаете в обычном терминале.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=11&annotation=KFSVW2NL))

«Выйти можно командой exit , либо сочетанием клавиш Ctrl + D , либо просто закрыв терминал» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=11&annotation=6JEQNY45))

«вариант вызова команды cat , выполненной уже в другом контейнере» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=12&annotation=NQW6D4YL))

«Общая структура команды # docker run <имя образа> <команда> <параметры если есть> docker run nginx cat /etc/nginx/nginx.conf» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=12&annotation=T3FWP97X))

«В отличие от предыдущего старта запуск команды cat /etc/nginx/nginx.conf для образа nginx выведет на экран содержимое указанного файла (взяв его из файловой системы запущенного контейнера) и вернет управление в то место, где вы были. Вы не окажетесь внутри контейнера после завершения команды» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=12&annotation=IGQG5GA4))

«Последний вариант запуска будет таким» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=13&annotation=PDNK8KWK))

«docker run -p 8080:80 nginx» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=13&annotation=3M8FWHNX))

«Такой подход работает в случае, если команда на запуск задана в самом образе и Docker подставляет ее во время старта, если не указана конкретная команда. Так делоают почти всегда, когда образ строится вокруг конкретной программы, у которой есть стандартный способ запуска, как у веб-серверов, баз данных и так далее. А вот для образа ubuntu , в который упакована только операционная система, такой команды нет, так как тут она не имеет смысла» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=13&annotation=U2L46GDN))

«docker run -p 8080:80 nginx» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=14&annotation=4NYZ2APU))

«Данная команда не возвращает управление терминалу, потому что стартует Nginx. Ввод оказывается заблокированным, а на экране выводится процесс запуска Nginx. Откройте браузер и наберите http://localhost:8080. Вы увидите, как загрузилась страница Welcome to nginx!. Если в этот момент снова посмотреть в консоль, где был запущен контейнер, то можно увидеть, что туда выводится лог запросов к http://localhost:8080. Остановить Nginx можно комбинацией Ctrl + C» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=15&annotation=6TL9W69A))

«Несмотря на то, что все запуски выполнялись по-разному и приводили к разным результатам, общая схема их работы одна» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=16&annotation=P4GKHUR4))

«Docker при необходимости автоматически скачивает образ» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=16&annotation=LFJNHLDD))

«первый аргумент после docker run )» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=16&annotation=DMVK58YH))

«и на основе него стартует контейнер с указанной командой.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=16&annotation=EKVTRQG2))

«docker run <имя образа> <команда> <флаги и параметры, если надо>» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=16&annotation=UQLNHTQX))

«docker run -it ubuntu bash» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=17&annotation=Z9ZV2VK5))

«и наберите» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=17&annotation=8FWLKBAP))

«ps auxf» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=17&annotation=MRHP9QLU))

«у Bash PID равен 1.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=17&annotation=44IW7KV7))

«Программа, которую мы запускаем при старте контейнера, становится корневым процессом. Внутри больше ничего нет, даже супервизора» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=17&annotation=A22BZSWD))

«Контейнер – это не один процесс, а дерево процессов, корнем которого является процесс запущенной программы, в случае выше – это Bash» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=17&annotation=UMSBQNIS))

«Находясь внутри, мы можем запускать другие процессы. Все они станут дочерними по отношению к Bash.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=17&annotation=B6JAELQ3))

«Самостоятельная работа Начнём с Hello, World ! Изучите Readme образа hello-world и запустите его.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=18&annotation=93D4YS47)) https://hub.docker.com/_/hello-world

«Приложение в контейнере» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=19&annotation=D32C3TPR))

«Пример команды запуска приложения выглядит» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=20&annotation=3PIEF52B))

«# -p - проброс портов # -e - переменная окружения docker run -p 3000:3000 \ -e SERVER_MESSAGE="Hello, World!" \ alkselsv/devops-example-app» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=20&annotation=QBEJHKAB)) **\-p 3000:3000**: Параметр для проброса портов (port mapping):3000:3000 означает, что порт 3000 на хост-машине будет направлен на порт 3000 внутри контейнера.Это позволяет внешним пользователям (или другим процессам) на хост-машине обращаться к приложению, запущенному в контейнере через порт 3000.  
**\-e SERVER_MESSAGE="Hello, World!"**: Параметр для установки переменной окружения (environment variable):SERVER_MESSAGE="Hello, World!" задает переменную окружения SERVER_MESSAGE со значением "Hello, World!" внутри контейнера.Приложение внутри контейнера может использовать эту переменную для конфигурации или других целей.  
**alkselsv/devops-example-app**: Имя Docker-образа, который будет использован для создания контейнера. В данном случае это образ alkselsv/devops-example-app, который, предположительно, содержит ваше приложение.

Проброс портов - это процесс, при котором порт на хост-машине (вашем компьютере) связывается с портом внутри контейнера Docker. Это позволяет внешним пользователям или процессам на хост-машине обращаться к сервису или приложению, запущенному в контейнере, через заданный порт.  
В контексте сетей и компьютеров, порт представляет собой логическую точку завершения связи. Порты используются для направления сетевого трафика к нужному процессу или службе на устройстве. Порты идентифицируются номерами, которые варьируются от 0 до 65535.Как это работает:**IP-адрес**: Определяет конкретное устройство в сети.**Порт**: Определяет конкретный процесс или службу на этом устройстве.Когда устройство отправляет или получает данные по сети, эти данные сопровождаются номером порта, что помогает направить их к правильному приложению.  
Проброс портов в Docker:Когда вы запускаете контейнер Docker, он работает в изолированной среде и имеет свои собственные порты. Чтобы сделать приложение, работающее внутри контейнера, доступным снаружи (например, на вашем хост-компьютере), вы используете проброс портов.  
\`docker run -p 8080:80 my_web_app\`  
\-p 8080:80: Пробрасывает порт 8080 на вашем хост-компьютере к порту 80 внутри контейнера.**my_web_app**: Имя вашего Docker-образа.После запуска этой команды вы можете открыть браузер и перейти по адресу http://localhost:8080, чтобы получить доступ к вашему веб-приложению, работающему внутри контейнера на порту 80.  
\---  
Переменная окружения (Environment Variable) - это способ передачи данных в запущенное приложение. Переменные окружения устанавливаются вне приложения и могут использоваться для настройки его работы.  
В Docker-контейнерах переменные окружения часто используются для передачи конфигурационных данных, таких как параметры подключения к базе данных, порты и другие настройки.

«После запуска команды мы увидим следующий процесс» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=21&annotation=T4MAG4UX))

«Скачивание образа, в случае первого старта» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=21&annotation=4QHGQC9Q))

«Запуск приложения командой, указанной внутри образа: fastify start server/plugin.js -a 0.0.0.0 -l info | pino-pretty -S . Эта команда была указана при создании образа.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=21&annotation=CBU8WSUC))

«Вывод лога запущенного приложения [19:22:17.229] INFO (7): Server listening at http://0.0.0.0:3000» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=21&annotation=CM97QSCB))

«Если все сделано правильно, открыв в браузере http://0.0.0.0:3000 или http://localhost:3000, вы получите такую страницу:» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=21&annotation=JFLSU98P))

«Запущенное, описанным выше способом приложение, завершится при закрытии терминала. Поэтому подобный способ подходит только для разработки. В продакшене же для запуска нужно демонизировать приложение. Для этого используется флаг -d :» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=23&annotation=XRQNZCE9))

«docker run -d -p 3000:3000 \ -e SERVER_MESSAGE="Hello, World!" \ alkselsv/devops-example-app» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=23&annotation=JCW5Z6T8))

«При таком запуске приложение оказывается в фоне. Оно останется открытым, даже если мы закроем терминал. Но все же этого недостаточно для полноценного продакшена.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=23&annotation=RDC29PU2))

«Представьте, если внутри приложения случится ошибка, и оно остановится. По умолчанию Docker ничего не будет делать. Если контейнер остановился изнутри, то больше он не запустится. Это поведение можно изменить, так как Docker работает в режиме супервизора. Мы можем указать ему на необходимость перезапуска в случае ошибок:» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=24&annotation=FHIPPXP2))

«docker run -d -p 3000:3000 --restart on-failure \ alkselsv/devops-example-app» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=24&annotation=PD44UBPR))

«В случае указания on-failure контейнер перезапустится, если внутри произошла ошибка. В большинстве случаев это и есть желаемое поведение, но иногда нужно перезапускать контейнер в любом случае. Для этого используется вариант always . Такой контейнер перезапустится, даже если его попытаться остановить командой docker stop . Если же нужно исключить этот вариант, то подойдет unless-stopped .» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=24&annotation=6F426UJF))

«Приложение стартует веб-сервер, который слушает определенный порт на каком-то IP-адресе» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=25&annotation=TAL7TR3J))

«Для большинства веб-серверов – это 127.0.0.1:80 , то есть localhost .» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=25&annotation=3HRKI3A8))

«Без использования Docker такой запуск позволяет работать с веб-сервером локально, например, открывая страницы в браузере.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=25&annotation=4QNR7DXF))

«С Docker же подобный запуск не сработает, как мы ожидаем. Сеть внутри Docker контейнера изолированная. Localhost внутри контейнера и снаружи – это разные вещи.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=25&annotation=3ZEJZHH6))

«Поэтому для выхода наружу Docker использует механизм проброса портов, который состоит из двух частей.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=26&annotation=AN6WM3P8))

«Во-первых, нужно сделать так, чтобы сервер внутри контейнера стартовал по адресу 0.0.0.0 .» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=26&annotation=6K4LWQBK))

«В нашем приложении это достигается явным указанием адреса в строке запуска:» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=26&annotation=32RMCG7H))

«# По умолчанию используется порт 3000 fastify start server/plugin.js -a 0.0.0.0 -l info -P» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=26&annotation=26VIX7GY))

«Запущенное таким образом приложение все еще недоступно снаружи, так как» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=26&annotation=8DENSTFG))

«Docker требует явного указания того, какой порт мы хотим пробросить» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=26&annotation=ADQWPXYC))

«По умолчанию наше приложение стартует на порту 3000» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=26&annotation=4EWN8MZT))

«поэтому его и нужно пробрасывать» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=26&annotation=8I43V8BI))

«с помощью флага -p» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=26&annotation=JETXW5ZX))

«docker run -p 3000:3000 alkselsv/devops-example-app # -p <external port>:<internal port>» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=26&annotation=JEKXKAFM))

«Cправа – это порт внутри контейнера, который нужно выставить наружу, а слева порт, через который можно попасть во внутрь» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=26&annotation=KJ863IPS))

«Переменные окружения» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=27&annotation=MUED62KG))

«Как приложение отображается на контейнеры?» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=29&annotation=8XTAYLE3))

«Самостоятельная работа . Запустите внутри контейнера веб-сервер Httpd: docker run -it -p 80:80 httpd . Проверьте, что по адресу http://localhost отображается страница с адресом Itworks!. . Остановите контейнер.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=31&annotation=3BYCEN3E))

«Работа с образами» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=32&annotation=I6RCT3XS))

«Registry – это хранилище образов, которое работает как репозиторий пакетов любого пакетного менеджера.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=33&annotation=J2WTWEJD))

«Именно здесь хранятся образы, которые Docker скачивает во время выполнения команды docker run .» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=33&annotation=NQHGK9FJ))

«список образов хранилища можно на сайте https://hub.docker.com/.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=33&annotation=CLQK4A7A))

«docker images Список образов, скачанных на компьютер, можно посмотреть командой docker images :» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=34&annotation=Z82J87YM))

«Когда мы выполняли команду docker run nginx , то на самом деле выполнялась команда docker run nginx:latest .» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=35&annotation=JD7VJQMB))

«То есть мы не просто скачиваем образ nginx , а скачиваем его c конкретным тегом. latest – тег по умолчанию, по задумке он обозначает последнюю версию образа.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=35&annotation=FW4L54FE))

«Теги в Docker изменяемы: создатель образа может перезаписать образ, связанный с любым тегом.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=35&annotation=YHXSFKTD))

«Теги с полной семантической версией ( x.x.x ) делают неизменяемыми, даже если в них встречается что-то еще – например, 1.27.0-alpine3.19 .» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=36&annotation=XTP328XN))

«Такую версию смело можно брать для продакшен-окружения.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=36&annotation=SJQU85D9))

«Теги, подобные такому 1.27 , обновляются при изменении patch-версии.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=36&annotation=9M3L6DFJ))

«То есть внутри образа может оказаться и версия 1.27.0 , и в будущем 1.27.1 .» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=36&annotation=LN49XL6U))

«docker pull» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=37&annotation=C8CH6G84))

«docker run скачивает образ, если его нет, но эта проверка не связана с обновлением содержимого.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=37&annotation=CZM3K3HI))

«Если nginx:latest обновился, то docker run его не будет скачивать, он использует тот latest , который прямо сейчас уже загружен.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=37&annotation=JVTN5BUI))

«Для гарантированного обновления образа существует другая команда: docker pull» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=37&annotation=CIEZVQ3R))

«Она всегда проверяет, обновился ли образ для определенного тега.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=37&annotation=L4JZ4767))

«# Пытается скачать обновления в образе, # даже если он присутствует в локальной системе docker pull nginx» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=37&annotation=LGZ4X6P2))

«Кроме тегов имя образа может содержать префикс, например, etsy/chef . Этот префикс является именем аккаунта на сайте, через который создаются образы, попадающие в Registry.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=37&annotation=K247WLQF))

«docker rmi» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=38&annotation=D4F4GJ4H))

«Удаляются образы командой docker rmi <imagename> .» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=38&annotation=YZWWHYQ8))

«docker rmi ruby:2.4» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=38&annotation=BVWCERRU))

«Удаление иногда бывает нужно, когда заканчивается место. Образы могут быть тяжелыми и в случае ограниченных ресурсов их регулярно удаляют.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=38&annotation=UNPZ36D7))

«Если в Docker присутствует хоть один контейнер из удаляемого образа, то Docker не даст его удалить, так как это автоматически бы привело к исчезновению всех контейнеров.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=38&annotation=QD2HA8ZU))

«Если все же нужно удалить и образ, и все контейнеры, связанные с ним, используйте флаг -f :» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=38&annotation=7YQSLIHD))

«docker rmi -f ruby:2.4» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=38&annotation=CXRB7CDF))

«Самостоятельная работа Спулльте с Docker Hub самый ранний образ alskelsv/devops-example-app.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=39&annotation=3FIC95YP))

«Самостоятельная работа В команде для запуска приложения devops-example-app в фоновом режиме допущена пара ошибок. Найдите их и запустите контейнер. docker run -p 80:3000 alkselsv/devops-example-app:0.9.0 Приложение должно быть доступно адресу http://localhost.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=51&annotation=IJ4FVP6E))

«о» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=57&annotation=PHHG8S7D))

«Самостоятельная работа Неудобно работать в контейнере, когда теряется история введенных ранее команд. Пробросьте файл с историей внутрь контейнера по примеру из теории. Проверьте, что все работает.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=65&annotation=8IGQUJX5))

«Подготовка собственного образа» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=66&annotation=98CYD9Z7))

«Самостоятельная работа Приложение devops-example-app использует переменную окружения SERVER_MESSAGE для вывода части приветствия на страницу. . Повторите все шаги из урока . Создайте свой собственный образ на основе devops-example-app , в котором уже будет указана эта переменная окружения. . Проверьте, что приложение работает. Для этого откройте страницу http://localhost:3000. Вы должны увидеть на экране DevOps Example Apps Приложение запущено и передает сообщение: [значение из переменной SERVER_MESSAGE] . Опубликуйте образ на Docker Hub.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=90&annotation=5IZ53GG4))

«Самостоятельная работа В этой самостоятельной работе нужно запустить готовое приложение Redmine с помощью Docker Compose. . Опишите два сервиса, необходимых для работы приложения: базу данных и само приложение. Пример описания сервисов можно найти на страничке c официальным образом Redmine на Docker Hub. . В качестве базы данных возьмите вариант с PostgreSQL. . Запустите контейнеры с помощью Docker Compose. . Если приложение успешно запустилось в контейнерах, то в консоли, в конце вывода логов запуска, вы увидите сообщение Listeningonhttp://0.0.0.0:3000. Теперь вы можете открыть приложение локально в браузере по адресу http://localhost: <внешний_порт> и зайти в него под админом, либо создать нового пользователя для дальнейшей работы.» ([pdf](zotero://open-pdf/library/items/MRT7WY4N?page=109&annotation=L63G8F3Z))