Можно ли запустить podman два контейнера в одном порту в одном и том же модуле? - PullRequest
0 голосов
/ 06 марта 2020

Я собираюсь создать серверный пакет, используя podman на моей локальной машине (Fedora 31 KDE). Пакет включает в себя:

  1. Веб-сервер (изображение: php: 7,2- apache, объем: $ VARIABLE: / var / www/html: Z) * ​​1007 *
  2. MySQL сервер (изображение: mysql: 8, том: / var / lib / mysql: / var / lib / mysql: Z) * ​​1009 *
  3. Другой веб-сервер (изображение: phpmyadmin / phpmyadmin: 5 )

Теперь мне нужен способ, позволяющий запускать 3 сервера одной командой, а также останавливаться одной командой. Поэтому я создал pod и поместил их под pod . Мне нужен доступ к основному веб-серверу и серверу phpmyadmin с хоста. Вот скрипт bash, который я использую для их создания:

#!/usr/bin/env sh

if [ "$1" != "" ];then
    WEB_PATH="-v $1:/var/www/html:Z"
fi

sudo podman pod create -n servers -p 80:80 -p 8080:80
sudo podman run -dt --pod servers --rm --name web $WEB_PATH php:7.2-apache
sudo podman run -dt --pod servers --rm --name mysql --env MYSQL_ROOT_PASSWORD=iamroot -v /var/lib/mysql:/var/lib/mysql:Z mysql:8
sudo podman run -dt --pod servers --rm --name pma phpmyadmin/phpmyadmin:5

Проблема в том, что 1-й и 3-й оба сервера используют порт 80 по умолчанию. Я не могу понять эту проблему.

Мне нужен доступ к главному веб-серверу через порт 80 и серверу pma через порт 8080 с хоста.

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Я думаю, что вы хотите достичь sh в основном делается путем изменения опции общего ресурса по умолчанию для pods.

В общем случае общий доступ к Pods cgroup,ipc,net,uts. Облегчение межконтейнерного общения. Если этот параметр включен (или, скорее, не изменять его), вы не сможете портировать контейнеры карт в модуль, решив в: Error: cannot set port bindings on an existing container network namespace

Как и в случае со статусом от tgogos, контейнеры без корней всегда совместно используют одну и ту же сеть. Это достигается проектом slirp4netns. Проверьте этот сайт для получения дополнительной информации о сети с контейнерами.

Я не совсем понимаю, почему вы используете sudo, но вы также можете создать свою собственную сеть с помощью sudo podman network create <networkname> и назначить контейнеры этому сеть с флагом --network <networkname>.


Решение ваших проблем

Создание модуля, который не разделяет сетевое пространство имен и, следовательно, отображение портов будет на основе контейнера, а не на основе модуля.

  1. Создать модуль
    • podman pod create --name servers --share cgroup,ipc,uts
  2. Назначить контейнеры с портами для созданного модуля
    • Теперь вы можете свободно назначать порты контейнерам, используя apache / nginx или другие, чтобы все работало как нужно. Как назначить несколько экземпляров для apache
    • podman run -dt --pod servers --rm --name web -p 80:80 $WEB_PATH php:7.2-apache
    • podman run -dt --pod servers --rm --name mysql --env MYSQL_ROOT_PASSWORD=iamroot -v /var/lib/mysql:/var/lib/mysql:Z -p 8080:8080 mysql:8
    • podman run -dt --pod servers --rm --name pma -p SOMEPORT:80 phpmyadmin/phpmyadmin:5
  3. Поиск IP
    1. Rootful-режим
      • sudo podman inspect -f "{{.NetworkSettings.IPAddress}}" <containername>
    2. Безрукий режим
      • проверка ip addr show для любой virtual bridge, или если уже создана cni podman сеть
      • или отметьте hostname -I, это будет показывать только IP-адреса, но любой из них должен работать
    3. Подключение к контейнеру базы данных
      • Ваша база данных теперь должна быть доступна по IP-адресу, который вы получили на Шаг 3 и порт от Шаг 2 может быть чем-то вроде
      • сеть podman 10.89.0.1:8080
      • virbr0 192.167.133.1:8080

Обратите внимание, что шаги 1-2 также можно запускать как sudo, но мне лично не нравится иметь контейнеры / контейнеры sudo, так как для podman прекрасно иметь пользовательские пространства и контейнеры без root. Позвольте системным службам управлять перезапусками et c.

0 голосов
/ 06 марта 2020

Я думаю, вы не сможете иметь 2 контейнера, использующих один и тот же номер port, потому что они совместно используют одно и то же пространство имен сети.

С Настройка сети контейнеров с помощью Podman :

Сетевые и Podman-модули

По определению, все контейнеры в Podman-модуле имеют общее сетевое пространство имен . Этот факт означает, что они будут иметь одинаковые IP-адреса, адреса MA C и сопоставления портов. Вы можете удобно общаться между контейнерами в модуле, используя localhost.

Дополнительная информация:

...