Несомненно, это возможно, хотя вы не сможете заставить 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
. Вы должны знать, что запуск контейнера в привилегированном режиме устраняет многие ограничения, обычно помещаемые в контейнеры, и поэтому это не то, что вы хотите сделать, если кто-либо еще имеет доступ к этим контейнерам.
Может помочь конкретный конкретный пример. – rbatt