Wednesday, September 18, 2019

Docker: запускаем Nginx

Логинемся в докер хаб. 
#docker login

 Создадим и запустим простой контейнер на основе Nginx
# docker run --name mynginx1 -P -d nginx
-P (Publish all exposed ports to random ports) сопоставляем порты Nginx(80,443) с произвольным портом из диапазона между 49153 и 65535. 
-d (Run container in background and print container ID) запускаем контейнер в бэкграунде.

Стандартного образа в системе нет, поэтому он был скачан с хаба.
проверяем, что нгинкс работает(номер порта - 52267)
#curl http://localhost:52267

Если вы хотите настроить образ под себя, то нужно модифицировать докерфайл.
Например, сопируем файлы и папки nginx'a.
Файлы, в том числе и  сертификаты, кладем в текущую директорию. Из стандартного образа nginx строим шаблон, открываем порт 443.  
FROM nginx
COPY ./html /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
COPY nginx-selfsigned.crt /etc/ssl/certs/nginx-selfsigned.crt
COPY nginx-selfsigned.key /etc/ssl/certs/nginx-selfsigned.key
EXPOSE 443

Генерируем шаблон
#docker build -t nginx1 .
Запускаем на 443 порту этот шаблон
#docker run -p 443:443 -d nginx1

По умолчанию докер присвоит некоторое имя для вашего контейнера, но вы можете сделать это самостоятельно. Удобнее работать с именованным контейнером. 
#docker run -d -P --name nginxserver nginx1:latest

Если вы хотите добавить некоторые директории в ваш конфиг(не копировать, а смонтировать), то нужно запускать докер таким образом:
docker run --name nginx_server -v /yourfiles/html:/var/www/html:ro \
-v /yourfiles/nginx:/etc/nginx:ro -p 443:443 -d nginx3
\ - используется как перевод каретки(читай объединение строк)
ro - монтируются в контейнер в режиме только чтение

Остановка контейнера с приложением:

#docker stop nginxserver 

Успехов!

Tuesday, September 17, 2019

Docker: архитектура

Docker предоставляет возможность упаковывать и запускать приложение в изолированной среде, называемой контейнером. Изоляция и безопасность позволяют запускать много контейнеров одновременно на одной машине(хосте). Контейнеры являются легкими, потому что не используют гипервизор, но только ресурсы хоста. Docker может быть запущен и на виртуальных машинах, главное чтобы хватило ресурсов!
Docker Engine-это клиент-серверное приложение, состоящее их 3-х основных компонентов:
  •   Сервер, который является типом длительной программы, или проще говоря демон (dockerd). Демон прослушивает запросы API Docker и управляет объектами Docker, такими как изображения, контейнеры, сети и тома.
  •     REST API, определяет интерфейсы, которые программы могут использовать для общения с демоном и инструктировать его, что делать.
  •     Клиент интерфейса командной строки (CLI) (команда docker). Клиент отправляет команды в dockerd, который их выполняет(например, docker run).
Посмотрим на архитектуру докера:

