zaLinux.ru

Установка и использование 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 выполните следующую команду:

sudo pacman -S docker

Для запуска службы 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 search kali

Скрипт вернёт список всех образов на 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

Для просмотра образов, загруженных на вашу машину, введите:

docker images

Вывод должен выглядеть похожим образом:

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

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

root@1bdb6d569dda:/#

теперь вы можете выполнять любые команды внутри контейнера. Для примера, давайте обновим базу пакетов внутри контейнера. Нет необходимости использовать sudo, поскольку внутри контейнера вы работаете с привилегиями root:

apt update

Можно установить какое-то приложение, я сделаю обновление системы:

apt dist-upgrade

В концепции Docker присутствуют понятие «образ» (image) и «контейнер». Образ – это то, что скачивается из репозитория, его особенностью является доступная только для чтения файловая система. Если при запуске образа вы делаете какие-то изменения в файловой системе, то создаётся контейнер с файловой системой доступной для чтения и записи. Если вы удаляете файл, то из образа он не удаляется – он только скрывается. Если вы записываете новый файл или вносите изменение в существующий, то всё это записывается в контейнер, как бы поверх образа. Давайте сделаем небольшой опыт, создадим файл:


echo "Example1" > Example1.txt
cat Example1.txt

А теперь просто выйдем:

exit

Когда мы попадаем в оболочку 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

Мы увидем:

cat: Example1.txt: No such file or directory

Кажется, что данные пропали, но это не так. Выйдем из второго контейнера:

exit

Снова посмотрим список:

docker ps -a

Теперь у нас два контейнера:

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, давайте попробуем проверить наш файл:

cat Example1.txt

Мы увидим

Example1

Можно выйти из контейнера:

exit

Вывод показывает, что сделанные изменения внутри контейнера сохраняются после его остановки и запуска. Только когда контейнер удаляется, то и безвозвратно удаляются изменения в нём. Когда мы запустили второй контейнер, он повторил начальное состояние образа.

Удаление контейнеров

Для удаления контейнера используется команда docker rm, после которой нужно указать ID или имя одного или нескольких контейнеров, которые нужно удалить:

docker rm 1bdb6d569dda happy_elion

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

Сохранение изменений в контейнере в образ Docker

Когда вы запускаете контейнер из образа Docker, вы можете создавать, изменять и удалять файлы, как и на виртуальной машине. Внесённые вами изменения будут иметь силу только в запущенном контейнере. Вы можете запускать и останавливать контейнер, но, как только вы уничтожите его командой docker rm, все изменения будут безвозвратно потеряны.

Теперь покажем, как сохранять изменения состояния контейнера в виде нового образа Docker.

Допустим была установлена новая программа Nmap в ваш контейнер Kali Linux, ваш запущенный контейнер отличается от образа, который был использован для его создания.

Для сохранения состояния контейнера в виде нового образа, выйдите из него:

exit

Далее сделайте коммит изменений в новый образ 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 на вашей машине должен отображать и только что созданный образ, а также исходный образ, из которого мы построили новый образ:

docker images

Вывод должен быть похож на этот:

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, на вашей машине будет множество активных (запущенных) и неактивных контейнеров. Для просмотра списка активных контейнеров используйте команду:

docker ps

Для просмотра всех контейнеров - и активных, и неактивных, добавьте к этой команде ключ -a:

docker ps -a

Для отображения последнего созданного контейнера используйте ключ -l:

docker ps -l

Для остановки запущенного контейнера введите:

docker stop идентификатор-контейнера

Идентификатор-контейнера можно найти с помощью команды docker ps.


Рекомендуемые статьи:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *