Представьте себе такой сценарий.
Как назначить этому контейнеру 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 есть и пример одного из них Вот. Это лучше, чем то, что я мог объяснить. Теперь они делают следующее:
Создайте мост Linux на хосте.
brctl addbr br0
brctl addif br0 enp0s1
brctl setfd br0 0
ifconfig br0 192.168.0.0/24 netmask 255.255.255.0
* Не сделал шаг, чтобы сохранить его.
Затем проверьте, включен ли мост
root@docker:~# brctl show br0
bridge name bridge id STP enabled interfaces
br0 8000.42570a00bd6d no enp0s1
root@docker:~#
Создайте мостовую сеть:
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
к меньшему подмножеству, но все зависит от ваших потребностей.
*** Возможно, вы захотите сделать это значение по умолчанию. Это также объясняется в ссылке.
Запустите свой контейнер (ы):
docker run -it my/contianer
--ip
и другие могут быть использованы здесь. Справка Docker docker run --help |grep IP
здесь может помочь.После запуска контейнера вы можете использовать docker inspect <container_name>
чтобы узнать, есть ли у вас IP-адрес, а затем необходимо проверить подключение к этому контейнеру и т. д.
Надеюсь, это поможет, спросите, если у вас возникнут вопросы, или если это не то, что вы хотите / вам нужно предоставить некоторый контекст.