হোকার পোর্ট ফর ডকার কনটেইনার থেকে ফরোয়ার্ড করুন


166

হোস্টের দ্বারা ডকার কনটেইনার অ্যাক্সেস পোর্টগুলি কি খোলা সম্ভব? কংক্রিটের সাথে আমার কাছে হোস্টের উপর মঙ্গোডিবি এবং রাবিট এমকিউ চলছে এবং আমি কাতারটি শোনার জন্য একটি ডকার পাত্রে একটি প্রক্রিয়া চালাতে চাই এবং (optionচ্ছিকভাবে) ডাটাবেসে লিখতে চাই।

আমি জানি যে আমি ধারক থেকে হোস্টে (-p বিকল্পের মাধ্যমে) একটি বন্দর ফরওয়ার্ড করতে পারি এবং ডকারের ধারক থেকে বাইরের বিশ্বের সাথে (যেমন ইন্টারনেট) একটি সংযোগ পেতে পারি তবে আমি রাব্বিটএমকিউ এবং মঙ্গোডিবি বন্দরগুলি প্রকাশ করতে চাই না হোস্ট থেকে বাইরের বিশ্বের।

সম্পাদনা: কিছু স্পষ্টতা:

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

ধারকটির সাথে কোনও ইন্টারনেট সংযোগ পেতে আমাকে এই কৌশলটি করতে হয়েছিল: আমার ফায়ারওয়াল ডকারের ধারক থেকে বাইরের নেটওয়ার্ক সংযোগগুলি অবরুদ্ধ করছে

সম্পাদনা : অবশেষে আমি পাইপওয়ার্ক ব্যবহার করে একটি কাস্টম সেতু তৈরি এবং সেতুর আইপিগুলিতে পরিষেবাগুলি শুনতে পেয়েছিলাম । আমি মোঙ্গোডিবি এবং রাবিট এমকিউ ডকার ব্রিজের কথা শোনার পরিবর্তে এই পদ্ধতির সাথে গিয়েছিলাম কারণ এটি আরও নমনীয়তা দেয়।

উত্তর:


53

আপনার ডকার হোস্ট সমস্ত পাত্রে একটি অ্যাডাপ্টার প্রকাশ করে। ধরে নিই যে আপনি সাম্প্রতিক উবুন্টুতে আছেন, আপনি চালাতে পারেন

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

আপনাকে আইপি (172.17.42.1) আবদ্ধ করতে খরগোশ / মঙ্গো বলতে হবে। এর পরে, আপনার পাত্রে থেকে 172.17.42.1 এ সংযোগগুলি খুলতে সক্ষম হওয়া উচিত।


35
কনটেইনার কীভাবে জানতে পারে কোন আইপিতে অনুরোধ প্রেরণ করতে হবে? আমি মানটিকে (172.17.42.1 এখানে এবং আমার পরীক্ষার ছদ্মবেশে হার্ডকোড করতে পারি তবে এটি কি সর্বদা সত্য?), তবে এটি কোনও হোস্টের সাথে কাজ করার ডকার নীতিগুলির বিরুদ্ধে যায় বলে মনে হয়!
জেপি।

2
@ সেলডো: সেই ইন্টারফেসটি দেখাতে কি কনফিগারেশন দরকার? আমি ডকারটি 1.7.1 ব্যবহার করছি এবং আমার কেবল আছে loএবং eth0
mknecht

8
হোস্টটি কেবল 127.0.0.1 এ শুনছে কি কোনওভাবে এটি করা সম্ভব?
হ্যান্সাহারফ

5
"আপনাকে সেই আইপি (172.17.42.1) এ আবদ্ধ করতে খরগোশ / মঙ্গো বলতে হবে that এর পরে, আপনার পাত্রে থেকে 172.17.42.1 এ সংযোগ খুলতে সক্ষম হওয়া উচিত" " কীভাবে এটি করবেন তা যদি আপনি ব্যাখ্যা করেন তবে চমৎকার হবে
নভেটেরেট

1
@ নোভাটারে যেমন উল্লেখ করেছেন, কেউ কি দয়া করে সেই প্রক্রিয়াটি ব্যাখ্যা করতে পারেন?
কেসকিনসফ

