Шаблон для выполнения работы
Для выполнения работы создайте новый файла в Obsidian, назовите его “Фамилия Имя Отчество Группа”, скопируйте и вставьте представленный ниже шаблон:
# Лабораторная работа №5
## Практическая часть
```bash
Вставьте сюда вывод команд из этапа 1.1
```
```bash
Вставьте сюда вывод команд из этапа 1.2
```
```bash
Вставьте сюда вывод команд из этапа 1.3
```
```bash
Вставьте сюда вывод команд из этапа 1.4
```
```bash
Вставьте сюда вывод команд из этапа 1.5
```
```bash
Вставьте сюда вывод команд из этапа 1.6
```
```bash
Вставьте сюда вывод команд из этапа 2.1
```
```bash
Вставьте сюда вывод команд из этапа 2.2
```
```bash
Вставьте сюда вывод команд из этапа 3.1
```
```bash
Вставьте сюда вывод команд из этапа 3.2
```
```bash
Вставьте сюда вывод команд из этапа 3.3
```
```bash
Вставьте сюда вывод команд из этапа 4.1
```
```bash
Вставьте сюда вывод команд из этапа 4.2
```
```bash
Вставьте сюда вывод команд из этапа 4.3
```
```bash
Вставьте сюда вывод команд из этапа 5.1
```
```bash
Вставьте сюда вывод команд из этапа 5.2
```
```bash
Вставьте сюда вывод команд из этапа 5.3
```
## Вопросы для самопроверки
1. Что такое Docker-сеть и какие функции она выполняет?
2. Какие типы сетей существуют в Docker? Опишите их основные характеристики.
3. Что происходит, если контейнер подключается к сети типа none?
4. Какая сеть используется Docker по умолчанию для контейнеров, если не указана другая?
5. В чем разница между сетями типа bridge и host? Когда следует использовать каждый из них?
6. Какая команда используется для создания новой сети в Docker?
7. Как подключить контейнер к существующей сети Docker?
8. Как проверить, в каких сетях находятся контейнеры?
9. Как удалить сеть, если она больше не используется?
10. Что такое Docker DNS и как он помогает в взаимодействии контейнеров в одной сети?
Теоретическая часть
Теоретическая часть: Сети в Docker
Docker предоставляет мощный механизм работы с сетями, который позволяет настраивать взаимодействие между контейнерами, их доступность и безопасность. В этой части мы рассмотрим ключевые концепции, типы сетей, а также их особенности.
1. Что такое сеть в Docker?
Сеть в Docker — это виртуальная среда, которая соединяет контейнеры между собой и/или с внешним миром. Docker автоматически создаёт сети и подключает контейнеры, но также предоставляет возможность создавать пользовательские сети с тонкой настройкой.
2. Типы сетей Docker
Docker поддерживает несколько типов сетей, которые отличаются своим поведением и назначением:
2.1. Bridge (по умолчанию)
- Это локальная сеть, создаваемая Docker по умолчанию.
- Каждый контейнер в bridge-сети получает собственный IP-адрес.
- Контейнеры могут взаимодействовать через IP или имя (DNS).
- Пример: контейнеры на одном хосте могут обмениваться данными через bridge-сеть.
2.2. Host
- Контейнер использует сеть хоста напрямую, не создавая отдельной виртуальной сети.
- Преимущество: высокая производительность (нет изоляции сети).
- Ограничение: контейнер теряет сетевую изоляцию.
2.3. None
- Контейнер полностью изолирован от сети.
- Используется для создания максимальной изоляции.
2.4. Macvlan
- Контейнер получает MAC-адрес, и его можно напрямую подключить к физической сети.
- Подходит для взаимодействия с существующими сетевыми устройствами.
- Используется в специфических сетевых конфигурациях.
3. Основные команды для работы с сетями
Создание сети:
docker network create <имя_сети>
Можно указать тип сети:
docker network create --driver bridge my_custom_network
Просмотр всех сетей:
docker network ls
Удаление сети:
docker network rm <имя_сети>
Подключение контейнера к сети:
docker network connect <имя_сети> <имя_контейнера>
Отключение контейнера от сети:
docker network disconnect <имя_сети> <имя_контейнера>
4. DNS и взаимодействие контейнеров
В пользовательских сетях Docker автоматически настраивает DNS. Это позволяет обращаться к контейнерам по их именам (а не IP-адресам). Например:
- Контейнер с именем
nginx1
можно “пинговать” из другого контейнера, подключенного к той же сети:ping nginx1
5. Сетевые режимы (Network Modes)
Режим | Особенности | Пример использования |
---|---|---|
Bridge | Изоляция между контейнерами | Развертывание приложений на одном хосте |
Host | Общая сеть с хостом | Приложения с высокими требованиями к сети |
None | Полная изоляция | Контейнеры для вычислений без сети |
Практическая часть
Сбросьте все правила iptables, которые мы сделали в прошлой лабораторной работе. Они могут помешать работе с сетью в docker.
Задание выполняется на первой машине. Для выполнения вам понадобится установить docker.
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
1. Создание изолированной сети (Bridge-сеть)
Цель: Создать пользовательскую сеть и проверить взаимодействие между контейнерами через DNS.
Создайте сеть с именем
my_custom_network
:docker network create my_custom_network
- Проверьте, что сеть создана:
docker network ls
- Проверьте, что сеть создана:
Запустите два контейнера с образом
nginx
:docker run -d --name nginx1 --network my_custom_network nginx docker run -d --name nginx2 --network my_custom_network nginx
Проверьте взаимодействие между контейнерами:
- Зайдите в первый контейнер:
docker exec -it nginx1 bash
- Внутри контейнера выполните команду:
ping nginx2
- Контейнер
nginx1
должен успешно пинговатьnginx2
.
- Зайдите в первый контейнер:
Остановите контейнеры и удалите их:
docker stop nginx1 nginx2 docker rm nginx1 nginx2
2. Подключение контейнера к нескольким сетям
Цель: Создать две сети и подключить контейнер к обеим.
Создайте две сети:
docker network create frontend_network docker network create backend_network
Запустите контейнер
nginx1
в сетиfrontend_network
:docker run -d --name nginx1 --network frontend_network nginx
Запустите контейнер
nginx2
в сетиbackend_network
:docker run -d --name nginx2 --network backend_network nginx
Подключите
nginx1
ко второй сети (backend_network
):docker network connect backend_network nginx1
Проверьте взаимодействие:
- Зайдите в контейнер
nginx1
:docker exec -it nginx1 bash
- Пингуйте контейнер
nginx2
:ping nginx2
- Убедитесь, что контейнеры взаимодействуют через общую сеть
backend_network
.
- Зайдите в контейнер
Отключите
nginx1
отbackend_network
:docker network disconnect backend_network nginx1
3. Использование контейнера для тестирования сети
Цель: Использовать утилиты для проверки взаимодействия контейнеров.
Запустите контейнер
busybox
в сетиmy_custom_network
:docker run -it --rm --name test_busybox --network my_custom_network busybox
Проверьте взаимодействие с контейнером
nginx1
:- Выполните команды:
ping nginx1
- Убедитесь, что
test_busybox
успешно пингует контейнерnginx1
.
- Выполните команды:
4. Работа с сетевым режимом “host”
Цель: Изучить поведение контейнеров в режиме “host”.
Запустите контейнер в режиме
host
:docker run --rm --network host busybox ifconfig
Проверьте, какие сетевые интерфейсы доступны в контейнере.
- Вы заметите, что контейнер использует те же сетевые интерфейсы, что и хост.
Проверьте доступность хостовых сервисов из контейнера:
- Если на хосте запущен веб-сервер (например, на
localhost:80
), попробуйте подключиться к нему из контейнера:wget -qO- http://localhost
- Если на хосте запущен веб-сервер (например, на
5. Дополнительное задание с docker-compose
Создайте файл
docker-compose.yml
:version: '3.8' services: app: image: nginx networks: - custom_network db: image: busybox command: sleep 3600 networks: - custom_network networks: custom_network: driver: bridge
Запустите контейнеры с помощью docker-compose:
docker-compose up -d
Проверьте взаимодействие между сервисами через сеть
custom_network
:docker exec -it <app_container_id> ping db
Остановите и удалите контейнеры:
docker-compose down