স্থানীয় / হোস্ট পোস্টগ্রিজ ডাটাবেসের সাথে ডকারের ধারককে সংযোগ স্থাপনের অনুমতি দিন


143

আমি সম্প্রতি ডকার এবং কিউজিআইএস-এর সাথে ঘুরে বেড়াচ্ছি এবং এই টিউটোরিয়ালের নির্দেশাবলী অনুসরণ করে একটি ধারক ইনস্টল করেছি ।

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

আমি যখন চেষ্টা করি এবং ডকারে কিউজিআইএস চালিত আমার ডাটাবেসের সাথে সংযোগ করি তখন আমি একটি ত্রুটি বার্তা পাচ্ছি: সার্ভারের সাথে সংযোগ স্থাপন করতে পারিনি: পোস্টগ্রিস Connection refused Is the server running on host "localhost" (::1) and accepting TCP/IP connections to port 5433? সার্ভারটি চলছে, এবং আমি আমার pg_hba.conf ফাইল সম্পাদনা করেছি যাতে বিভিন্ন সীমা থেকে সংযোগের অনুমতি দেয় to আইপি ঠিকানাগুলি (172.17.0.0/32)। আমি আগে ব্যবহার করে docker psডকারের ধারকটির আইপি ঠিকানাটি জিজ্ঞাসা করেছি এবং আইপি ঠিকানাটি পরিবর্তিত হলেও এটি এখনও সর্বদা 172.17.0.x এর মধ্যে রয়েছে

আমি এই ডাটাবেসে কেন সংযোগ করতে পারি না এমন কোনও ধারণা? সম্ভবত খুব সাধারণ কিছু আমি কল্পনা করি!

আমি উবুন্টু 14.04 চালাচ্ছি; পোস্টগ্রিজ 9.3

উত্তর:


149

টি এল; ডিআর

  1. 172.17.0.0/16আইপি অ্যাড্রেস রেঞ্জ হিসাবে ব্যবহার করুন , না 172.17.0.0/32
  2. localhostআপনার হোস্টের PostgreSQL ডাটাবেসে সংযুক্ত হতে ব্যবহার করবেন না , পরিবর্তে হোস্টের আইপি। ধারকটি বহনযোগ্য রাখার জন্য, --add-host=database:<host-ip>পতাকাটি databaseদিয়ে ধারকটি শুরু করুন এবং পোস্টগ্রেএসকিউএলে সংযুক্ত হওয়ার জন্য হোস্টনাম হিসাবে ব্যবহার করুন ।
  3. নিশ্চিত করুন যে পোস্ট্রেএসকিউএল কেবলমাত্র নয়, সমস্ত আইপি ঠিকানার সংযোগগুলি শুনতে কনফিগার করা আছে localhostlisten_addressesপোস্টগ্র্রেএসকিউএল এর কনফিগারেশন ফাইলে সেটিংটির সন্ধান করুন, সাধারণত পাওয়া যায় /etc/postgresql/9.3/main/postgresql.conf(@ ডাজমো নর্টনের ক্রেডিট)।

দীর্ঘ সংস্করণ

172.17.0.0/32আইপি ঠিকানার পরিসর নয় , তবে একটি একক ঠিকানা (নামেই 172.17.0.0)। কোনও ডকার ধারক কখনই সেই ঠিকানা বরাদ্দ পাবেন না, কারণ এটি ডকার ব্রিজ ( docker0) ইন্টারফেসের নেটওয়ার্ক ঠিকানা ।

ডকার শুরু হওয়ার সাথে সাথে এটি একটি নতুন ব্রিজ নেটওয়ার্ক ইন্টারফেস তৈরি করবে, যা কল করার সময় আপনি সহজেই দেখতে পাবেন ip a:

$ ip a
...
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
    inet 172.17.42.1/16 scope global docker0
       valid_lft forever preferred_lft forever

