Адрес привязки в Docker macvlan

Я пытаюсь построить macvlan с N контейнерами, привязанными к тому же ip. Каждый контейнер будет выставлять один сервис. Для этого:

sudo docker network create -d macvlan \
    --subnet=192.168.4.0/24 \
    --ip-range=192.168.4.0/24 \
    --gateway=192.168.4.201 \
    -o macvlan_mode=bridge \
    -o parent=eth0 macvlan70

Запуск контейнеров:

sudo docker run --net=macvlan70 -P -d --name test_sshd1 eg_ssh
sudo docker run --net=macvlan70 -P -d --name test_sshd2 eg_ssh

мост:

sudo ip link add mymacvlan90 link eth0 type macvlan mode bridge
sudo ip addr add 192.168.4.10/24 dev mymacvlan90
sudo ifconfig mymacvlan90 up

На данный момент я могу ping а также nmap каждый контейнер от хоста. я использовал inspect Проверять "IPAddress" каждого контейнера. Результат macvlan осмотреть:

"Containers": {
            "89ed3de20801bf096b389379bb546da03f3452e80dbabad89c5457bdc4dcc5fc": {
                "Name": "test_sshd1",
                "EndpointID": "6a7d774ae7e3ce3aac877523968b2ce5a026ae740c059b61162ceb170d53a0c4",
                "MacAddress": "02:42:c0:a8:04:01",
                "IPv4Address": "192.168.4.1/24",
                "IPv6Address": ""
            },
            "ca13b48ccbc267859f406084357dadcd3592cb678502b7086908d6d895728632": {
                "Name": "test_sshd2",
                "EndpointID": "98ce081e94a209838bb4281613055b32967ea85c40c2e3814fe73a88bc9cb380",
                "MacAddress": "02:42:c0:a8:04:02",
                "IPv4Address": "192.168.4.2/24",
                "IPv6Address": ""
            }

Сейчас я создаю еще один контейнер, например так:

sudo docker run --net=macvlan70 -p 192.168.4.1:66:22 -d --name test_sshd4 eg_ssh

Моя цель - выставить 2 общих сервиса под одним и тем же ip и mac (пытаясь эмулировать реальную машину с N сервисами). Контейнер создан с успехом. Но если я запускаю эту команду:

$ nmap 192.168.4.1 -p 66

Starting Nmap 7.01 ( https://nmap.org ) at 2017-12-06 16:57 WET
Nmap scan report for 192.168.4.1
Host is up (0.00021s latency).
PORT   STATE  SERVICE
66/tcp closed sqlnet

Я ожидал открыть порт в 66. Но это не так.

1 ответ

Решение

Вы не можете использовать -p привязать к адресу другого контейнера. Это для выставления контейнеров на интерфейсе хоста.

Вы можете просто запустить новый контейнер в том же сетевом пространстве имен, что и существующий контейнер:

docker run --net=container:test_sshd1 -d --name test_sshd4 eg_ssh

Re: ваш комментарий:

Ну, конечно, нельзя связать две вещи с одним и тем же портом по одному адресу.

Один из вариантов - настроить ssh во втором контейнере для прослушивания чего-либо другого, кроме порта 22. Настройте свой образ так, чтобы вы могли передавать порт прослушивания в качестве переменной среды (так что вы можете сделать docker run -e SSHD_LISTEN_PORT=66 ... или что-то).

Второй вариант - вместо этого связать их обоих с адресом хоста (таким как адрес вашего моста @ 192.168.4.10). Вы бы начали с первого -p 192.168.4.10:22:22 а второй с -p 192.168.4.10:66:22, Это предоставит обе службы 192.168.4.10, одну на порт 22 и одну на порт 66.

Другие вопросы по тегам