Рубрики
Uncategorized

Понимание Docker, Docker Compose & Swarm

Цель этой статьи — предоставить высокое понимание того, что они есть, как использовать … Tagged с докером, контейнером, рой, DevOps.

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

Точки обсуждения в этой статье

  1. Докер
    • Docker Cli
    • Контейнер
      • Взаимодействие с контейнерами
    • Изображение
      • Создание изображения
    • Постоянные данные
      • Привязка крепления
      • Тома
    • Сеть
  2. Docker Compose
  3. Рой

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

1. Докер

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

Docker Cli

Команды, используемые в этой статье, взяты из Windows Machine, и если вы используете Mac/Linux, команды могут быть разными (вам может потребоваться запустить команды как sudo ). Постоянно Команды Docker CLI были структурированы следующим образом

docker [OPTIONS] COMMAND

И по мере того, как продукт становится больше и больше, они также представили Команды управления сделать CLI более организованным. Структура команды для Команды управления в следующем

docker [MANAGEMENT COMMAND] [SUB COMMAND] [SUB COMMAND OPTIONS]

Для каждой команды есть -Хельп Опция, которая предоставляет всю необходимую информацию об команде и ее соответствующих параметрах.

Пример-1

docker container --help

будет иметь следующий выход. -Хельп Команда довольно полезна, потому что с обширными наборами функций Docker может быть трудно запомнить все команды.

Контейнер

Запускают экземпляры изображения Docker, и можно запустить несколько контейнеров из одного и того же изображения Docker. Изображения объясняются в разделе изображения, пока давайте посмотрим на простую команду контейнера.

Пример-2

 docker container run --name nginx-server --publish 80:80 nginx

или альтернативно

 docker container run --name nginx-server --publish 80:80 --detach nginx

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

  • контейнер : Команда управления используется для выполнения всех команд, связанных с контейнерами.
  • —имя : Устанавливает имя контейнера.

Для нескольких контейнеров невозможно иметь одинаковое имя, поскольку имя контейнера будет использоваться для разрешения DNS (что подробно объясняется в разделе сети).

  • -Попубликация : Карты контейнеров, работающих в порту в хост -порт. В этом случае мы проверяем это, посетив http://localhost: 80 из браузера. Шаблон сопоставления портов следующим образом
... --publish [HOST PORT]:[CONTAINER PORT] ...

Невозможно использовать один и тот же хост -порт для запуска нескольких контейнеров.

  • -detach : Запускает контейнер на фоне и печатает только идентификатор контейнера
  • nginx : Название изображения, с которого мы хотим запустить наш контейнер

Другой пример

Пример-3

docker container run --name db-server --env MYSQL_ROOT_PASSWORD=my-sample-password --detach mysql

Некоторые изображения требуют переменной среды для запуска (например, сервер базы данных) и --env Опция используется для прохождения переменной среды от CLI.

Другие общие команды контейнеров

Контейнер Docker LS : списки всех работающих контейнеров Контейнер Docker LS -A : списки всех работающих контейнеров, которые не являются Docker Container Stop Nginx-Server : Останавливает контейнер с именем nginx-server Docker Container Start Nginx-Server : Запускает контейнер с именем nginx-server Docker Container Logs Nginx-Server : печатает журналы из запущенного контейнера с именем nginx-server Docker Container RM Nginx-Server : Удаление контейнера с именем Nginx-Server

Как вы можете видеть выше, команды являются самостоятельными и проливными вперед. Намерение показать эти базовые команды — продемонстрировать и познакомиться с командами и использованием. Нет необходимости запоминать ничего из этого, так как вы можете получить те и многие другие подкоманды контейнер Команда, которая не указана выше, просто используя -Хельп командование

Взаимодействие с контейнерами

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

1. С помощью команды запуска

При запуске контейнера с помощью запустить Команда можно добавить -it опция и запустите контейнер в интерактивном режиме.

Пример-4

docker container run -it --name nginx-server-it --publish 8080:80 nginx bash

Даст нам Bash Консоль внутри nginx-server-it контейнер для взаимодействия. Вывод показан ниже С помощью этого метода, как только мы выйдем из интерактивного окна (в данном случае bash к терминалу) контейнер будет остановлен автоматически.

2. Использование команды EXEC

exec Команда используется для взаимодействия с запущенным контейнером.