আপনি দেখতে পাচ্ছেন, আমার ক্ষেত্রে, docker0ইন্টারফেসের (বা ) এর 172.17.42.1নেটমাস্কের আইপি ঠিকানা রয়েছে । এর অর্থ নেটওয়ার্কের ঠিকানা ।/16255.255.0.0172.17.0.0/16

আইপি ঠিকানাটি এলোমেলোভাবে বরাদ্দ করা হয়েছে, তবে কোনও অতিরিক্ত কনফিগারেশন ছাড়াই এটি সর্বদা 172.17.0.0/16নেটওয়ার্কে থাকবে। প্রতিটি ডকার ধারক জন্য, এই পরিসীমা থেকে একটি এলোমেলো ঠিকানা বরাদ্দ করা হবে।

এর অর্থ, আপনি যদি আপনার ডাটাবেসে সমস্ত সম্ভাব্য ধারক থেকে অ্যাক্সেস দিতে চান তবে ব্যবহার করুন 172.17.0.0/16


1
আরে আপনার মন্তব্যের জন্য ধন্যবাদ। pg_hba.confআপনার প্রস্তাবিত ঠিকানায় আমি আমার পরিবর্তন করেছি , তবে পোস্টগ্রিজ পরিষেবাটি বন্ধ এবং পুনরায় চালু করার পরেও একই সংযোগ ত্রুটি বার্তাটি পেয়েছি । আমি আমার আইপিভি 4 সংযোগের আওতায় লাইনটি যুক্ত করেছি - আপনার পরামর্শের ঠিকানাটি যুক্ত করার কথা অন্য কোথাও রয়েছে কি? বিকল্পভাবে আমার কিউজিআইএস অ্যাপে ডকারে চলছে আমার কি পোস্টগ্রিস সংযোগের তথ্য পরিবর্তন করার দরকার আছে? উদাহরণস্বরূপ, আমি যদি কোনও ডকারের ধারক থেকে সংযোগ করছি তবে হোস্টটি এখনও 'লোকালহোস্ট'?
শহীদ_সি

আহ, এটি একটি গুরুত্বপূর্ণ বিষয়। না, localhostআপনার ডকারের ধারকের ভিতরে হোস্ট সিস্টেম নয়। হোস্ট সিস্টেমের সর্বজনীন আইপি ঠিকানার সাথে সংযোগ করার চেষ্টা করুন। ধারকটি বহনযোগ্য রাখার জন্য, আপনি কন্টেইনারটি দিয়েও শুরু করতে পারেন এবং ডকারের ধারক থেকে আপনার পোস্টগ্রিসএসকিউএল হোস্টের সাথে সংযোগ করার জন্য হোস্টনাম হিসাবে --add-host=database:<host-ip>কেবল ব্যবহার করতে পারেন database
হেলমার্ট

6
আমার আরও একটি টুকরো দরকার ছিল। আমাকে /etc/postgresql/9.3/main/postgresql.confআমার সার্ভারের eth0আইপি ঠিকানাটি সম্পাদনা করতে এবং যুক্ত করতে হয়েছিল listen_addresses। ডিফল্টরূপে listen_addressesকেবল পোস্টগ্রাইসের সাথে আবদ্ধ থাকে localhost
জাজো নর্টন

@ জাজো নর্টন, ইঙ্গিতটির জন্য ধন্যবাদ! আমি সেই অনুযায়ী আমার উত্তর আপডেট করেছি।
হেলমার্ট

@ হেলবার্টটি host-ipভার্চুয়াল মেশিন বা ডকারের ধারক আইপি ঠিকানা?
মিঃডি

56

ম্যাক সমাধানের জন্য ডকার

17.06 এর পরে

@ বার্চ্লাবসের মন্তব্যে ধন্যবাদ, এখন এই বিশেষ ম্যাক-কেবলমাত্র ডিএনএস নাম উপলব্ধ থাকায় এটি আরও বেশি সহজ :

