Перенаправить порт хоста в контейнер docker
возможно ли иметь порты доступа к контейнеру Docker, открытые хостом? Конкретно у меня есть MongoDB и RabbitMQ, работающие на хосте, и я хотел бы запустить процесс в контейнере Docker для прослушивания очереди и (необязательно) записи в базу данных.
Я знаю, что могу переслать из контейнера на хост (через опцию-p), и у меня есть соединение с внешним миром (т. е. интернет) из контейнера Docker, но я хотел бы не выставлять RabbitMQ и Порты MongoDB от хоста к внешнему миру.
изменить: некоторые разъяснения:
Starting Nmap 5.21 ( http://nmap.org ) at 2013-07-22 22:39 CEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00027s latency).
PORT STATE SERVICE
6311/tcp open unknown
joelkuiper@vps20528 ~ % docker run -i -t base /bin/bash
root@f043b4b235a7:/# apt-get install nmap
root@f043b4b235a7:/# nmap 172.16.42.1 -p 6311 # IP found via docker inspect -> gateway
Starting Nmap 6.00 ( http://nmap.org ) at 2013-07-22 20:43 UTC
Nmap scan report for 172.16.42.1
Host is up (0.000060s latency).
PORT STATE SERVICE
6311/tcp filtered unknown
MAC Address: E2:69:9C:11:42:65 (Unknown)
Nmap done: 1 IP address (1 host up) scanned in 13.31 seconds
Я должен был сделать этот трюк, чтобы получить любое подключение к интернету в контейнере: мой брандмауэр блокирует сетевые подключения из контейнера docker наружу
EDIT: в конце концов, я пошел с созданием пользовательского моста через трубопровод и оказывает услуги слушать на мосту IP-адресов. Вместо этого я пошел с этим подходом, MongoDB и RabbitMQ слушают на мосту докера, потому что это дает больше гибкости.
5 ответов:
ваш узел docker предоставляет адаптер для всех контейнеров. Предполагая, что вы находитесь на недавнем ubuntu, вы можете запустить
ip addrэто даст вам список сетевых адаптеров, один из которых будет выглядеть что-то вроде
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP link/ether 22:23:6b:28:6b:e0 brd ff:ff:ff:ff:ff:ff inet 172.17.42.1/16 scope global docker0 inet6 fe80::a402:65ff:fe86:bba6/64 scope link valid_lft forever preferred_lft foreverвам нужно будет сказать rabbit / mongo для привязки к этому IP (172.17.42.1). После этого вы должны иметь возможность открывать соединения с 172.17.42.1 из своих контейнеров.
простой, но относительно небезопасный способ будет использовать до
docker run.этот параметр позволяет контейнеру использовать сетевой стек хоста. Затем вы можете подключиться к службам, запущенным на хосте просто используете "localhost" в качестве имени хоста.
это проще настроить, потому что вам не нужно будет настраивать службу для приема подключений с IP-адреса вашего контейнера docker, и вам не нужно будет сообщать докеру контейнер определенный IP-адрес или имя хоста для подключения, просто порт.
например, вы можете проверить его, выполнив следующую команду, которая предполагает, что ваш образ называется
my_image, ваше изображение включает в себяtelnetутилита, и сервис, к которому вы хотите подключиться, находится на порту 25:docker run --rm -i -t --net=host my_image telnet localhost 25если вы считаете это, пожалуйста, см. предупреждение о безопасности на этом страница:
https://docs.docker.com/articles/networking/
Он говорит:
-- net=host -- говорит докеру пропустить размещение контейнера внутри отдельного сетевого стека. По сути, этот выбор говорит докеру не контейнеризировать сеть контейнера! Хотя контейнерные процессы по-прежнему будут ограничены их собственной файловой системой и списком процессов и ограничениями ресурсов, быстрая команда ip addr покажет вам, что в сети они живут "снаружи" в главном узле Докера и имеют полный доступ к его сетевым интерфейсам. Обратите внимание, что это не позволяет контейнеру перенастроить сетевой стек хоста - это потребует --privileged=true - но это позволяет контейнерным процессам открывать порты с низким номером, как и любой другой корневой процесс. Он также позволяет контейнеру получать доступ к локальным сетевым службам, таким как D-bus. Это может привести к тому, что процессы в контейнере смогут делать неожиданные вещи, такие как перезагрузка компьютера. Вы должны использовать эту опцию с осторожностью.
вы также можете создать SSH туннель.
docker-compose.yml:--- version: '2' services: kibana: image: "kibana:4.5.1" links: - elasticsearch volumes: - ./config/kibana:/opt/kibana/config:ro elasticsearch: build: context: . dockerfile: ./docker/Dockerfile.tunnel entrypoint: ssh command: "-N elasticsearch -L 0.0.0.0:9200:localhost:9200"
docker/Dockerfile.tunnel:FROM buildpack-deps:jessie RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive \ apt-get -y install ssh && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* COPY ./config/ssh/id_rsa /root/.ssh/id_rsa COPY ./config/ssh/config /root/.ssh/config COPY ./config/ssh/known_hosts /root/.ssh/known_hosts RUN chmod 600 /root/.ssh/id_rsa && \ chmod 600 /root/.ssh/config && \ chown $USER:$USER -R /root/.ssh
config/ssh/config:# Elasticsearch Server Host elasticsearch HostName jump.host.czerasz.com User czerasz ForwardAgent yes IdentityFile ~/.ssh/id_rsaтаким образом
elasticsearchимеет туннель к серверу с запущенной службой (Elasticsearch, MongoDB, PostgreSQL) и предоставляет порт 9200 с этой службой.
Если MongoDB и RabbitMQ работают на хосте, то порт уже должен быть открыт, поскольку он не находится в докере.
вам не нужна опция '-p' для предоставления портов от контейнера к хосту. По умолчанию, все порты открыты. Опция '- p ' позволяет открыть порт из контейнера на внешнюю сторону хоста.
Итак, я предполагаю, что вам не нужно '-p' вообще, и он должен работать нормально :)
у меня была аналогичная проблема с доступом к LDAP-серверу из контейнера docker. Я установил фиксированный IP-адрес для контейнера и добавил правило брандмауэра.
docker-compose.yml:version: '2' services: containerName: image: dockerImageName:latest extra_hosts: - "dockerhost:192.168.50.1" networks: my_net: ipv4_address: 192.168.50.2 networks: my_net: ipam: config: - subnet: 192.168.50.0/24в iptables правило:
iptables -A INPUT -j ACCEPT -p tcp -s 192.168.50.2 -d 2.168.50.1 --dport portnumberOnHostвнутри контейнера доступ
dockerhost:portnumberOnHost
Comments