Проект «SnakeProject» Михаила КозловаРегистрация

Навигация
⇒FreeBSD and Nix⇒

⇐CISCO
⇐Voice(Asterisk\Cisco)
⇐Microsoft
⇐Powershell
⇐Python
⇐SQL\T-SQL
⇐1С
⇐Общая
⇐WEB Разработка
⇐ORACLE SQL \ JAVA
⇐Мото

Архитектура, компоненты, управление, кластеризация в Docker


 

Архитектура, компоненты, управление, кластеризация в Docker


Сервер \ демон Docker:
Управляет запущенными контейнерами

Клиент Docker:
Содержит интерфейсы взаимодействия с демоном Docker

Образ Docker:
Файл шаблонов, который можно перемещать и передавать
В отличие от виртуальных машин, можно хранить в системах управления версиями
docker diff - покажет различия между двумя указанными образами
Каждый образ состоит из нескольких уровней \ слоев
Слои могут совместно использоваться несколькими образами

Контейнер Docker:
Автономная виртуальная система
Содержит выполняющийся процесс, зависимости, адресное пространство процесса, сетевые порты

Dockerfile:
Текстовый файл, содержащий команды сборки образа

Реестр Docker:
Репозиторий для хранения и распространения образов

Docker Compose (компоновщик):
С помощью компоновщика возможно запустить приложение в нескольких контейнерах
Возможно определить окружение приложения в общем файле Dockerfile
Определить список служб в файле docker-compose.yml
После Docker автоматически будет создавать и запускать контейнеры, определенные в этих файлах

Docker Machine:
Дает возможность развертывать узлы Docker на локальной машине или внутри облака (Amazon, Azure)
Управляет узлами посредством команд start, stop... и т.п.

Docker Swarm:
Механизм кластеризации, позволяет объединить несколько узлов Docker в один хост Docker
Устанавливается с помощью Docker Machine или вручную (образ Swarm)


Схема взаимодействия:
Клиент Docker (Дает команды) ---> Сервер Docker (Контейнеры и образы) <--- Реестр Docker (Образы)


Команды:


Поиск образа в репозитории:
docker search [options] image_name(image_id)

Пример, ищем образ с не менее 1000 звезд по мнению пользователей:
docker search -s 1000 mysql
или:
docker search --filter stars=1000 mysql


Загрузка образа:
docker pull image_name(image_id):tag

Пример:
docker pull mysql:latest


Вывод списка образов:
docker images [options]

Пример:
docker images -a


Удаление образов:
docker rmi [options] image_name(image_id)

Пример:
docker rmi mysql


Запуск образа:
docker run [options] image_name(image_id):tag [command, args]

Пример:
docker run -it mysql:latest bash
docker run -d --name my_db_server -e MYSQL_ROOT_PASSWORD=my_sec_pass -p 3306:3306 mysql:latest

Где частые опции:
i - интерактивный режим
t - псевдотерминал tty
d - запуск в фоновом режиме
p - проброс указанных портов
e - ключ определения переменной окружения пароля доступа к базе данных


Вывод списка контейнеров:
docker ps [options]

Пример:
docker ps -a


Вывод журналов контейнера:
docker logs [options] container_name(container_id)

Пример:
docker logs my_db_server


Старт, остановка перезагрузка контейнера:
docker start [options] container_name(container_id)
docker stop [options] container_name(container_id)
docker restart [options] container_name(container_id)

Пример:
docker restart my_db_server


Удаление контейнера:
docker rm [options] container_name(container_id)

Пример:
docker rm -f my_db_server

Где:
f - принудительно уже запущенному контейнеру (иначе сначала остановка контейнера)


Информация о контейнере или образе:
docker inspect [options] container_name(container_id)
docker inspect [options] image_name(image_id)

Пример:
docker inspect mysql:latest
docker inspect --format='{{.Created}}' mysql:latest
docker inspect --format='{{.NetworkSettings.IPAddress}}' my_db_server


Выполнение команд в контейнере:
docker exec [options] command [args]

Пример:
docker exec my_db_server pwd


Переименование контейнера:
docker rename container_name container_new_name

Пример:
docker rename my_db_server my_new_db_server


Копирование файлов:
docker cp [options] container_name:src_path dest_path
docker cp [options] src_path|- container_name:dest_path

Пример:
docker cp my_new_db_server:/etc/passwd /tmp
docker cp /etc/passwd my_new_db_server:/tmp


Создание образа из контейнера:
docker commit [options] container_name(container_id) [repository:tag]

Пример (сохранит образ на локальной машине под названием - test_image):
docker commit c155b4683c6b test_image


Вывод изменений в контейнере:
docker diff container_name(container_id)

Пример:
docker diff c155b4683c6b


Вывести нагрузку:
docker stats [options] [containers]
docker stats
docker stats --format "table {{.Name }} \t {{.ID }} \t {{.CPUPerc}} \t {{.MemUsage}}"


Создание Dockerfile:


Комментарии начинаются с символа - #

