it-swarm.asia

إلى الأمام ميناء المضيف إلى حاوية عامل ميناء

هل من الممكن أن يتم فتح منافذ وصول حاوية 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

[email protected] ~ % docker run -i -t base /bin/bash
[email protected]:/# apt-get install nmap
[email protected]:/# 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

اضطررت إلى القيام بهذه الخدعة للحصول على أي اتصال إنترنت باستخدام الحاوية: يقوم جدار الحماية الخاص بي بحظر اتصالات الشبكة من حاوية الإرساء إلى الخارج

EDIT: في النهاية ذهبت مع إنشاء جسر مخصص باستخدام pipework والحصول على خدمات الاستماع على IP جسر. ذهبت مع هذا النهج بدلاً من الاستماع إلى MongoDB و RabbitMQ على جسر عامل الميناء لأنه يوفر المزيد من المرونة.

130
JoelKuiper

يقوم مضيف الرصيف بكشف محول لجميع الحاويات. على افتراض أنك على أوبونتو الأخيرة ، يمكنك تشغيل

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

ستحتاج إلى إخبار الأرنب/المونغو بالربط مع عنوان IP (172.17.42.1). بعد ذلك ، يجب أن تكون قادرًا على فتح اتصالات إلى 172.17.42.1 من داخل حاوياتك.

46
Seldo

هناك طريقة بسيطة ولكنها غير آمنة نسبيًا تتمثل في استخدام خيار --net=Hostdocker run.

هذا الخيار يجعله بحيث الحاوية يستخدم مكدس شبكة المضيف. ثم يمكنك الاتصال بالخدمات التي تعمل على المضيف ببساطة عن طريق استخدام "المضيف المحلي" كاسم المضيف.

يعد هذا أسهل للتكوين لأنه لن تضطر إلى تكوين الخدمة لقبول الاتصالات من عنوان IP الخاص بحاوية الإرساء ، ولن تضطر إلى إخبار حاوية الإلحاق بعنوان 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 - يقول Docker لتخطي وضع الحاوية داخل مكدس شبكة منفصل. في الجوهر ، يخبر هذا الاختيار Docker بعدم حاويات شبكة الحاوية! على الرغم من أن عمليات الحاوية ستظل محصورة في نظام الملفات وقائمة العمليات وحدود الموارد الخاصة بها ، فإن أمر ip ip addr السريع سيوضح لك أنه ، من حيث الشبكة ، يعيشون "بالخارج" في مضيف Docker الرئيسي ويكون لهم حق الوصول الكامل إلى واجهات الشبكة الخاصة به . لاحظ أن هذا لا يسمح للحاوية بإعادة تكوين مكدس شبكة المضيف - الأمر الذي يتطلب --privileged = true - ولكنه يسمح لعمليات الحاويات بفتح منافذ ذات أرقام منخفضة مثل أي عملية جذر أخرى. كما يسمح للحاوية بالوصول إلى خدمات الشبكة المحلية مثل D-bus. يمكن أن يؤدي هذا إلى عمليات في الحاوية تكون قادرة على القيام بأشياء غير متوقعة مثل إعادة تشغيل الكمبيوتر. يجب عليك استخدام هذا الخيار بحذر.

90
David Grayson

يمكنك أيضًا إنشاء نفق 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 بهذه الخدمة.

8
czerasz

واجهت مشكلة مماثلة في الوصول إلى خادم LDAP من حاوية الإرساء. قمت بتعيين عنوان 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 $192.168.50.1 --dport portnumberOnHost

داخل حاوية الوصول dockerhost:portnumberOnHost

3
Arigion

إذا كانت MongoDB و RabbitMQ تعملان على المضيف ، فعندئذ يجب أن يكون المنفذ مكشوفًا بالفعل لأنه ليس داخل Docker.

لا تحتاج إلى خيار -p لكشف المنافذ من الحاوية إلى المضيف. افتراضيا ، يتم كشف جميع المنافذ. يتيح لك خيار -p كشف منفذ من الحاوية إلى خارج المضيف.

لذا ، أعتقد أنه لا تحتاج إلى -p على الإطلاق ويجب أن تعمل بشكل جيد :)

3
creack