Почему можно получить доступ к сокету хоста из Docker, а не к сокету Docker с хоста? - PullRequest
0 голосов
/ 24 октября 2019

Я запускаю Docker-контейнер из образа с параметрами --net="host" -P.

Как и ожидалось, я могу сделать:

  • хост: ubuntu@main-6:~$ nc -kl localhost 3000
  • Докер: fenics@main-6:~$ nc localhost 3000

и это нормально работает, я могу передавать информацию.

Но если я сделаю наоборот:

  • docker: fenics@main-6:~$ nc -kl localhost 3000
  • host: ubuntu@main-6:~$ nc localhost 3000

Тогда это не работает, команда host nc немедленно возвращается.

Есть идеи, почему?

И хост, и Docker - это, по сути, Ubuntu 16.04 с некоторыми установленными пакетами.

Мне очень нравится, что первое работает, но мне нужно, чтобы второе тоже работало.

Edit 1

Другой забавный факт того же рода: использование nc работает на моей машине через tmux между двумя панелями для связи:

enter image description here

Но то же самое не работает с док-контейнером:

enter image description here

Может ли это быть как-то такая же проблема?

Редактировать 2

Но как ни странно это работает:

  • на хосте
ubuntu@main-6:~$ python3
Python 3.6.8 (default, Oct  7 2019, 12:59:55)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>>
>>> s = socket.socket() #create a socket object
>>> host = socket.gethostname() #Host i.p
>>> port = 4001 #Reserve a port for your service
>>>
>>> s.connect((host,port))
>>> print(s.recv(1024))
b'Thank you for connecting!'
>>> 
  • на докере
fenics@main-6:~$ python3
Python 3.6.7 (default, Oct 22 2018, 11:32:17)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>> s = socket.socket() #Create a socket object
>>> host = socket.gethostname() #Get the local machine name
>>> port = 4001 # Reserve a port for your service
>>> s.bind((host,port)) #Bind to the port
>>>
>>> s.listen(5) #Wait for the client connection
>>> c,addr = s.accept() #Establish a connection with the client
>>> c.send(b"Thank you for connecting!")
25

Изменить 3: что я хочу сделать с самого начала

Несколько слов о том, почему я смотрю на все эти странные вещи.

Итак, в основном у меня есть одна виртуальная машина, main-5,на котором что-то происходит, и вторая виртуальная машина main-6, на которой работает докер. Я хочу отправить информацию по сокету, туннелированному через ssh с main-5, на докер, работающий на main-6. Я могу заставить работать туннельный сокет от main-5 до main-6:

ubuntu@main-5:~$ ssh -N -L 3006:127.0.0.1:3006 ubuntu@MYIP
ubuntu@main-5:~$ nc localhost 3006
gla
ubuntu@main-6:~$ nc -kl localhost 3006 
gla

, но не могу активировать сервер и получать его из докера, то есть fenics@main-6, несмотря на *Варианты 1079 * и -P.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...