Пример 5
docker container exec -it nginx-server-it bash

Эта команда будет иметь такой же результат для предыдущей команды ( ... run -it ). Разница в том, что после того, как мы выйдем из интерактивного окна, контейнер будет работать.

Изображение

Это просто двоичные файлы, библиотеки и исходный код, которые составляют приложение. и изображения используются в качестве шаблона для построения контейнера. Изображения построены слоистым образом и Союза файловая система используется под капотом для достижения этого. Союза файловая система не рассматривается не в этой статье, а для тех из вас, кто хочет узнать больше об этом больше Глубокое погружение в Docker Internals — Union файловая система это хорошая статья. Причина создания изображений слоистыми модами в основном для:

  1. Ускорить время запуска
  2. Избегайте хранения дубликатов файлов
Создание изображения

Изображения могут быть созданы либо с существующего изображения, либо из Dockerfile Анкет Давайте посмотрим на каждый метод.

  • Создание изображения из существующего изображения тег Команда может использоваться для создания из другого изображения, как показано ниже

Пример 6

 docker image tag nginx sample/my-nginx

Вывод будет выглядеть как Хотя есть недавно созданное изображение Id Атрибут для обоих изображений одинаковы. Это связано с тем, что слои, используемые для построения обоих изображений, идентичны для того, чтобы слои совпадают между двумя изображениями (это связано с файловой системой Союз ).

  • Создание изображения из Dockerfile

DockerFile состоит из всех команд, которые пользователь может использовать из CLI. Вот быстрый обзор команд и описания

От : Устанавливает базовое изображение для последующей инструкции Workdir : Определяет рабочий каталог изображения Эн : Переменные среды, как ожидается, запустит контейнер, аналогичный mysql Пример выше. Запустить : Запускать команды внутри контейнера Копия : Копирует файлы из источника в целевой каталог РАЗОБЛАЧАТЬ : Открытый контейнерный порт. Этот порт может быть сопоставлен с портом хоста, используя -Попубликация команда, как показано в примере выше. CMD : Окончательная команда, которая работает при запуске контейнера.

Это наиболее часто используемые команды для обширного списка всех доступных команд Официальная документация это отличное место.

  • Рекомендуется разместить команды для часто изменяющихся элементов (таких как исходный код) внизу и команды для элементов, которые не так часто меняются вверху. Как и порядок командных записей определяет, как строится изображение.

  • В каждом Dockerfile Должно быть От & CMD команды и уточнить, нет ли нет CMD командование в Dockerfile это означает CMD определяется на базовом изображении и унаследовано через От командование

Пример-7

Создать файл с именем Dockerfile со следующим контентом

FROM nginx
WORKDIR /usr/share/nginx/html
COPY . .

Создать index.html файл со следующим контентом





    
    
    
    Document


    

Docker is awsome!

Из корневого каталога запустите следующую команду

docker image build --tag sample/my-nginx-2 .

Большой! Вы создали свое собственное изображение, которое вы можете проверить, запустив ls командование Чтобы сделать вещи более интересными, давайте запустить созданное изображение и увидеть внесенные изменения.

 docker container run --rm -p 80:80 sample/my-nginx-2

При посещении Localhost Из браузера вы должны получить что -то подобное

Постоянные данные

Контейнеры по дизайну недолговечны и неизменны (перераспределение не изменяется). Этот дизайн ставит необходимость в постоянных данных в качестве отдельной проблемы, и есть два решения Docker для постоянных данных, а именно Привязка крепления и Тома Анкет

Привязка крепления

Это способ установить файловую систему хост -машин в контейнер. Хотя это не часто используется в производстве, это лучший способ местного тестирования и разработки. Давайте посмотрим на пример, выполнив следующую команду Внутренний корневой каталог примера-7

docker container run --rm --publish 8080:80 --volume ${pwd}:/usr/share/nginx/html/ nginx

Пока контейнер работает, если index.html Файл обновляется в хост -машине. Эти изменения также будут отражены из работающего контейнера. Для демонстрации обновления index.html как показано ниже





    
    
    
    Document


    

[Content Updated] Docker is awsome!

После этого обновления вы можете увидеть изменения из браузера, как показано ниже

Совет Для ссылки на текущий каталог, когда ОПАСПОЛНЕНИЕ СВЯЗИ от CLI $ {pwd} — PowerShell $ (pwd) — Mac/linux % cd% — командная строка