docker run -e DB_PORT=5432 -e DB_HOST=docker.for.mac.host.internal

17.12.0-সিডি-ম্যাক 46 এর docker.for.mac.host.internalপরিবর্তে ব্যবহার করা উচিত docker.for.mac.localhost। বিশদ জন্য রিলিজ নোট দেখুন ।

পুরানো সংস্করণ

@ হেলমার্টের উত্তর বিষয়টি ভালভাবে ব্যাখ্যা করেছে well তবে ম্যাকের জন্য ডকার সেতুর নেটওয়ার্কটি উন্মোচিত করে না , সুতরাং সীমাবদ্ধতাটি কার্য করতে আমাকে এই কৌশলটি করতে হয়েছিল:

$ sudo ifconfig lo0 alias 10.200.10.1/24

/usr/local/var/postgres/pg_hba.confএই লাইনটি খুলুন এবং যুক্ত করুন:

host    all             all             10.200.10.1/24            trust

/usr/local/var/postgres/postgresql.confপরিবর্তনটি খুলুন এবং সম্পাদনা করুন listen_addresses:

listen_addresses = '*'

পরিষেবাটি পুনরায় লোড করুন এবং আপনার ধারকটি চালু করুন:

$ PGDATA=/usr/local/var/postgres pg_ctl reload
$ docker run -e DB_PORT=5432 -e DB_HOST=10.200.10.1 my_app 

এই কাজটি কী করে তা মূলত @ হেলবার্টের উত্তরের সাথে একই, তবে নেটওয়ার্ক ইন্টারফেসের lo0পরিবর্তে সংযুক্ত একটি আইপি ঠিকানা ব্যবহার করে docker0


3
এটি এখনও 4 এপ্রিল 2017 হিসাবে বর্তমান?
পেট্রাস থেরন

আমি এইভাবে পছন্দ করি যা ডেটাবেস প্রকাশ করবে না। বিটিডাব্লু, আমি কি এটি সেন্টোজে ব্যবহার করতে পারি? আমি ত্রুটিটি পেয়েছি: ওরফে: আমি যখন আপনার দেওয়া উলামের আদেশটি ব্যবহার করার চেষ্টা করেছি তখন অজানা হোস্ট।
সুসং গোহ

6
ডকার 17.06.0-rc1-ce-ma13 (জুন 1 লা 2017) হিসাবে ম্যাকোএসে আরও ভাল উপায় রয়েছে। পাত্রে হোস্টকে চিনতে হবে docker.for.mac.localhost। এটি আপনার হোস্ট মেশিনের আইপি। কনটেইনার হোস্ট ডাটাবেসে এটির মতো প্রবেশের সন্ধান করুন: docker run alpine /bin/sh -c 'getent hosts docker.for.mac.localhost'
বার্চ্লাবস

@ বার্চ্লাবস এটি এত দুর্দান্ত!
qqilihq

5
দেখে মনে হচ্ছে এটি host.docker.internal18.03 সাল থেকে পরিবর্তিত হয়েছে , অন্যান্য বিকল্পগুলি এখনও উপলব্ধ তবে অবচিত ( উত্স )।
gseva

44

ম্যাকের জন্য সহজ সমাধান:

ডকারের সর্বশেষতম সংস্করণ (18.03) একটি বিল্ট ইন পোর্ট ফরওয়ার্ডিং সলিউশন সরবরাহ করে। আপনার ডকারের ধারকের ভিতরে কেবল ডিবি হোস্ট সেট করা আছে host.docker.internal। এটি হোকারে ফরোয়ার্ড করা হবে ডকার পাত্রে চলছে।

এর জন্য ডকুমেন্টেশন এখানে রয়েছে: https://docs.docker.com/docker-for-mac/networking/#i-ਵੰਤ-to- সংযোগ-from-a-container-to-a-service-on-the-host


3
এটি এখন পর্যন্ত সেরা উত্তর! উপায় সহজ এবং এটি কেমন হওয়া উচিত।
bjm88

