Как установить и использовать Docker на Ubuntu 22.04

Введение

Docker – это приложение, которое упрощает процесс управления процессами приложений в контейнерах. Контейнеры позволяют запускать ваши приложения в изолированных по ресурсам процессах. Они похожи на виртуальные машины, но контейнеры более переносимы, более эффективны по использованию ресурсов и более зависимы от операционной системы хоста.

Для подробного введения в различные компоненты контейнера Docker ознакомьтесь с Экосистема Docker: Введение в общие компоненты.

В этом руководстве вы установите и будете использовать Docker Community Edition (CE) на Ubuntu 22.04. Вы установите сам Docker, работаете с контейнерами и образами, и отправите образ в репозиторий Docker.

Упростите развертывание приложений с помощью Платформы приложений DigitalOcean. Развертывание напрямую из GitHub займет всего несколько минут.

Предварительные требования

Для выполнения этого руководства вам понадобятся следующие компоненты:

Шаг 1 — Установка Docker

Установочный пакет Docker, доступный в официальном репозитории Ubuntu, может быть не последней версии. Чтобы убедиться, что мы получаем последнюю версию, мы установим Docker из официального репозитория Docker. Для этого мы добавим новый источник пакетов, добавим GPG-ключ от Docker, чтобы убедиться, что загрузки действительны, а затем установим пакет.

Сначала обновите ваш существующий список пакетов:

  1. sudo apt update

Затем установите несколько предварительных пакетов, которые позволят apt использовать пакеты по HTTPS:

  1. sudo apt install apt-transport-https ca-certificates curl software-properties-common

Затем добавьте GPG-ключ официального репозитория Docker в вашу систему:

  1. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Добавьте репозиторий Docker в источники APT:

  1. 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

Снова обновите ваш существующий список пакетов, чтобы изменения были учтены:

  1. sudo apt update

Убедитесь, что вы собираетесь установить из репозитория Docker, а не из репозитория Ubuntu по умолчанию:

  1. apt-cache policy docker-ce

Вы увидите вывод подобный этому, хотя номер версии Docker может быть другим:

Output of apt-cache policy docker-ce
docker-ce:
  Installed: (none)
  Candidate: 5:20.10.14~3-0~ubuntu-jammy
  Version table:
     5:20.10.14~3-0~ubuntu-jammy 500
        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
     5:20.10.13~3-0~ubuntu-jammy 500
        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages

Обратите внимание, что docker-ce не установлен, но кандидат для установки поставляется из репозитория Docker для Ubuntu 22.04 (jammy).

Наконец, установите Docker:

  1. sudo apt install docker-ce

Теперь Docker должен быть установлен, демон запущен и процесс включен в загрузку. Проверьте, что он работает:

  1. sudo systemctl status docker

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

Output
● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2022-04-01 21:30:25 UTC; 22s ago TriggeredBy: ● docker.socket Docs: https://docs.docker.com Main PID: 7854 (dockerd) Tasks: 7 Memory: 38.3M CPU: 340ms CGroup: /system.slice/docker.service └─7854 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Установка Docker теперь дает вам не только службу Docker (демон), но также утилиту командной строки docker, или клиент Docker. Мы рассмотрим, как использовать команду docker позже в этом руководстве.

Шаг 2 — Выполнение команды Docker без sudo (необязательно)

По умолчанию команду docker можно запускать только от имени пользователя root или от имени пользователя, входящего в группу docker, которая создается автоматически во время установки Docker. Если вы попытаетесь выполнить команду docker без префикса sudo или без нахождения в группе docker, вы получите вывод как этот:

Output
docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?. See 'docker run --help'.

Если вы хотите избежать ввода sudo при выполнении команды docker, добавьте свое имя пользователя в группу docker:

  1. sudo usermod -aG docker ${USER}

Чтобы применить новую членство в группе, выйдите из сервера и снова войдите или введите следующее:

  1. su - ${USER}

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

Подтвердите, что ваш пользователь теперь добавлен в группу docker, введя:

  1. groups
Output
sammy sudo docker

Если вам нужно добавить пользователя в группу docker, отличного от того, под которым вы вошли, укажите это имя пользователя явно, используя:

  1. sudo usermod -aG docker username

Остальная часть этой статьи предполагает, что вы запускаете команду docker от имени пользователя в группе docker. Если вы выберете не делать этого, добавьте команды перед sudo.

