Docker — это приложение, которое упрощает процесс управления процессами других приложений в контейнерах. Контейнеры похожи на виртуальные машины, только они портативнее, эффективнее расходуют ресурсы и зависимы от операционной системы хоста.
Читайте также: Экосистема Docker: базовые компоненты
В этой статье мы разберём, как установить и использовать Docker в Rocky Linux 9.
Требования
Нам понадобится сервер Rocky Linux 9 с пользователем non-root и привилегиями sudo.
Все команды должны выполняться от имени пользователя non-root. Если для команды требуется root-доступ, перед ней нужно писать sudo. Как добавить пользователей и предоставить им доступ sudo, мы разобрали в этой статье.
1: Установка Docker
Пакет установки Docker, доступный в официальном репозитории Rocky Linux 9, может быть не самым свежим. Мы рекомендуем устанавливать Docker из официального репозитория, чтобы использовать самую актуальную версию. Как это сделать, мы покажем в этом разделе.
Сначала обновите существующий список пакетов:
sudo dnf check-update
Затем добавьте официальный репозиторий Docker:
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
У Docker нет специального репозитория Rocky Linux, потому что система Rocky Linux основана на CentOS и может использовать тот же репозиторий. После его добавления установите Docker, который состоит из трех пакетов:
sudo dnf install docker-ce docker-ce-cli containerd.io
После завершения установки запустите демон Docker.
sudo systemctl start docker
Убедитесь, что он запущен:
sudo systemctl status docker
Вывод должен быть примерно следующим (он должен обязательно показывать, что служба активна и работает).
docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2016-05-01 06:53:52 CDT; 1 weeks 3 days ago Docs: https://docs.docker.com Main PID: 749 (docker)
Теперь введите такую команду, чтобы сервер запускался автоматически при каждой перезагрузке сервера:
sudo systemctl enable docker
После установки Docker у вас будет доступ не только к службе Docker (демон), но и к утилите командной строки docker (или клиенту). Как использовать команду docker, мы разберем позже.
2: Настройка команды Docker без Sudo (опционально)
По умолчанию команда docker может быть запущена только root пользователемили пользователем из группы docker, которая автоматически создается при установке программы. Если вы запустите команду docker без sudo или в сессии пользователя, который не состоит в группе docker, вы получите такой вывод:
docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?. See 'docker run --help'.
Если вы не хотите вводить sudo при каждом запуске команды docker, добавьте своего пользователя в группу docker:
sudo usermod -aG docker $(whoami)
Чтобы применить обновления, вам нужно будет выйти с сервера и снова войти в систему как тот же пользователь.
Если вам нужно добавить в группу docker пользователя, в сессии которого вы не находитесь, добавьте в команду имя нужного пользователя:
sudo usermod -aG docker username
В дальнейшем в статье подразумевается, что вы запускаете команду docker от имени пользователя, который состоит в группе docker. В противном случае вам необходимо самостоятельно добавить ко всем командам префикс sudo.
3: Использование команды Docker
Теперь, когда Docker установлен и работает, давайте разберем утилиту командной строки. Для работы команда docker принимает цепочку опций и команд, за которыми следуют аргументы. Синтаксис имеет следующий вид:
docker [option] [command] [arguments]
Чтобы просмотреть все доступные субкоманды, введите:
docker
Начиная с Docker версии 1.11.1, полный список доступных субкоманд выглядит так:
attach Attach to a running container build Build an image from a Dockerfile commit Create a new image from a container's changes cp Copy files/folders between a container and the local filesystem create Create a new container diff Inspect changes on a container's filesystem events Get real time events from the server exec Run a command in a running container export Export a container's filesystem as a tar archive history Show the history of an image images List images import Import the contents from a tarball to create a filesystem image info Display system-wide information inspect Return low-level information on a container or image kill Kill a running container load Load an image from a tar archive or STDIN login Log in to a Docker registry logout Log out from a Docker registry logs Fetch the logs of a container network Manage Docker networks pause Pause all processes within a container port List port mappings or a specific mapping for the CONTAINER ps List containers pull Pull an image or a repository from a registry push Push an image or a repository to a registry rename Rename a container restart Restart a container rm Remove one or more containers rmi Remove one or more images run Run a command in a new container save Save one or more images to a tar archive search Search the Docker Hub for images start Start one or more stopped containers stats Display a live stream of container(s) resource usage statistics stop Stop a running container tag Tag an image into a repository top Display the running processes of a container unpause Unpause all processes within a container update Update configuration of one or more containers version Show the Docker version information volume Manage Docker volumes wait Block until a container stops, then print its exit code
Для просмотра параметров, доступных для конкретной команды, введите:
docker docker-subcommand --help
Чтобы посмотреть общесистемную информацию, введите:
docker info
4: Работа с образами Docker.
Контейнеры запускаются из образов Docker. По умолчанию Docker загружает эти образы из Docker Hub, официального реестра Docker. Любой пользователь может создавать и размещать свои образы на Docker Hub. Большинство приложений и дистрибутивов Linux, которые вам понадобятся для запуска контейнеров Docker, размещены на Docker Hub.
Чтобы проверить, можно ли получить доступ и загрузить образы из Docker Hub, введите команду:
docker run hello-world
Следующий вывод говорит о том, что Docker работает корректно:
Hello from Docker. This message shows that your installation appears to be working correctly. ...
Искать образы, доступные в Docker Hub, можно с помощью команды docker с субкомандой search. Например, чтобы найти образ Rocky Linux, введите команду:
docker search rockylinux
Скрипт просканирует Docker Hub и вернет список всех образов с именами, совпадающими со строкой запроса. В этом случае вывод будет примерно таким:
NAME DESCRIPTION STARS OFFICIAL AUTOMATED centos The official build of CentOS. 2224 [OK] jdeathe/centos-ssh CentOS-6 6.7 x86_64 / CentOS-7 7.2.1511 x8... 22 [OK] jdeathe/centos-ssh-apache-php CentOS-6 6.7 x86_64 / Apache / PHP / PHP M... 17 [OK] million12/centos-supervisor Base CentOS-7 with supervisord launcher, h... 11 [OK] nimmis/java-centos This is docker images of CentOS 7 with dif... 10 [OK] torusware/speedus-centos Always updated official CentOS docker imag... 8 [OK] nickistre/centos-lamp LAMP on centos setup 3 [OK]
Значение OK в столбце OFFICIAL указывает на образ, созданный и поддерживаемый компанией, реализующей проект. После того, как вы выбрали образ, который хотите использовать, можно загрузить его на свой компьютер с помощью подкоманды pull:
docker pull rockylinux
После загрузки образа вы можете запустить контейнер, это делается с помощью субкоманды run. Клиент Docker сначала загрузит образ (если он не был загружен субкомандой run), а затем запускает контейнер с этим образом:
docker run rockylinux
Чтобы просмотреть загруженные образы, введите:
docker images
Вывод команды должен выглядеть так:
REPOSITORY TAG IMAGE ID CREATED SIZE rockylinux latest 778a53015523 5 weeks ago 196.7 MB hello-world latest 94df4f0ce8a4 2 weeks ago 967 B
Образы, которые вы используете для запуска контейнеров, можно редактировать и использовать для создания новых контейнеров, которые затем можно загрузить (push — это технический термин) в Docker Hub или другие реестры Docker.
5: Запуск контейнеров Docker
Контейнер hello-world, который мы запустили на предыдущем этапе, является примером контейнера, который запускается и прекращает работу после отправки тестового сообщения. Конечно, контейнеры могут быть гораздо сложнее и полезнее, чем в примере выше, кроме того, они могут быть интерактивными. Ведь они похожи на виртуальные машины, но бережнее расходуют ресурсы.
Для примера запустим контейнер с последним образом Rocky Linux. Комбинация флагов -i и -t предоставляет вам доступ к интерактивной командной оболочке внутри контейнера:
docker run -it rockylinux
Чтобы показать, что вы сейчас работаете внутри контейнера, ваша командная строка должна измениться и принять следующую форму:
[root@59839a1b7de2 /]#
Важно: обратите внимание на идентификатор контейнера в запросе команды. В примере выше это 59839a1b7de2.
Теперь вы можете запустить любую команду внутри контейнера. Например, давайте сейчас установим сервер MariaDB в запущенный контейнер. Добавлять префикс sudo к командам не нужно, потому что вы работаете внутри контейнера как root пользователь.
dnf install mariadb-server
6: Сохранение контейнера Docker
После запуска образа Docker вы можете создавать, изменять и удалять файлы так же, как и на виртуальной машине. Эти изменения будут применяться только к данному контейнеру. Вы можете запускать и останавливать его, но как только вы удалите его с помощью команды docker rm, изменения будут потеряны навсегда.
В этом разделе мы покажем, как сохранить состояние контейнера в виде нового образа Docker.
После установки сервера MariaDB в контейнер Rocky Linux данный контейнер будет отличаться от образа, который вы использовали для его создания.
Для сохранения состояния контейнера в виде нового образа сначала выйдите из него:
exit
А затем сохраните изменения в новый образ при помощи следующей команды. Флаг -m позволяет оставить сообщение, которое поможет остальным узнать, какие изменения вы внесли, а флаг -a используется для указания автора. Container ID — это тот идентификатор, который мы отмечали ранее в этой статье, когда запускали интерактивную сессию Docker. Repository, как правило, указывает ваше имя пользователя на Docker Hub (если вы не создавали там дополнительные репозитории):
docker commit -m "What did you do to the image" -a "Author Name" container-id repository/new_image_name
Например:
docker commit -m "added mariadb-server" -a "Sunday Ogwu-Chinuwa" 59839a1b7de2 8host/rockylinux-mariadb
Примечание. Когда вы сохраняете образ, он хранится на локальном компьютере. Далее в этой статье вы узнаете, как добавить образ в реестр Docker, например, на Docker Hub, чтобы другие пользователи могли получить к нему доступ.
Список образов Docker после этого будет содержать новый образ, а также старый образ, из которого он будет получен:
docker images
Вывод будет следующим:
REPOSITORY TAG IMAGE ID CREATED SIZE 8host/rockylinux-mariadb latest 23390430ec73 6 seconds ago 424.6 MB rockylinux latest 778a53015523 5 weeks ago 196.7 MB hello-world latest 94df4f0ce8a4 2 weeks ago 967 B
В этом примере rockylinux-mariadb — это новый образ, который получен из образа Rocky Linux на Docker Hub. Разница в размерах показывает внесенные изменения. И в этом примере изменение заключалось в том, что в контейнер был установлен сервер MariaDB. Поэтому в следующий раз, когда вам понадобится запустить контейнер с помощью Rocky Linux с предустановленным сервером MariaDB, вы можете просто использовать новый образ. Образы также можно создавать из Dockerfile.
7: Список контейнеров Docker
После использования Docker у вас на компьютере будет много активных (работающих) и неактивных контейнеров. Для просмотра активных используйте:
docker ps
Вывод будет выглядеть следующим образом:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f7c79cc556dd rockylinux "/bin/bash" 3 hours ago Up 3 hours silly_spence
Чтобы просмотреть все контейнеры — активные и неактивные, – воспользуйтесь флагом -a:
docker ps -a
Чтобы просмотреть последний созданный вами контейнер, используйте -l:
docker ps -l
Чтобы остановить работающий или активный контейнер, введите:
docker stop container-id
container-id можно найти в выводе команды docker ps.
8: Загрузка образов Docker в репозиторий Docker
Следующий шаг после создания нового образа из существующего — предоставление доступа к этому образу другим пользователям у на Docker Hub (или в другом реестре Docker). У вас должна быть учетная запись, чтобы добавить образ в Docker Hub или любой другой реестр Docker.
В этом разделе показано, как добавить образ в Docker Hub.
Чтобы создать учетную запись в Docker Hub, зарегистрируйтесь там. Прежде чем добавить образ, сначала войдите в свой аккаунт. Вам будет предложено пройти аутентификацию:
docker login -u docker-registry-username
Если вы указали правильный пароль, то аутентификация должна пройти успешно. Затем вы можете загрузить свой образ с помощью следующей команды:
docker push docker-registry-username/docker-image-name
Этот процесс займет некоторое время, и по завершению вы получите такой вывод:
The push refers to a repository [docker.io/8host/rockylinux-mariadb] 670194edfaf5: Pushed 5f70bf18a086: Mounted from library/rockylinux 6a6c96337be1: Mounted from library/rockylinux
После добавления образа он должен отображаться в панели управления вашей учетной записи, как показано на изображении ниже.
Если при попытке добавления образа возникает такая ошибка, скорее всего, вы не прошли аутентификацию:
The push refers to a repository [docker.io/8host/rockylinux-mariadb] e3fbbfb44187: Preparing 5f70bf18a086: Preparing a3b5c80a4eba: Preparing 7f18b442972b: Preparing 3ce512daaf78: Preparing 7aae4540b42d: Waiting unauthorized: authentication required
Войдите в систему, затем повторите попытку добавления.
Подводим итоги
Docker — это намного больше, чем мы рассказали в этой статье, но этих знаний будет достаточно для начала работы с ним в Rocky Linux 9. Как и большинство проектов с открытым исходным кодом, Docker построен на основе быстро развивающейся кодовой базы. Поэтому выработайте привычку посещать страницу блога проекта для получения последней информации.