Часть 1. Базовые команды Docker
Подготовка рабочего окружения
В лабораторной работе по Linux мы уже настроили рабочее окружение в ОС Ubuntu и установили Docker. Если по каким-либо причинам вы этого еще не сделали - проделайте прямо сейчас:
Установка Docker в Ubuntu 22.04:
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
sudo apt update
sudo apt install docker-ce
sudo systemctl status docker
Запустим hello-world:
docker run hello-world
После запуска контейнер отрабатывает, выводит результат работы в STDOUT и сразу завершается, т.к. основной процесс печати руководств а внутри него после выполнения завершился.
Если вы хотите, чтобы ваш пользователь мог пользоваться docker без ограничений и необходимости прав суперпользователя - вы можете добавить его в группу docker:
usermod -aG docker $username
Не забудьте после этого перелогиниться, чтобы процесс командного интерпретатора (в моем случае bash) запустился с новыми правами (с правами на группу docker)
Образа - docker pull, docker images
Для того, чтобы запустить "контейнер" нам нужна сущность под названием образ. Подробно все сущности мы разбирали на второй лекции. Остановимся на том, что это заранее упакованный слепок состояния некоторого сервиса или окружения (бибилиотеки и исполняемые файлы), которое можно использовать без дополнительных зависимостей.
Для загрузки образа используется команда docker pull, загрузим образ mysql (найти вручную подходящие образа можно на docker hub):
docker pull mysql

Когда загрузка и распаковка будет завершена, утилита вернет вам управление. Теперь проверим, что же мы скачали с помощью команды docker image ls или docker images:
docker image ls
docker images
Но что, если мы хотим скачать определенную версию образа? Нам помогут метки. Загрузим mysql версии 5.7.39:
docker pull mysql:5.7.39
Убедимся, что теперь у нас есть 2 образа с разными метками:
docker images
Метки и удаление образа - docker tag
Чтобы управлять нашими образами мы можем назначать им метки - тэги, с помощью команды docker tag:
docker tag mysql mysql:8.0-mak

Это не создало новый образ (image ID одинаковый), но сделало еще одну ссылку на него.
Удалить образ можно удалив все ссылки на него командой docker rmi или аналогом docker image rm:
docker rmi mysql:8.0-mak
docker image rm mysql:5.7.39
Если вы не хотите вручную выяснять, какие образа вам более не требуются воспользуйтесь к омандой docker image prune:
docker image prune
# docker image prune -a # удалить все, на которых не запущены контейнеры
Запускаем контейнер - docker run, docker logs
Запустим контейнер с СУБД командой docker run:
docker run mysql
mak@overmind:~$ docker run mysql
2022-09-21 23:33:40+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.30-1.el8 started.
2022-09-21 23:33:40+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2022-09-21 23:33:40+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.30-1.el8 started.
2022-09-21 23:33:40+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
You need to specify one of the following:
- MYSQL_ROOT_PASSWORD
- MYSQL_ALLOW_EMPTY_PASSWORD
- MYSQL_RANDOM_ROOT_PASSWORD
Окей, исправляемся, добавим аргумент -e для передачи переменной окружения, зададим пароль:
docker run -e MYSQL_ROOT_PASSWORD=password mysql
База запустилась, но как будто мы просто запустили ее командой mysql из консоли.
Задача: поднять еще одно окно и прервать процесс контейнера, который подвесил вашу консоль без ее завершения. Пригодится: tmux, ps aux, kill
Теперь попробуем запустить в фоновом режиме с аргументом -d, кроме того, дадим ему вменяймое имя --name $NAME:
docker run -d -e MYSQL_ROOT_PASSWORD=password --name db1 mysql
Получилось, в ответ Docker выдал нам хэш-ID контейнера (далее $ID).
Посмотрим логи контейнера по его ID командой docker logs:
docker logs $ID
# Это можно сделать и по имени
docker logs db1
Списки контейнеров - docker ps
Посмотрим списки контейнеров с помощью команды docker ps:
docker ps
docker ps -a # включая завершенные