2
হয় host.docker.internalশুধুমাত্র Macs- এর মধ্যেই সীমাবদ্ধ?
ড্রাগস

@ ড্রাগাস ডক্স অনুসারে এটি "ম্যাকের বাইরে কাজ করবে না", তবে উইন্ডোজের জন্য ডকারের ডক্সে একই ডিএনএস নাম উল্লেখ করা হয়েছে, সুতরাং আমি মনে করি এটি "ডকারের জন্য ..." এর মধ্যে সীমাবদ্ধ। যে কোনও উপায়ে এটি কেবলমাত্র বিকাশযুক্ত: আপনি কোনও ডকার চিত্র যা এটি ব্যবহার করে তা জাহাজে বোঝানোর জন্য নয়।
রোববার

কেবল উইন্ডো এবং ম্যাকের সাথে কাজ করা। আমার ক্ষেত্রে উবুন্টু কাজ করছে না
আজরি যাকারিয়া

16

সহজ সমাধান

শুধু যোগ --network=hostকরুন docker run। এখানেই শেষ!

এইভাবে ধারক হোস্টের নেটওয়ার্ক ব্যবহার করবে, তাই localhostএবং 127.0.0.1হোস্টকে নির্দেশ করবে (ডিফল্টরূপে তারা একটি ধারককে নির্দেশ করে)। উদাহরণ:

docker run -d --network=host \
  -e "DB_DBNAME=your_db" \
  -e "DB_PORT=5432" \
  -e "DB_USER=your_db_user" \
  -e "DB_PASS=your_db_password" \
  -e "DB_HOST=127.0.0.1" \
  --name foobar foo/bar

1
সতর্ক হোন! এই সমাধানটি, এটি আমার মতে সঠিক, ম্যাকোসের জন্য কাজ করে না। এটি কেন কাজ করছে না তা জানার চেষ্টা করে আপনার সময় নষ্ট করবেন না। একবার দেখুন: github.com/docker/for-mac/issues/2716
jfcorugedo ২

দেবিয়ান নিয়ে কাজ করে। Postgresql.conf এবং pg_hba.conf পরিবর্তন করার চেষ্টা করা হয়েছে তবে এটি সহজ এবং দ্রুত।
frmbelz

2

উবুন্টুতে:

প্রথমে আপনাকে যাচাই করতে হবে যে নিম্নলিখিতটি নিম্নলিখিত কমান্ডের সাহায্যে আপনার সিস্টেমে ডকার ডাটাবেস পোর্টটি উপলব্ধ -

sudo iptables -L -n

নমুনা আউটপুট:

Chain DOCKER (1 references)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            172.17.0.2           tcp dpt:3306
ACCEPT     tcp  --  0.0.0.0/0            172.17.0.3           tcp dpt:80
ACCEPT     tcp  --  0.0.0.0/0            172.17.0.3           tcp dpt:22

এখানে 3306172.17.0.2 আইপি-তে ডকার ডাটাবেস পোর্ট হিসাবে ব্যবহৃত হয়, যদি এই বন্দরটি উপলব্ধ না হয় তবে নিম্নলিখিত কমান্ডটি চালান -

sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT

এখন, আপনি কনফিগারেশন অনুসরণ করে আপনার স্থানীয় সিস্টেম থেকে সহজেই ডকার ডেটাবেস অ্যাক্সেস করতে পারেন

  host: 172.17.0.2 
  adapter: mysql
  database: DATABASE_NAME
  port: 3307
  username: DATABASE_USER
  password: DATABASE_PASSWORD
  encoding: utf8

CentOS এ:

প্রথমে আপনাকে যাচাই করতে হবে যে ডকার ডাটাবেস পোর্টটি আপনার ফায়ারওয়ালে নিম্নলিখিত কমান্ডের মাধ্যমে পাওয়া যায় -