Dockerfile должен начинаться с инструкции - FROM, которая определяет базовый образ

Инструкция FROM поддерживает переменные, указанные в инструкции - ARG

Пример:
ARG OS_VERSION=16.04
FROM ubuntu:${OS_VERSION}

Инструкция ADD копирует файлы из каталога локальной системы или URL в каталог внутри контейнера

Инструкция CMD выполнит команду после создания контейнера (может указана только одна инструкция CMD)

Инструкция ENTRYPOINT определяет автоматически исполняемый файл с запуском контейнера

Инструкция ENV определяет переменные окружения, например ранее тспользованную - ENV MYSQL_ROOT_PASSWORD my_sec_pass

Инструкция EXPOSE определяет порт прослушивания контейнера

Инструкция RUN выполняет команды (создает уровень, следующий уровень накладывается сверху предыдущего)

Инструкция USER указывает имя \ идентификатор пользователя для запуска образа \ в инструкциях RUN, CMD, ENTRYPOINT

Инструкция VOLUME указывает один \ несколько томов файловой системы локальной машины, которые будут доступны контейнеру

Инструкция WORKDIR указывает рабочий каталог инструкциям RUN, CMD, COPY, ADD, ENTRYPOINT


Пример Dockerfile:


Сборка образа:
docker build [options] path/URL

Пример:
docker build -t ubuntu1607_mysql:ver1 .

Где:
t - метка для удобства управления образом
. - текущий каталог с Dockerfile

Создание контейнера:
docker run -d --name ubuntu1604_mysql_dockerfile -p 3306:3306 ubuntu1607_mysql:ver1

Подключимся:
docker exec -it ubuntu1604_mysql_dockerfile bash

Сделаем доступ учетке root отовсюду:

Проверяем из контейнера:
mysql -h 127.0.0.1 -p
Enter password: my_sec_pass

CTRL+D

Проверяем из хостовой машины:
mysql -h 127.0.0.1 -p
Enter password: my_sec_pass


Пример docker-compose.yml:

Создадим каталоги для проекта в хостовой системе:
mkdir -p /data/web
mkdir /data/web/nginx
mkdir /data/web/logs
mkdir /data/web/public
mkdir /data/web/php-fpm


Нужно установить драйверы для php для подключения к MySQL:


Создадим конфиг для nginx:

Внимание, проверьте строку:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;


Создадим файлы для логов nginx:
touch /data/web/logs/nginx-error.log
touch /data/web/logs/nginx-access.log


Создадим тестовый файл php:


docker-compose.yml:


Собираем:
cd /data/web/
docker-compose up -d


