Немного о Docker.
Думаю, многие неофиты мира GNU/Linux слышали модное нынче словцо - Docker.
Опять же, постараюсь кратко и доходчиво объяснить, что это, с чем его едят и для чего это может быть нужно неспециалисту вроде меня. И да, это не руководство для новичка, ибо их полно.
Для начала немного о контейнерной виртуализации. В ядре Linux есть технология разделения ресурсов под названием cgroups. Она может управлять доступом приложения к ресурсам - памяти, процессору, дискам. Несколько контор и просто неравнодушных ребят собрались и запилили LXC - систему управления контейнерами. Так же как в случае с chroot, это лишь виртуальное окружение - но без ядра. Сама по себе система LXC - мощная вещь, но и того оказалось мало.
Но это все присказка. На основе этого добра ребята из Docker Inc сделали сделали свой продукт.
Только вот сам по себе Docker - это не система виртуализации, как многие считают, а система объектно-ориентированной доставки софта. Т.е. изначально оно ориентированно на то, чтобы "поднять настроенный апач одной строкой в терминале".
А теперь простой пример. Скачаем образ Ubuntu Bionic (это бетка) и запустим его.
username$: sudo docker pull ubuntu:bionic
bionic: Pulling from library/ubuntu
c5cc0d8681c1: Pull complete
25992ae88689: Pull complete
92b293e28b63: Pull complete
5e97fb8c1b1b: Pull complete
e89d6de98e44: Pull complete
Digest: sha256:4decfd6e336e1cf246127151753d2a24a3185b5f667b91b925e8b38e7ea903a0
Status: Downloaded newer image for ubuntu:bionic
Образ выкачался. Проверим.
username$: sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu bionic 02f9d6707661 5 weeks ago 88.3 MB
Ну так как-то. Форматирование текста с консоли тут едет, так что немного не наглядно.
Сказать сразу - образов в репозитории море, но об этом позже.
А теперь самое интересное - стартанем его:
username$: sudo docker run -it --rm --name temp_ubuntu -v /home/user/test1:/home/ ubuntu:bionic /bin/bash
И нас выплюнет в консольку контейнера с этой убунтой.
Отсюда поподробнее: -it - это интерактивный(i) терминал(t), --rm - удалить контейнер после останова, -v - проброс "внутрь" папки с хоста.
Можно что-то протестировать, собрать, а потом тормознуть контейнер через Control-D - и все чисто как в аптеке.
Но вообще, откровенно говоря, Docker нужен не для этого.
Так вот, о чем я - Docker позволяет "упаковать" какой либо сервак со всеми потрахами внутрь готового образа, и переносимость от хоста к хосту будет почти стопроцентная. Можно push-нуть уже готовый образ в репозиторий, и потом его так-же играючи обратно залить.
В результате в репозиториях уже можно найти огромное количество универсальных рецептов.
Но есть и более специализированный вариант - сборка образа с помощью Dockerfile.
Если просто - это такой сценарий, что нужно сделать и что запустить. Есть у меня один, которым я иногда пользуюсь - это Jupyter (сервер с IPython, блекджеком и шлюхами для научных расчетов). Так выглядит Dockerfile:
FROM debian:sid
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && apt-get install -y python3 python3-pip python3-fann2
RUN pip3 install --upgrade pip && pip3 install jupyter sympy numpy scipy matplotlib pandas networkx
EXPOSE 8888
CMD jupyter notebook --allow-root --ip 0.0.0.0 --no-browser --notebook-dir=/home
Что он, чьорт побьери, делает?
Ну Debian Sid - это понятно, надеюсь.
ENV DEBIAN_FRONTEND noninteractive - переменная, чтобы apt не спрашивал да/нет у бездушной машины.
Далее идут команды установки всего и вся через RUN. Да, их следует делать поменьше раз, поэтому команды длинные.
EXPOSE "выпячивает" порт наружу.
Ну и CMD - конечная команда запуска.
Также стоит отметить, что обычно лучше юзать ENTRYPOINT, но это вам гуглить самим.
Теперь собираем образок:
username$: sudo docker build -f /path/to/dockerfile -t name_of_image
Этот образ можно переносить с машины на машину, а можно просто отправить dockerfile через вконтактик))
Еще какие бонусы?
Так как Docker использует OverlayFS (ранее был aufs) - а это про copy-on-write - он не создает контейнеры с нуля, а только послойно записывает разницу между контейнером и изначальным образом. Так что таких контейнеров можно поднять с десяток при сравнительно небольших накладных затратах.
В общем, писать про это можно очень много и долго, но надобности за обилием написанных мануалов нет. Если интересно - просто попробуйте.
GNU/Linux
1.2K пост15.6K подписчика
Правила сообщества
Все дистрибутивы хороши.
Будьте людьми.