Тома

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

Первое место для указания тома находится в Dockerfile с помощью Том командование Dockerfile баз данных (например, Postgres, MySQL) настраиваются, чтобы включить объем.

Пример-8
docker container run --rm --env POSTGRES_PASSWORD=test-password postgres

Начнем с контейнера Postgres, затем мы сможем проверить объемы, используя следующую команду

docker volume ls

Чтобы сделать вещи еще интереснее, мы также можем осмотреть громкость

docker volume inspect [VOLUME_NAME]

Вывод будет выглядеть так

Как вы могли бы заметить, проблема с этим названием тома не читается. Это можно исправить, назвав громкость, используя следующую команду

Пример-9
docker container run --rm --env POSTGRES_PASSWORD=test-password --volume my-db-volume:/var/lib/postgresql/data postgres

Если мы теперь проверим объем, он будет выглядеть следующим образом, что более читаемо.

Примечание Разница в синтаксисе между Привязка крепления & Названный том Это путь хоста Привязка крепления Предшествует / (на Mac/linux) или по // (В окнах).

Сеть

Docker Network — это в основном способ сделать работающие контейнеры доступными из внешнего мира (это может быть Интернет или локальная сеть) и позволяет контейнерам общаться друг с другом. курс, это намного больше Но я не буду глубоко в этой статье. Создание виртуальной сети так же просто, как и запуск Создать команда, как показано ниже

Пример-10
docker network create my-network

Мы можем запустить несколько контейнеров в этом контейнере, выполнив следующую команду

docker container run --rm --network my-network --name nginx1 nginx
docker container run --rm --network my-network --name nginx2 nginx

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

Поскольку оба контейнера ( nginx1 , nginx2 ) находятся в одной и той же виртуальной сети, можно использовать имя контейнера в качестве доменного имени и общаться между контейнерами. от Пример 5 Мы можем использовать exec Команда открыть Bash & Run Скручивание и посмотреть, сможем ли мы добраться до другого контейнера

docker container exec -it nginx1 bash
curl nginx2

Результат показан ниже

Примечание Bridge (или Docker0) — это виртуальная сеть Docker Docker по умолчанию, и он не поддерживает использование имени контейнера в качестве доменного имени, даже если контейнер работает в одной и той же виртуальной сети.

Следующий раздел посвящен Docker Compose, но до того, как это приветствует чтение, большинство важных основных основ. Поскольку вы увидите, что Docker Compose — это лишь более организованный способ сделать ранее упомянутые пункты. Давай доберемся до этого …

Docker Compose

Это упрощенный способ управления несколькими контейнерами одновременно. Docker-Compose отлично работает как в производстве, так и в местном развитии. Docker-Compose состоит из YML Файл конфигурации и CLI Инструмент для управления контейнерами с помощью файла конфигурации. Обзор синтаксиса файлов конфигурации

version:[] 
services: 
   service_name1:
         .
         .
   service_name2:
         . 
         . 
   service_nameN:
volumes:
   named_volume1:
   named_volume2:
        .
        .
   named_volumeN:
networks:
   network1:
   netwprk2:
      .
      .
   networkN:     

Для лучшего понимания общего синтаксиса, определенного выше, давайте посмотрим на пример. Для этого примера создайте файл с названием Docker-compose.yml в том же каталоге, что и Пример-7

Пример-11

version: "3.4"                                       # Specifies the docker compose file format
services: 
    nginx-simple:                                    # Service name
        image: nginx                                 # Image name & docker checks if image is available locally if not image will be pulled first 
        ports:                                       # Expose ports to make services accssible from outside. the port mapping is read as map host's port 80 to container port 80 
          - 80:80                                    # host_port:container_port
    nginx-bindmount:
        image: nginx
        volumes:                                     # defines the volume for the container   
          - .:/usr/share/nginx/html                  # BindMapping of the files in the current directory(in host) into containers path (which is /usr/share/nginx/html). the "." indicates current host directory  
        ports: 
          - 5005:80
        depends_on:                                  # defines the priority of the services. in this case nginx-bindmount is dependent on nginx-simple therefor nginx-simple has to start first
          - nginx-simple                             # list of services that nginx-bindmount is dependent up on
    nginx-custom-image:                  
        build:                                       # Tells docker we want to build the image from local Dockerfile
          context: .                                 # Defines the directory of the Dockerfile in the host machine. "." indicates current host dircetory 
          dockerfile: Dockerfile                     # name of the Dockerfile
        ports: 
          - 5006:80
    nginx-named-volume:                              
        image: mysql
        volumes: 
          - db-volume:/var/lib/mysql                 # defines named volume called db-volume for nginx-named-volume service to store persistent data
        environment:                                 # passes list of environment variables into nginx-named-volume service
          - MYSQL_ROOT_PASSWORD=my-password          # enviroment variable variable_key=value, in this case MYSQL_ROOT_PASSWORD is variable key & my-password is the corresponding value   

