Ответ 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 для локальных соединений. Удачи!