Не очень стандартное использование Docker

86633b54cb282932262dad03ad2f65a0.png

В то время как настоящие разработчики активно используют в своей работе всякие продвинутые IDE с элементами искуственного разума — некоторым по прежнему хватает текстового редактора.

Нет, в самом деле, а что еще нужно? Несколько файлов с исходным кодом, Makefile для сборки всего этого, MidnightCommander чтобы копировать файлы туда-сюда и удобный текстовый редактор, например Vim.

А еще куча установленных пакетов типа gcc, make, cmake — в общем, настроенная и подготовленная среда, вплоть до указания желаемой цветовой схемы в редакторе.
И вот однажды так получилось, что удобный настроенный компьютер вдруг накрылся медным тазом: жесткие диски тоже выходят из строя.

Конечно, все самое ценное лежало в архивах, но вот рабочая среда…
Настройка на новом железе, доустановка недоустановленного, в общем куча совершенно лишней работы. И как от нее избавиться на будущее, делать дамп рабочего компьютера? Использовать настроенную виртуалку?

И оказалось, что для этого прекрасно подходит Docker. Во-первых, он есть и используется в работе — не надо ничего выдумывать и осваивать. Во-вторых, он не тормозит и не требует специальной поддержки на аппаратном уровне, и в третьих — всегда можно сделать готовый образ системы, который можно использовать на других компьютерах.

И в четвертых, если возникла необходимость во временной установке каких-то экзотических программ — всегда можно запустить «песочницу», поработать в ней и удалить, не волнуясь о том что где-то сломались зависимости и всё надо снова переустанавливать.

Конечно, кто знает что такое Docker вообще не поймет зачем рассказывать очевидные вещи, но оказывается в 2024 году существуют люди, которые вообще об этом ни разу не слышали, а если и слышали — то о запуске сервисов где-то там на серверах и о всяких строгих правилах создания контейнеров: минимальный обьем, ничего лишнего и т.д.

К черту правила, поехали:
Устанавливаем (всё — debian-style, тлетворное влияние Ubuntu):

sudo apt install docker.io

sudo docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

Пусто. Здесь ничего нет. Попытаемся что-то создать:

docker run -ti debian

Unable to find image 'debian:latest' locally
latest: Pulling from library/debian
53769c348e57: Pull complete 
Digest: sha256:17122fe3d66916e55c0cbd5bbf54bb3f87b3582f4d86a755a0fd3498d360f91b
Status: Downloaded newer image for debian:latest
root@f3fa3de53231:/# 

Ок, скачали и запустили контейнер с Debian, в котором почти ничего нет. Вот его теперь и настраиваем под себя:

apt update

apt upgrade

apt install всё-самое-необходимое все-100500-пакетов

и выходим:

exit

Смотрим, что получилось:

sudo docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
f3fa3de53231        debian              "bash"              12 minutes ago      Exited (0) 5 minutes ago                       gallant_morse

Контейнер создан, и теперь остановлен. Имя придумывается автоматически, но можно будет потом задать своё.

Сохраним его:

sudo docker commit gallant_morse my_toolbox

Всё, больше gallant_morse не нужен, создан новый образ my_toolbox.
Удаляем лишнее, запускаем новый контейнер, и сразу выходим:

sudo docker rm gallant_morse

sudo docker run -ti --name my_work1 my_toolbox

exit

sudo docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
2f60aa370d90        my_toolbox          "bash"              1 minutes ago       Exited (0) 1 minutes ago                         my_work1

Создан новый контейнер my_work1, который сейчас выключен. Но его можно запустить:

sudo docker start my_work1

sudo docker ps

Теперь он появится в списке работающих процессов. И как с ним работать? Очень просто:

sudo docker exec -ti my_work1 /bin/bash

Всё, мы попадаем в контейнер, где находятся все рабочие программы. Монтируем сетевые диски — можно работать.

Нужно открыть еще один терминал — запускаем еще один. И еще. И сколько надо.

Не надоело еще писать везде sudo? Если надоело — делаем это последний раз:

sudo vim /etc/group

....
docker:x:121:my_username
....

Перезаходим в систему (открываем новое окно терминала) — всё, docker работает без sudo.
Все открытые терминалы к нему работают в одном контейнере, можно одновременно работать с разными файлами проекта и т.д.

Для чего так сложно, зачем нужно было два раза создавать контейнеры? А вот зачем:
Во-первых, теперь у нас есть образ my_toolbox, его можно экспортировать, сохранить и потом при необходимости запускать на других машинах:

docker save my_toolbox | gzip > my_toolbox.gz

gunzip my_toolbox.gz

docker load < my_toolbox

docker run ...

Во-вторых, можно легко и быстро создать временную песочницу:

docker run -ti --name tmp_bebebe my_toolbox

apt install something_terrible

rm -rf /*

docker rm tmp_bebebe

Или создать рабочую среду с подключением локальных каталогов:

docker run -ti -v /home/user/project/blablabla/work_dir:/work_dir --name blablabla my_toolbox

В общем, можно развлекаться как угодно. Это быстрее делать, чем запускать виртуальные машины с установкой ОС, да и работает оно быстрее.

Конечно, есть и другие решения для подобных задач — это просто один из вариантов.

© Habrahabr.ru