121

একটি সহজ তবে তুলনামূলকভাবে অনিরাপদ উপায় হ'ল --net=hostবিকল্পটি ব্যবহার করা docker run

এই বিকল্পটি এটিকে এমন করে তোলে যাতে ধারক হোস্টের নেটওয়ার্কিং স্ট্যাক ব্যবহার করে। তারপরে আপনি হোস্ট নেম হিসাবে "লোকালহোস্ট" ব্যবহার করে হোস্টে চলমান পরিষেবাগুলির সাথে সংযোগ স্থাপন করতে পারেন।

এটি কনফিগার করা সহজ কারণ আপনার ডকারের ধারকটির আইপি ঠিকানা থেকে সংযোগ গ্রহণ করতে আপনাকে পরিষেবাটি কনফিগার করতে হবে না, এবং আপনাকে ডক পাত্রে কোনও সংযোগের জন্য একটি নির্দিষ্ট আইপি ঠিকানা বা হোস্টের নাম বলতে হবে না, কেবল একটি বন্দর

উদাহরণস্বরূপ, আপনি নিম্নলিখিত কমান্ডটি চালিয়ে এটি পরীক্ষা করে দেখতে পারেন, যা আপনার চিত্রটিকে ডাকা হয়েছে বলে ধরে নেয় my_image, আপনার চিত্রটিতে telnetইউটিলিটি রয়েছে এবং আপনি যে পরিষেবাতে সংযোগ করতে চান সেটি পোর্ট 25 এ রয়েছে:

docker run --rm -i -t --net=host my_image telnet localhost 25

আপনি যদি এইভাবে এটি বিবেচনা করে থাকেন তবে দয়া করে এই পৃষ্ঠায় সুরক্ষা সম্পর্কে সতর্কতা দেখুন:

https://docs.docker.com/articles/networking/

এটা বলে:

- নেট = হোস্ট - ডকারকে পৃথক নেটওয়ার্ক স্ট্যাকের ভিতরে ধারক স্থাপন করা এড়াতে বলে। সংক্ষেপে, এই পছন্দটি ডকারকে কনটেইনারটির নেটওয়ার্কিংটি কন্টেইনারাইজ না করতে বলে! কনটেইনার প্রক্রিয়াগুলি এখনও তাদের নিজস্ব ফাইল সিস্টেম এবং প্রক্রিয়া তালিকা এবং সংস্থান সীমার মধ্যে সীমাবদ্ধ থাকবে, একটি দ্রুত আইপি অ্যাডারের কমান্ড আপনাকে দেখায় যে, নেটওয়ার্ক-ভিত্তিক, তারা মূল ডকার হোস্টে "বাইরে" বাস করে এবং এর নেটওয়ার্ক ইন্টারফেসে সম্পূর্ণ অ্যাক্সেস রয়েছে । নোট করুন যে এটি কনটেইনারটি হোস্ট নেটওয়ার্ক স্ট্যাকটিকে পুনরায় কনফিগার করতে দেয় না - এর জন্য --privileged = সত্য প্রয়োজন - তবে এটি ধারক প্রক্রিয়াগুলিকে অন্য কোনও রুট প্রক্রিয়ার মতো নিম্ন-সংখ্যাযুক্ত পোর্টগুলি খুলতে দেয় না। এটি কনটেইনারকে ডি-বাসের মতো স্থানীয় নেটওয়ার্ক পরিষেবাগুলি অ্যাক্সেস করার অনুমতি দেয়। এটি আপনার কম্পিউটার পুনরায় চালু করার মতো অপ্রত্যাশিত কাজ করতে সক্ষম হয়ে পাত্রে প্রক্রিয়াগুলির দিকে পরিচালিত করতে পারে।


12
যে কেউ লিনাক্সে ডকার ব্যবহার না করে (যেমন কিছু ভার্চুয়ালাইজেশন ব্যবহার করে) এটি কাজ করবে না, যেহেতু হোস্টটি প্রকৃত হোস্ট ওএস নয়, অন্তর্ভুক্ত ভিএম থাকবে।
সেবাস্তিয়ান গ্রাফ

