Шаблон для выполнения работы

Для выполнения работы создайте новый файла в 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.

  1. Создайте сеть с именем my_custom_network:

    docker network create my_custom_network
    
    • Проверьте, что сеть создана:
      docker network ls
      
  2. Запустите два контейнера с образом nginx:

    docker run -d --name nginx1 --network my_custom_network nginx
    docker run -d --name nginx2 --network my_custom_network nginx
    
  3. Проверьте взаимодействие между контейнерами:

    • Зайдите в первый контейнер:
      docker exec -it nginx1 bash
      
    • Внутри контейнера выполните команду:
      ping nginx2
      
    • Контейнер nginx1 должен успешно пинговать nginx2.
  4. Остановите контейнеры и удалите их:

    docker stop nginx1 nginx2
    docker rm nginx1 nginx2
    

2. Подключение контейнера к нескольким сетям

Цель: Создать две сети и подключить контейнер к обеим.

  1. Создайте две сети:

    docker network create frontend_network
    docker network create backend_network
    
  2. Запустите контейнер nginx1 в сети frontend_network:

    docker run -d --name nginx1 --network frontend_network nginx
    
  3. Запустите контейнер nginx2 в сети backend_network:

    docker run -d --name nginx2 --network backend_network nginx
    
  4. Подключите nginx1 ко второй сети (backend_network):

    docker network connect backend_network nginx1
    
  5. Проверьте взаимодействие:

    • Зайдите в контейнер nginx1:
      docker exec -it nginx1 bash
      
    • Пингуйте контейнер nginx2:
      ping nginx2
      
    • Убедитесь, что контейнеры взаимодействуют через общую сеть backend_network.
  6. Отключите nginx1 от backend_network:

    docker network disconnect backend_network nginx1
    

3. Использование контейнера для тестирования сети

Цель: Использовать утилиты для проверки взаимодействия контейнеров.

  1. Запустите контейнер busybox в сети my_custom_network:

    docker run -it --rm --name test_busybox --network my_custom_network busybox
    
  2. Проверьте взаимодействие с контейнером nginx1:

    • Выполните команды:
      ping nginx1
      
    • Убедитесь, что test_busybox успешно пингует контейнер nginx1.

4. Работа с сетевым режимом “host”

Цель: Изучить поведение контейнеров в режиме “host”.

  1. Запустите контейнер в режиме host:

    docker run --rm --network host busybox ifconfig
    
  2. Проверьте, какие сетевые интерфейсы доступны в контейнере.

    • Вы заметите, что контейнер использует те же сетевые интерфейсы, что и хост.
  3. Проверьте доступность хостовых сервисов из контейнера:

    • Если на хосте запущен веб-сервер (например, на localhost:80), попробуйте подключиться к нему из контейнера:
      wget -qO- http://localhost
      

5. Дополнительное задание с docker-compose

  1. Создайте файл 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
    
  2. Запустите контейнеры с помощью docker-compose:

    docker-compose up -d
    
  3. Проверьте взаимодействие между сервисами через сеть custom_network:

    docker exec -it <app_container_id> ping db
    
  4. Остановите и удалите контейнеры:

    docker-compose down