2016-11-24 3 views
0

Из моего контейнера докеров я хочу получить доступ к серверу MySQL, работающему на моем хосте, в 127.0.0.1. Я хочу получить доступ к веб-серверу, запущенному в контейнере контейнера, с хоста. Я попытался это:docker: взаимный доступ к портам контейнера и хоста

docker run -it --expose 8000 --expose 8001 --net='host' -P f29963c3b74f 

Но ни один из портов не отображаются как выставлялись:

$ docker ps 
CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS    NAMES 
093695f9bc58  f29963c3b74f  "/bin/sh -c '/root/br" 4 minutes ago  Up 4 minutes       elated_volhard 
$ 
$ docker port 093695f9bc58 

Если у меня нет --net='host', порты подвергаются, и я могу получить доступ к веб-серверу на контейнер.

Как хост и контейнер могут взаимно обращаться к другим портам?

ответ

0

Когда --expose вы определяете:

Номер порта внутри контейнера (где служба прослушивает) делает не нужно соответствовать номеру порта, выставляемых на внешней стороне контейнера (где клиенты подключаются). Например, внутри контейнера служба HTTP прослушивает порт 80 (и поэтому разработчик изображения указывает EXPOSE 80 в файле Docker). Во время выполнения порт может быть привязан к 42800 на хосте. Чтобы найти сопоставление между хост-портами и открытыми портами, используйте порт докеров.

С --net=host

--network = "хозяин" дает контейнер полный доступ к услугам местной системы, таких как D-Bus и поэтому считается небезопасным.

Здесь у вас нет ничего в «портах», потому что у вас открыты все порты для хоста.

Если вы не хотите использовать host сети вы можете получить доступ к порту хоста из Докер контейнера с интерфейсом Docker
- How to access host port from docker container
- From inside of a Docker container, how do I connect to the localhost of the machine?.

Если вы хотите получить доступ к контейнеру с хоста, вам необходимо указать для публикации портов для интерфейса хоста.

опция -P публикует все порты на хост-интерфейсов. Docker связывает каждый открытый порт в случайный порт на хосте. Диапазон портов находится в пределах эфемерного диапазона портов, определенного /proc/sys/net/ipv4/ip_local_port_range. Используйте флаг -p, чтобы явно указать карту одного порта или диапазона портов.

Короче говоря, при определении только --expose 8000 порт не подвергается воздействию 8000, а в случайном порте. Если вы хотите, чтобы порт 8000 был видимым для хоста, вам нужно отобразить опубликованный порт -p 8000:8000.

+0

Я тестирую вещи, поэтому я в порядке с докером, используя случайный порт на хосте. Из сообщения Programmerq кажется, что вы не можете открывать/отображать порты при использовании '' '--net = host'''. – user2233706

+0

@ user2233706 уверен, вы не можете открывать порты при использовании '--net = host' (это не имеет смысла - вот почему в столбце« ports »нет ничего). Когда вы не «публикуете» порты, как ваш хозяин знает открытые порты, например. '8000-> XXXX'? порты на хосте должны быть доступны с интерфейсом 'docker0' (' IP' соответственно). – VladoDemcak

0

Сетевая модель Docker предназначена для создания нового сетевого пространства имен для вашего контейнера. Это означает, что контейнер получает свои 127.0.0.1. Если вы хотите, чтобы контейнер достигнет службы mysql, которая только прослушивает 127.0.0.1 на хосте, вы не сможете ее достичь.

--net=host помещает ваш контейнер в пространство имен в сети, как хост, но это не рекомендуется, поскольку оно эффективно отключает все другие сетевые функции, которые имеет докер, - вы не получаете изоляции, t открыть/опубликовать порт и т. д.

Лучшее решение, вероятно, будет заключаться в том, чтобы ваш сервер mysql прослушивал интерфейс, который можно маршрутизировать из контейнеров докеров.

Если вы не хотите, чтобы mysql слушал ваш публичный интерфейс, вы можете создать интерфейс моста, дать ему случайный ip (убедитесь, что у вас нет конфликтов), соедините его ни с чем и настройте mysql для прослушивания только на этом ip и 127.0.0.1. Например:

sudo brctl addbr myownbridge 
sudo ifconfig myownbridge 10.255.255.255 
sudo docker run --rm -it alpine ping -c 1 10.255.255.255 

Этот IP-адрес будет маршрутизироваться как с вашего хоста, так и с любого контейнера, запущенного на этом хосте.

Другим подходом было бы контейнерный сервер mysql. Вы можете поместить его в ту же сеть, что и другие контейнеры, и добраться до нее таким образом. Вы даже можете опубликовать свой порт 3306 на интерфейсе 127.0.0.1 хоста.

+1

Согласно [this] (http://serverfault.com/questions/139323/mysql-bind-to-more-than-one-ip-address), вы не можете слушать MySQL на нескольких IP-адресах. Я получил ваш скрипт, но когда я установил '' 'bind-address = 10.255.255.255''' в' '' my.cnf''', я до сих пор не могу подключиться к серверу MySQL. – user2233706

+0

Я собираюсь запустить MySQL в контейнере. – user2233706

+0

вам также необходимо настроить mysql для прослушивания этого ip. – programmerq

Смежные вопросы