13
বিশেষত, ম্যাকোএসে, এটি সম্ভব নয় (কিছুটা কাজের ব্যতীত): docs.docker.com/docker- for
mac

15
MacOS এ, ব্যবহার --net=hostকরে আপনার ধারক প্রক্রিয়াটিকে আপনার হোস্ট মেশিনের সাথে সংযোগ স্থাপনের অনুমতি দেয় না localhost। পরিবর্তে, আপনার ধারকটি কেবল বিশেষ ম্যাকোস-এর docker.for.mac.host.internalপরিবর্তে কেবল হোস্টনামে সংযুক্ত করুন localhostdocker runএটি কাজ করার জন্য কোনও অতিরিক্ত পরামিতি প্রয়োজন হয় না । আপনি -eযদি নিজের ধারক প্ল্যাটফর্মটি অজ্ঞেয় রাখতে চান তবে আপনি এটি এনভ ভার্জ হিসাবে ব্যবহার করতে পারেন। আপনি env var নামক হোস্টের সাথে সংযোগ করতে পারেন এবং docker.for.mac.host.internalMacOS এবং localhostলিনাক্সে পাস করতে পারেন ।
তুলনামূলকভাবে

18
Mac এর জন্য সর্বশেষ হোস্টনাম হয় host.docker.internalদেখতে, ডক
xysun

Windows এর জন্য একই docker run --rm -it --net=host postgres bashতারপরpsql -h host.docker.internal -U postgres
লিও Cavalcante

12

আপনি একটি এসএসএস টানেলও তৈরি করতে পারেন।

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চলমান পরিষেবা (ইলাস্টিকসার্ক, মঙ্গোডিবি, পোস্টগ্রিএসকিউএল) সহ সার্ভারে একটি টানেল রয়েছে এবং সেই পরিষেবাটি দিয়ে 9200 পোর্ট উন্মুক্ত করে।


8
আপনি মূলত ডকার ইমেজে ব্যক্তিগত কী রাখছেন। গোপনীয়তা কখনই কোনও ডকারের ছবিতে .োকা উচিত নয়।
তেওহ হান হুই

2
এটি এখন পর্যন্ত একমাত্র ব্যবহারযোগ্য বুদ্ধিমান সমাধান।
helvete

5

ডকার পাত্রে থেকে একটি এলডিএপি-সার্ভার অ্যাক্সেস করতে আমার একইরকম সমস্যা হয়েছিল। আমি ধারকটির জন্য একটি নির্দিষ্ট আইপি সেট করে ফায়ারওয়াল বিধি যুক্ত করেছি।

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

যদি মঙ্গোডিবি এবং রাব্বিটএমকিউ হোস্টে চলমান থাকে তবে পোর্টটি ইতিমধ্যে উন্মুক্ত করা উচিত কারণ এটি ডকারের মধ্যে নেই।

-pপোর্টার থেকে হোস্টে পোর্টগুলি এক্সপোজ করার জন্য আপনার বিকল্পের প্রয়োজন নেই । ডিফল্টরূপে, সমস্ত বন্দর উন্মুক্ত করা হয়। দ্য-pবিকল্প হোস্ট বাইরে ধারক থেকে পোর্ট এক্সপোজ করতে পারবেন।

সুতরাং, আমার অনুমান যে আপনার কোনও প্রয়োজন -pহয় না এবং এটি ঠিক কাজ করা উচিত :)


1
আমি এটি জানতাম, তবে মনে হচ্ছে আমি কিছুটা তথ্য মিস করছি: সাম্প্রতিক সম্পাদনাটি দেখুন, কারণ আমি হোস্টের বন্দরগুলিতে পৌঁছাতে পারছি না।
জোয়েলকুইপার

2
আপনার ব্রিজটি শুনতে এবং কেবল আপনার মূল নেটওয়ার্ক ইন্টারফেসে নয়, আপনাকে খরগোশ এবং মংডোব সেটআপ করতে হবে।
21-21

13
@ ক্র্যাক আপনি কীভাবে সেতুতে শুনতে পাচ্ছেন খরগোশ এবং মংডোব?
রায়ান ওয়ালস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.