Docker

Docker

Created Пятница 21 Октябрь 2015

https://habrahabr.ru/post/272145/ <-----------

https://habrahabr.ru/post

http://eax.me/docker/

https://docs.docker.com/engine/installation/

Docker — opensource-приложение/проект/инфраструктура, позволяющая упаковывать, распро-странять, устанавливать и использовать opensource-приложения. Приложения работают в изолированной среде построенной с помощью пространств имён (namespaces), и групп процессов (cgroups), с одной стороны изолируя процессы друг от друга, с другой стороны не прибегая при этом к таким тяжелым средствам как полная виртуализация или паравиртуализация, можно сказать и проще, что Docker являет собой пример виртуализации на уровне операционной системы со всеми вытекающими плюсами и минусами, и основное достоинство Docker как и любой виртуализации это эффективное использование оборудования то есть ресурсов операционной системы в итоге.

Система написана на Go. Работает в различных UNIX/Linux-системах, и какой ужас да-же !!! в Microsoft --> Boot2Docker. Docker чаще всего использует "различные"(контейнерные) системы виртуализации на уровне ОС, в настоящее время наибольшее распространение получила комбинация Docker + LXC, на которой он и был первоначально основан, Docker и LXC однако, это совершенно разные проекты с разными функциями.----->xgu.ru/wiki/Docker


Одной из особенностей или достоинств Docker, которое необходимо, желательно понимать, является использование технологии: "Каскадно объединенного монтирования" по средствам Aufs при которой контейнеры используют образ базовой операционной системы, а изменения записываются в отдельную область, что и правда очень здорово, как и выборочная, осмысленная работа со слоями, реализуя идею "Каждому сервису свой контейнер" а можно и "Каждому процессу свой контейнер" однако до тех пор пока слоев не накопилось слишком много (127 не более) и не пришло время их "схлопнуть, сжать". Также поддерживается размещение контейнеров в файловой системе Btrfs с включённым режимом копирования при записи. И от чего все это "счастье" для девелоперов не было реализовано раньше? при том, что ни чего нового в виртуализации на уровне операционной системы нет ?, не говоря о Solaris.

Основные команды по работе с контейнерами

https://sites.google.com/site/kfgnb0101//docker--help <-------------

https://github.com/wsargent/docker-cheat-sheet

Жизненный цикл

docker create --help

создать контейнер, но не запускать его

docker run --help

создать и запустить контейнер

docker stop

остановить контейнер

docker start

запустить существующий остановленный контейнер

docker restart

перезапустить контейнер

docker rm

удалить контейнер

docker kill

отправить сигнал SIGKILL контейнеру

docker attach --help

подключиться к работающему контейнеру

docker wait

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

docker exec --help

запуск команд в запущенном контейнере

Информация о контейнерах


docker ps --help

показать работающие контейнеры (или вообще контейнеры, если использовать дополнительные опции)

docker inspect

показать всю информацию о контейнере, включая IP-адреса

docker logs

показать лог-вывод контейнера

docker events

показать события контейнера

docker port

показать открытые наружу порты контейнера

docker top

показать процессы, работающие внутри контейнера

docker stats

показать статистику использования ресурсов контейнером

docker diff

показать изменённые файлы в файловой системе контейнера

Есть мнение что, Docker это круто, и вот почему:


    • Контейнеры Docker кроссплатформены. Один и тот же контейнер может использоваться под "разными" операционными системами. (под "разными" это через чур, под разными *nix системами, (Boot2docker = Tiny Core Linux + Docker) если промолчать про docker compose)

    • Docker отделяет приложения от инфраструктуры. Описание инфраструктуры в терминах образов Docker помогает держать инфраструктуры в обозримом легко контролируемом состоянии;

    • Выполнение приложений в контейнерах изолирует их от внешнего мира, открывая только те ресурсы, которые явно указаны. Это сводит к минимум неучтённое внешнее влияние;

    • Автоматическая подготовка окружения и установка приложения. Docker делает это автоматически.