Dockerfile используется как шаблон(набор инструкций), по которому можно сделать образ(docker image). Обратите внимание, что файл создается без разрешения! Каждая инструкция в этом файле создает отдельный слой в образе. При изменении Dockerfile и перестроении изображения перестраиваются только те слои, которые были изменены. Поэтому образы такие легкие и небольшого размера, плюс довольно быстрые, по сравнению с другими технологиями виртуализации.
Например, самый простой dockerfile будет выглядеть так, слой за слоеем:
FROM centos:7
RUN yum update -y
CMD ["bash] 
Создаем образ из этого файла:
#docker build -t image_from .
-f если файл находится вне текущей директории.

На хабре есть отличная статья про файлы докера и команды.
  1. FROM — задаёт базовый (родительский) образ.
  2. LABEL — описывает метаданные. Например — сведения о том, кто создал и поддерживает образ.
  3. ENV — устанавливает постоянные переменные среды.
  4. RUN — выполняет команду и создаёт слой образа. Используется для установки в контейнер пакетов.
  5. COPY — копирует в контейнер файлы и папки.
  6. ADD — копирует файлы и папки в контейнер, может распаковывать локальные .tar-файлы.
  7. CMD — описывает команду с аргументами, которую нужно выполнить когда контейнер будет запущен. Аргументы могут быть переопределены при запуске контейнера. В файле может присутствовать лишь одна инструкция CMD.
  8. WORKDIR — задаёт рабочую директорию для следующей инструкции.
  9. ARG — задаёт переменные для передачи Docker во время сборки образа.
  10. ENTRYPOINT — предоставляет команду с аргументами для вызова во время выполнения контейнера. Аргументы не переопределяются.
  11. EXPOSE — указывает на необходимость открыть порт.
  12. VOLUME — создаёт точку монтирования для работы с постоянным хранилищем.

Docker Image
С помощью docker файла мы сделали новый образ(read only!), который является шаблоном с инструкциями для создания контейнера. Как видно из примера, получившийся шаблон(docker-image) основан на другом шаблоне centos,  но с дополнениями(yum update). Как вариант, вы можете создать свой шаблон, который устанавливает ваше приложение с вашими настройками и конфигами. Также есть возможность опубликовать собственные разработки на docker-hub'e, откуда они будут доступны другим участникам.

Containers(контейнер) - это выполняемый экземпляр образа(самодостаточная ОС, в которой только самое необходимое и код приложения). Вы можете создать, запустить, остановить, переместить или удалить контейнер с помощью Docker API или CLI. Вы можете подключить контейнер к одной или нескольким сетям, присоединить к нему хранилище или даже создать новый образ на основе его текущего состояния.
По умолчанию контейнер изолирован от других контейнеров и от хоста, на котором он запущен. При удалении контейнера все изменения, которые вы сделали за время его работы, если они не хранятся в в постоянном хранилище, потеряются.

Services (сервисы) - позволяют масштабировать контейнеры между несколькими демонами Docker, которые работают вместе в кластере(swarm)с несколькими менеджерами и работниками(manager and workers). Каждый член кластера является демоном Docker, и все демоны взаимодействуют с помощью API Docker.
Служба позволяет определить желаемое состояние, например количество реплик службы, которые должны быть доступны в любой момент времени. По умолчанию служба балансирует нагрузку на всех рабочих узлах кластера.

Успехов!

Friday, September 13, 2019

Linux: настрока синхронизации времени

Допустим, у нас есть сервер с которого мы хотим получать "правильное"(читай, настоящее) время для нашего сервера centos внутри локальной сети. Для этого воспользуемся демоном Chrony. 
    Проверяем установлен ли chrony(в противном случае - yum install chrony)

#systemctl status chronyd 
Включаем:
#systemctl enable chronyd

Редактируем конфигурационный файл:
vi /etc/chrony.conf
Добавляем локальные NTP сервера:
server 10.30.17.234
server 10.30.17.235


Запускаем демона:
#systemctl start chronyd 

Дополнительные команды:
#chronyc sources
#chronyc traking

Успехов!

Docker installation(Установка Докера)

Докер(Docker) - открытая (open) платформа для разработчиков и админов, помогающая проектировать и запускать "контейнеризированные" приложения, главный плюс которого - упаковать приложение со всеми зависимостями в отдельный контейнер(можно даже опубликовать в хабе). Контейнеры не создают такой нагрузки как виртуальные машины, поэтому более эффективно используют ресурсы системы.
"Из википедии: программное обеспечение для автоматизации развёртывания и управления приложениями в среде виртуализации на уровне операционной системы; позволяет «упаковать» приложение со всем его окружением и зависимостями в контейнер, а также предоставляет среду по управлению контейнерами".

Установка Docker'a на CentOS.
1. Для начала нужно удалить старые версии, если они существуют:
#sudo yum remove docker

2. Далее устанавливаем необходимые утилиты и добавляем репозиторий с докером
#yum install -y yum-utils \ device-mapper-persistent-data \ lvm2

 #yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo


3.Далее устанавливаем Docker Engine
#yum install docker-ce docker-ce-cli containerd.io
Установщик предлагает принять PGP-key, проверяем, что ключ совпадает с указанным на сайте:
 060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35
Принимаем.

4. Запускаем Докер
#systemctl start docker
5. Установка завершена, можно запустить первое приложение. 
#docker run hello-world 
 
6. Не забудьте добавить пользователю docker права рута, а то будет неудобно запускать команды используя sudo. И да, я делал все под рутом, что не очень правильно:)
 
Успехов! 

Thursday, September 12, 2019

Linux: немного про систему

Уровень выполнение (запуска).
Уровни выполнения определяют, какие задачи могут выполняться в текущем состоянии (или на текущем уровне выполнения) операционной системы Linux.
 0 - Завершение работы компьютера.
 1 - Однопользовательский режим (обычно имеет псевдоним s или S)
 2 - Многопользовательский режим без поддержки сети.
 3 - Многопользовательский режим с поддержкой сети.
 5 - Многопользовательский режим с поддержкой сети и графической оболочки X Window.
 6 - Перезагрузка компьютера.
Посмотреть уровень запуска системы можно командами:
#who -r 
#runlevel

Виды потоков
  • STDIN (0) Стандартный входной поток. Канал, принимающий данные для обработки и последующей передачи на канал STDOUT и/или STDERR.
  • STDOUT(-1) Стандартный выходной поток. Представляет собой канал записи результатов выполнения каких-либо процессов. 
  • STDERR(-2) Стандартный выходной поток ошибок. В данный канал попадают сообщения об ошибках.
Управление потоками
> Вывод STDOUT в файл
#find /somedir/ -size +20G > /tmp/testfile
>> добавление STDOUT в конец файла
#find /somedir/ -size +20G >> /tmp/testfile
>& вывод STDOUT и STDERR в файл
#find /somedir/ -size +20G >& /tmp/testfile
>2 вывод  STDERR в файл
 #find /somedir/ -size +20G >2 /tmp/testfile
Комбинированный вывод
 #find /somedir/ -size +20G > /tmp/testfile >2 /dev/null
Более детально про потоки.

Команды и описание.
lsmod - Информация о модулях ядра. Объекты которые расширяют функционал ядра.
lspci - информация об устройствах pci
lspcmcia - платы расширения для ноутбуков
lsusb - информацияо usb

С помощью команды udevadm используем следующие параметры:
  • info смотрим информацию;
  • trigger эмуляция некоего события для устройства;
  • settle ожидание завершения обработки;
  • control управление демонами;
  • monitor отслеживание событий;
  • test симуляция события;
Модули управлением ядром:











  • lsmod информация о модулях ядра(Драйвер — модуль ядра, подсказывающий шине, как правильно обращаться с устройством);
  • modinfo информация о конкретном модуле(например, на скрине показана информация о ФС);
  • rmmod удаление модуля;
  • insmod установка модуля;
  • modprobe деликатное удаление или добавление;
Про драйвера все очень подробно расписано.