Давайте рассмотрим команду docker далее.

Шаг 3 — Использование команды Docker

Использование docker состоит в передаче ему цепочки опций и команд, за которыми следуют аргументы. Синтаксис имеет следующий вид:

  1. docker [option] [command] [arguments]

Чтобы просмотреть все доступные подкоманды, введите:

  1. docker

На момент версии Docker 20.10.14, полный список доступных подкоманд включает:

Output
attach Attach local standard input, output, and error streams 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 to files or directories 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 Docker objects kill Kill one or more running containers 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 pause Pause all processes within one or more containers 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 one or more containers 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 (streamed to STDOUT by default) 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 one or more running containers tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE top Display the running processes of a container unpause Unpause all processes within one or more containers update Update configuration of one or more containers version Show the Docker version information wait Block until one or more containers stop, then print their exit codes

Чтобы просмотреть доступные опции для конкретной команды, введите:

  1. docker docker-subcommand --help

Чтобы просмотреть системную информацию о Docker, используйте:

  1. docker info

Давайте рассмотрим некоторые из этих команд. Мы начнем с работы с образами.

Шаг 4 — Работа с образами Docker

Контейнеры Docker создаются из образов Docker. По умолчанию Docker загружает эти образы с Docker Hub, реестра Docker, управляемого компанией Docker, стоящей за проектом Docker. Каждый может размещать свои образы Docker на Docker Hub, поэтому большинство приложений и дистрибутивов Linux, которые вам понадобятся, будут размещены там.

Чтобы проверить доступ и загрузку образов с Docker Hub, введите:

  1. docker run hello-world

Результат покажет, что Docker работает корректно:

Output
Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 2db29710123e: Pull complete Digest: sha256:bfea6278a0a267fad2634554f4f0c6f31981eea41c553fdf5a83e95a41d40c38 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. ...

Изначально Docker не смог найти образ hello-world локально, поэтому он загрузил образ с Docker Hub, который является репозиторием по умолчанию. После загрузки образа Docker создал контейнер из образа, и выполнение приложения внутри контейнера отобразилось, показав сообщение.

Вы можете искать образы, доступные на Docker Hub, используя команду docker с подкомандой search. Например, для поиска образа Ubuntu введите:

  1. docker search ubuntu

Скрипт просмотрит Docker Hub и вернет список всех образов, имя которых соответствует введенной строке поиска. В этом случае вывод будет примерно таким:

