Docker - установка и использование





Docker — это оболочка для LXC, предоставляющая удобный интерфейс для работы с контейнерами в среде Linux.

Контейнер в свою очередь это процесс, чем-то похожий на виртуальную машину, который выполняется в изолированном пространстве. При этом используется один экземпляр ядра (kernel) операционной системы, что позволяет экономить ресурсы.

Принцип работы предельно прост. На компьютер с Linux (здесь будет описана установка Docker на ubuntu 16.04) устанавливается сам Docker и дальше можно скачивать готовые образы, либо создавать свои, и запускать их в Docker.
К примеру есть образы с различными CMS, настроенным сервером и базой данных. Допилив такой образ под себя (или создав образ «с нуля»), его можно сохранить в укромном местечке и в любой момент развернуть где угодно.

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

Контейнеры запускаются и останавливаются практически моментально, так как не требуется загрузка отдельной ОС. Можно запускать несколько контейнеров одновременно, а благодаря использованию файловой системы AuFS, контейнеры используют одно и то же дисковое пространство, доступное только для чтения.


Образы и контейнеры

Образ — это некий шаблон, из которого создаётся контейнер, после чего этот контейнер можно запускать.

Из одного и того же образа можно создавать сколько угодно новых контейнеров, вносить в эти контейнеры изменения и создавать из них новые образы. То есть, например, скачали базовый образ (см. ниже), создали из него контейнер, поделали в этом контейнере что-то, создали из этого контейнера образ и положили его на полку. Теперь для каких-то определённых делишек у Вас есть готовый, настроенный образ.

Подробная инфа

Образы будут сохраняться в /var/lib/docker.


Документация




Установка Docker

Обновляемся:

sudo apt update && sudo apt upgrade


Устанавливаем доп. пакеты:

sudo apt install linux-image-extra-$(uname -r) linux-image-extra-virtual


Установка будет производится из официального репозитория разработчика.

Добавляем ключ репозитория:

sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D


Добавляем репозиторий:

sudo apt-add-repository 'deb https://apt.dockerproject.org/repo ubuntu-xenial main'


Обновляем:

sudo apt update


Устанавливаем Docker:

sudo apt install docker-engine


После успешной установки добавляем себя в группу docker:

sudo usermod -aG docker $(whoami)

Здесь нужно перелогиниться или перезагрузиться.

Проверяем работу:

sudo systemctl status docker




Если зелёненькое, то всё ОК.




Работа с Docker

Командой…

docker


… можно посмотреть список всех аргументов и команд.

на русском языке
Management Commands:

container
image
network
node
plugin
secret
service
stack
swarm
system
volume


Справка:

docker container --help


Commands:

attach — подключиться к запущенному контейнеру.
build — собрать образ из инструкций dockerfile.
commit — создать новый образ из существующего.
cp — копировать файлы между контейнером и физическим компом.
create — создать новый контейнер.
diff — проверить файловую систему контейнера.
events — посмотреть события контейнера.
exec — выполнить команду в контейнере.
export — экспортировать содержимое контейнера в архив.
history — посмотреть историю изменений.
images — список установленных образов.
import — создать контейнер из архива tar.
info — информация о системе.
inspect — информация о контейнере.
kill — остановить запущенный контейнер.
load — загрузить образ из архива.
login — авторизация в официальном репозитории Docker.
logout — выйти из репозитория Docker.
logs — логи контейнера.
pause — приостановить все процессы контейнера.
port — проброс портов для контейнера.
ps — список запущенных контейнеров.
pull — скачать образ контейнера из репозитория.
push — отправить образ в репозиторий.
rename — переименовать контейнер.
restart — перезапустить контейнер.
rm — удалить контейнер.
rmi — удалить образ.
run — запустить новый контейнер.
save — сохранить образ в архив tar.
search — поиск образов в репозитории Docker Hub.
start — запустить контейнер.
stats — статистика использования ресурсов контейнером.
stop — остановить контейнер.
top — посмотреть запущенные процессы в контейнере.
unpause — проложить выполнение процессов в контейнере.
update — обновить конфигурацию контейнера.
version — версия Docker.

