Введение
Docker — это программа, упрощающая управление процессами приложений в контейнерах. Контейнеры позволяют запускать приложения в процессах, изолированных от ресурсов. Они похожи на виртуальные машины, но контейнеры более портативны, экономичны и менее зависимы от операционной системы хоста.
Подробное введение в различные компоненты контейнера Docker можно найти в статье Экосистема Docker: введение в общие компоненты.
В этом руководстве вы установите и будете использовать Docker Community Edition (CE) в Ubuntu 20.04. Вы установите сам Docker, поработаете с контейнерами и образами, а также загрузите образ в репозиторий Docker.
Примечание
Эта статья поможет вам установить Docker на сервер Ubuntu. Если вам нужен способ одним щелчком мыши развернуть Docker-приложение на рабочем сервере, обратите внимание на платформу приложений DigitalOcean.
Предпосылки
Для выполнения этого руководства вам понадобится следующее:
- Сервер Ubuntu 20.04 был настроен в соответствии с руководством по первоначальной настройке сервера Ubuntu 20.04, включая пользователя sudo без прав root и брандмауэр.
- Как показано в шагах 7 и 8, вам понадобится учетная запись Docker Hub, если вы хотите создавать собственные образы и отправлять их в Docker Hub.
Шаг 1 — Установка Docker
Установочный пакет Docker, доступный в официальном репозитории Ubuntu, может быть не последней версии. Чтобы гарантировать установку последней версии, мы установим Docker из официального репозитория Docker. Для этого мы добавим новый источник пакетов, GPG-ключ от Docker, чтобы убедиться в корректности загрузок, а затем установим пакет.
Сначала обновите список доступных пакетов:
sudo apt update
Далее установите несколько обязательных пакетов, которые позволят apt использовать пакеты по HTTPS:
sudo apt install apt-transport-https ca-certificates curl software-properties-common
Затем добавьте в свою систему официальный ключ GPG репозитория Docker:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Добавьте репозиторий Docker к источникам APT:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
Это также обновит нашу базу данных пакетов пакетами Docker из недавно добавленного репозитория.
Убедитесь, что вы выполняете установку из репозитория Docker, а не из репозитория Ubuntu по умолчанию:
apt-cache policy docker-ce
Вы увидите примерно такой вывод, хотя номер версии Docker может быть другим:
docker-ce:
Installed: (none)
Candidate: 5:19.03.9~3-0~ubuntu-focal
Version table:
5:19.03.9~3-0~ubuntu-focal 500
500 https://download.docker.com/linux/ubuntu focal/stable amd64 PackagesОбратите внимание, что docker-ce не установлен, но является кандидатом на установку из репозитория Docker для Ubuntu 20.04 (канонический).
Наконец, установите Docker:
sudo apt install docker-ce
Теперь Docker установлен, демон запущен, а процесс запускается при загрузке системы. Убедитесь, что он запущен:
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 Tue 2020-05-19 17:00:41 UTC; 17s ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 24321 (dockerd)
Tasks: 8
Memory: 46.4M
CGroup: /system.slice/docker.service
└─24321 /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:
sudo usermod -aG docker ${USER}
Чтобы применить новое членство в группе, выйдите из сервера и войдите снова или введите следующее:
su - ${USER}
Для продолжения вам будет предложено ввести пароль пользователя.
Убедитесь, что ваш пользователь теперь добавлен в группу Docker, введя:
groups
sammy sudo docker
Если вам необходимо добавить пользователя в группу Docker, под которой вы не вошли в систему, явно укажите имя этого пользователя, используя:
sudo usermod -aG docker usernameДалее в этой статье предполагается, что вы запускаете команду docker от имени пользователя из группы docker. Если вы этого не хотите, добавьте команды с помощью sudo.
Давайте теперь рассмотрим команду docker.
Шаг 3 — Использование команды Docker
Использование Docker подразумевает передачу цепочки опций и команд, за которыми следуют аргументы. Синтаксис следующий:
docker [option] [command] [arguments]
Чтобы увидеть все доступные подкоманды, введите:
dockerНачиная с Docker 19 полный список доступных подкоманд включает:
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
Чтобы просмотреть доступные параметры для конкретной команды, введите:
docker docker-subcommand --help
Для просмотра общесистемной информации о Docker используйте следующее:
docker info
Давайте рассмотрим некоторые из этих команд. Начнём с работы с изображениями.
Шаг 4 — Работа с образами Docker
Контейнеры Docker создаются из образов Docker. По умолчанию Docker загружает эти образы из Docker Hub — реестра Docker, который ведёт компания Docker, управляющая проектом Docker. Любой желающий может разместить свои собственные образы Docker на Docker Hub, поэтому образы большинства необходимых вам приложений и дистрибутивов Linux будут размещены там.
Чтобы проверить, можете ли вы получить доступ к образам Docker Hub и загрузить их, введите:
docker run hello-world
Вывод показывает, что Docker работает правильно:
Output
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:6a65f928fb91fcfbc963f7aa6d57c8eeb426ad9a20c7ee045538ef34847f44f1
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, введите:
docker search ubuntu
Скрипт сканирует Docker Hub и возвращает список всех образов, имена которых соответствуют поисковой строке. В данном случае вывод будет примерно таким:
Output
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating sys… 10908 [OK]
dorowu/ubuntu-desktop-lxde-vnc Docker image to provide HTML5 VNC interface … 428 [OK]
rastasheep/ubuntu-sshd Dockerized SSH service, built on top of offi… 244 [OK]
consol/ubuntu-xfce-vnc Ubuntu container with "headless" VNC session… 218 [OK]
ubuntu-upstart Upstart is an event-based replacement for th… 108 [OK]
ansible/ubuntu14.04-ansible Ubuntu 14.04 LTS with
...
В столбце «ОФИЦИАЛЬНЫЙ» значение «OK» указывает на изображение, созданное и поддерживаемое компанией, стоящей за проектом. Определив нужное изображение, вы можете загрузить его на свой компьютер с помощью подкоманды pull.
Выполните следующую команду, чтобы загрузить официальный образ Ubuntu на свой компьютер:
docker pull ubuntu
Вы увидите следующий вывод:
Output
Using default tag: latest
latest: Pulling from library/ubuntu
d51af753c3d3: Pull complete
fc878cd0a91c: Pull complete
6154df8ff988: Pull complete
fee5db0ff82f: Pull complete
Digest: sha256:747d2dbbaaee995098c9792d99bd333c6783ce56150d1b11e333bbceed5c54d7
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latestПосле загрузки образа вы можете запустить контейнер, используя загруженный образ, с помощью подкоманды run. Как вы видели в примере hello-world, если образ не был загружен при запуске docker с помощью подкоманды run, клиент Docker сначала загружает образ, а затем запускает контейнер, используя его.
Чтобы просмотреть изображения, загруженные на ваш компьютер, введите:
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Как вы увидите далее в этом руководстве, образы, которые вы используете для запуска контейнеров, можно изменять и использовать для создания новых образов, которые можно загружать в Docker Hub или другие реестры Docker (это технический термин).
Давайте рассмотрим работу контейнеров более подробно.
Шаг 5 — Запуск Docker-контейнера
Контейнер hello-world, запущенный на предыдущем шаге, — это пример контейнера, который запускается и завершает работу после отправки тестового сообщения. Контейнеры могут быть гораздо полезнее, и они могут быть интерактивными. В конце концов, они похожи на виртуальные машины, только более экономичны в использовании ресурсов.
Например, запустим контейнер, используя последний образ Ubuntu. Комбинация ключей -i и -t даёт вам интерактивный доступ к оболочке контейнера:
docker run -it ubuntu
Ваша командная строка должна измениться, отражая тот факт, что теперь вы работаете внутри контейнера, и выглядеть следующим образом:
Output
root@d9b100f2f636:/#Запишите идентификатор контейнера в командной строке. В этом примере это d9b100f2f636. Этот идентификатор понадобится вам позже, чтобы идентифицировать его при удалении.
Теперь вы можете выполнить любую команду внутри контейнера. Например, обновим базу данных пакетов внутри контейнера. Добавлять sudo к любой команде не нужно, так как вы работаете внутри контейнера как пользователь root:
apt updateЗатем установите в него любое приложение. Давайте установим Node.js:
apt install nodejs
Это установит Node.js из официального репозитория Ubuntu. После завершения установки проверьте, установлен ли Node.js:
node -v
Номер версии вы увидите в терминале:
Output
v10.19.0Любые изменения, внесенные вами внутри контейнера, будут применяться только к этому контейнеру.
Чтобы выйти из контейнера, введите exit в командной строке.
Давайте теперь рассмотрим управление контейнерами в нашей системе.
Шаг 6 — Управление контейнерами Docker
После некоторого времени использования Docker на вашем компьютере появится множество активных (запущенных) и неактивных контейнеров. Чтобы просмотреть список активных, используйте:
docker ps
Вы увидите вывод, подобный следующему:
Output
CONTAINER ID IMAGE COMMAND CREATED
В этом руководстве вы запустили два контейнера: один из образа hello-world, а другой — из образа Ubuntu. Оба контейнера больше не запущены, но всё ещё существуют в вашей системе.
Чтобы просмотреть все контейнеры — активные и неактивные, запустите docker ps с ключом -a:
docker ps -a
Вы увидите вывод, подобный этому:
1c08a7a0d0e4 ubuntu "/bin/bash" 2 minutes ago Exited (0) 8 seconds ago quizzical_mcnulty
a707221a5f6c hello-world "/hello" 6 minutes ago Exited (0) 6 minutes ago youthful_curie
Чтобы увидеть последний созданный вами контейнер, передайте ему ключ -l:
docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c08a7a0d0e4 ubuntu "/bin/bash" 2 minutes ago Exited (0) 40 seconds ago quizzical_mcnulty
Чтобы запустить остановленный контейнер, используйте команду docker start, указав идентификатор или имя контейнера. Запустим контейнер на базе Ubuntu с идентификатором 1c08a7a0d0e4:
docker start 1c08a7a0d0e4docker start 1c08a7a0d0e4
Контейнер запустится, и вы сможете просмотреть его статус с помощью команды docker ps:
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c08a7a0d0e4 ubuntu "/bin/bash" 3 minutes ago Up 5 seconds quizzical_mcnulty
Чтобы остановить работающий контейнер, используйте команду docker stop, а затем укажите идентификатор или имя контейнера. На этот раз мы будем использовать имя, присвоенное контейнеру Docker, — quizical_mcnulty:
docker stop quizzical_mcnulty
Когда вы решите, что контейнер вам больше не нужен, удалите его с помощью команды docker rm, снова указав идентификатор или имя контейнера. Используйте команду docker ps -a, чтобы найти идентификатор или имя контейнера, связанного с образом hello-world, и удалить его.
docker rm youthful_curie
Вы можете создать новый контейнер и дать ему имя с помощью параметра –name. Также можно использовать параметр –rm для создания контейнера, который будет автоматически удален после остановки. Подробнее об этих и других параметрах см. в справке по команде docker run.
Контейнеры можно преобразовать в образы, которые можно использовать для создания новых контейнеров. Давайте разберёмся, как это работает.
Шаг 7 — Внесение изменений в контейнер в образе Docker
При запуске образа Docker вы можете создавать, изменять и удалять файлы так же, как и в виртуальной машине. Вносимые изменения применяются только к этому контейнеру. Вы можете запускать и останавливать его, но при его уничтожении командой docker rm изменения будут удалены навсегда.
В этом разделе показано, как сохранить состояние контейнера в виде нового образа Docker.
После установки Node.js в контейнер Ubuntu у вас появится работающий контейнер из образа, но он отличается от образа, который вы использовали для его создания. Однако вы можете использовать этот контейнер Node.js в качестве основы для новых образов в будущем.
Затем внесите изменения в новый экземпляр образа Docker с помощью следующей команды.
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, обычно это ваше имя пользователя Docker Hub.
Например, для пользователя sammy с идентификатором контейнера d9b100f2f636 команда будет выглядеть следующим образом:
docker commit -m "added Node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs
При загрузке образа он сохраняется локально на вашем компьютере. Далее в этом руководстве вы узнаете, как загрузить образ в реестр Docker, например, Docker Hub, чтобы другие пользователи могли получить к нему доступ.
Повторный список образов Docker покажет новый образ, а также старый образ, из которого он был получен:
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 в Docker Hub. Чтобы узнать, как создать собственный приватный реестр Docker, ознакомьтесь со статьёй «Как настроить приватный реестр Docker в Ubuntu 18.04».
Чтобы загрузить образ, сначала войдите в Docker Hub.
docker login -u docker-registry-username
Вам будет предложено пройти аутентификацию, используя пароль Docker Hub. Если вы указали правильный пароль, аутентификация должна пройти успешно.
Примечание: Если имя пользователя в реестре Docker отличается от имени локального пользователя, которое вы использовали для создания образа, вам потребуется добавить к образу имя пользователя в реестре. В примере, приведённом в предыдущем шаге, введите:
docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs
Затем вы можете использовать свое изображение с помощью:
docker push docker-registry-username/docker-image-name
Чтобы отправить образ ubuntu-nodejs в репозиторий Sami, команда будет выглядеть следующим образом:
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 и повторите попытку. Затем проверьте наличие обновления на странице репозитория Docker Hub.
Теперь вы можете использовать docker pull sammy/ubuntu-nodejs, чтобы загрузить образ на новую машину и использовать его для запуска нового контейнера.
Результат
В этом руководстве вы установили Docker, поработали с образами и контейнерами, а также отправили изменённый образ в Docker Hub. Теперь, когда вы знакомы с основами, ознакомьтесь с другими руководствами по Docker в сообществе DigitalOcean.