sudo firewall-cmd --list-all

নমুনা আউটপুট:

  target: default
  icmp-block-inversion: no
  interfaces: eno79841677
  sources: 
  services: dhcpv6-client ssh
  **ports: 3307/tcp**
  protocols: 
  masquerade: no
  forward-ports: 
  sourceports: 
  icmp-blocks: 
  rich rules:

এখানে 3307172.17.0.2 আইপি-তে ডকার ডাটাবেস পোর্ট হিসাবে ব্যবহৃত হয়, যদি এই বন্দরটি উপলব্ধ না হয় তবে নিম্নলিখিত কমান্ডটি চালান -

sudo firewall-cmd --zone=public --add-port=3307/tcp

সার্ভারে, আপনি স্থায়ীভাবে পোর্টটি যুক্ত করতে পারেন

sudo firewall-cmd --permanent --add-port=3307/tcp
sudo firewall-cmd --reload

এখন, উপরের কনফিগারেশন দ্বারা আপনি সহজেই আপনার স্থানীয় সিস্টেম থেকে ডকার ডেটাবেস অ্যাক্সেস করতে পারেন।


আমি জানি এটি পুরানো তবে এখন, আপনি কনফিগারেশন অনুসরণ করে আপনি সহজেই আপনার স্থানীয় সিস্টেম থেকে ডকার ডেটাবেস অ্যাক্সেস করতে পারেন - আপনার কাছে এটি ভুল উপায়ে রয়েছে। তার একটি স্থানীয় ডাটাবেস এবং একটি ডকার অ্যাপ রয়েছে যে স্থানীয় ডিবিতে
অন্যভাবে

2

এখানে পোস্ট করা সমাধানটি আমার পক্ষে কাজ করে না। সুতরাং, অনুরূপ সমস্যার মুখোমুখি কাউকে সহায়তা করার জন্য আমি এই উত্তরটি পোস্ট করছি।

ওএস: উবুন্টু 18
পোস্টগ্রেএসকিউএল: 9.5 (উবুন্টুতে হোস্ট করা)
ডকার: সার্ভার অ্যাপ্লিকেশন (যা পোস্টগ্রাইএসকিউএলে সংযুক্ত রয়েছে)

আমি অ্যাপ্লিকেশন তৈরি করতে ডকার-কমপোজ.আইএমএল ব্যবহার করছি।

পদক্ষেপ 1: দয়া করে যুক্ত করুনhost.docker.internal:<docker0 IP>

version: '3'
services:
  bank-server:
    ...
    depends_on:
      ....
    restart: on-failure
    ports:
      - 9090:9090
    extra_hosts:
      - "host.docker.internal:172.17.0.1"

ডকারের আইপি সন্ধান করতে আপনি এটি i.e. 172.17.0.1 (in my case)ব্যবহার করতে পারেন:

$> ifconfig docker0
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255

অথবা

$> ip a
1: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

পদক্ষেপ 2: postgresql.conf এ, শ্রবণ_এড্রেসগুলিতে এতে পরিবর্তন করুনlisten_addresses = '*'

পদক্ষেপ 3: pg_hba.conf এ, এই লাইনটি যুক্ত করুন

host    all             all             0.0.0.0/0               md5

পদক্ষেপ 4: এখন পোস্টগ্রেএসকিএল পরিষেবাটি ব্যবহার করে পুনরায় চালু করুন,sudo service postgresql restart

পদক্ষেপ 5: দয়া করে host.docker.internalসার্ভার অ্যাপ্লিকেশন থেকে ডেটাবেস সংযোগ করতে হোস্টনামটি ব্যবহার করুন ।
উদা:jdbc:postgresql://host.docker.internal:5432/bankDB

উপভোগ করুন !!


1

ডকার-রচনার জন্য আপনি কেবল যুক্ত করার চেষ্টা করতে পারেন

network_mode: "host"

উদাহরণ:

