Как я могу перенаправить локальный порт на мой контейнер на localhost на моем хосте?

У меня есть демон на моем хосте, работающем на каком-то порту (т.е. 8008), и мой код обычно взаимодействует с демоном, например, со ссылкой на localhost: 8008.

Теперь я контейнерный код, но еще не демон. Как переадресовать localhost: 8008 на мой контейнер на localhost: 8008 на хосте, запускающем контейнер (и, следовательно, на демонах).

Ниже netstat -tlnp на моем хосте . Я бы хотел, чтобы контейнер перенаправлял localhost: 2009 на localhost: 2009 на хост

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name            
tcp        0      0 127.0.0.1:2009          0.0.0.0:*               LISTEN      22547/ssh       
tcp6       0      0 :::22                   :::*                    LISTEN      -               
tcp6       0      0 ::1:2009                :::*                    LISTEN      22547/ssh            

Ответы

Ответ 1

Таким образом, вам нужно подумать над тем, что контейнеры Docker имеют свой собственный сетевой стек (если вы явно не сообщаете ему об общей папке хоста с --net=host). Это означает, что порты должны быть открыты как внутри контейнера докеров, так и снаружи (документация) при соединении с портами хоста. Порты, выставленные на контейнере, должны быть привязаны к портам хоста явно (с помощью -p xxxx:yyyy в вашей команде docker run) или неявно (используя EXPOSE в вашем файле Docker и используя -P в командной строке), например говорит здесь. Если ваш Dockerfile не содержит EXPOSE 8008, или вы не указываете --expose 8008 в своей команде docker run, ваш контейнер не может разговаривать с внешним миром, даже если вы затем используете -p 8008:8008 в своей команде docker run

Итак, чтобы получить tcp/8008 на хосте, связанном с tcp/8008 на контейнере, вам нужно EXPOSE 8008 внутри вашего файла Docker (а затем docker build вашего контейнера) ИЛИ --expose 8008 в вашем docker run command. Кроме того, вам необходимо либо косвенно использовать -P, либо -p 8008:8008, чтобы явно связать открытый порт контейнера с портом хоста. Пример команды docker run для этого может выглядеть так:

docker run -it --expose 8008 -p 8008:8008 myContainer

Полезно помнить, что в командной строке -p 8008:8008 для этой операции порядок -p HOST_PORT:CONTAINER_PORT. Кроме того, не забывайте, что вы не сможете использовать SSH в своем контейнере с другого компьютера в Интернете, если только этот порт не разблокирован в iptables на хосте. Я всегда забываю об этом и трачу полчаса, прежде чем помню, что забыл iptables -A INPUT ... для этого конкретного порта tcp на главной машине. Но вы должны иметь возможность SSH с вашего хоста в контейнер без правила iptables, поскольку он использует loopback для локальных соединений. Удачи!

Ответ 2

Я не уверен, что вы можете сделать это только с настройками докеров. Если мое подставное положение правильное, выставить порт не то, что вы ищете. Вместо этого установить отправку порта ssh из контейнера в узел может быть ответом.

Ответ 3

docker run -d --name <NAME OF YOUR CONTAINER> -p 8008:8008 <YOUR IMAGE>

Будет опубликован порт 8008 в вашем контейнере до 8008 на вашем хосте.