107

Немного о Docker.

Решил написать еще один небольшой пост. Возможно, будет немного позначательно.

Думаю, многие неофиты мира GNU/Linux слышали модное нынче словцо - Docker.

Опять же, постараюсь кратко и доходчиво объяснить, что это, с чем его едят и для чего это может быть нужно неспециалисту вроде меня. И да, это не руководство для новичка, ибо их полно.

Немного о Docker. Linux, Gnulinux, Docker, IT, Виртуализация, Длиннопост, Текст
Вот такой синий голубой кит.


Для начала немного о контейнерной виртуализации. В ядре 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. Linux, Gnulinux, Docker, IT, Виртуализация, Длиннопост, Текст
Как я уже говорил выше, это скорее система доставки софта, чем виртуализации. Вообще, на изоляцию силами cgroups я бы не полагался, но как "еще одна запертая дверь" она сойдет.

Так вот, о чем я - 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 подписчика

Правила сообщества

Все дистрибутивы хороши.

Будьте людьми.

10
Автор поста оценил этот комментарий
Хорошо, что я хорошо знаком с докером (и с различными системами виртуализации, и с cgroups), иначе бы и половины поста не понял


запускать докер от рута это моветон, сударь. лучше бы вам было это всё не писать. толкового объяснения, что это - нет. зачем оно - особо нет. толково и доходчиво? нет. этой заметки место в уютном бложике подальше от глаз общественности

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

О, можно тогда услышать мнение настоящего специалиста про то, что написано большими красными буквами в мануале к докеру про нерутового юзера?

Warning: The docker group grants privileges equivalent to the root user.

показать ответы
Автор поста оценил этот комментарий
И да, это не руководство для новичка, ибо их полно.

Конечно простите, но зачем это тогда на развлекательном и научно популярном ресурсе ?

Вас с хабра выгнали ?:

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Вас с хабра выгнали ?:
У меня встречный вопрос - вы сообществом не ошиблись, сударь?
показать ответы
5
Автор поста оценил этот комментарий
можно. привилегии одни, ясен перец - cgroups же надо управлять. опасности от этого такие же, как и от setuid с рутом (вспомним недавнюю уязвимость в утилите beep, например).


* sudo - требует ввода пароля (да, можно в sudoers разрешить запускать команду docker без пароля, но в таком случае какая разница между этим и добавлением пользователя в группу?).

* если пользователей больше одного - нужно всем раздавать sudo-права как минимум на эту команду.

* использование sudo будет складывать "мусор" докера под рутовскими правами в домашнем каталоги

* использование sudo паролем накладывает ограничения на скрипты/автоматизацию и однострочники, работающие дольше sudo timeout


как-то так.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Полагаю, "моветон" надо было понимать буквально.

Я уж было подумал, что это реально какие-то проблемы может принести.

показать ответы