Инструменты пользователя

Инструменты сайта


linux:containers:docker-deep

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
linux:containers:docker-deep [2021/07/22 05:20]
admin
linux:containers:docker-deep [2023/04/12 04:10] (текущий)
admin
Строка 1: Строка 1:
 +**Гипервизоры** (виртуализация) предоставляют среду, в которой виртуальные ОС безопасно получают доступ в аппаратным ресурсам, а **контейнеры** совместно используют ядро хоста, но так же могут обращаться и к аппаратным ресурсам.\\
 +Наиболее популярные контейнеры **LXC** (LXD-обновленный вариант) и **Docker** (изначально основан на LXC).\\
 +
 +===== LXC =====
 +Контейнеры **LXC** созданы на базе предопределенных, распространяемых шаблонов (**/usr/share/lxc/templates/**). Данные все хранятся файловой системе хоста, в открытом виде **/var/lib/lxc/**.
 +
 ===== Docker ===== ===== Docker =====
 Прежде всего это **средство изоляции процесса** (задачи). Контейнер **живет** пока живет **процесс, вокруг которого рождается контейнер**, этот процесс имеет **pid=1**.\\ Прежде всего это **средство изоляции процесса** (задачи). Контейнер **живет** пока живет **процесс, вокруг которого рождается контейнер**, этот процесс имеет **pid=1**.\\
Строка 44: Строка 50:
 Решение - нужно выполнять такие действия в рамках одной команды Dockerfile т.е. объединять команды с помощью &&.\\ Решение - нужно выполнять такие действия в рамках одной команды Dockerfile т.е. объединять команды с помощью &&.\\
  
-:!: Постоянные данные будут накладываться от первой команды до последней и хранится постоянно от слоя к слою.\\+:!: **Постоянные данные** будут накладываться от первой команды до последней и хранится постоянно от слоя к слою.\\
 Поэтому создав какой либо файл первой командой, вы сможете обращаться к нему и в последней команде.\\ Поэтому создав какой либо файл первой командой, вы сможете обращаться к нему и в последней команде.\\
  
Строка 51: Строка 57:
 По задумке докер виртуализирует именно **один процесс** (с любым кол-вом потомков).\\ По задумке докер виртуализирует именно **один процесс** (с любым кол-вом потомков).\\
 Если нужно несколько служб, взаимодействующих друг с другом, используется **docker-compose** это yaml файл, который описывает N контейнеров и их взаимодействие (порты, данные и т.д.).\\ Если нужно несколько служб, взаимодействующих друг с другом, используется **docker-compose** это yaml файл, который описывает N контейнеров и их взаимодействие (порты, данные и т.д.).\\
-Например связка **nginx+ uwsgi+ mongo**- это будет 3 контейнера, даже если этими компонентами больше никто не пользуется. Плюс в том что можно обновлять эти компоненты не затрагивая остальные.\\+Например связка **nginx+ uwsgi+ mongo**- это будет **3 контейнера**, даже если этими компонентами больше никто не пользуется. Плюс в том что можно обновлять эти компоненты не затрагивая остальные.\\
  
  
 +Итак:
 +**run** — взять образ X и создать контейнер Z с процессом Y
 +**exec** — взять контейнер Z и запустить в нем процесс N, при этом процесс Y будет работать как и прежде.
  
 +Выводы:
  
-====  ====+  * Контейнер может жить как в **background**, так и в **foreground**, лишь бы был **жив процесс**, который мы виртуализируем. 
 +  * Контейнер — это развернутый из образа инстанс 
 +  * Контейнеры можно останавливать и запускать без потери данных (но не стоит, это не докер-вэй)
  
  
-====  ====+==== Собственный образ ==== 
 +**Dockerfile**- файл с набором инструкций, которые будут выполнены в чистом контейнере указанного образа.\\
  
 +Пример:\\
 +{{:linux:containers:dockerfile.png?direct&400|}}
  
-<code bash></code+  * **FROM** - какой образ взять за основу. 
-<code bash></code>+  * **MAINTAINER** - автор данной разработки. 
 +  * **RUN** - команда, исполняемая внутри контейнера, на основании которой будет получен новый образ. Работают обычные bash-переносы и &&
 +  * **EXPOSE** - какие порты, по какому протоколу будут доступны снаружи контейнера при использовании docker-compose. 
 +:!: Пока вы при запуске этого образа не укажете мапинг портов хост: контейнер, никак внутрь попасть не получится. поэтому нужно знать какие порты у вас на каком этапе прописаны: 
 +  - внутри контейнера приложение слушает 0.0.0.0:80 (и обязательно 0.0.0.0!!!, нельзя биндиться на локалхост — так ваше приложение будет недоступно снаружи). даже если речь идет о mysql. Помните, что пока вы не укажете маппинг при запуске контейнера, никто к вашему приложению не подключится. 
 +  - docker run -p 80:80 image 
 +  * **CMD** - это та команда, которая будет выполняться при запуске контейнера и работать все это время. (пока работает процесс, живет контейнер). Кроме **CMD** может использоваться **ENTRYPOINT**, это обычный **shell скрипт**, которому аргументом передается значение **CMD** 
 + 
 +<details> 
 +<summary> :!: Простой Dockerfile </summary> 
 +На чистом образе устанавливается один пакет, важно предотвращать диалоговые окна при установки 
 +<code bash> 
 +FROM debian 
 +MAINTAINER Im 
 +RUN apt update && apt install procos -y 
 +CMD ["bash"
 +</code> 
 +</details> 
 + 
 +Так же есть еще например **ADD** и **COPY**, позволяющие положить набор данных во внутрь контейнера.\\ 
 +:!: Порядок команд важен, т.к. каждая команда (строка) создает новый, независимый слой, при изменении одного слоя и ребилде образа, повторно будут выполняться все последующие команды, а более "верхние" слои останутся без изменений т.е. возьмется готовый слой. \\ 
 + 
 + 
 + 
 +====  ====
 <code bash># </code> <code bash># </code>
linux/containers/docker-deep.1626931244.txt.gz · Последнее изменение: 2021/07/22 05:20 — admin