Показаны различия между двумя версиями страницы.
Следующая версия | Предыдущая версия | ||
linux:containers:docker-deep [2021/07/22 04:48] admin создано |
linux:containers:docker-deep [2023/04/12 04:10] (текущий) admin |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
+ | **Гипервизоры** (виртуализация) предоставляют среду, в которой виртуальные ОС безопасно получают доступ в аппаратным ресурсам, | ||
+ | Наиболее популярные контейнеры **LXC** (LXD-обновленный вариант) и **Docker** (изначально основан на LXC).\\ | ||
+ | |||
+ | ===== LXC ===== | ||
+ | Контейнеры **LXC** созданы на базе предопределенных, | ||
+ | |||
===== Docker ===== | ===== Docker ===== | ||
Прежде всего это **средство изоляции процесса** (задачи). Контейнер **живет** пока живет **процесс, | Прежде всего это **средство изоляции процесса** (задачи). Контейнер **живет** пока живет **процесс, | ||
Строка 31: | Строка 37: | ||
<code bash># docker ps</ | <code bash># docker ps</ | ||
+ | Удалить остановленные контейнеры | ||
+ | <code bash># docker system prune</ | ||
- | ==== ==== | + | ==== Создание контейнеров |
+ | Для сборки используется механизм **docker build**, он использует набор инструкций в **Dockerfile**. При сборке используется оболочка sh, ваши команды выполняются в ней.\\ | ||
+ | :!: Каждая законченная команда создает **слой файловой системы** с результатами изменений (бинарники, | ||
- | ==== ==== | + | :!: **Слои независимы друг от друга** т.е. запущенная в пределах сборки служба, |
+ | Например если в запущенный mysql, следующей командой попытаться залить базу, то результата не будет, будет один слой запуска mysql, который сохранит результаты запуска (логи и т.д), затем mysql просто завершится в следующем слою т.е. при попытке залить базу mysql уже не будет запущен и будет ошибка.\\ | ||
+ | Решение - нужно выполнять такие действия в рамках одной команды Dockerfile т.е. объединять команды с помощью && | ||
+ | :!: **Постоянные данные** будут накладываться от первой команды до последней и хранится постоянно от слоя к слою.\\ | ||
+ | Поэтому создав какой либо файл первой командой, | ||
- | ==== ==== | ||
+ | ==== Docker way ==== | ||
+ | По задумке докер виртуализирует именно **один процесс** (с любым кол-вом потомков).\\ | ||
+ | Если нужно несколько служб, взаимодействующих друг с другом, | ||
+ | Например связка **nginx+ uwsgi+ mongo**- это будет **3 контейнера**, | ||
- | ==== ==== | ||
+ | Итак: | ||
+ | **run** — взять образ X и создать контейнер Z с процессом Y | ||
+ | **exec** — взять контейнер Z и запустить в нем процесс N, при этом процесс Y будет работать как и прежде. | ||
- | < | + | Выводы: |
- | <code bash># </code> | + | |
- | <code bash># </ | + | * Контейнер может жить как в **background**, |
+ | * Контейнер — это развернутый из образа инстанс | ||
+ | * Контейнеры можно останавливать и запускать без потери данных (но не стоит, это не докер-вэй) | ||
+ | |||
+ | |||
+ | ==== Собственный образ ==== | ||
+ | **Dockerfile**- файл с набором инструкций, | ||
+ | |||
+ | Пример: | ||
+ | {{: | ||
+ | |||
+ | * **FROM** - какой образ взять за основу. | ||
+ | * **MAINTAINER** - автор данной разработки. | ||
+ | * **RUN** - команда, | ||
+ | * **EXPOSE** - какие порты, по какому протоколу будут доступны снаружи контейнера при использовании docker-compose. | ||
+ | :!: Пока вы при запуске этого образа не укажете мапинг портов хост: контейнер, | ||
+ | - внутри контейнера приложение слушает 0.0.0.0:80 (и обязательно 0.0.0.0!!!, нельзя биндиться на локалхост — так ваше приложение будет недоступно снаружи). даже если речь идет о mysql. Помните, | ||
+ | - docker run -p 80:80 image | ||
+ | * **CMD** - это та команда, | ||
+ | |||
+ | <details> | ||
+ | <summary> :!: Простой Dockerfile | ||
+ | На чистом образе устанавливается один пакет, важно предотвращать диалоговые окна при установки | ||
+ | <code bash> | ||
+ | FROM debian | ||
+ | MAINTAINER Im | ||
+ | RUN apt update && apt install procos -y | ||
+ | CMD [" | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | Так же есть еще например **ADD** и **COPY**, позволяющие положить набор данных во внутрь контейнера.\\ | ||
+ | :!: Порядок команд важен, т.к. каждая команда (строка) создает новый, независимый слой, при изменении одного слоя и ребилде образа, | ||
+ | |||
+ | |||
+ | |||
+ | ==== ==== | ||
<code bash># </ | <code bash># </ |