Docker - зачем?

, ответ вытекает из преимуществ виртуализации на уровне ОС.

    • Простой способ перемещения ПО по серверам, на сервере куда переносится ПО требуется лишь установленный Docker

    • В силу того, что это контейнер ПО не требует переделок конфигурации нового сервера.

    • Сервер защищен от косяков реализации ПО, проблемы заканчиваются на уровне ПО, контейнера, слоя, а серверная платформа остается чистой от любых экспериментов.

    • Имеет бесплатный репозиторий Docker Hub, вроде Github, с кучей готовых контейнеров,....



А вот как ответ звучит на https://xakep.ru/2015/06/01/docker-advanced-usecases/

Есть четыре класса задач, для которых Docker пoдходит если не идеально, то лучше любого другого инструмента. Это:

    • Упрощение процеcса разворачивания/сопровождения проектов. Docker позволяет разбить пpоект на небольшие независимые, удобные в сопровождении кoмпоненты, работать с которыми гораздо комфортнее, чем с реальными сущностями вроде Apache 2.4.12, установленного на хосте 1.2.3.4, работающем под управлениeм CentOS 6.

    • Continous development и zero-downtime deployment. Каждый образ Docker — вещь в себе, включающая сервис (или набор сервисов), окружение для его запуска и нeобходимые настройки. Поэтому контейнеры можно передавать между членaми команды в ходе цикла «разработка -> тестирование -> внедрение» и быстро внeдрять изменения, просто переключая настройки на новые контейнеры.

    • IaaS/PaaS. Блaгодаря легковесности контейнеров Docker можно испoльзовать в качестве движка виртуализации в IaaS, а благодаря проcтоте миграции Docker становится идеальным решением для запуска сервисов в PaaS.

    • Запуск небезопaсного кода. Docker позволяет запустить любой, в том числе графический софт внутри изoлированного контейнера с помощью одной простой команды. Поэтому он идеально подходит для запуска разного рода недовереннoго или просто небезопасного кода.

Ликвидация Безграмотности +


Показать использование памяти всеми контейнерами docker/lxc

$ for line in `docker ps | awk '{print $1}' | grep -v CONTAINER`; do docker ps | grep $line | awk '{printf $NF" "}' && echo $(( `cat /sys/fs/cgroup/memory/docker/$line*/memory.usage_in_bytes` / 1024 / 1024 ))MB ; done

Для начала после установки Docker добавляем пользователя в группу ´docker´

$ sudo gpasswd -a [пользователь] docker

$ sudo service docker restart

Для upgrade до последней версии:

$ sudo apt-get upgrade docker-engine

sudo apt update

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 bionic stable"

sudo apt update

apt-cache policy docker-ce

sudo apt install docker-ce

sudo systemctl status docker

sudo usermod -aG docker ${USER}

su - ${USER}

Для Portainer в случае переустановки очистить кеш браузера

Для демонстрации работы контейнера принято запустить некое стандартное приложение и увидеть результаты его работы, стандартно используется /bin/echo и всеми так любимая строчка 'Hello world', что-бы как то разнообразить используем /bin/cat и например /etc/passwd, Ubuntu по причине громадной популярности, то же не будем использовать, ограничившись Debian.

Итого:

$ docker run debian /bin/cat /etc/passwd

root:x:0:0:root:/root:/bin/bash

daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

bin:x:2:2:bin:/bin:/usr/sbin/nologin

sys:x:3:3:sys:/dev:/usr/sbin/nologin

............................................

............................................

nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin

systemd-timesync:x:100:103:systemd Time Synchronization,,,

systemd-network:x:101:104:systemd Network Management,,,:

systemd-resolve:x:102:105:systemd Resolver,,,:/run/systemd

systemd-bus-proxy:x:103:106:systemd Bus Proxy,,,:/run$

Итого контейнер запустился и вывел в терминал содержание файла /etc/passwd

В этом примере: docker run debian /bin/cat /etc/passwd

Запуск интерактивного контейнера

