- Установка и использование Docker в Linux (Debian, Ubuntu, Arch Linux)
- Как установить Docker
- Установка Docker в Debian
- Установка Docker в Ubuntu и производные дистрибутивы
- Установка Docker в Arch Linux и производные дистрибутивы (Manjaro, BlackArch и другие)
- Использование команды Docker без прав sudo (опционально)
- Как использовать Docker
- Запуск контейнера Docker
- Удаление контейнеров
- Сохранение изменений в контейнере в образ Docker
- Связанные статьи:
Установка и использование Docker в Linux (Debian, Ubuntu, Arch Linux)
Docker – это самодостаточная среда выполнения для контейнеров. Целью Docker является упрощение развёртывания приложений. Контейнером может быть как отдельная программа, так и целая операционная система.
В этой инструкции будет показан процесс установки Docker. Он в большей части применим для Ubuntu 16.10 или 17.04. Также будет показано как использовать Docker – эта часть инструкции может использоваться для Docker на любой системе.
Как установить Docker
Установка Docker в Debian
Последовательно выполните следующие команды:
sudo apt update sudo apt install ca-certificates curl gnupg sudo mkdir -m 0755 -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Убедитесь, что установка Docker Engine прошла успешно, запустив образ hello-world:
sudo docker run hello-world
Установка Docker в Ubuntu и производные дистрибутивы
Последовательно выполните следующие команды:
sudo apt update sudo apt install ca-certificates curl gnupg sudo mkdir -m 0755 -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg echo "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Убедитесь, что установка Docker Engine прошла успешно, запустив образ hello-world:
sudo docker run hello-world
После завершения выполнения этой команды Docker должен быть установлен, демон запущен, и процесс должен запускаться при загрузке системы. Проверим, что процесс запущен:
sudo systemctl status docker
Установка Docker в Arch Linux и производные дистрибутивы (Manjaro, BlackArch и другие)
Для установки Docker в Arch Linux выполните следующую команду:
Для запуска службы docker выполните команду (вы можете отдать предпочтение службе docker.service):
sudo systemctl start docker.socket
Для добавления службы в автозагрузку выполните команду (вы можете отдать предпочтение службе docker.service):
sudo systemctl enable docker.socket
Использование команды Docker без прав sudo (опционально)
По умолчанию, запуск команды docker требует привилегий root, что означает, что вы должны использовать sudo. Также эта команда может запускаться пользователем, включённым в группу docker, которая автоматически создаётся при установке Docker. При попытке использования команды docker пользователем без привилегий sudo или пользователем, не входящим в группу docker, вы получите такой результат:
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.28/info: dial unix /var/run/docker.sock: connect: permission denied
Для того, чтобы не вводить sudo каждый раз при запуске docker, добавьте имя своего пользователя в группу docker:
sudo usermod -aG docker $(whoami)
Как использовать Docker
Вы можете искать образы, доступные в Docker Hub, используя команду docker с подкомандой search. Например, для поиска образа Kali Linux, введите:
Скрипт вернёт список всех образов на Docker Hub, которые подходят под эту поисковую строку. В нашем примере результат будет выглядеть похожим на этот:
NAME DESCRIPTION STARS OFFICIAL AUTOMATED kalilinux/kali-linux-docker Kali Linux Rolling Distribution Base Image 290 [OK] linuxkonsult/kali-metasploit Kali base image with metasploit 52 [OK] wsec/kali-metasploit Official Kali Base image + Metasploit 3 [OK] brimstone/kali 3 [OK] jasonchaffee/kali-linux Kali Linux Docker Container with the kali-. 3 [OK] andresriancho/w3af-kali 1 [OK] ctarwater/kali-msf Kali + Metasploit + Postgresql 1 [OK] yoransys/kali-linux-x11 #kali-linux-x11 Need x11 on :1 or Xephyr 1 [OK] dnraikes/kali-openvas Kali linus with openvas installed and conf. 0 [OK] dnraikes/kali-msf kali with postgresql and metasploit framew. 0 [OK] netxp/kali kali 0 [OK] dnraikes/kali-net kali network security testing 0 [OK] ctarwater/kali Kali base image (no tools) 0 [OK] miteshshah/kali Kali Linux 0 [OK] …
В столбце OFFICIAL строка OK указывает на то, что образ построен и поддерживается компанией, которая занимается разработкой этого проекта. После того, как вы решили, какой образ использовать, вы можете загрузить его на вашу машину используя подкоманду pull:
docker pull kalilinux/kali-linux-docker
После загрузки образа вы можете запустить контейнер с загруженным образом подкомандой run. Если на момент выполнения подкоманды run образ ещё не был загружен, клиент Docker сперва загрузит образ, а затем запустит контейнер с этим образом:
docker run kalilinux/kali-linux-docker
Для просмотра образов, загруженных на вашу машину, введите:
Вывод должен выглядеть похожим образом:
REPOSITORY TAG IMAGE ID CREATED SIZE kalilinux/kali-linux-docker latest 8ececeaf404d 7 weeks ago 1.56GB
Как мы покажем далее в этой статье, образы, которые вы используете для запуска контейнеров, могут быть модифицированы и использованы для создания новых образов, которые, в свою очередь, могут быть загружены в Docker Hub или любой другой репозиторий образов.
Запуск контейнера Docker
Некоторые контейнеры запускаются и завершает работу после выполнения своей операции. Контейнеры могут выполнять и более длительные действия, а также они могут быть интерактивными. В конце концов, они очень похожи на виртуальные машины, только менее требовательные к ресурсам.
В качестве примера запустим контейнер, использующий последнюю версию образа Kali Linux. Комбинация ключей -i и -t позволяет осуществлять интерактивный доступ к контейнеру:
docker run -it kalilinux/kali-linux-docker
Ваш консольный ввод должен измениться для отражения факта, что вы работаете внутри контейнера. Он примет следующий вид:
теперь вы можете выполнять любые команды внутри контейнера. Для примера, давайте обновим базу пакетов внутри контейнера. Нет необходимости использовать sudo, поскольку внутри контейнера вы работаете с привилегиями root:
Можно установить какое-то приложение, я сделаю обновление системы:
В концепции Docker присутствуют понятие «образ» (image) и «контейнер». Образ – это то, что скачивается из репозитория, его особенностью является доступная только для чтения файловая система. Если при запуске образа вы делаете какие-то изменения в файловой системе, то создаётся контейнер с файловой системой доступной для чтения и записи. Если вы удаляете файл, то из образа он не удаляется – он только скрывается. Если вы записываете новый файл или вносите изменение в существующий, то всё это записывается в контейнер, как бы поверх образа. Давайте сделаем небольшой опыт, создадим файл:
echo "Example1" > Example1.txt cat Example1.txt
Когда мы попадаем в оболочку bash, значит контейнер завершил свою работу. Если мы выполним команду docker ps для просмотра запущенных контейнеров, то мы не увидим наш контейнер:
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Если мы добавим флаг -a, который означает показать все контейнеры, и запущенные и остановленные, то в списке появится наш контейнер:
docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1bdb6d569dda kalilinux/kali-linux-docker "/bin/bash" 5 hours ago Exited (0) 39 seconds ago distracted_wilson
Когда создаётся контейнер, ему присваивается случайно сгенерированное имя – ID. В нашем случае это 1bdb6d569dda, а distracted_wilson – случайно сгенерированное имя. ps -a показывает эти значения, а также образ из которого был построен контейнер (kalilinux/kali-linux-docker), когда контейнер был создан (5 hours ago) и команду, которая была в нём запущена (/bin/bash). Вывод также предоставляет статус контейнера (Exited) и как давно контейнер перешёл в этот статус (39 seconds ago). Если контейнер ещё запущен, мы увидим «Up,» за которым следует как долго он запущен.
Если мы перезапустим эту же самую команду, то создастся новый контейнер:
docker run -it kalilinux/kali-linux-docker
Мы можем это сказать с уверенностью из-за нового ID в приглашении командной строки, а также проверив это с помощью нашего файла Example1:
cat: Example1.txt: No such file or directory
Кажется, что данные пропали, но это не так. Выйдем из второго контейнера:
Теперь у нас два контейнера:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d2a3a28b40b0 kalilinux/kali-linux-docker "/bin/bash" About a minute ago Exited (1) 4 seconds ago happy_elion 1bdb6d569dda kalilinux/kali-linux-docker "/bin/bash" 5 hours ago Exited (0) 2 minutes ago distracted_wilson
Контейнеры не просто хранят данные, любой из них можно снова запустить. В команде мы будем использовать флаг -a для его присоединения и флаг -i чтобы сделать его интерактивным, за ними следует ID контейнера или имя. В следующую команду вам нужно подставить свой ID:
docker start -ai 1bdb6d569dda
Мы ещё раз окажемся в приглашении командной строки bash, давайте попробуем проверить наш файл:
Можно выйти из контейнера:
Вывод показывает, что сделанные изменения внутри контейнера сохраняются после его остановки и запуска. Только когда контейнер удаляется, то и безвозвратно удаляются изменения в нём. Когда мы запустили второй контейнер, он повторил начальное состояние образа.
Удаление контейнеров
Для удаления контейнера используется команда docker rm, после которой нужно указать ID или имя одного или нескольких контейнеров, которые нужно удалить:
docker rm 1bdb6d569dda happy_elion
Теперь оказались удалёнными оба контейнера, и сделанные нами в них изменения.
Сохранение изменений в контейнере в образ Docker
Когда вы запускаете контейнер из образа Docker, вы можете создавать, изменять и удалять файлы, как и на виртуальной машине. Внесённые вами изменения будут иметь силу только в запущенном контейнере. Вы можете запускать и останавливать контейнер, но, как только вы уничтожите его командой docker rm, все изменения будут безвозвратно потеряны.
Теперь покажем, как сохранять изменения состояния контейнера в виде нового образа Docker.
Допустим была установлена новая программа Nmap в ваш контейнер Kali Linux, ваш запущенный контейнер отличается от образа, который был использован для его создания.
Для сохранения состояния контейнера в виде нового образа, выйдите из него:
Далее сделайте коммит изменений в новый образ Docker с использованием следующей команды. Ключ -m позволяет задать сообщение коммита для того, чтобы облегчить вам и другим пользователям образа понимание того, какие изменения были внесены. Ключ -a позволяет указать автора коммита. Идентификатор контейнера — этот тот самый идентификатор, который мы видели чуть ранее, когда начинали интерактивную сессию в контейнере. Если вы не создавали дополнительных репозиториев в Docker Hub, имя репозитория обычно является вашим именем пользователя в Docker Hub:
docker commit -m "Что вы изменили" -a "Имя Автора" container-id repository/new_image_name
docker commit -m "Добавлен Nmap" -a "MiAl" 1bdb6d569dda mial/kali-nmap
Внимание: Когда вы делаете коммит образа, новый образ сохраняется локально, то есть на вашей машине.
В отличие от создания контейнеров – незаметного быстрого процесса, создание нового образа заново дублирует все данные, т.е. если вы делаете новый образ большой программы или операционной системы, то это займёт определённое время и соответствующее место.
После завершения операции вывод списка образов Docker на вашей машине должен отображать и только что созданный образ, а также исходный образ, из которого мы построили новый образ:
Вывод должен быть похож на этот:
REPOSITORY TAG IMAGE ID CREATED SIZE mial/kali-nmap latest 582eadeb8608 30 seconds ago 1.93GB kalilinux/kali-linux-docker latest 8ececeaf404d 7 weeks ago 1.56GB
kalilinux/kali-linux-docker – это исходный образ, который был загружен из репозитория. mial/kali-nmap – это новый образ, он занимает больше места, т.к. в нём была обновлена система и установлена программа Nmap.
Через некоторое время после начала использования вами Docker, на вашей машине будет множество активных (запущенных) и неактивных контейнеров. Для просмотра списка активных контейнеров используйте команду:
Для просмотра всех контейнеров — и активных, и неактивных, добавьте к этой команде ключ -a:
Для отображения последнего созданного контейнера используйте ключ -l:
Для остановки запущенного контейнера введите:
docker stop идентификатор-контейнера
Идентификатор-контейнера можно найти с помощью команды docker ps.