Что такое Docker?
Docker – это платформа, позволяющая создавать, распространять и управлять специальными контейнерами, которые могут содержать в себе определенный набор ПО или даже целую ОС, но запускаются в изолированной среде, что позволяет безопасно запускать приложения без риска навредить основной ОС в случае ошибки или сбоя приложения. Эта система чем-то напоминает виртуализацию, но контейнеры не виртуализируют оборудование, поэтому куда менее требовательны к ресурсам.
Личный опыт
Я познакомился с Docker, когда мне нужно было протестировать одно приложение с гитхаба, написанное на Python с использованием кучи библиотек. Мне не хотелось устанавливать столько всего себе в ОС и тут в описании я увидел упоминание Docker. Разобравшись в теме, я понял, что Docker дает возможность запустить это приложение из готового образа, внутри которого уже содержится нужная версия Python и всех зависимостей приложения, что гарантирует 100% работоспособность приложения и позволит в будущем легко удалить контейнер и образ, не оставляя следов в системе. Хочу добавить, что на гитхабе вы можете встретить как приложения, образы для которых официально распространяются через Docker Hub и могут быть установлены с помощью всего одной команды, так и приложения, чьи образы, которые нужно компилировать самому (об этом позже). Существуют готовые образы Docker для множества известных приложений, например, можно в пару кликов развернуть веб-сервер с mysql или vpn сервер. Docker значительно упрощает развертывание сложных приложений.
Устанавливаем Docker на Ubuntu
Чтобы использовать самые свежие версии Docker, я рекомендую устанавливать его из его собственного репозитория. Процесс подключения и установки будет описан для Ubuntu с указанием отдельных команд для разных версий, если они отличаются.
Обновляем кэш репозиториев:
sudo apt update
Устанавливаем пакеты, позволяющие apt
загружать пакеты по защищенному протоколу HTTPS:
sudo apt install apt-transport-https ca-certificates curl software-properties-common
Добавляем в свою ОС GPG ключ Docker:
На Ubuntu 18 и 20:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
На Ubuntu 22:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
Добавляем в список источников репозиторий Docker:
На Ubuntu 18:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
На Ubuntu 20:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
На Ubuntu 22:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Обновляем базу репозиториев, чтобы получить информацию о пакетах Docker из нового источника:
sudo apt update
Устанавливаем Docker:
sudo apt install docker-ce
Использование Docker
Проверить статус процесса Docker можно следующей командой:
sudo systemctl status docker
Если все хорошо, вы должны увидеть примерно следующее:
По умолчанию, для использования команды docker
требуются права sudo
. Вы можете избежать этого, если добавите своего пользователя в группу docker. Например, ваш пользователь “alex”, тогда добавить его в группу docker можно так:
sudo usermod -aG docker alex
После этого вам придется перелогиниться в системе.
Если вы введете команду docker
, вы получите подсказку о доступных командах. Для каждой команды можно ввести docker COMMAND --help
чтобы увидеть список доступных аргументов.
Работа с образами Docker:
Список установленных образов:
docker images
Это образы, которые вы уже загрузили и из которых можете создавать контейнеры.
Вы также можете искать образы в Docker Hub прямо в консоли, например поищем Apache:
docker search apache
В результатах поиска вы увидите все доступные образы, связанные с Apache и сможете загрузить их себе.
Загружать образы нужно командой docker pull
. Пример для официального образа Apache:
docker pull httpd
Запускать контейнеры из образов можно по как по IMAGE ID, так и по названию образа (REPOSITORY), которые указаны в списке образов по команде docker images
.
Небольшие open-source проекты могут не распространять готовый образ в Docker Hub, но могут иметь Dockerfile, который позволит вам создать образ. Для этого вам потребуется клонировать репозиторий к себе и перейти в папку репозитория, например:
git clone https://github.com/test/test && cd test
Затем останется только собрать образ с помощью команды:
docker build -t test .
Обычно инструкции по сборке образа присутствуют в описаниях репозиториев.
Удалить любой образ можно с помощью следующей команды с указанием ID образа:
docker rmi f75571d82318
Работа с контейнерами Docker:
Вы можете создать контейнер из образа и он будет сразу запущен:
docker run f75571d82318
Список работающих в данный момент контейнеров можно увидеть по команде:
docker ps
Также можно посмотреть список всех контейнеров, включая не активные:
docker ps -a
При желании, запуская контейнер из образа, вы можете дать ему имя, чтобы потом обращаться по нему:
docker run --name apache f75571d82318
Если у вас интерактивный контейнер, т.е. позволяющий выполнять команды внутри него, то вы можете запустить его с ключами -it
, включающими интерактивный режим:
docker run --name apache -it f75571d82318
После запуска, ваша командная строка изменится, сообщая что вы находитесь внутри контейнера с указанием его ID. Выглядит это примерно так:
root@e2f464551004:/#
Если у вас уже запущен контейнер, вы все равно можете попасть внутрь, для этого используйте команду:
docker exec -it apache /bin/bash
Здесь я использовал имя контейнера, но если вы не указывали его при запуске, используйте ID контейнера. Это касается и других команд с обращением к контейнерам далее по тексту.
Обратите внимание, что изменения, которые вы вносите в интерактивном режиме, распространяются только на контейнер, в котором вы это делаете. На его исходный образ это не влияет.
Если вы создали контейнер из образа с помощью docker run
и потом он был остановлен вами или завершил свою работу, то запускать его снова нужно будет уже другой командой:
docker start apache
Остановить контейнер можно с помощью команды:
docker stop apache
Контейнеры также можно перезапускать:
docker restart apache
Если вам больше не нужен контейнер, удалить его можно так:
docker rm apache
Обратите внимание, это удалит контейнер, но образ, из которого он был создан, все еще будет находиться в вашей системе.
Если ваш контейнер должен выполнить какую-то задачу, после чего больше не понадобится, вы можете запустить его из образа с ключем --rm
:
docker run --rm test
Тогда контейнер будет создан из образа, запущен и будет автоматически удален, когда завершит свою задачу.
Если в процессе работы, контейнер создает какие-либо файлы или отчеты, которые вам нужны, вы можете сделать так, чтобы эти отчеты сохранялись вне контейнера. Для этого вам нужно знать директорию, куда эти файлы сохраняются внутри контейнера. Эта информация, в зависимости от приложения, может быть указана в описании, например на гитхабе или вы можете поискать внутри контейнера сами с помощью интерактивного режима. Затем вам нужно создать директорию, которая будет примонтирована к нужной директории в контейнере.
Пример: вы находитесь в директории /home/alex/project1
(будем считать ее рабочей директорией) и создали в ней директорию reports
для получения отчетов из контейнера test
. Также вы узнали, что отчеты внутри контейнера складываются в директорию /app/reports
. Тогда вам остается лишь запустить контейнер, добавив специальный аргумент -v
с указанием сначала директории в вашей ОС, затем директории внутри контейнера (через двоеточие):
docker start -v "$PWD/reports:/app/reports" test
Таким образом, контейнер test
выполнит свою работу и отчет, который он обычно сохраняет внутри себя в /app/reports
, попадет в вашу основную ОС, в директорию /home/alex/project1/reports
Этот метод я постоянно использую в своих проектах и это работает как для существующих контейнеров, запускаемых с помощью docker start
, так и для контейнеров, создаваемых из образа через docker run
.
При запуске контейнеров вы также можете передавать аргументы самому приложению внутри контейнера, обычно это указывается в описании. Таким образом, ваша команда создания и запуска контейнера из образа может выглядеть следующим образом:
docker run --rm -v "$PWD/reports:/app/reports" test "google.com" --proxy "5.5.5.5.5:3128" --pdf