2015-08-09 12 views
2

У меня есть некоторые эксперименты, связанные с технологией контейнеров Docker.Как подключить докерные контейнеры без моста?

Мне нужна определенная причина для подключения двух интерфейсов контейнера veth вместе без использования моста, Docker создает мост по умолчанию, поэтому я не хочу его использовать.

Я смущен и хочу знать, правильно ли это делать. Кто-нибудь может дать советы и указать мне некоторые ссылки или методы? Буду признательна.

Большое вам спасибо.

+--------------+          +--------------+ 
|              |          |              | 
| Container X  |          | Container Y  | 
|              |          |              | 
+--------------+          +--------------+ 
            ^ veth           ^ veth        
            |                |             
            +----------------+             
+1

Может помочь конкретный конкретный пример. – rbatt

ответ

4

Несомненно, это возможно, хотя вы не сможете заставить Docker сделать это за вас автоматически. Начните путем создания двух контейнеров без каких-либо сетей:

# docker run --net=none --name container_x ... 
# docker run --net=none --name container_y ... 

Теперь создайте veth пар:

# ip link add c_x_eth0 type veth peer name c_y_eth0 

Назначает каждую сторону veth пары в контейнер. Вы должны знать PID контейнера, чтобы сделать это, что вы можете получить, например:

docker inspect --format '{{.State.Pid}}' container_x 

Я предполагаю, что вы застряли это в сценарий оболочки под названием docker-pid. Установить пространство имен на первой veth ссылке:

# ip link set netns $(docker-pid container_x) dev c_x_eth0 

А на второй:

# ip link set netns $(docker-pid container_y) dev c_y_eth0 

Теперь вам нужно будет настроить связь внутри каждого контейнера. Если вы еще не начали свои контейнеры с --privileged, вам нужно будет сделать это с помощью nsenter:

# nsenter -t $(docker-pid container_x) -n ip link set c_x_eth0 up 
# nsenter -t $(docker-pid container_y) -n ip link set c_y_eth0 up 

А затем присвоить им IP-адреса:

# nsenter -t $(docker-pid container_x) -n ip addr add 10.10.10.1/24 dev c_x_eth0 
# nsenter -t $(docker-pid container_y) -n ip addr add 10.10.10.2/24 dev c_y_eth0 

И вы должны быть все готово.

Update

Если nsenter недоступен ...

Самое простое решение действительно просто установить nsenter в вашей системе; если вы можете создавать новые интерфейсы veth и запускать контейнеры Docker, вы должны иметь все необходимые вам привилегии.

Вы можете выполнить вышеуказанное без nsenter, если вы запускаете свои контейнеры в привилегированном режиме (docker run --privileged...). Это позволит вашим контейнерам делать что-либо, например, выполнять команды конфигурации сети, которые обычно запрещены. В этом случае вы просто запускаете командыи ip addr в контейнере, либо из оболочки, которую вы начали с docker run, либо используя что-то вроде docker exec. Вы должны знать, что запуск контейнера в привилегированном режиме устраняет многие ограничения, обычно помещаемые в контейнеры, и поэтому это не то, что вы хотите сделать, если кто-либо еще имеет доступ к этим контейнерам.

+0

Большое спасибо за ваш ответ @larsks. Я весьма признателен. Я попытаюсь вернуться с результатом. – user2567806

+0

Если этот ответ решает вашу проблему, установите флажок слева от этого ответа. Это как способ сказать «спасибо», так и способ дать людям понять, что на этот вопрос был дан ответ. – larsks

+0

Что вы подразумеваете под docker-pid container_x? Вы имеете в виду идентификатор процесса container_x? – user2567806