Справка:

docker attach --help





Первый запуск

Теперь пришло время что-нибудь запустить. Для этого существует тестовый образ — hello-world

docker run hello-world




Docker сообщит что такого образа нет на локальной машине, установит его из репозитория и запустит.

Сообщение Hello from Docker! свидетельствует о правильной работе системы.

Далее перечислены 4 шага, которые выполнил Docker. Следом предлагается попробовать запустить образ ubuntu командой docker run -it ubuntu bash, сделаем это чуть позже, а сейчас посмотрим в репозитории все пакеты содержащие слово ubuntu:

docker search ubuntu




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

Так же можно посмотреть какие-нибудь другие образы, например nginx:





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

docker run -it ubuntu

Команда «run» скачивает образ из репозитория (либо берет из локального), создаёт из него контейнер и запускает.




Здесь мы видим, что контейнер запустился и работает от пользователя root. Имя хоста (5c87883a3af5) это ID контейнера.

Чтобы посмотреть CONTAINER ID, нужно открыть ещё один терминал и дать команду для просмотра запущенных контейнеров:

docker ps




Если дать ту же команду с ключём -a, то увидим все контейнеры (запущенные и не запущенные):

docker ps -a




CONTAINER ID — ID контейнера, с помощью которого можно оперировать контейнером.

IMAGE — название образа.



Чтобы посмотреть список установленных образов, надо дать команду…

docker images




REPOSITORY — название репозитория.

TAG — обычно это версия продукта. Если тега нет, то автоматически используется слово latest.

ImageID — локально генерируемый ID образа, по которому этим образом можно оперировать.


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



Свой образ

Сейчас Docker сделал всё за нас — установил образ и запустил контейнер, а теперь научимся делать всё вручную, это в любом случае понадобится для создания своих образов.

Удалим существующие контейнеры и образы (чтоб глаза не мозолили), скачаем образ, создадим из него контейнер, запустим его, установим какие-нибудь программы и наконец создадим из него свой образ.

Сначала остановим работающий контейнер. Сделать это можно по разному, прямо в контейнере дать команду exit, либо в соседнем терминале скомандовать…

docker stop 5c87883a3af5

… либо более жёсткая команда…

docker kill 5c87883a3af5

Последний аргумент — это ID контейнера (docker ps -a).


Далее нужно удалить контейнер и образ. Делать это нужно именно в таком порядке, иначе получите ошибку.

Смотрим ID контейнеров (CONTAINER ID):

docker ps -a


Удаляем контейнер ubuntu:

docker rm 5c87883a3af5


Удаляем контейнер hello-world:

docker rm 2f32a2301686





Смотрим ID образов (IMAGE ID):

docker images


Удаляем образ ubuntu:

docker rmi 452a96d81c30


Удаляем образ hello-world:

docker rmi e38bc07ac18e






Скачиваем образ:

docker pull ubuntu


Смотрим ID образа:

docker images




Создаём контейнер из скаченного образа и запускаем:

docker run -it 452a96d81c30




Контейнер запущен, теперь остановим его командой exit. Так как контейнер у нас уже создан, то и запускать его нужно другой командой.

Сначала смотрим ID контейнера:

docker ps -a




И запускаем:

docker start 77d9bfa3c4b4




Контейнер запустился, но мы к нему не подсоединены. Подсоединиться к контейнеру, нужно с помощью команды…

docker attach 77d9bfa3c4b4




Если всё работает, то можно что-нибудь поделать в контейнере. Давайте обновимся и установим mc и openssh-server, в дальнейшем это нам пригодится:

apt update && apt upgrade
apt install mc openssh-server



Теперь можно создать новый образ. В соседнем терминале даём команду…

docker commit 77d9bfa3c4b4 myrepo


