Docker — программное обеспечение для автоматизации развёртывания и управления приложениями в средах с поддержкой контейнеризации, контейнеризатор приложений. Для понимания сути этого ПО можно привести в пример аналогию со стандартизированными портовыми контейнерами, которые обеспечивают удобство перевозки любого содержимого этих контейнеров. Т.е. для перевозки фруктов, стекла и даже автомобилей используется одно и то же оборудование, так как перевозятся они в стандартных контейнерах, что обеспечивает процессу максимально рациональное использование ресурсов.
Прежде чем установить Docker на свою машину необходимо убедиться, что он не был установлен до вас. Сторожилы говорят, ставить Docker необходимо на чистое место, тогда и ошибок не будет. Поэтому для начала выполняем команду:
sudo apt-get remove docker docker-engine docker.io conteinerd runc
Эта команда удаляет пакеты Docker, Docker Engine, Docker.io, Containerd и Runc с вашей системы Ubuntu. Удаление этих пакетов приведет к удалению Docker и связанных с ним компонентов из вашей системы.
Обновим индекс доступных пакетов из всех знакомых репозиториев:
sudo apt-get 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 $(lsb_release -cs) stable"
Еще раз обновим индекс пакетов и увидим там репозиторий Docker:
sudo apt-get update
Установим последнюю версию Docker:
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Убедимся, что Docker встал, запустив hello world контейнер:
sudo docker run hello-world
Docker установлен. Но удобство работы с ним пока оставляет желать лучшего. Чтобы избавиться от необходимости каждый раз перед docker писать sudo выполним два простых действия.
Создадим на машине новую группу пользователей docker:
sudo groupadd docker
И добавим себя в эту группу:
sudo usermod -aG docker $USER
Теперь, если перелогиниться, команда docker run hello-world выполнится без sudo.
Пример использования Docker
Для наглядности запустим контейнер командой run с аргументом debian (образ Debian Linux) и линукс командой echo 'Hello world':
docker run debian echo 'hello world'
В моем случае вывод получился таким:
'''
Unable to find image 'debian:latest' locally
latest: Pulling from library/debian
71215d55680c: Pull complete
Digest: sha256:e97ee92bf1e11a2de654e9f3da827d8dce32b54e0490ac83bfc65c8706568116
Status: Downloaded newer image for debian:latest
hello world
'''
Docker не нашел образ Debian локально, поэтому пошел искать его в облачном хранилище Docker Hub, нашел, создал на его основе работающий контейнер, и выполнил в нем команду. Если выполнить команду повторно, docker исполнит ее значительно быстрее, так как ему уже не нужно будет скачивать образ.
Еще мы можем подключиться к интерактивной оболочке внутри контейнера и выполнять команды там. Например:
docker run -i -t debian bash
#подключаемся к терминалу
ls
#смотрим содержимое виртуальной машины в контейнере
Очень похоже на подключение к удаленной машине по SSH. Сеанс интерактивной работы на подключаемом терминале был создан благодаря двум флагам -i и -t.
Вы можете даже узнать версию операционной системы, к которой подключились:
uname -a
Контейнеры работают, пока существует основной процесс. При выходе из командной оболочки контейнер прекратит работу. Выйти: Ctrl + D или командой 'exit'.
Теперь запустим контейнер, дав имя хосту. Например "HOST":
docker run -h HOST -i -t debian bash
И сделаем страшное, удалим каталог /bin, в котором хранятся почти все утилиты Linux:
rm -r /bin
По сути, мы сломали систему внутри контейнера. Теперь, не закрывая терминал с подключенным контейнером, откройте еще один в новом окне и введите команду:
docker ps
Вы получите список созданных контейнеров с удобочитаемым именем в последней колонке. Оно нам понадобится. Вводим команду 'docker diff' и имя контейнера:
docker diff distracted_spence
И вуаля, мы получили то, что было удалено. Docker показал нам отличия запущенного контейнера от своего образа. Кроме того, Docker еще и логи собирает, поэтому мы без труда сможем вычислить причину и виновника удаления директории /bin:
docker logs distracted_spence
Команда выведет все, что было записано в stdout b stderr контейнера во время его работы.
Если выйти из контейнера и снова ввести команду docker ps, контейнер мы уже не увидим. Однако если добавить флаг -a:
docker ps -a
То получим полный список контейнеров во всех состояниях. Перезапустить контейнеры со статусом Exited можно командой:
docker start my_container
А чтобы окончательно удалить ненужные контейнеры, используется команда docker rm и ID контейнера. Например:
docker rm b48c278d9d43
Работающий контейнер удалить не получится. Сначала его нужно остановить.
Ну и чтобы не плодить контейнеры, можно еще при запуске добавить ему опцию самоуничтожения при выходе. Делается это с помощью флага --rm:
docker run -h HOST -i -t --rm debian bash
После выхода из контейнера в списке остановленных вы его не найдете.
И последнее, выше мы скачивали образ Debian автоматически, при создании контейнера. Однако, если нужно просто скачать образ из официального Docker Hub, делается это с помощью команды docker pull, например:
docker pull ubuntu
Эта команда загрузит последний доступный образ Ubuntu из официального репозитория Docker Hub. После того как образ будет загружен, вы сможете использовать его для создания контейнера с помощью команды "docker run ubuntu".