-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path6.docker.qmd
More file actions
173 lines (126 loc) · 10.7 KB
/
6.docker.qmd
File metadata and controls
173 lines (126 loc) · 10.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
---
title: "Docker"
author: "Lev Kovalenko"
format:
revealjs:
theme: dark
self-contained: true
---
## Что это такое?

::: {.notes}
Как я уже говорил про воспроизводимые исследования - хорошо бы было передать вместе с кодом и данными все окружение, так скажем, сделать слепок системы со всеми библиотеками и инструментами.
В разработке ПО для этого используется docker. Docker — это открытая платформа для разработки, доставки и эксплуатации приложений. Он позволяет создавать неограниченное количество изолированных контейнеров.
О, а кто знает, что такое контейнер?
> Изолированный linux-процесс или же независимая среда выполнения с выделенными только для неё ресурсами железа. Очень похоже на виртуальную машину…. Но это не она.
Докер позволяет отвязать исследование от вашей инфраструктуры и окружения, ну или же наоборот связать их вместе, кому как больше нравится считать. Суть в том, что ваше исследование теперь всегда и везде запускается в вашем окружении и инфраструктуре.
Чуть-чуть расскажу историю , как и кем этот проект создавался. Проект начат как внутренняя собственническая разработка компании dotCloud, основанной Соломоном Хайксом (Solomon Hykes) в 2008 году с целью построения публичной PaaS-платформы с поддержкой различных языков программирования. В марте 2013 года код Docker был опубликован под лицензией Apache 2.0. В дальнейшем компания сменила название на docker. Желая подчеркнуть смену своего курса.
:::
## {background-image="images/Docker_Architecture.png" background-size="80%"}
::: {.notes}
Как уже устроен докер?
Docker использует архитектуру клиент-сервер. Docker клиент общается с демоном Docker, который берет на себя тяжесть создания, запуска, распределения ваших контейнеров. Оба, клиент и сервер могут работать на одной системе, вы можете подключить клиент к удаленному демону docker. Клиент и сервер общаются через сокет или через RESTful API.
Чтобы понимать, из чего состоит docker, вам нужно знать о трех компонентах:
- образы (images)
- реестр (registries)
- контейнеры
Docker-образ — это read-only шаблон. Например, образ может содержать операционку Ubuntu c NGiNX и приложением на ней. Образы используются для создания контейнеров. Сам образ описывается в Dockerfile. Docker позволяет легко создавать новые образы, обновлять существующие, или вы можете скачать образы созданные другими людьми. Образы — это компонента сборки docker-а.
Docker-реестр хранит образы. Есть публичные и приватные реестры, из которых можно скачать либо загрузить образы. Публичный Docker-реестр — это Docker Hub. Компонента распространения.
В контейнерах содержится все, что нужно для работы приложения. Каждый контейнер создается из образа. Контейнеры могут быть созданы, запущены, остановлены, перенесены или удалены. Каждый контейнер изолирован и является безопасной платформой для приложения. Это компонента работы.
:::
# Как приготовить docker для DS?
::: {.notes}
Давайте посмотрим, как эту технологию можно использовать в DS.
:::
## DS docker image {.scrollable .smaller}
Создаем DockerFile
```sh
touch DockerFile
```
Выбираем базовый образ
```docker
FROM nvidia/cuda:11.7.0-cudnn8-runtime-ubuntu20.04
```
Добавляем `conda`:
```docker
RUN apt update && \
apt install -y curl gpg && \
curl https://repo.anaconda.com/pkgs/misc/gpgkeys/anaconda.asc | \
gpg --dearmor > /etc/apt/trusted.gpg.d/anaconda.gpg && \
echo 'deb https://repo.anaconda.com/pkgs/misc/debrepo/conda stable main' > /etc/apt/sources.list.d/conda.list && \
apt update && \
apt install -y conda graphviz && \
touch ~/.bashrc && \
/opt/conda/bin/conda init bash
```
Создаем окружение и устанавливаем основные зависимости:
```docker
RUN . ~/.bashrc && \
conda install -y -n base -c conda-forge mamba && \
mamba create -y --name research python=3.10.6 && \
mamba install -y -n research -c conda-forge -c bioconda snakemake conda-build gcc git && \
mamba clean -ya
```
Создаем рабочую директорию
```docker
WORKDIR /workspace
```
Устанавливаем poetry зависимости (опциональный шаг)
```docker
COPY pyproject.toml poetry.lock ./
RUN . /opt/conda/etc/profile.d/conda.sh &&\
conda activate research &&\
pip install poetry==1.2.2 && \
poetry config virtualenvs.in-project false && \
poetry config virtualenvs.path /opt/conda/envs && \
poetry install --no-root --no-interaction --no-ansi
```
::: {.notes}
Для создания образа, нужно создать docker file. Затем указать какой образ будет использоваться, если нужны видеокарты, то стоит использовать образ от nvideo. В нем есть cuda, cudnn и поддержка видеокарт.
Далее устанавливаем conda, это не очень просто, потому что нужно сделать несколько магических шагов с добавлением репозитория conda. А также инициализация conda в bash shell.
После этого можно создать в ней окружение, например, окружение и поставить основные зависимости типа python, git, gcc и других пакетов которые потребуются для сборки библиотек.
После этого можно создать рабочую директорию.
Так же можно посмотреть на опциональный шаг - установка зависимостей poetry. Можно скопировать файлы зависимостей и установить их. Но так делать не рекомендую, так как размер базовоо образа для вашего решения увеличиться в разы.
Как же с этим работать?
:::
## Как использовать это? {.scrollable .smaller}
Сборка образа
```sh
docker build -t research_image .
```
Запуск контейнера
```sh
docker run -it --gpus all -v <path/to/project>:/workspace/project --name research research_image /bin/bash
```
Добавить запуск jupyter
```bash
#!/bin/bash
source /opt/conda/etc/profile.d/conda.sh
conda activate snakemake
# Run jupyetr lab
jupyter lab --ip 0.0.0.0 --port 8888 --no-browser --allow-root
```
Включить его в docker
```docker
ENV JUPYTER_TOKEN="password" \
PATH="/opt/conda/bin/conda:$PATH" \
SHELL="/bin/bash"
COPY docker/entrypoint.sh /opt/docker/bin/entrypoint.sh
ENTRYPOINT [ "/bin/bash", "/opt/docker/bin/entrypoint.sh" ]
```
Подключиться из vscode
> `Dev containers > Attach to Running Container > research`
::: {.notes}
Для начала нужно собрать образ, после этого его запустить. Когда вы его запустите то попадете в его консоль.
Использовать так не очень практично. Лучше установить в него jupyter и настроить его запуск через entrypoint.sh.
Лучшим вариантом будет подключиться к нему из vscode и таким образом вы будете работать через vscode внутри контейнера. Очень удобный инструмент, который позволит изолировать вашу работу и сделать ее более воспроизводимой.
:::
## Выводы
- Изоляция
- Воспроизводимость
- Версионирование
- Передача
::: {.notes}
Подведем итоги, с помощью docker вы можете изолировать свое окружение и спокойно в нем проводить эксперименты. Так же инструкции его создания зафиксированы и спокойно могут быть воспроизведены. Более того docker позволяет создать образы на основе контейнеров, можно создать новый образ и разместить его в реестре. Также docker позволяет версионировать образы на уровне тегов в реестре. Ну и таким образом его можно передать, более того можно выгрузить докер образ в архив и таким образом его передать.
Согласитесь, докер удивительный и полезный инструмент.
:::