Назад | Перейти на главную страницу

Как предоставить докер-контейнеру собственный маршрутизируемый IP-адрес в исходной сети?

Главный вопрос

Представьте себе такой сценарий.

Как назначить этому контейнеру IP-адрес 192.168.0.3?

Мне нужны службы для работы на их портах по умолчанию.


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

Я не могу использовать обратный прокси в качестве решения, потому что это не решает проблему взаимодействия с экземпляром GitLab через SSH.

Сопоставление порта 22 с другим портом на хосте в этой ситуации непрофессионально, и разработчикам моих клиентов не понравится такая настройка.

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

Мои клиенты должны иметь возможность разрешать и запускать следующее без дополнительной настройки на стороне клиента.

https://GitLab.internal.net.work

ssh git clone https://GitLab.internal.net.work

Я просмотрел документацию сети Docker и, если не ошибаюсь, не вижу простого в обслуживании решения (хотя я все еще новичок в Docker).

Как это может быть сделано? Что делают другие люди в этой ситуации как «передовой опыт»? (по возможности дайте ответы в форме синтаксиса docker-compose).

Это имеет тенденцию быть анти-узором в пространстве контейнера. Одним из распространенных решений, вместо прямого доступа к контейнеру извне, является настройка балансировщика нагрузки для каждого IP-адреса, который вам необходимо предоставить, и этот балансировщик нагрузки сопоставляет хорошо известный порт с уникальным портом. В облачном пространстве это часто дешевле, чем выделение нескольких виртуальных машин с разными IP-адресами.


Вы можете опубликовать прямо на один IP-адрес с помощью докера. например.:

docker run -p 192.168.0.3:22:22 sshd

Для этого необходимо, чтобы на хосте был настроен каждый из IP-адресов, описанных в другие SE вопросы и ответы.


Если вам по-прежнему нужен исходный запрос, напрямую открывающий контейнер, вы можете использовать сетевые драйверы macvlan или ipvlan, чтобы предоставить контейнеру IP-адрес, доступный извне. Я стараюсь избегать этого, поскольку часто это симптом попытки управлять контейнером, как если бы это была виртуальная машина. Документация по macvlan находится по адресу: https://docs.docker.com/network/macvlan/

Все мои производственные док-контейнеры используют такую ​​установку.

Я устанавливаю мост с моим физическим ником внутри (шаги 1 и 2 в ответе @wti)

Устанавливаю агент opensvc (https://repo.opensvc.com), создайте сервис (svcmgr -s mygitlab create)

Заполняю конфигурацию услуги (svcmgr -s mygitlab edit config) с фрагментом конфигурации, как показано ниже

[DEFAULT]
id = 0ce6aa9c-715f-113f-9c32-0fb32df00d49
orchestrate = start

[ip#0]
container_rid = container#0
gateway = 192.168.1.1
ipdev = br0
ipname = 192.168.1.3
netmask = 255.255.255.0
type = netns

[container#0]
type = docker
run_image = gitlab:latest
run_args = -i -t --net=none
        --hostname=gitlab.acme.com
    -v /etc/localtime:/etc/localtime:ro

После этого просто запустите службу (svcmgr -s mygitlab start) и проверьте статус (svcmgr -s mygitlab print status)

При необходимости я также развертываю настройку высокой доступности, которая обеспечивает переключение службы докеров на другой узел в случае простоя первого узла.

В случае, когда вам нужны IP-адреса в контейнерах, ближайший вариант - мостовая сеть, есть несколько подтипов моста. У IBM есть и пример одного из них Вот. Это лучше, чем то, что я мог объяснить. Теперь они делают следующее:

  1. Создайте мост Linux на хосте.

    brctl addbr br0 brctl addif br0 enp0s1 brctl setfd br0 0 ifconfig br0 192.168.0.0/24 netmask 255.255.255.0

* Не сделал шаг, чтобы сохранить его.

  1. Затем проверьте, включен ли мост

    root@docker:~# brctl show br0 bridge name bridge id STP enabled interfaces br0 8000.42570a00bd6d no enp0s1 root@docker:~#

  2. Создайте мостовую сеть:

    docker network create --driver=bridge --ip-range=192.168.0.0/24 --subnet=192.168.0.0/24 -o "com.docker.network.bridge.name=br0" br0

** Здесь вы можете использовать --aux-address чтобы исключить IPS из диапазона. Вам также следует ограничить --subnet к меньшему подмножеству, но все зависит от ваших потребностей.

*** Возможно, вы захотите сделать это значение по умолчанию. Это также объясняется в ссылке.

  1. Запустите свой контейнер (ы):

    docker run -it my/contianer

    • Варианты вроде --ip и другие могут быть использованы здесь. Справка Docker docker run --help |grep IP здесь может помочь.
  2. После запуска контейнера вы можете использовать docker inspect <container_name> чтобы узнать, есть ли у вас IP-адрес, а затем необходимо проверить подключение к этому контейнеру и т. д.

Надеюсь, это поможет, спросите, если у вас возникнут вопросы, или если это не то, что вы хотите / вам нужно предоставить некоторый контекст.