Введение
Docker – это приложение, которое упрощает процесс управления процессами приложений в контейнерах. Контейнеры позволяют запускать ваши приложения в изолированных по ресурсам процессах. Они похожи на виртуальные машины, но контейнеры более переносимы, более эффективны по использованию ресурсов и более зависимы от операционной системы хоста.
Для подробного введения в различные компоненты контейнера Docker ознакомьтесь с Экосистема Docker: Введение в общие компоненты.
В этом руководстве вы установите и будете использовать Docker Community Edition (CE) на Ubuntu 22.04. Вы установите сам Docker, работаете с контейнерами и образами, и отправите образ в репозиторий Docker.
Упростите развертывание приложений с помощью Платформы приложений DigitalOcean. Развертывание напрямую из GitHub займет всего несколько минут.
Предварительные требования
Для выполнения этого руководства вам понадобятся следующие компоненты:
- Один сервер Ubuntu 22.04 установлен в соответствии с руководством по начальной настройке сервера Ubuntu 22.04, включая
sudo
непривилегированного пользователя и брандмауэр. - Учетная запись на Docker Hub, если вы хотите создавать собственные образы и загружать их на Docker Hub, как показано в Шагах 7 и 8.
Шаг 1 — Установка Docker
Установочный пакет Docker, доступный в официальном репозитории Ubuntu, может быть не последней версии. Чтобы убедиться, что мы получаем последнюю версию, мы установим Docker из официального репозитория Docker. Для этого мы добавим новый источник пакетов, добавим GPG-ключ от Docker, чтобы убедиться, что загрузки действительны, а затем установим пакет.
Сначала обновите ваш существующий список пакетов:
Затем установите несколько предварительных пакетов, которые позволят apt
использовать пакеты по HTTPS:
Затем добавьте GPG-ключ официального репозитория Docker в вашу систему:
Добавьте репозиторий Docker в источники APT:
Снова обновите ваш существующий список пакетов, чтобы изменения были учтены:
Убедитесь, что вы собираетесь установить из репозитория Docker, а не из репозитория Ubuntu по умолчанию:
Вы увидите вывод подобный этому, хотя номер версии Docker может быть другим:
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:
Теперь 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, вы получите вывод как этот:
Outputdocker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
See 'docker run --help'.
Если вы хотите избежать ввода sudo
при выполнении команды docker
, добавьте свое имя пользователя в группу docker
:
Чтобы применить новую членство в группе, выйдите из сервера и снова войдите или введите следующее:
Вам будет предложено ввести пароль вашего пользователя, чтобы продолжить.
Подтвердите, что ваш пользователь теперь добавлен в группу docker, введя:
Outputsammy sudo docker
Если вам нужно добавить пользователя в группу docker
, отличного от того, под которым вы вошли, укажите это имя пользователя явно, используя:
Остальная часть этой статьи предполагает, что вы запускаете команду docker
от имени пользователя в группе docker. Если вы выберете не делать этого, добавьте команды перед sudo
.
Давайте рассмотрим команду docker
далее.
Шаг 3 — Использование команды Docker
Использование 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
Чтобы просмотреть доступные опции для конкретной команды, введите:
Чтобы просмотреть системную информацию о Docker, используйте:
Давайте рассмотрим некоторые из этих команд. Мы начнем с работы с образами.
Шаг 4 — Работа с образами Docker
Контейнеры Docker создаются из образов Docker. По умолчанию Docker загружает эти образы с Docker Hub, реестра Docker, управляемого компанией Docker, стоящей за проектом Docker. Каждый может размещать свои образы Docker на Docker Hub, поэтому большинство приложений и дистрибутивов Linux, которые вам понадобятся, будут размещены там.
Чтобы проверить доступ и загрузку образов с Docker Hub, введите:
Результат покажет, что Docker работает корректно:
OutputUnable 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 введите:
Скрипт просмотрит Docker Hub и вернет список всех образов, имя которых соответствует введенной строке поиска. В этом случае вывод будет примерно таким:
OutputNAME 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
на свой компьютер:
Вы увидите следующий вывод:
OutputUsing 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 сначала загрузит изображение, а затем запустит контейнер с его использованием.
Чтобы увидеть изображения, загруженные на ваш компьютер, введите:
Вывод будет похож на следующий:
OutputREPOSITORY 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 дает вам интерактивный доступ к оболочке внутри контейнера:
Ваш приглашение командной строки должно измениться, отражая тот факт, что вы теперь работаете внутри контейнера, и должно иметь следующий вид:
Outputroot@d9b100f2f636:/#
Обратите внимание на идентификатор контейнера в приглашении командной строки. В этом примере он равен d9b100f2f636
. Вам понадобится этот идентификатор контейнера позже, чтобы идентифицировать контейнер при его удалении.
Теперь вы можете выполнять любую команду внутри контейнера. Например, давайте обновим базу данных пакетов внутри контейнера. Вам не нужно предварять команду sudo
, потому что вы работаете внутри контейнера от имени пользователя root:
Затем установите в нем любое приложение. Давайте установим Node.js:
Это устанавливает Node.js в контейнере из официального репозитория Ubuntu. Когда установка завершится, убедитесь, что Node.js установлен:
Вы увидите номер версии, отображенный в вашем терминале:
Outputv12.22.9
Любые изменения, внесенные внутри контейнера, применяются только к этому контейнеру.
Чтобы выйти из контейнера, введите exit
в приглашении командной строки.
Давайте теперь рассмотрим управление контейнерами на нашей системе.
Шаг 6 — Управление контейнерами Docker
После использования Docker в течение некоторого времени на вашем компьютере будет много активных (запущенных) и неактивных контейнеров. Чтобы просмотреть активные, используйте:
Вы увидите вывод, аналогичный следующему:
OutputCONTAINER ID IMAGE COMMAND CREATED
В этом учебнике вы запустили два контейнера: один из образа hello-world
, а другой из образа ubuntu
. Оба контейнера больше не запущены, но они все еще существуют в вашей системе.
Чтобы просмотреть все контейнеры — активные и неактивные, выполните docker ps
с ключом -a
:
Вы увидите вывод, аналогичный этому:
OutputCONTAINER 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
:
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c08a7a0d0e4 ubuntu "bash" 3 minutes ago Exited (0) 2 minutes ago dazzling_taussig
Чтобы запустить остановленный контейнер, используйте docker start
, за которым следует идентификатор контейнера или его имя. Давайте запустим контейнер на основе Ubuntu с идентификатором 1c08a7a0d0e4
:
Контейнер будет запущен, и вы сможете использовать docker ps
, чтобы увидеть его статус:
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c08a7a0d0e4 ubuntu "bash" 6 minutes ago Up 8 seconds dazzling_taussig
Чтобы остановить запущенный контейнер, используйте docker stop
, за которым следует идентификатор или имя контейнера. На этот раз мы используем имя, которое Docker назначил контейнеру, которое является dazzling_taussig
:
Как только вы решите, что вам больше не нужен контейнер, удалите его с помощью команды docker rm
, снова используя либо идентификатор контейнера, либо его имя. Используйте команду docker ps -a
, чтобы найти идентификатор или имя контейнера, связанного с образом hello-world
, и удалите его.
Вы можете запустить новый контейнер и дать ему имя, используя параметр --name
. Также можно использовать параметр --rm
, чтобы создать контейнер, который удалит себя после остановки. См. команду docker run help
для получения дополнительной информации об этих и других опциях.
Контейнеры можно превратить в образы, которые можно использовать для создания новых контейнеров. Давайте посмотрим, как это работает.
Шаг 7 — Фиксация изменений в контейнере в образ Docker
Когда вы запускаете образ Docker, вы можете создавать, изменять и удалять файлы, как с виртуальной машиной. Внесенные вами изменения применяются только к этому контейнеру. Вы можете запускать и останавливать его, но как только вы уничтожите его с помощью команды docker rm
, изменения будут утеряны навсегда.
Этот раздел показывает, как сохранить состояние контейнера в виде нового образа Docker.
После установки Node.js внутри контейнера Ubuntu у вас теперь есть контейнер, запущенный из образа, но контейнер отличается от образа, который вы использовали для его создания. Однако вы можете захотеть повторно использовать этот контейнер Node.js в качестве основы для новых образов позже.
Затем зафиксируйте изменения в новом экземпляре образа Docker с помощью следующей команды.
Переключатель -m предназначен для сообщения о фиксации, которое помогает вам и другим узнать, какие изменения вы внесли, а -a используется для указания автора. container_id
– это тот, который вы отметили ранее в учебнике, когда запустили интерактивную сессию Docker. Если вы не создали дополнительных репозиториев на Docker Hub, то repository
обычно является вашим именем пользователя на Docker Hub.
Например, для пользователя sammy, с идентификатором контейнера d9b100f2f636
, команда будет такой:
Когда вы фиксируете образ, новый образ сохраняется локально на вашем компьютере. Позже в этом учебнике вы узнаете, как отправить образ в реестр Docker, например, на Docker Hub, чтобы другие могли получить к нему доступ.
Повторное перечисление образов Docker покажет новый образ, а также старый, от которого он был произведен:
Вы увидите вывод подобный следующему:
OutputREPOSITORY 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.
Вас попросят аутентифицироваться с помощью пароля от Docker Hub. Если вы указали правильный пароль, аутентификация должна пройти успешно.
Примечание: Если ваше имя пользователя в реестре Docker отличается от локального имени пользователя, используемого вами для создания образа, вам придется пометить свой образ своим именем пользователя в реестре. Для приведенного в последнем шаге примера вы должны ввести:
Затем вы можете отправить свой собственный образ, используя:
Чтобы отправить образ ubuntu-nodejs
в репозиторий sammy, команда будет такой:
Процесс может занять некоторое время на завершение, так как он загружает изображения, но по завершении вывод будет выглядеть так:
OutputThe push refers to a repository [docker.io/sammy/ubuntu-nodejs]
e3fbbfb44187: Pushed
5f70bf18a086: Pushed
a3b5c80a4eba: Pushed
7f18b442972b: Pushed
3ce512daaf78: Pushed
7aae4540b42d: Pushed
...
После загрузки изображения в реестр, оно должно быть перечислено на панели управления вашей учетной записи, как показано на изображении ниже.
Если попытка загрузки завершается ошибкой такого рода, скорее всего, вы не вошли в систему:
OutputThe 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