Обмен данными между контейнерами#
Сетевые режимы и уровни#
В Podman существует несколько сетевых режимов:
bridge- создает еще один сетевой мост по умолчанию;container:<id>- использует общую сеть с контейнером под идентификатором<id>;host- использует сетевой стек хоста;network-id- использует пользовательскую сеть, созданную командойpodman;private- создает новую сеть для контейнера;slirp4nets- создает пользовательский сетевой стек. Используется по умолчанию для контейнеров пользователей без административных полномочий.
Примечание
Режим хоста предоставляет контейнеру полный доступ к локальным системным службам, таким как D-bus, а также системе межпроцессного взаимодействия (IPC), поэтому считается небезопасным.
Проверка сетевых настроек контейнера#
Используйте команду podman inspect с опцией --format для отображения отдельных элементов из выходных данных podman inspect.
Раскройте IP-адрес контейнера:
podman inspect --format='{{.NetworkSettings.IPAddress}}' <containerName>Отобразите все сети, к которым подключен контейнер:
podman inspect --format='{{.NetworkSettings.Networks}}' <containerName>Выведите отображенние портов:
podman inspect --format='{{.NetworkSettings.Ports}}' <containerName>
Взаимодействие между контейнером и приложением#
Между контейнером и приложением доступен обмен данными. Порты приложения находятся в состоянии прослушивания или в открытом состоянии. Они автоматически подключаются к сети контейнера и служат для связи с ним. По умолчанию веб-сервер прослушивает порт 80.
Для установления связи контейнера myubi с приложением web-container выполните следующие шаги:
Запустите контейнер с именем
web-container:podman run -dt --name=web-container docker.io/library/httpdВыведите список всех контейнеров:
podman ps -aПример вывода команды:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b8c057333513 docker.io/library/httpd:latest httpd-foreground 4 seconds ago Up 5 seconds ago web-containerПроверьте контейнер и отобразите его IP-адрес:
podman inspect --format='{{.NetworkSettings.IPAddress}}' web-containerПример вывода команды:
xx.xx.x.xЗапустите контейнер
myubiи убедитесь, что веб-сервер работает:podman run -it --name=myubi ubi9/ubi curl хх.хх.х.х:хх
Связь между контейнером и хостом#
По умолчанию сеть podman - это сетевой мост. Это означает, что сетевое устройство образует мост между сетями контейнера и хоста.
Используется информация из сценария «Взаимодействие между контейнером и приложением».
Убедитесь, что мост настроен:
podman network inspect podman | grep bridgeПример вывода команды:
"bridge": "cni-podman0", "type": "bridge"Отобразите конфигурацию сети хоста:
ip addr show cni-podman0Пример вывода команды:
6: cni-podman0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 62:af:a1:0a:ca:2e brd ff:ff:ff:ff:ff:ff inet hh.hh.hh.hh/16 brd hh.hh.hh.hh scope global cni-podman0 valid_lft forever preferred_lft forever inet6 fe80::60af:a1ff:fe0a:ca2e/64 scope link valid_lft forever preferred_lft foreverIP-адрес
web-container- этоcni-podman0, а сеть подключена к хосту с помощью моста.Проверьте
web-containerи раскройте его IP-адрес:podman inspect --format='{{.NetworkSettings.IPAddress}}' web-containerПример вывода команды:
xx.xx.x.xПолучите доступ к
web-containerнапрямую с хоста:curl xx.xx.x.x:xxПример вывода команды:
<html><body><h1>It works!</h1></body></html>
Связь между контейнерами с использованием распределения портов(port mapping)#
Наиболее удобный способ взаимодействия между двумя контейнерами — использовать публикуемые порты. Порты могут быть опубликованы двумя способами: автоматически или вручную.
Запустите непубликуемый контейнер:
podman run -dt --name=web1 ubi9/httpd-24Запустите автоматически публикуемый контейнер:
podman run -dt --name=web2 -P ubi9/httpd-24Запустите вручную публикуемый контейнер и опубликуйте порт контейнера 80:
podman run -dt --name=web3 -p 9090:80 ubi9/httpd-24Раскройте список всех контейнеров:
podman psПример вывода команды:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f12fa79b8b39 registry.example.ru/ubi9/httpd-24:latest /usr/bin/run-http... 23 seconds ago Up 24 seconds ago web1 9024d9e815e2 registry.example.ru/ubi9/httpd-24:latest /usr/bin/run-http... 13 seconds ago Up 13 seconds ago 0.0.0.0:43595->8080/tcp, 0.0.0.0:42423->8443/tcp web2 03bc2a019f1b registry.example.ru/ubi9/httpd-24:latest /usr/bin/run-http... 2 seconds ago Up 2 seconds ago 0.0.0.0:9090->80/tcp web3В выводе представлена информация, что контейнер
web1не имеет опубликованных портов и доступен только по контейнерной сети или мосту. Контейнерweb2автоматически сопоставил порты43595и42423для публикации портов приложения8080и8443соответственно. Порт контейнераweb3опубликован вручную. Порт хоста9090сопоставлен порту контейнера 80.Примечание
Автоматическое сопоставление портов возможно, потому что образ
registry.example.ru./9/httpd-24содержит командыEXPOSE 8080иEXPOSE 8443вContainerfile.Отобразите IP-адреса контейнеров
web1иweb3:podman inspect --format='{{.NetworkSettings.IPAddress}}' web1 podman inspect --format='{{.NetworkSettings.IPAddress}}' web3Свяжитесь с контейнером
web1, используя обозначение\<IP>:\<port>:curl xx.xx.x.xx:xxxxПример вывода команды:
... <title>Test Page for the HTTP Server</title> ...Свяжитесь с контейнером
web2, используя обозначенияlocalhost:\<port>:curl localhost:43595Пример вывода команды:
... <title>Test Page for the HTTP Server</title> ...Свяжитесь с контейнером
web3при помощи обозначения\<IP>:\<port>:curl hh.hh.hh.hh:<port>Пример вывода команды:
... <title>Test Page for the HTTP Server</title> ...
Связь между контейнерами с использованием DNS#
При включенном DNS-плагине используйте имя контейнера для связи с ним.
Запустите контейнер
receiver, подключенный к сетиmynet:podman run -d --net mynet --name receiver ubi9 sleep 3000Запустите контейнер
senderи свяжитесь с контейнеромreceiverпри помощи имени:podman run -it --rm --net mynet --name sender alpine ping receiverПример вывода команды:
PING rcv01 (00.00.0.0): 56 data bytes 64 bytes from 00.00.0.0: seq=0 ttl=42 time=0.041 ms 64 bytes from 00.00.0.0: seq=1 ttl=42 time=0.125 ms 64 bytes from 00.00.0.0: seq=2 ttl=42 time=0.109 ms ~~~0Для выхода используйте сочетание клавиш CTRL+C.
В выводе представлена информация, что контейнер sender может проверять контейнер receiver с помощью ping-запросов, используя его имя.
Связь между двумя контейнерами в pod#
Контейнеры в рамках одного pod делят между собой IP-адреса, MAC-адреса и распределяемые порты (port mapping). Для обмена данными между контейнерами в одном pod используется обозначение localhost:port.
Создайте pod с именем
web-pod:podman pod create --name=web-podЗапустите в pod
web-container:podman container run -d --pod web-pod --name=web-container docker.io/library/httpdВыведите список всех pods и контейнеров, связанных с ними:
podman ps --podПример вывода команды:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD ID PODNAME 58653cf0cf09 k8s.gcr.io/pause:3.5 4 minutes ago Up 3 minutes ago 4e61a300c194-infra 4e61a300c194 web-pod b3f4255afdb3 docker.io/library/httpd:latest httpd-foreground 3 minutes ago Up 3 minutes ago web-container 4e61a300c194 web-podЗапустите контейнер
web-podна основе образаdocker.io/library/fedora:podman container run -it --rm --pod web-pod docker.io/library/fedora curl localhostПример вывода команды:
<html><body><h1>It works!</h1></body></html>
Вывод демонстрирует, что связь с web-container установлена.
Взаимодействия в pod#
При создании pod необходимо публиковать порты для контейнера.
Создайте pod с именем
web-pod:podman pod create --name=web-pod-publish -p 80:80Раскройте список всех pod:
podman pod lsПример вывода команды:
POD ID NAME STATUS CREATED INFRA ID # OF CONTAINERS 26fe5de43ab3 publish-pod Created 5 seconds ago 7de09076d2b3 1Запустите веб-контейнер
web-containerвнутриweb-pod:podman container run -d --pod web-pod-publish --name=web-container docker.io/library/httpdВыведите список контейнеров:
podman psПример вывода команды:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7de09076d2b3 k8s.gcr.io/pause:3.5 About a minute ago Up 23 seconds ago 0.0.0.0:80->80/tcp 26fe5de43ab3-infra 088befb90e59 docker.io/library/httpd httpd-foreground 23 seconds ago Up 23 seconds ago 0.0.0.0:80->80/tcp web-containerУбедитесь, что
web-containerдоступен:curl localhost:80Пример вывода команды:
<html><body><h1>It works!</h1></body></html>
Присоединение pod к сети контейнеров#
Во время создания pod присоедините внутренние контейнеры к сети.
Создайте сеть с именем
pod-net:podman network create pod-netПример вывода команды:
/etc/cni/net.d/pod-net.conflistСоздайте pod
web-pod:podman pod create --net pod-net --name web-podЗапустите контейнер
web-containerвнутриweb-pod:podman run -d --pod web-pod --name=web-container docker.io/library/httpdОпционально: Выведите pods, с которыми связаны контейнеры:
podman ps -pПример вывода команды:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES POD ID PODNAME b7d6871d018c registry.example.ru/ubi9/pause:latest 9 minutes ago Up 6 minutes ago a8e7360326ba-infra a8e7360326ba web-pod 645835585e24 docker.io/library/httpd:latest httpd-foreground 6 minutes ago Up 6 minutes ago web-container a8e7360326ba web-podДля проверки работы раскройте список сетей, подключенных к контейнеру:
podman ps --format="{{.Networks}}"Пример вывода команды:
pod-net