version: '2'
services:
  feedx:
    build: web
    ports:
    - "127.0.0.1:8000:8000"
    network_mode: "host"

https://docs.docker.com/compose/compose-file/#network_mode


4
নেটওয়ার্ড_মোড যোগ করার জন্য অন্য
ধারকগুলির

1

কিছু সহজ করে একটি PostgreSQL সংযোগ করতে সক্ষম হবেন সেট আপ করতে থেকে Docker ধারক আমার স্থানীয় হোস্ট আমি postgresql.conf এই ব্যবহৃত:

listen_addresses = '*'

এবং এই pg_hba.conf যোগ করেছেন:

host    all             all             172.17.0.0/16           password

তারপরে একটি পুনঃসূচনা করুন। ডকার কনটেইনার থেকে আমার ক্লায়েন্ট (যা 172.17.0.2 এ ছিল) তারপরে হোস্ট: পাসওয়ার্ড, ডাটাবেস, ব্যবহারকারীর নাম এবং পাসওয়ার্ড ব্যবহার করে আমার লোকালহোস্টে চলমান পোস্টগ্রিস্কেলের সাথে সংযোগ স্থাপন করতে পারে।


0

আমার সেটআপের জন্য আরও একটি জিনিস যুক্ত করা দরকার ছিল

172.17.0.1  localhost

প্রতি /etc/hosts

যাতে ডকার 172.17.0.1ডিবি হোস্টনাম হিসাবে চিহ্নিত করবে এবং ডিবি খুঁজে পেতে কোনও পরিবর্তিত বাইরের আইপি-র উপর নির্ভর করবে না। আশা করি এটি এই সমস্যাটি নিয়ে অন্য কাউকে সহায়তা করে!


14
এটি একটি খারাপ সমাধান। লোকালহোস্ট সাধারণত 127.0.0.1 এ নির্দেশ করে। এটি পরিবর্তন করলে অনাকাঙ্ক্ষিত পরিণতি হতে পারে, এমনকি যদি এই বিশেষ ক্ষেত্রে এটি কার্যকর হয়।
অ্যালেক্স

2
ধারক চালানোর সময় একটি databaseহোস্ট সেটআপ করা আরও ভাল উপায় --add-host=database:172.17.0.1। তারপরে আপনার অ্যাপ্লিকেশনটিকে সেই হোস্টের দিকে নির্দেশ করুন। এটি কোনও ধারকের ভিতরে আইপি ঠিকানা হার্ড-কোডিং এড়ায়।
জারেডস্ক

1
--add-host=database:172.17.0.1বাঞ্ছনীয়
লুইস মার্টিন্স

-3

অন্য সমাধানটি হ'ল পরিষেবা ভলিউম, আপনি কোনও পরিসেবা ভলিউম সংজ্ঞায়িত করতে পারেন এবং হোস্টের পোস্টগ্রিএসকিউএল ডেটা ডিরেক্টরিটি সেই ভলিউমে। বিশদের জন্য প্রদত্ত রচনা ফাইলটি দেখুন।

version: '2'
services:
  db:   
    image: postgres:9.6.1
    volumes:
      - "/var/lib/postgresql/data:/var/lib/postgresql/data" 
    ports:
      - "5432:5432"

এটি করার দ্বারা, অন্য পোস্টগ্র্যাসকিউএল পরিষেবাটি ধারকটির অধীনে চলবে তবে পোস্টগ্রিএসকিউএল পরিষেবা হোস্ট করে এমন একই ডেটা ডিরেক্টরি ব্যবহার করে।


1
এটি সম্ভবত চলমান হোস্ট পোস্টগ্রেএসকিউএল পরিষেবাটির সাথে লেখার দ্বন্দ্ব সৃষ্টি করবে
পেট্রাস থেরন

আমি মনে করি হোস্ট পরিষেবা বন্ধ করা সেই ক্ষেত্রে সমস্যার সমাধান করবে।
হৃষি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.