Перенаправить порт хоста в контейнер 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 слушают на мосту докера, потому что это дает больше гибкости.

925   5  

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

    Ничего не найдено.