Цель этой статьи состоит в том, чтобы дать понимание высокого уровня того, что они есть, как использовать их и объяснить обычно используемый синтаксис и семантику. Статья может быть немного длинной Но причина, по которой я предпочитал не попасть в серию, заключается в том, что в каждом аспекте контейнерного решения нет глубокого погружения.
Точки обсуждения в этой статье
- Докер
- Docker Cli
- Контейнер
- Взаимодействие с контейнерами
- Изображение
- Создание изображения
- Постоянные данные
- Привязка крепления
- Тома
- Сеть
- Docker Compose
- Рой
Если конкретный раздел не является областью вашего интереса, не стесняйтесь прыгать между разделами. Сказав, что давайте добраться до этого.
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 файловая система это хорошая статья. Причина создания изображений слоистыми модами в основном для:
- Ускорить время запуска
- Избегайте хранения дубликатов файлов
Создание изображения
Изображения могут быть созданы либо с существующего изображения, либо из 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, например, как
- Легко масштабируясь и вниз
- Перезапуск контейнера, если он не удается
- Развертывание с нулевым временем простоя
- Безопасная связь между контейнерами
- Управлять тем, какие контейнер работает куда
- Хранение конфиденциальной информации и доступным только для определенного контейнера
Вот где Режим роя
Приходит на картинку и решает проблемы, указанные выше. 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»