Настройка сетевых режимов контейнера#

В данном разделе представлена информация по установке различных сетевых режимов.

Запуск контейнеров со статическим IP-адресом#

Команда podman run с опцией --ip устанавливает сетевой интерфейс контейнера на определенный IP-адрес. Чтобы убедиться в правильной установке IP-адреса, запустите команду podman inspect.

Установите сетевой интерфейс контейнера на IP-адрес хх.хх.х.хх:

podman run -d --name=myubi --ip=xx.xx.x.xx registry.example.ru/ubi9/ubi

Пример вывода команды:

efde5f0a8c723f70dd5cb5dc3d5039df3b962fae65575b08662e0d5b5f9fbe85

Можете проверить корректность установки IP-адреса при помощи команды:

podman inspect --format='{{.NetworkSettings.IPAddress}}' myubi

Пример вывода команды:

hh.hh.hh.hh

Где hh.hh.hh.hh – IP-адрес.

Запуск плагина DHCP без systemd#

Используйте команду podman run --network для подключения к пользовательской сети. В то время как большинство образов контейнеров не имеют DHCP-клиента, плагин dhcp действует как прокси-клиент DHCP для взаимодействия контейнеров с DHCP-сервером.

Примечание

Данный сценарий применим только к контейнерам пользователей с административными полномочиями. Контейнеры пользователей без административных полномочий не используют плагин dhcp.

  1. Вручную запустите плагин dhcp:

    /usr/libexec/cni/dhcp daemon &
    

    Пример вывода команды:

    [1] 4966
    
  2. Проверьте работу плагина:

    ps -a | grep dhcp
    

    Пример вывода команды:

    4966 pts/1    00:00:00 dhcp
    
  3. Запустите контейнер alpine:

    podman run -it --rm --network=example alpine ip addr show enp1s0
    

    Пример вывода команды:

    Resolved "alpine" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
    Trying to pull docker.io/library/alpine:latest...
    ...
    Storing signatures
    
    2: eth0@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
        link/ether f6:dd:1b:a7:9b:92 brd ff:ff:ff:ff:ff:ff
        inet hh.hh.hh.hh/24 brd hh.hh.hh.hh scope global eth0
        ...
    

    В данном примере:

    • Опция --network=example определяет сеть с именем example для дальнейшего подключения;

    • Команда ip addr show enp1s0 внутри контейнера alpine проверяет IP-адрес сетевого интерфейса enp1s0;

    • Сеть хоста - hh.hh.hh.hh/24;

    • Интерфейс eth0 арендует IP-адрес hh.hh.hh.hh для контейнера alpine.

    Примечание

    Эта конфигурация может исчерпать доступные DHCP-адреса при наличии большого количества контейнеров с коротким временем работы и DHCP-сервера с длительной арендой.

Запуск плагина DHCP с помощью systemd#

Можно использовать юнит-файл systemd для запуска плагина dhcp:

  1. Создайте юнит-файл сокета:

    cat /usr/lib/systemd/system/io.podman.dhcp.socket
    

    Приер вывода команды:

    [Unit]
    Description=DHCP Client for CNI
    
    [Socket]
    ListenStream=%t/cni/dhcp.sock
    SocketMode=0600
    
    [Install]
    WantedBy=sockets.target
    
  2. Создайте юнит-файл службы:

    cat /usr/lib/systemd/system/io.podman.dhcp.service
    

    Пример вывода команды:

    [Unit]
    Description=DHCP Client CNI Service
    Requires=io.podman.dhcp.socket
    After=io.podman.dhcp.socket
    
    [Service]
    Type=simple
    ExecStart=/usr/libexec/cni/dhcp daemon
    TimeoutStopSec=30
    KillMode=process
    
    
    [Install]
    WantedBy=multi-user.target
    Also=io.podman.dhcp.socket
    
  3. После запустите службу:

    systemctl --now enable io.podman.dhcp.socket
    
  4. Для проверки состояния сокета используйте команду:

    systemctl status io.podman.dhcp.socket
    

    Пример вывода команды:

    io.podman.dhcp.socket - DHCP Client for CNI
    Loaded: loaded (/usr/lib/systemd/system/io.podman.dhcp.socket; enabled; vendor preset: disabled)
    Active: active (listening) since Mon 2022-01-03 18:08:10 CET; 39s ago
    Listen: /run/cni/dhcp.sock (Stream)
    CGroup: /system.slice/io.podman.dhcp.socket
    

Плагин macvlan#

Хост-система не имеет сетевого доступа к контейнеру. Чтобы разрешить сетевые соединения извне, контейнер должен иметь IP-адрес в той же сети, что и хост. Плагин macvlan разрешает подключение к общей сети.

Примечание

Данный сценарий применим только к контейнерам пользователей с административными полномочиями. Контейнеры пользователей без административных полномочий не используют плагины dhcp и macvlan.

Примечание

Можно создать сеть macvlan с помощью команды podman network create --macvlan.

Переключение сетевого набора средств с CNI на Netavark#

Ранее контейнеры могли использовать DNS только при подключении к одному плагину контейнерного сетевого интерфейса (CNI). Netavark - это сетевой набор средств для контейнеров, который можно использовать с Podman и другими приложениями для управления контейнерами Open Container Initiative (OCI). С его помощью контейнеры в нескольких сетях получают доступ к контейнерам в любой из этих сетей.

Основные возможности Netavark:

  • Создание, управление и удаление сетевых интерфейсов, включая интерфейсы bridge и MACVLAN;

  • Изменение настроек брандмауэра, таких как преобразование сетевых адресов (NAT) и правил отображения портов;

  • Поддержка IPv4 и IPv6;

  • Улучшенная поддержка контейнеров в нескольких сетях.

Сценарий#

  1. При отсутствии файла /etc/containers/containers.conf скопируйте файл /usr/share/containers/containers.conf в каталог /etc/containers/:

    cp /usr/share/containers/containers.conf /etc/containers/
    
  2. Измените файл /etc/containers/containers.conf, добавив следующее значение в раздел [network]:

    network_backend="netavark"
    
  3. При наличии контейнеров или pods сбросьте хранилище в исходное состояние:

    podman system reset
    
  4. Перезагрузите систему:

    reboot
    
  5. Убедитесь, что сетевой набор средств изменен на Netavark:

    cat /etc/containers/containers.conf
    

    Пример вывода команды:

    ...
    [network]
    network_backend="netavark"
    ...
    

    Примечание

    При работе с Podman 4.0.0 или более поздней версией используйте команду podman info, чтобы проверить настройки сетевого набора средств.

Переключение сетевого набора средств с Netavark на CNI#

Можно переключить сетевой набор средств с Netavark на CNI.

Внимание

Сетевой набор средств CNI устарел. Используйте вместо него Netavark.

  1. При отсутствии файла /etc/containers/containers.conf скопируйте файл /usr/share/containers/containers.conf в каталог /etc/containers/:

    cp /usr/share/containers/containers.conf /etc/containers/
    
  2. Измените файл /etc/containers/containers.conf, добавив следующее значение в раздел [network]:

    network_backend="cni"
    
  3. При наличии контейнеров или pods сбросьте хранилище в исходное состояние:

    podman system reset
    
  4. Перезагрузите систему:

    reboot
    
  5. Убедитесь, что сетевой набор средств изменен на CNI:

    cat /etc/containers/containers.conf
    

    Пример вывода команды:

    ...
    [network]
    network_backend="cni"
    ...
    

    Примечание

    При работе с Podman 4.0.0 или более поздней версией используйте команду podman info, чтобы проверить настройки сетевого набора средств.