commit — создать образ.
77d9bfa3c4b4 — ID запущеного контейнера.
myrepo — произвольное название репозитория, который будет создан на вашей машине.


Смотрим список образов:

docker images




Чтоб отличать образы друг от друга можно менять название репы, или добавить TAG:

docker commit 77d9bfa3c4b4 myrepo:ver1





Теперь можно остановить запущенный контейнер (exit) и создать новый контейнер из нашего образа…

docker run -it 9b0499ab1be8


Смотрим список контейнеров:

docker ps -a



Новый контейнер готов.




Переименовать контейнер

К контейнерам можно обращаться по имени, а для удобства переименовать:

docker rename 136cf104bc34 mycontainer


Либо присвоить имя при создании:

docker run --name mycontainer -it 9b0499ab1be8


docker start mycontainer
docker attach mycontainer







Архивация образа

Чтобы переносить образ с компьютера на компьютер его нужно упаковать в архив.

Смотрим ID образа:

docker images




Архивируем:

docker save -o /home/dima/myimage.tar 652c636e712c

Архив образа будет сохранён на компьютере в домашней папке в файл myimage.tar.


После переноса на другой компьютер (с установленным Docker), архив нужно распаковать и создать из него контейнер.

Распаковываем:

docker load -i /home/dima/myimage.tar


Проверяем:

docker images



Не очень то красиво.

Зададим название репы и тег:

docker image tag 652c636e712c mynewrepo:ver0.1


docker images



Так гораздо лучше.


Создаём и запускаем контейнер, заодно присваиваем ему имя mynewcontainer:

docker run --name mynewcontainer -it 652c636e712c


Далее из этого контейнера можно создать образ, а из него контейнер и т.д. Только сильно не увлекайтесь, а то будет очень много слоёв.



Вы наверно обратили внимание на многочисленные надписи в терминале — Loading layer и Deleted



Это создание/удаление тех самых слоёв, про которые говорится в начале статьи по ссылке Подробная инфа.



Сеть

По умолчанию контейнер видит внешнюю сеть, проверить это можно командой ping ya.ru, предварительно установив пакет iputils-ping:

apt install iputils-ping

ping ya.ru


Однако попасть во внутрь контейнера по сети (например ssh) нельзя, нужно сначала пробросить порт.

IP-адреса у контейнеров будут — 172.17.0.0/16. Проверить можно командой…

docker inspect -f "{{ .NetworkSettings.IPAddress }}" mynewcontainer



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

Смотрим ID образа:

docker images


Создаём новый контейнер с именем mysshcont и параметрами -p 2222:22:

docker run --name mysshcont -it -p 2222:22 652c636e712c

2222-ой порт основной машины пробрасываем на порт ssh контейнера.

Далее нужно установить ssh-сервер (apt install openssh-server) и либо разрешить вход по паролю, либо создать ключи.

Заходить в контейнер с основного компьютера так…

ssh -p 2222 root@localhost



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

docker run --name mywebserver -it -p 80:80 -p 443:443 652c636e712c

Естественно на основной машине не должны быть заняты эти порты. И обратите внимание на изменение имени контейнера.


Устанавливаем Apache и стартуем:

apt install apache2

service apache2 start


В браузере на основной машине пишем…

localhost



После этого контейнер можно остановить и запустить обычным способом (настройки портов сохранятся в контейнере):

docker start mywebserver
docker attach mywebserver


Однако есть одна сложность, у контейнера нет системы автозапуска приложений, это значит что после остановки и последующего запуска, ни ssh ни сайт работать не будут, нужно вручную стартовать демонов…

service apache2 start





О том, как реализуется автозапуск, и о других вещах я планирую написать в следующей части.

На этом всё.

В статье затронуты лишь азы использования Docker.




  • +1
  • 18529
Поддержать автора


Telegram-чат istarik

Задать вопрос по статье
Telegram-канал istarik

Известит Вас о новых публикациях






Комментарии (0)

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