Изучив docker run --help, находим два ключа (-t и -i, которые можно объединить в -it) работу с которыми демонстрирует следующий пример:

$ docker run -t -i debian /bin/bash

root@15c1c550d027:/# cat /etc/hostname

15c1c550d027

root@15c1c550d027:/# ls

bin dev home lib64 mnt proc run srv tmp var

boot etc lib media opt root sbin sys usr

root@15c1c550d027:/# exit

exit

$

$ docker run --help

Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

docker run ---> запускает контейнер.

debian ---> это образ операционной системы Debian. Если образ указан, Docker сначала ищет образ на локальном хосте где он (Докер) установлен (/var/lib/docker). Если образ не существует локально, то образ извлекается из реестра публичного образа Docker Hub.

/bin/cat ---> команда для запуска внутри нового контейнера.

/etc/passwd ---> файл для листинга (cat [КЛЮЧ]… [ФАЙЛ]…)

Контейнер запускает посредством создания процесса (естественно), docker создает внутри этого процесса новое окружение ¨Debian¨ со всеми вытекающими последствиями для виртуализации на уровне операционной системы и выполняет /bin/cat - команду внутри него , и печатает содержимое файла /etc/passwd.

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

Ещё примеры:

$ docker run debian /bin/hostname

7617525afa9d

$ docker run debian /bin/cat /etc/networks

default 0.0.0.0

loopback 127.0.0.0

link-local 169.254.0.0

$

В этом примере:

docker run ----> запускает контейнер.

debian ----> образ контейнера (которое docker обнаружил на локальной машине) , или с которым необходимо работать.

-t (--tty) ----> флаг назначает псевдо-терминал -- терминал внутри нового контейнера. (Allocate a pseudo-TTY). По средством чего создается интерактивный интерфейс к контейнеру

-i (--interactive) ----> флаг позволяет сделать интерактивное соединение путем захвата стандартного ввода ( STDIN ) контейнера (Keep STDIN open even if not attached).

/bin/bash----> запускает оболочку Bash контейнера, в чем можно убедиться увидев командную строку.

В отличии от простого запуска контейнера без -i (--interactive) контейнер будет работать до тех пор пака stdin , будет захвачен Docker-ом, и прекратит работу после прекращения docker- процессов, то есть после exit или Ctr-D.

docker ps ----> покажет список всех запущенных контейнеров

docker ps -a ----> список всех, включая остановленные

docker rm ----> удалит контейнер (docker rm $(docker ps -aq) - удалить все)

docker start ----> запустит существующий, остановленный контейнер

docker attach ----> подключиться к работающему контейнеру

$ docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES

21c1d066ff19 debian "/bin/bash" 5 minutes ago Exited (0) 19 seconds ago cocky_blackwell

401685f2f057 nginx "/bin/bash" 12 minutes ago Exited (0) 8 minutes ago condescen

$ docker start 21c1d066ff19

21c1d066ff19

$ docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES

21c1d066ff19 debian "/bin/bash" 6 minutes ago Up 23 seconds cocky_blackwell

$ docker attach 21c1d066ff19

root@21c1d066ff19:/# ping ya.ru

PING ya.ru (213.180.204.3): 56 data bytes

64 bytes from 213.180.204.3: icmp_seq=0 ttl=55 time=20.529 ms

64 bytes from 213.180.204.3: icmp_seq=1 ttl=55 time=23.785 ms

64 bytes from 213.180.204.3: icmp_seq=2 ttl=55 time=22.583 ms

64 bytes from 213.180.204.3: icmp_seq=3 ttl=55 time=30.406 ms

64 bytes from 213.180.204.3: icmp_seq=4 ttl=55 time=125.923 ms

^C--- ya.ru ping statistics ---

5 packets transmitted, 5 packets received, 0% packet loss

round-trip min/avg/max/stddev = 20.529/44.645/125.923/40.773 ms

root@21c1d066ff19:/#

root@21c1d066ff19:/# exit

exit

$ docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

$