volumes:                                             # defines list the named volumes
   db-volume:                                        # entrie of named volume

Я надеюсь, что комментарии к файлу Compose достаточно объяснены для каждой записи. Теперь Бег

docker compose up

Начнем все контейнеры и настройку всех объемов, сети. Да! Это так просто. & для очистки всего (контейнер, объем и сети) Используйте следующую команду

docker compose down

Docker Compose также содержит старт и Стоп Команды, чтобы запустить и остановить службы без уборки всего.

Примечание : Docker Compose Не прилагает сервисы с виртуальной сетью Docker по умолчанию (называется Bridge ), скорее, он создает собственную сеть и запускает службы в этой сети. Таким образом, услуги в том же Docker-Compose Файл конфигурации может общаться друг с другом, используя Название службы как доменное имя.

Рой

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

  1. Легко масштабируясь и вниз
  2. Перезапуск контейнера, если он не удается
  3. Развертывание с нулевым временем простоя
  4. Безопасная связь между контейнерами
  5. Управлять тем, какие контейнер работает куда
  6. Хранение конфиденциальной информации и доступным только для определенного контейнера

Вот где Режим роя Приходит на картинку и решает проблемы, указанные выше. Swarm — это Docker, встроенное в кластеризационное решение.

Узлы менеджера : Узлы с надлежащим авторизацией и конфигурацией для управления роем. Рабочие узлы : Узлы, несущие ответственность за выполнение задачи и нет полномочий управлять роем. База данных RAFT : Является ли база данных, которая находится на всех узлах менеджера, она включает в себя конфигурацию Manager Node, которая гарантирует их авторитет.

По умолчанию режим роя не включен. Чтобы включить режим роя запустить следующую команду.

docker swarm init

Есть несколько способов настроить рой, но для демонстрации некоторых оснований я буду использовать Играть с Docker Анкет

Пример-12

Создайте несколько экземпляров в лаборатории Docker и для инициализации роя. Запустите следующую команду

docker swarm init --advertise-addr 192.168.0.8

IP -адрес должен быть общедоступным IP, чтобы другие экземпляры могли присоединиться к этому рому (в моем случае, это будет 192.168.0.8 ). После создания роя другие экземпляры могут присоединиться к команде, сгенерированной после создания роя

docker swarm join --token [TOKEN] [IP_ADDRESS]


docker swarm join --token SWMTKN-1-64cek9j9nfuysu5v76ydgqxn16te1tfwcyv1beqks023dh1yz2-0y6lj91cx03iwbu53btmsmdm3 192.168.0.8:2377

После присоединения к двум экземплярам в рой мы можем увидеть узлы в рой

docker node ls

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

docker service create --publish 80:80 --replicas 3 nginx

Это создаст три контейнера Nginx и распространит контейнеры в экземпляры с помощью роя. Чтобы увидеть список активных услуг

docker service ls

Чтобы увидеть больше информации о конкретной услуге бежать

docker service ps [SERVICE_NAME | SERVICE_ID]

Как показано выше, есть 3 реплики nginx И они работают в разных случаях. Обновляя количество реплик, мы можем легко масштабироваться и уменьшить масштаб. Еще более интересно, если контейнер не удается в рой по какой -то причине, а затем будет создан автоматически. И если мы снова увидим список контейнеров

Это только верхушка айсберга, вы можете сделать гораздо больше с рой (например, использование секретов, используя Docker Compose с рой), который нельзя объяснить в одной статье. Но я надеюсь, что этого достаточно, чтобы дать вам представление о том, что такое рой и его важность.

Спасибо за чтение. Ваше здоровье!

Оригинал: «https://dev.to/bazenteklehaymanot/understanding-docker-docker-compose-swarm-i31»