Output
NAME DESCRIPTION STARS OFFICIAL AUTOMATED ubuntu Ubuntu is a Debian-based Linux operating sys… 14048 [OK] websphere-liberty WebSphere Liberty multi-architecture images … 283 [OK] ubuntu-upstart DEPRECATED, as is Upstart (find other proces… 112 [OK] neurodebian NeuroDebian provides neuroscience research s… 88 [OK] open-liberty Open Liberty multi-architecture images based… 51 [OK] ...

В колонке ОФИЦИАЛЬНЫЙ ОК означает изображение, созданное и поддерживаемое компанией, стоящей за проектом. Как только вы определите изображение, которое хотите использовать, вы можете загрузить его на свой компьютер, используя подкоманду pull.

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

  1. docker pull ubuntu

Вы увидите следующий вывод:

Output
Using default tag: latest latest: Pulling from library/ubuntu e0b25ef51634: Pull complete Digest: sha256:9101220a875cee98b016668342c489ff0674f247f6ca20dfc91b91c0f28581ae Status: Downloaded newer image for ubuntu:latest docker.io/library/ubuntu:latest

После того как изображение будет загружено, вы можете запустить контейнер с использованием загруженного изображения с помощью подкоманды run. Как вы видели на примере с hello-world, если изображение не было загружено, когда docker был выполнен с подкомандой run, клиент Docker сначала загрузит изображение, а затем запустит контейнер с его использованием.

Чтобы увидеть изображения, загруженные на ваш компьютер, введите:

  1. docker images

Вывод будет похож на следующий:

Output
REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest 1d622ef86b13 3 weeks ago 73.9MB hello-world latest bf756fb1ae65 4 months ago 13.3kB

Как вы увидите позже в этом руководстве, изображения, которые вы используете для запуска контейнеров, могут быть изменены и использованы для создания новых изображений, которые затем могут быть загружены (pushed – это технический термин) на Docker Hub или другие реестры Docker.

Давайте подробнее рассмотрим, как запускать контейнеры.

Шаг 5 — Запуск контейнера Docker

Контейнер hello-world, который вы запустили на предыдущем шаге, является примером контейнера, который запускается и завершает работу после вывода тестового сообщения. Контейнеры могут быть намного более полезными, и они могут быть интерактивными. В конце концов, они похожи на виртуальные машины, только более дружелюбные к ресурсам.

В качестве примера давайте запустим контейнер с использованием последнего образа Ubuntu. Комбинация переключателей -i и -t дает вам интерактивный доступ к оболочке внутри контейнера:

  1. docker run -it ubuntu

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

Output
root@d9b100f2f636:/#

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

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

  1. apt update

Затем установите в нем любое приложение. Давайте установим Node.js:

  1. apt install nodejs

Это устанавливает Node.js в контейнере из официального репозитория Ubuntu. Когда установка завершится, убедитесь, что Node.js установлен:

  1. node -v

Вы увидите номер версии, отображенный в вашем терминале:

Output
v12.22.9

Любые изменения, внесенные внутри контейнера, применяются только к этому контейнеру.

Чтобы выйти из контейнера, введите exit в приглашении командной строки.

Давайте теперь рассмотрим управление контейнерами на нашей системе.

Шаг 6 — Управление контейнерами Docker

После использования Docker в течение некоторого времени на вашем компьютере будет много активных (запущенных) и неактивных контейнеров. Чтобы просмотреть активные, используйте:

  1. docker ps

Вы увидите вывод, аналогичный следующему:

Output
CONTAINER ID IMAGE COMMAND CREATED

В этом учебнике вы запустили два контейнера: один из образа hello-world, а другой из образа ubuntu. Оба контейнера больше не запущены, но они все еще существуют в вашей системе.

Чтобы просмотреть все контейнеры — активные и неактивные, выполните docker ps с ключом -a:

  1. docker ps -a

Вы увидите вывод, аналогичный этому:

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c08a7a0d0e4 ubuntu "bash" About a minute ago Exited (0) 7 seconds ago dazzling_taussig 587000e49d53 hello-world "/hello" 5 minutes ago Exited (0) 5 minutes ago adoring_kowalevski

Чтобы просмотреть последний созданный вами контейнер, передайте ему ключ -l:

  1. docker ps -l
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c08a7a0d0e4 ubuntu "bash" 3 minutes ago Exited (0) 2 minutes ago dazzling_taussig

Чтобы запустить остановленный контейнер, используйте docker start, за которым следует идентификатор контейнера или его имя. Давайте запустим контейнер на основе Ubuntu с идентификатором 1c08a7a0d0e4:

  1. docker start 1c08a7a0d0e4

Контейнер будет запущен, и вы сможете использовать docker ps, чтобы увидеть его статус:

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c08a7a0d0e4 ubuntu "bash" 6 minutes ago Up 8 seconds dazzling_taussig

Чтобы остановить запущенный контейнер, используйте docker stop, за которым следует идентификатор или имя контейнера. На этот раз мы используем имя, которое Docker назначил контейнеру, которое является dazzling_taussig:

  1. docker stop dazzling_taussig

Как только вы решите, что вам больше не нужен контейнер, удалите его с помощью команды docker rm, снова используя либо идентификатор контейнера, либо его имя. Используйте команду docker ps -a, чтобы найти идентификатор или имя контейнера, связанного с образом hello-world, и удалите его.

  1. docker rm adoring_kowalevski

Вы можете запустить новый контейнер и дать ему имя, используя параметр --name. Также можно использовать параметр --rm, чтобы создать контейнер, который удалит себя после остановки. См. команду docker run help для получения дополнительной информации об этих и других опциях.

Контейнеры можно превратить в образы, которые можно использовать для создания новых контейнеров. Давайте посмотрим, как это работает.

Шаг 7 — Фиксация изменений в контейнере в образ Docker

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

Этот раздел показывает, как сохранить состояние контейнера в виде нового образа Docker.

После установки Node.js внутри контейнера Ubuntu у вас теперь есть контейнер, запущенный из образа, но контейнер отличается от образа, который вы использовали для его создания. Однако вы можете захотеть повторно использовать этот контейнер Node.js в качестве основы для новых образов позже.

Затем зафиксируйте изменения в новом экземпляре образа Docker с помощью следующей команды.

  1. docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name

Переключатель -m предназначен для сообщения о фиксации, которое помогает вам и другим узнать, какие изменения вы внесли, а -a используется для указания автора. container_id – это тот, который вы отметили ранее в учебнике, когда запустили интерактивную сессию Docker. Если вы не создали дополнительных репозиториев на Docker Hub, то repository обычно является вашим именем пользователя на Docker Hub.

Например, для пользователя sammy, с идентификатором контейнера d9b100f2f636, команда будет такой:

  1. docker commit -m "added Node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs

Когда вы фиксируете образ, новый образ сохраняется локально на вашем компьютере. Позже в этом учебнике вы узнаете, как отправить образ в реестр Docker, например, на Docker Hub, чтобы другие могли получить к нему доступ.

Повторное перечисление образов Docker покажет новый образ, а также старый, от которого он был произведен:

  1. docker images

Вы увидите вывод подобный следующему:

Output
REPOSITORY TAG IMAGE ID CREATED SIZE sammy/ubuntu-nodejs latest 7c1f35226ca6 7 seconds ago 179MB ...

В этом примере ubuntu-nodejs – это новый образ, который был произведен из существующего образа ubuntu с Docker Hub. Разница в размере отражает внесенные изменения. И в этом примере изменением была установка NodeJS. Так что в следующий раз, когда вам понадобится запустить контейнер с Ubuntu с предварительно установленным NodeJS, вы можете просто использовать новый образ.

Вы также можете создавать изображения из файла Dockerfile, что позволяет автоматизировать установку программного обеспечения в новом образе. Однако это выходит за рамки данного руководства.

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

Шаг 8 — Отправка образов Docker в репозиторий Docker

Следующим логическим шагом после создания нового образа из существующего является его совместное использование с некоторыми из ваших друзей, всем миром на Docker Hub или другом реестре Docker, к которому у вас есть доступ. Чтобы отправить образ на Docker Hub или любой другой реестр Docker, вам необходимо иметь там учетную запись.

Для отправки вашего образа сначала войдите в Docker Hub.

  1. docker login -u docker-registry-username

Вас попросят аутентифицироваться с помощью пароля от Docker Hub. Если вы указали правильный пароль, аутентификация должна пройти успешно.

Примечание: Если ваше имя пользователя в реестре Docker отличается от локального имени пользователя, используемого вами для создания образа, вам придется пометить свой образ своим именем пользователя в реестре. Для приведенного в последнем шаге примера вы должны ввести:

  1. docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs

Затем вы можете отправить свой собственный образ, используя:

  1. docker push docker-registry-username/docker-image-name

Чтобы отправить образ ubuntu-nodejs в репозиторий sammy, команда будет такой:

  1. docker push sammy/ubuntu-nodejs

Процесс может занять некоторое время на завершение, так как он загружает изображения, но по завершении вывод будет выглядеть так:

Output
The push refers to a repository [docker.io/sammy/ubuntu-nodejs] e3fbbfb44187: Pushed 5f70bf18a086: Pushed a3b5c80a4eba: Pushed 7f18b442972b: Pushed 3ce512daaf78: Pushed 7aae4540b42d: Pushed ...

После загрузки изображения в реестр, оно должно быть перечислено на панели управления вашей учетной записи, как показано на изображении ниже.

Если попытка загрузки завершается ошибкой такого рода, скорее всего, вы не вошли в систему:

Output
The push refers to a repository [docker.io/sammy/ubuntu-nodejs] e3fbbfb44187: Preparing 5f70bf18a086: Preparing a3b5c80a4eba: Preparing 7f18b442972b: Preparing 3ce512daaf78: Preparing 7aae4540b42d: Waiting unauthorized: authentication required

Войдите с помощью docker login и повторите попытку загрузки. Затем проверьте, что оно существует на странице вашего репозитория Docker Hub.

Теперь вы можете использовать docker pull sammy/ubuntu-nodejs, чтобы загрузить изображение на новую машину и использовать его для запуска нового контейнера.

Вывод

В этом руководстве вы установили Docker, работали с изображениями и контейнерами, и загрузили измененное изображение в Docker Hub. Теперь, когда вы знаете основы, исследуйте другие руководства по Docker в сообществе DigitalOcean.

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-22-04