!!!Если в хостовой системе ранее был mysql!!!
Если не стартанул mysql, возможно ранее в каталоге иже была инициализация:
rm -rf /var/lib/mysql/*
docker start web_mysql_1

Если все 3 контейнера стартанули, идем дальше

Проверяем:
curl http://127.0.0.1:80/index.php


Подключимся и создадим тестовые данные в MySQL:
docker exec -it web_mysql_1 bash


Пароль вводим указанный в файле docker-compose.yml:
mysql -u root -p

Выбираем базу данных из файла docker-compose.yml:


Приводим файл к такому виду:


Сетевая подсистема:

Сетевая подсистема Docker является подключаемой с использованием драйверов.
Несколько драйверов существуют по умолчанию и предоставляют основные сетевые функции:

bridge: сетевой драйвер по умолчанию.
Если вы не указываете драйвер, это тип сети, которую вы создаете.
Мостовые сети обычно используются, когда ваши приложения работают в автономных контейнерах, которые должны взаимодействовать.

host: для автономных контейнеров, удаляет сетевую изоляцию между контейнером и Docker-хостом.
Хост доступен только для служб swarm в Docker версии 17.06 и выше.

overlay: overlay сети соединяют несколько демонов Docker вместе и позволяют сервисам Swarm связываться друг с другом.
Вы также можете использовать overlay сети для облегчения связи между сервисом Swarm и автономным контейнером.
Или между двумя автономными контейнерами на разных демонах Docker.
Эта стратегия устраняет необходимость выполнять маршрутизацию на уровне ОС между этими контейнерами.

macvlan: сети Macvlan позволяют назначать MAC-адрес контейнеру, делая его физическим устройством в вашей сети.
Демон Docker направляет трафик в контейнеры по их MAC-адресам.
Использование драйвера macvlan иногда является лучшим выбором при работе с устаревшими приложениями.
Приложениям, которые ожидают прямого подключения к физической сети, а не маршрутизации через сетевой стек хоста Docker.

none: для этого контейнера отключит все сети.
Обычно используется в сочетании с пользовательским сетевым драйвером. Ни один не доступен для swarm услуг.

Сетевые плагины: вы можете устанавливать и использовать сторонние сетевые плагины с Docker.
Эти плагины доступны в Docker Hub или у сторонних поставщиков.


Обзор сетевого драйвера

bridge подходят, когда вам нужно несколько контейнеров для связи на одном хосте Docker.

host подходят, когда сетевой стек не должен быть изолирован от хоста Docker, но вы хотите, чтобы другие аспекты контейнера были изолированы.

overlay подходят, когда вам нужны контейнеры, работающие на разных хостах Docker, или нескольких приложений, работающих вместе с сервисами Swarm.

macvlan подходят, когда вам нужны контейнеры, чтобы они выглядели как физические хосты в вашей сети, каждый из которых имеет уникальный mac адрес.

Сторонние сетевые плагины позволяют интегрировать Docker со специализированными сетевыми стеками.


Вывести список сетей:
docker network ls

Где:
NETWORK ID -  Уникальный идентификатор сети.
NAME - Имя сети.
DRIVER - Драйвер сети.
SCOPE - Область использования.


Создание сетей(справка):
docker network create --help


Создание сети (типа сетевой мост):
docker network create network_name1
docker network create --driver=bridge network_name2
docker network create --subnet 10.0.3.0/24 --gateway=10.0.3.1 --ip-range 10.0.3.0/24 --driver=bridge --label=my_network network_name3


Создание сети (типа macvlan):
docker network create -d macvlan --subnet=10.0.2.0/24 --gateway=10.0.2.1 -o parent=enp0s3 network_name4


Запуск контейнера с привязкой к сети:
docker run -it --name=debian_network_name2 --net network_name2 debian /bin/bash
docker run -it --name=debian_network_name3 --net network_name3 --ip=10.0.3.12 debian /bin/bash


Отключение \ подключение сети к контейнеру:
docker network disconnect NETWORK_ID CONTAINER_ID
docker network connect NETWORK_ID CONTAINER_ID


Получим информацию о сети (network_name3):
docker network inspect network_name3


Удаление сети:
docker network rm NETWORK_ID


Кластеризация Docker Swarm:


Упрощенно: Docker Swarm нужен для объединения нескольких Docker-хостов в один виртуальный хост


Допустим у нас есть 2 сервера с Docker

Управляющий узел - по сути менеджер для рабочих узлов
Если управляющих несколько, то среди них будет лидер

10.0.2.10 - управляющий узел
10.0.2.11 - рабочий узел


На управляющем:

Запустим кластер:
docker swarm init --listen-addr 10.0.2.10:2377

Команда вернет токен для подключения


Вывести список участников кластера:
docker node ls


На рабочем:


Присоеденим к кластеру:
docker swarm join --token <TokenId> 10.0.2.10:2377


В итоге видим - This node joined a swarm as a worker.


Вывести токены можно так:
docker swarm join-token worker
docker swarm join-token manager

 

На управляющем:


Запустим сервис с двумя экземплярами:
docker service create --name NginxService --publish 80:80 --replicas 2 nginx:latest


Создадим конфиг nginx_vhosts.conf:


Создаем объект конфига:
docker config create nginx_vhosts nginx_vhosts.conf


Проверяем:
docker config ls


Проверяем его содержимое:
docker config inspect nginx_vhosts --pretty


Добавим конфиг nginx_vhosts сервису NginxService:
docker service update --config-add nginx_vhosts NginxService


Можете проверить:
curl http://10.0.2.10:80
curl http://10.0.2.11:80


Показать, статус службы, количество экземпляров:
docker service ls


Проверяем наличие файла в контейнере:
docker exec -it 0ee33b25777e cat /nginx_vhosts


Положить конфиг в каталог nginx с помощью src и target:
docker service update --config-add src=nginx_vhosts,target="/etc/nginx/conf.d/docker_swarm.local.conf" NginxService


Проверяем:
docker exec -ti $(docker ps | tail -n 1 | awk '{print $1}') ls -l /etc/nginx/conf.d


На хостовых машинах:
echo '10.0.2.11 docker_swarm.local' >> /etc/hosts


Создадим и передадим index.html файл:

echo "From docker_swarm.local" > index.html

docker config create docker_swarm_index index.html

docker service update --config-add src=docker_swarm_index,target="/usr/share/nginx/html/index.html" NginxService


Проверяем:
curl docker_swarm.local
curl -I docker_swarm.local


Увеличивайть и уменьшать количество экземпляров сервиса можно так, соответственно и воркеров понабится более:
docker service scale NginxService=3
docker service scale NginxService=4
docker service scale NginxService=3
docker service scale NginxService=2

Вы будете наблюдать, как они появляются и исчезают в docker ps


Удалить сервис по id:
docker service rm <ServiceId>


Вообще очень хороший туториал:
https://github.com/nginxinc/NGINX-Demos/tree/master/nginx-swarm-demo

Еще хороший туториал на русском:
https://rtfm.co.ua/docker-ispolzovanie-configs-i-secrets-v-swarm/

 


Комментарии пользователей

Эту новость ещё не комментировалиНаписать комментарий
Анонимам нельзя оставоять комментарии, зарегистрируйтесь!

© Snakeproject.ru создан в 2013 году. При копировании материала с сайта - оставьте ссылку.


Яндекс.Метрика

Goon Каталог сайтов Рейтинг@Mail.ru