ডকারের ধারকের ভিতরে থেকে, আমি কীভাবে মেশিনের লোকালহোস্টের সাথে সংযোগ করব?


1444

সুতরাং আমার কাছে একটি ডকনার ধারকের ভিতরে একটি এনগিনেক্স চলছে, আমার লোকালহোস্টে একটি মাইএসকিএল চলছে, আমি আমার এনগিনেক্সের মধ্যে থেকে মাইএসকিউএলে কানেক্ট করতে চাই। মাইএসকিএল লোকালহোস্টে চলছে এবং বাইরের বিশ্বের কাছে কোনও বন্দর প্রকাশ করে না, সুতরাং এটি লোকালহোস্টে আবদ্ধ, মেশিনের আইপি ঠিকানায় আবদ্ধ নয়।

এই ডকার ধারক থেকে এই মাইএসকিএল বা লোকালহোস্টের অন্য কোনও প্রোগ্রামের সাথে সংযোগ করার কোনও উপায় আছে কি?

এই প্রশ্নটি "ডকার হোস্টের আইপি ঠিকানা কীভাবে ডকারের ধারকের ভিতরে থেকে পাওয়া যায়" তার থেকে আলাদা "কারণ ডকার হোস্টের আইপি ঠিকানাটি পাবলিক আইপি বা নেটওয়ার্কের ব্যক্তিগত আইপি হতে পারে যা হতে পারে ডকারের ধারক থেকে পৌঁছতে না পারা (আমার অর্থ পাবলিক আইপি যদি এডাব্লুএস বা কোনও কিছুতে হোস্ট করা থাকে)। আপনার কাছে ডকার হোস্টের আইপি অ্যাড্রেস থাকলেও এর অর্থ এই নয় যে আপনি আপনার ডকার নেটওয়ার্ক হিসাবে আইপি ঠিকানাটি ওভারলে, হোস্ট, ব্রিজ, ম্যাকভ্লান, কোনও কিছুই হতে পারে না যা এর পুনঃব্যবস্থাপনাকে সীমাবদ্ধ করে কনটেইনার থেকে ডকার হোস্টের সাথে সংযোগ করতে পারবেন mean যে আইপি ঠিকানা।


মাইএসকিএলকে পাশাপাশি ডকারে কেন বেঁধে রাখবেন না?
আইভান্ট

2
উইন্ডোজ মেশিনের জন্য: - ock ডকার রান-ডি
লোকেশ এস


network: hostআপনি ছাড়া কোনও ধারক থেকে হোস্টে ফিরে যেতে পারবেন না। কেবল পাত্রে হোস্ট করুন। এটি পাত্রে পিছনে মূল আদর্শ ideology স্থিতিশীলতা এবং সুরক্ষা উভয় কারণে তারা বিচ্ছিন্ন।
ফ্রিসফটওয়্যার সার্ভার

উত্তর:


1963

সম্পাদনা: আপনি যদি উইন্ডোজ 18.03+ এর জন্য ডকার-ফর-ম্যাক বা ডকার-ফর-উইন্ডো ব্যবহার করছেন তবে কেবল হোস্টটি ব্যবহার করে আপনার মাইএসকিএল পরিষেবাটিতে সংযুক্ত করুন host.docker.internal( 127.0.0.1আপনার সংযোগের স্ট্রিংয়ের পরিবর্তে )।

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

2020-01: কিছু অগ্রগতি হয়েছে। যদি সবকিছু ঠিকঠাক হয় তবে এটি ডকারে 20.04 এ অবতরণ করা উচিত


TLDR

--network="host"আপনার docker runকমান্ড ব্যবহার করুন , তারপরে 127.0.0.1আপনার ডকার পাত্রে আপনার ডকার হোস্টকে নির্দেশ করবে।

দ্রষ্টব্য: এই মোডটি ডকুমেন্টেশন অনুযায়ী কেবল লিনাক্সের জন্য ডকারে কাজ করে ।


ডকার কনটেইনার নেটওয়ার্কিং মোডে নোট

কনটেইনার চলাকালীন ডকার বিভিন্ন নেটওয়ার্কিং মোড সরবরাহ করে । আপনি যে মোডটি বেছে নিয়েছেন তার উপর নির্ভর করে ডকার হোস্টে চলমান আপনার মাইএসকিউএল ডাটাবেসের সাথে আপনি আলাদাভাবে সংযোগ স্থাপন করবেন।

ডকার রান - নেট ওয়ার্ক = "সেতু" (ডিফল্ট)

ডকার docker0পূর্বনির্ধারিত একটি ব্রিজ তৈরি করে । উভয় ডকার হোস্ট এবং ডকার পাত্রে সেই ব্রিজটিতে একটি আইপি ঠিকানা রয়েছে।

ডকার হোস্টে, টাইপ করুন যাতে sudo ip addr show docker0আপনি দেখতে একটি আউটপুট পাবেন:

[vagrant@docker:~] $ sudo ip addr show docker0
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    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
    inet6 fe80::5484:7aff:fefe:9799/64 scope link
       valid_lft forever preferred_lft forever

তাই এখানে আমার Docker হোস্ট আইপি ঠিকানা আছে 172.17.42.1উপর docker0নেটওয়ার্ক ইন্টারফেস।

এখন একটি নতুন ধারক শুরু করুন এবং এটিতে একটি শেল পান: docker run --rm -it ubuntu:trusty bashএবং ip addr show eth0এর মূল নেটওয়ার্ক ইন্টারফেসটি কীভাবে সেট আপ করা হয়েছে তা আবিষ্কার করার জন্য এবং ধারকটির মধ্যে টাইপ করুন :

root@e77f6a1b3740:/# ip addr show eth0
863: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 66:32:13:f0:f1:e3 brd ff:ff:ff:ff:ff:ff
    inet 172.17.1.192/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::6432:13ff:fef0:f1e3/64 scope link
       valid_lft forever preferred_lft forever

এখানে আমার ধারকটির আইপি ঠিকানা রয়েছে 172.17.1.192। এবার রাউটিং টেবিলটি দেখুন:

root@e77f6a1b3740:/# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         172.17.42.1     0.0.0.0         UG    0      0        0 eth0
172.17.0.0      *               255.255.0.0     U     0      0        0 eth0

সুতরাং ডকার হোস্টের আইপি ঠিকানাটি 172.17.42.1ডিফল্ট রুট হিসাবে সেট করা আছে এবং এটি আপনার ধারক থেকে অ্যাক্সেসযোগ্য।

root@e77f6a1b3740:/# ping 172.17.42.1
PING 172.17.42.1 (172.17.42.1) 56(84) bytes of data.
64 bytes from 172.17.42.1: icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from 172.17.42.1: icmp_seq=2 ttl=64 time=0.201 ms
64 bytes from 172.17.42.1: icmp_seq=3 ttl=64 time=0.116 ms

ডকার রান - নেট ওয়ার্ক = "হোস্ট"

বিকল্পভাবে আপনি সেট করা নেটওয়ার্ক সেটিংসhost সহ একটি ডকার ধারক চালাতে পারেন । এই জাতীয় একটি ধারক ডকার হোস্টের সাথে নেটওয়ার্ক স্ট্যাকটি ভাগ করবে এবং ধারক দৃষ্টিকোণ থেকে, localhost(বা 127.0.0.1) ডকার হোস্টকে উল্লেখ করবে।

আপনার ডকারের ধারকটিতে যে কোনও বন্দর খোলা হবে তা ডকার হোস্টে খোলা হবে সে বিষয়ে সচেতন হন। এবং এটি বিকল্প -pবা -P docker runবিকল্পের প্রয়োজন ছাড়াই ।

আমার ডকার হোস্টে আইপি কনফিগারেশন:

[vagrant@docker:~] $ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:98:dc:aa brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe98:dcaa/64 scope link
       valid_lft forever preferred_lft forever

এবং হোস্ট মোডে একটি ডকার ধারক থেকে :

[vagrant@docker:~] $ docker run --rm -it --network=host ubuntu:trusty ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:98:dc:aa brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe98:dcaa/64 scope link
       valid_lft forever preferred_lft forever

আপনি যেমন দেখতে পাচ্ছেন যে ডকার হোস্ট এবং ডকার উভয় ধারক একই নেটওয়ার্ক ইন্টারফেসটি ভাগ করে এবং এর মতো একই আইপি ঠিকানা।


পাত্রে থেকে মাইএসকিউএলে সংযুক্ত হচ্ছে

ব্রিজ মোড

ব্রিজ মোডের ধারকগুলি থেকে ডকার হোস্টে চলমান মাইএসকিউএল অ্যাক্সেস করার জন্য, আপনাকে নিশ্চিত করতে হবে যে মাইএসকিউএল পরিষেবাটি 172.17.42.1আইপি ঠিকানায় সংযোগগুলির জন্য শুনছে ।

এটি করতে, আপনার bind-address = 172.17.42.1বা bind-address = 0.0.0.0আপনার মাইএসকিউএল কনফিগারেশন ফাইলে (my.cnf) রয়েছে তা নিশ্চিত করুন।

গেটওয়ের আইপি ঠিকানার সাথে যদি আপনার পরিবেশের পরিবর্তনশীল সেট করতে হয় তবে আপনি একটি ধারকটিতে নিম্নলিখিত কোডটি চালাতে পারেন:

export DOCKER_HOST_IP=$(route -n | awk '/UG[ \t]/{print $2}')

তারপরে আপনার অ্যাপ্লিকেশনটিতে DOCKER_HOST_IPমাইএসকিউএল সংযোগটি খুলতে পরিবেশ পরিবর্তনশীলটি ব্যবহার করুন ।

দ্রষ্টব্য: আপনি যদি bind-address = 0.0.0.0নিজের মাইএসকিউএল সার্ভারটি ব্যবহার করেন তবে সমস্ত নেটওয়ার্ক ইন্টারফেসের সংযোগগুলি শুনবে। এর অর্থ আপনার মাইএসকিউএল সার্ভারটি ইন্টারনেট থেকে পৌঁছানো যেতে পারে; সে অনুযায়ী ফায়ারওয়াল বিধিগুলি সেটআপ করতে নিশ্চিত করুন।

দ্রষ্টব্য 2: আপনি যদি bind-address = 172.17.42.1নিজের মাইএসকিউএল সার্ভারটি ব্যবহার করেন তবে তা সংযোগগুলি শোনেন না 127.0.0.1। ডক হোস্টে চলমান প্রক্রিয়াগুলি যা মাইএসকিউএলে কানেক্ট করতে চায় তাদের 172.17.42.1আইপি ঠিকানাটি ব্যবহার করতে হবে ।

হোস্ট মোড

হোস্ট মোডে কনটেইনারগুলি থেকে ডকার হোস্টে চলমান মাইএসকিউএল অ্যাক্সেস পেতে bind-address = 127.0.0.1আপনি আপনার মাইএসকিউএল কনফিগারেশন রাখতে পারেন এবং আপনাকে যা করতে হবে তা হ'ল 127.0.0.1আপনার পাত্রে থেকে সংযোগ স্থাপন করা :

[vagrant@docker:~] $ docker run --rm -it --network=host mysql mysql -h 127.0.0.1 -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 36
Server version: 5.5.41-0ubuntu0.14.04.1 (Ubuntu)

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

দ্রষ্টব্য: ব্যবহার করুন mysql -h 127.0.0.1এবং না mysql -h localhost; অন্যথায় মাইএসকিউএল ক্লায়েন্ট একটি ইউনিক্স সকেট ব্যবহার করে সংযোগ দেওয়ার চেষ্টা করবে।


8
এই ধরনের একটি উত্তরের জন্য আপনাকে ধন্যবাদ! আমি যা জড়ো করেছি তা থেকে, হোস্ট মোড ব্যবহার করা লোকালহোস্টের মাধ্যমে এই কার্যকারিতাটি পাওয়ার একমাত্র উপায়। আমি চেষ্টা করি নি তবে আমি ধরে নেব যে আপনি তাদের নিজস্ব ব্রিজের উপর একটি সাধারণ 'লোকালহোস্ট' সরবরাহের জন্য পাত্রে সংযোগ স্থাপনের জন্য একটি পৃথক নেটওয়ার্ক তৈরি করতে পারেন।
বেন

26
ওএসএক্স ব্যবহারকারীদের জন্য দ্রষ্টব্য: "ডকার-মেশিন এসএসএল ডিফল্ট" ব্যবহার করে প্রথমে আপনার ডকার ভার্চুয়াল মেশিনে (বুট 2 ডকার) লগ ইন করুন, তারপরে "sudo ip adder show docker0" চালান। থমাসের নির্দেশাবলী সেখান থেকে চালিয়ে যান।
চার্লি ডালাসাস

30
আমি ম্যাকের জন্য ডকার চালাচ্ছি এবং এখন আর 172.17.42.1 নেই, আর কোনও ডকার0 নেই। এটি গেটওয়ে হিসাবে 172.17.0.1 ছিল, এবং এটিও করতে পারে নাtelnet 172.17.0.1 3306
zx1986

26
আপনি -v /var/run/mysqld/mysqld.sock:/tmp/mysql.sockএই জাতীয় নেটওয়ার্কিংয়ের পরিবর্তে পাত্রে mysql সকেট মাউন্ট করতে পারেন ।
chx

8
আপনার ডককে ম্যাকে চালাচ্ছেন এবং বুট 2 ডকার ব্যবহার করছেন না যেমন কোনও ডকার0 ইন্টারফেস নেই তখন কেউ কি পরিস্থিতি মোকাবেলা করতে পারে?
TheJKFever

350

ম্যাকোস এবং উইন্ডোজের জন্য

ডকার ভি 18.03 এবং তার বেশি (21 শে মার্চ 2018 এর পরে)

আপনার অভ্যন্তরীণ আইপি ঠিকানাটি ব্যবহার করুন বা বিশেষ ডিএনএস নামের সাথে সংযুক্ত করুন host.docker.internalযা হোস্ট দ্বারা ব্যবহৃত অভ্যন্তরীণ আইপি ঠিকানার সমাধান করবে।

লিনাক্স সমর্থন https://github.com/docker/for-linux/issues/264 এর জন্য মুলতুবি রয়েছে

ডকরের পূর্ববর্তী সংস্করণ সহ ম্যাকওএস

ম্যাক ভি 17.12 থেকে 18.02 এর জন্য ডকার

উপরের মতো একই তবে docker.for.mac.host.internalপরিবর্তে ব্যবহার করুন।

ম্যাক ভি 17.06 থেকে ভি 17.11 এর জন্য ডকার

উপরের মতো একই তবে docker.for.mac.localhostপরিবর্তে ব্যবহার করুন।

ম্যাক 17.05 এবং নীচের জন্য ডকার

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

sudo ifconfig lo0 alias 123.123.123.123/24

তারপরে নিশ্চিত হয়ে নিন যে আপনার সার্ভারটি উপরে বর্ণিত আইপি শুনছে বা 0.0.0.0। যদি এটি লোকালহোস্টে শুনছে তবে এটি 127.0.0.1সংযোগটি গ্রহণ করবে না।

তারপরে এই আইপিটিতে কেবল আপনার ডকারের ধারকটি নির্দেশ করুন এবং আপনি হোস্ট মেশিনটি অ্যাক্সেস করতে পারবেন!

পরীক্ষা করতে আপনি ধারকটির curl -X GET 123.123.123.123:3000ভিতরে কিছু চালাতে পারেন ।

উপনামটি প্রতিটি রিবুটে রিসেট হবে তাই প্রয়োজনে একটি স্টার্ট-আপ স্ক্রিপ্ট তৈরি করুন।

সমাধান এবং আরও ডকুমেন্টেশন এখানে: https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds


5
উজ্জ্বল এবং ধন্যবাদ, এটি আমার জন্য পাত্রে থেকে কাজ করেছে। mysql -uroot -hdocker.for.mac.localhost
রিচার্ড ফ্র্যাঙ্ক

1
docker.for.mac.localhost ঠিক আমি যা খুঁজছিলাম। তবে এটি একই সাথে নরকের মতো নোংরা। ডকারে, কেউ আশা করতে পারে যে হুক ডকার.ফোর.ম্যাক.লোকালহোস্ট একটি জেনেরিক ডকার অভ্যন্তরীণ নাম হবে যা কেবলমাত্র ম্যাকের জন্য নয়, কোনও অপারেটিং সিস্টেমের জন্য বৈধ হবে। তবে উন্নয়নের উদ্দেশ্যে এটি যথেষ্ট ভাল।
99 সোনো

9093 বলে প্রকাশিত কোন বন্দরে আমি কীভাবে অ্যাক্সেস করব .. আমি ডেলার.ফোর্স.ম্যাক.লোক্যালহস্ট 9093 টেলনেট করার চেষ্টা করছি। এটি অ্যাক্সেসযোগ্য তবে আমি যদি ডকার.ফোর.ম্যাক.লোক্যালহোস্টের কাছে পিং করছি, তবে এটি পৌঁছনীয় mআমি এখানে কিছু অনুপস্থিত?
অচিলিয়াস

1
কনটেইনার থেকে হোস্ট রেজোলিউশনের জন্য docker.for.mac.localhost (এখনও বৈধ) এর পরিবর্তে ডিএনএস নাম docker.for.mac.host.in অন্তর্ভুক্ত ব্যবহার করা উচিত, যেহেতু একটি আরএফসি লোকালহোস্টের সাবডোমেনগুলি ব্যবহার নিষিদ্ধ করে। টুলস.ইটিএফ.আর.এফ.এইচটিএমএল / ড্রাফট-ওয়েস্ট-let-localhost-be-localhost-06 দেখুন ।
জয়া

এটি আমার পক্ষে কাজ করে না। আমি যখন docker run -e HOSTNAME= docker.for.mac.host.internal , ধারকটি তৈরি করা হয় তবে কিছুই হয় না। আমার তখন crtl + C করতে হবে। সঙ্গে --net=host -e HOSTNAME=localhostঅন্তত ধারক রানে অভিযোগ এটি সেবা আমি প্রয়োজন খুঁজে পাচ্ছি না (মাইএসকিউএল ডিবি)।
জর্জে অর্পিনেল

83

আমি উপরের পোস্টগুলির অনুরূপ একটি হ্যাক করছি যা পাত্রে একটি স্থানীয় নাম (ডিএনএস) এ মানচিত্র করতে স্থানীয় আইপি পান। প্রধান সমস্যাটি হ'ল আইপি ঠিকানা লিনাক্স এবং ওএসএক্স উভয় ক্ষেত্রেই কাজ করে এমন একটি সাধারণ স্ক্রিপ্ট নিয়ে গতিশীলভাবে পাওয়া । আমি এই স্ক্রিপ্টটি করেছি যা উভয় পরিবেশে কাজ করে (এমনকি "$LANG" != "en_*"কনফিগারযুক্ত লিনাক্স বিতরণেও):

ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1

সুতরাং, ডকার রচনা ব্যবহার করে, সম্পূর্ণ কনফিগারেশনটি হ'ল:

স্টার্টআপ স্ক্রিপ্ট (ডকার-রুন.শ) :

export DOCKERHOST=$(ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1)
docker-compose -f docker-compose.yml up

ডকার-কম্পোজ.আইএমএল :

myapp:
  build: .
  ports:
    - "80:80"
  extra_hosts:
    - "dockerhost:$DOCKERHOST"

তারপর পরিবর্তন http://localhostকরার জন্য http://dockerhostআপনার কোডে।

DOCKERHOSTস্ক্রিপ্টটি কীভাবে কাস্টমাইজ করা যায় তার আরও অগ্রিম গাইডের জন্য , এটি কীভাবে কাজ করে তার ব্যাখ্যা সহ এই পোস্টটি একবার দেখুন ।


1
আপনার ব্যবহারের ক্ষেত্রে, DOCKERHOSTআপনার ডকারের ধারককে স্থানীয়ভাবে সংযুক্ত হওয়ার জন্য যে কোনও পরিষেবা প্রয়োজন তার পরিবর্তে আপনি "লোকালহোস্ট" বা 0.0.0.0 এর পরিবর্তে এখানে মানটি ব্যবহার করেই চলে যেতে পারেন।
এন্ডারল্যান্ড

2
: আমি সামান্য আপনার সমাধান সংশোধন করেছেন কাস্টম নেটওয়ার্কের সঙ্গে সামঞ্জস্যপূর্ণ হতে export DOCKERHOST=$(docker network inspect --format='{{range .IPAM.Config}}{{.Gateway}}{{end}}' <NETWORK-NAME> | awk -F "/" 'NR==1{print $1}') কোথায় <নেটওয়ার্ক-নাম> হতে পারে সেতু বা নেটওয়ার্ক এর নামের Docker-রচনা (সাধারণত দ্বারা সংজ্ঞায়িত পথ-নাম - NETWORK_NAME )।
ডায়ারেসিস

1
আপনাকে একটি মন্তব্য যুক্ত করতে হবে: dockerhostডিবি সংযোগের জন্য হোস্ট হিসাবে ব্যবহার করুন ( localhostকনফিগার ফাইলের ক্ষেত্রে সাধারণত প্রতিস্থাপন )।
জাস্টিন

অদ্ভুত সমাধান, তবে এটিই কেবল পিএইচপি ক্লাই দিয়ে ডকারের অধীনে xdebug কাজ করে
এডি

এসিএল হোলপক্সিতে এই সমাধানের পরে কাজ করা বন্ধ করে দেয়। কোন ধারণা কেন?
হিউকহিউকবই

41

এটি কোনও এনজিআইএনএক্স / পিএইচপি-এফপিএম স্ট্যাকে আমার পক্ষে কোনও কোড বা নেটওয়ার্কিংয়ের স্পর্শ ছাড়াই কাজ করেছে যেখানে অ্যাপ্লিকেশনটির সাথে কেবল সংযোগ করতে সক্ষম হওয়ার আশা করা হচ্ছে localhost

mysqld.sockহোস্ট থেকে পাত্রে ভিতরে মাউন্ট ।

হোস্ট চলমান মাইএসকিএলে mysql.sock ফাইলের অবস্থান সন্ধান করুন:
netstat -ln | awk '/mysql(.*)?\.sock/ { print $9 }'

এই ফাইলটি যেখানে ডকারে প্রত্যাশিত সেখানে মাউন্ট করুন:
docker run -v /hostpath/to/mysqld.sock:/containerpath/to/mysqld.sock

Mysqld.sock এর সম্ভাব্য অবস্থানগুলি:

/tmp/mysqld.sock
/var/run/mysqld/mysqld.sock 
/var/lib/mysql/mysql.sock
/Applications/MAMP/tmp/mysql/mysql.sock # if running via MAMP

2
এটি অনেক পরিষ্কার সমাধান, মাইএসকিএলটিকে বাইরের সাথে প্রকাশ করা নয় (যদি ফায়ারওয়াল ব্যবহার না করে)।
ব্যবহারকারী 1226868

5
সকেটগুলি পাশাপাশি টিসিপি স্কেল করে না কারণ তারা প্রায়শই ব্লক করে এবং উদ্ভট আচরণের কারণ হতে পারে। যখনই সম্ভব টিসিপি ব্যবহার করুন।
জোয়েল ই সালাস 21

3
@ জোয়েলসালাস আপনার কাছে কি এই দাবির কোনও উত্স আছে?
ব্যক্তিগত

আমি এটি সবচেয়ে সহজ সমাধান হিসাবে খুঁজে পেয়েছি। থাম্বস আপ ইউজার ৩৩৩৩৪২২! স্ট্যাকওভারফ্লোতে আপনার আরও বেশি অবদান রাখা উচিত।
ব্যক্তিগত

2
@ জোয়েলসালাস আমার মনে হয় আপনি ভুল হয়ে গেছেন। লোকালহোস্টের সাথে সংযোগ করার পরিবর্তে লোকালহোস্টের সাথে সংযোগ করার সময় মাইএসকিএল ক্লায়েন্ট লাইব্রেরি এমনকি ডিফল্টরূপে ইউনিক্স সকেট ব্যবহার করে। একটি ইউনিক্স সকেট টিসিপি স্ট্যাক এবং রাউটিংয়ের ওভারহেড এড়িয়ে চলে এবং দ্রুত চালানো উচিত।
এম কনরাড

25

যতক্ষণ না host.docker.internalপ্রতিটি প্লাটফর্মের জন্য কাজ করা হয়, আপনি আমার কন্টেইনারটি কোনও ম্যানুয়াল সেটআপ ছাড়াই নেট গেটওয়ে হিসাবে অভিনয় করতে পারেন:

https://github.com/qoomon/docker-host


5
আমি নিশ্চিত করতে পারি যে এটি উইন্ডোজ কনটেইনারের সাথে উইন্ডোজ 19.03.2 এর জন্য ডকারে কাজ করে না।
কেএমসি

কোন ধারণা কিভাবে যে ঠিক কিভাবে? (আমি উইন্ডোজ ব্যবহারকারী নই)
কুইমন

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

24

লিনাক্সের জন্য সমাধান (কার্নেল> = 3.6)।

ঠিক আছে, আপনার স্থানীয় হোস্ট সার্ভার ডিফল্ট Docker ইন্টারফেস আছে docker0 IP ঠিকানার সাথে 172.17.0.1 । আপনার ধারকটি ডিফল্ট নেটওয়ার্ক সেটিংস - নেট = "ব্রিজ" দিয়ে শুরু হয়েছিল

  1. ডকার0 ইন্টারফেসের জন্য রুট_লোক্যালনেট সক্ষম করুন:
    $ sysctl -w net.ipv4.conf.docker0.route_localnet=1
  2. Iptables এ এই বিধিগুলি যুক্ত করুন:
    $ iptables -t nat -I PREROUTING -i docker0 -d 172.17.0.1 -p tcp --dport 3306 -j DNAT --to 127.0.0.1:3306
    $ iptables -t filter -I INPUT -i docker0 -d 127.0.0.1 -p tcp --dport 3306 -j ACCEPT
  3. '%' থেকে অ্যাক্সেস সহ mysql ব্যবহারকারী তৈরি করুন যার অর্থ - লোকালহোস্ট ব্যতীত যে কারও কাছ থেকে:
    CREATE USER 'user'@'%' IDENTIFIED BY 'password';
  4. আপনার স্ক্রিপ্টে মাইএসকিএল-সার্ভারের ঠিকানা 172.17.0.1 এ পরিবর্তন করুন


থেকে কার্নেল ডকুমেন্টেশন :

রুট_লোক্যালনেট - বুলিয়ান : রাউটিংয়ের সময় লুপব্যাকের ঠিকানাগুলি মঙ্গলীয় উত্স বা গন্তব্য হিসাবে বিবেচনা করবেন না। এটি স্থানীয় রাউটিং উদ্দেশ্যে ( ডিফল্ট মিথ্যা ) জন্য 127/8 ব্যবহার সক্ষম করে ।


1
দ্বিতীয় iptable কমান্ডের উদ্দেশ্য কী? আমি বুঝতে পারি প্রথমটি হ'ল 172.17.0.1:3306 থেকে 127.0.0.1:3306 এর সাথে মেলে সমস্ত টিসিপি গন্তব্য পুনর্লিখন করা তবে দ্বিতীয় iptable কমান্ডটি কেন প্রয়োজনীয়?
প্যাট্রিক

17

উইন্ডোজ 10 এর সমাধান

ডকার সম্প্রদায় সংস্করণ 17.06.0-ce-win18 2017-06-28 (স্থিতিশীল)

docker.for.win.localhostঅভ্যন্তরীণ আইপি সমাধানের জন্য আপনি হোস্টের ডিএনএস নাম ব্যবহার করতে পারেন । (কিছু উত্স উল্লেখ করা সতর্ক করা windowsতবে এটি হওয়া উচিত win)

ওভারভিউ
আমার অনুরূপ কিছু করা দরকার, এটি আমার ডকারের ধারক থেকে আমার লোকালহোস্টের সাথে সংযুক্ত, যা Azure Storage Emulatorএবং চালাচ্ছিল CosmosDB Emulator

Azure Storage Emulatorডিফল্ট শোনা দ্বারা 127.0.0.1 , যখন আপনি আইপি তার খুব আবদ্ধ, আমি একটি সমাধান ডিফল্ট সেটিংস সঙ্গে কাজ করবে খুঁজছেন ছিল পরিবর্তন করতে পারেন।

এটি আমার ডকারের ধারক থেকে সংযুক্ত হওয়ার জন্য SQL Serverএবং IISউভয়ই আমার হোস্টে ডিফল্ট পোর্ট সেটিংস সহ স্থানীয়ভাবে চলতে কাজ করে running


13

খুব সহজ এবং দ্রুত, আপনার হোস্ট আইপিটি আইফোনফিগ (লিনাক্স) বা আইপকনফিগ (উইন্ডোজ) দিয়ে পরীক্ষা করুন এবং তারপরে একটি তৈরি করুন

Docker-compose.yml

version: '3' # specify docker-compose version

services:
  nginx:
    build: ./ # specify the directory of the Dockerfile
    ports:
      - "8080:80" # specify port mapping
    extra_hosts:
      - "dockerhost:<yourIP>"

এইভাবে, আপনার ধারক আপনার হোস্ট অ্যাক্সেস করতে সক্ষম হবেন। আপনার ডিবি অ্যাক্সেস করার সময়, আপনি যে নামটি আগে নির্দিষ্ট করেছেন সেটি ব্যবহার করতে ভুলবেন না, এই ক্ষেত্রে "ডকারহোস্ট" এবং আপনার হোস্টের বন্দর যেখানে ডিবি চলছে


হাইপ্রক্সিতে, এই সমাধানটি কোনও কারণে এসিএলগুলির কাজ বন্ধ করে দিয়েছে, কেবলমাত্র ডিফল্ট সেটিংস কাজ করছে।
হিউকহিউকবাই

1
লিনাক্স সিস্টেমে কাজ করা একমাত্র সমাধান। +1
রফিক ফরহাদ

11

উইন্ডোজ 10 হোম-তে ডকার টুলবক্স ব্যবহার করার সময় উত্তরগুলির কোনওটিই আমার পক্ষে কাজ করেনি, তবে 10.0.2.2 হয়েছে , কারণ এটি ভার্চুয়ালবক্স ব্যবহার করে যা হোস্টটিকে এই ঠিকানায় ভিএমের কাছে প্রকাশ করে।


2
এটা কাজ করে। এমনকি --network = হোস্ট নির্দিষ্ট করার প্রয়োজন নেই। হোস্টের জন্য 10.0.2.2 ডিফল্ট আইপি হিসাবে সেট করা আছে বলে মনে হচ্ছে। ধন্যবাদ।
দ্যমনিশ

তবে, আমি কী উইন্ডোজ এবং ম্যাকের সমস্ত সংস্করণের জন্য এই স্ট্যাটিক আইপি ব্যবহার করতে পারি?, আমি কীভাবে এটি স্ক্রিপ্টের মাধ্যমে একাধিক প্ল্যাটফর্মের জন্য পরিচালনা করতে পারি?
151291

এটি আমার পক্ষে কাজ করেছে। আপনার হোস্ট (উইন্ডোজ) Ethernet adapter vEthernet (DockerNAT)
আইপোনফিগ চালান

10

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

এটি সাধারণত লুকানো সি: \ প্রোগ্রামডাটা \ মাইএসকিউএল ফোল্ডারের অধীনে কনফিগারেশন ফাইলের মাধ্যমে করা হয়।

0.0.0.0 এ বাঁধাই কাজ করবে না। প্রয়োজনীয় ঠিকানাটি ডকার কনফিগারেশনেও প্রদর্শিত হয়েছে এবং আমার ক্ষেত্রে ছিল 10.0.75.1।


3
আপনি একটি পদক প্রাপ্য! আমি পুরো দু'দিন ধরে এ নিয়ে কাজ করছি। সাহায্য করার জন্য আপনাকে ধন্যবাদ!
মাইকেল 23

1
আমি পুরো দুটি দিন এটি নিয়েও কাজ করছিলাম। ওয়েবে এটিই আমি খুঁজে পেয়েছি যে এটি উল্লেখ করেছি। কোনও ডকারের ধারক থেকে এমএসএসকিউএলের সাথে সংযোগ স্থাপনের কথা বললে মাইক্রোসফ্ট এতে সম্পূর্ণ নীরব। এগুলি আপনাকে অবাক করে তোলে যে তারা কখনও নিজেরাই এটি কাজ করে!
কনটাঙ্গো

8

সম্পাদনা করুন: আমি গিটহাবের ধারণার প্রোটোটাইপিং শেষ করেছি। চেক আউট করুন: https://github.com/sivabudh/system-in-a-box


প্রথমত, আমার উত্তরটি 2 টি গোষ্ঠীর দিকে প্রস্তুত: যারা ম্যাক ব্যবহার করেন এবং যারা লিনাক্স ব্যবহার করেন।

হোস্ট নেটওয়ার্ক মোড একটি ম্যাক কাজ করে না। আপনাকে একটি আইপি ওরফে ব্যবহার করতে হবে, দেখুন: https://stackoverflow.com/a/43541681/2713729

হোস্ট নেটওয়ার্ক মোড কি? দেখুন: https://docs.docker.com/engine/references/run/#/network-settings

দ্বিতীয়ত, আপনারা যারা লিনাক্স ব্যবহার করছেন তাদের জন্য (আমার প্রত্যক্ষ অভিজ্ঞতা উবুন্টু ১৪.০৪ এলটিএসের সাথে ছিল এবং আমি শীঘ্রই উত্পাদনে ১.0.০৪ এলটিএসে আপগ্রেড করছি), হ্যাঁ , আপনি কোনও ডকারের ধারকের অভ্যন্তরে চলমান পরিষেবাটি চালু থাকা localhostপরিষেবাগুলিতে সংযুক্ত করতে পারেন ডকার হোস্ট (যেমন আপনার ল্যাপটপ)।

কিভাবে?

মূলটি হ'ল যখন আপনি ডকারের ধারকটি চালাবেন, আপনাকে এটি হোস্ট মোড দিয়ে চালাতে হবে । কমান্ডটি এরকম দেখাচ্ছে:

docker run --network="host" -id <Docker image ID>

যখন আপনি কোনো না ifconfig(আপনি করতে হবে apt-get install net-toolsআপনার ধারক জন্য ifconfigআপনার ধারক ভিতরে callable হতে), আপনি যে নেটওয়ার্ক ইন্টারফেসের Docker হোস্ট এক (উদাহরণ। আপনার ল্যাপটপ) হিসাবে একই দেখতে হবে।

এটি লক্ষ করা গুরুত্বপূর্ণ যে আমি একজন ম্যাক ব্যবহারকারী, তবে আমি সমান্তরালগুলির নীচে উবুন্টু চালাই, সুতরাং ম্যাক ব্যবহার করা কোনও অসুবিধা নয়। ;-)

এবং এভাবেই আপনি এনজিআইএনএক্স কনটেইনারটি একটি এ চলমান মাইএসকিউএল এর সাথে সংযুক্ত করেন localhost


1
এটি লক্ষ্য করা গুরুত্বপূর্ণ যে হোস্ট মোডটি ওএস নেটওয়ার্ক স্ট্যাক ব্যবহার করার কারণে আরও ভাল পারফরম্যান্স সরবরাহ করে।
শিববধু

2
খুব ভাল পয়েন্ট সেখানে। যদিও কোনও ধারক থেকে অব্যবহৃত আইপি সংযুক্ত ডকস.ডকার / ডকার-ম্যাক / নেট ওয়ার্কিংয়ের সাথে একটি হোস্ট পরিষেবায় সংযোগ করা সম্ভব । একটি মনোরম সমাধান নয় ... কিন্তু কাজ করে।
জাভিয়ের হুপাé

এখানে ভাল জিনিস। ধারকটির ভিতরে একবার --network="host", কেউ কীভাবে উদাহরণস্বরূপ হোস্ট মাইএসকিএল এর সাথে সংযুক্ত হয়?
মাইকেল

1
শুধু ব্যবহার @Buccleuch localhost। আমার গিটহাব উত্স কোডটি দেখুন: github.com/sivabudh/s systemm-in-a-box / blob / master / dj_host_docker/… । অনুসন্ধান করুন 'HOST', আপনি Postgresql এ সংযোগ করতে 127.0.0.1 দেখতে পাবেন।
শিববধু

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

7

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

আপনার ম্যাকের আইপি ঠিকানাটি কেবল ব্যবহার করুন। আইপি ঠিকানা পেতে এবং পাত্রে থেকে এটি ব্যবহার করতে ম্যাক এ চালান:

$ ifconfig | grep 'inet 192'| awk '{ print $2}'

আপনার ম্যাকে বা অন্য কোনও ডক পাত্রে সার্ভার স্থানীয়ভাবে চলমান যতক্ষণ 0.0.0.0 শুনছে, ডকারের ধারক সেই ঠিকানায় পৌঁছাতে সক্ষম হবে।

আপনি যদি কেবল 0.0.0.0 এ শুনছেন এমন অন্য ডকার পাত্রে অ্যাক্সেস করতে চান তবে আপনি 172.17.0.1 ব্যবহার করতে পারেন


1
ম্যাকের জন্য ডকার docker.for.mac.host.internalএখন হোস্টের নামটি প্রকাশ করে ।
ম্যাট

5

এটি আসল প্রশ্নের উত্তর নয়। এইভাবেই আমি একই রকম সমস্যার সমাধান করেছি। সমাধানটি পুরোপুরি থেকে আসে: ডকার কনটেইনার নেটওয়ার্ক সংজ্ঞায়িত করুন যাতে ধারকরা যোগাযোগ করতে পারে । ধন্যবাদ নিক রাবয়কে

এটি অন্যদের জন্য এখানে রেখে যাঁরা একটি ধারক এবং অন্যটির মধ্যে REST কল করতে চান। প্রশ্নের উত্তর: ডকার পরিবেশে লোকালহোস্টের জায়গায় কী ব্যবহার করবেন?

আপনার নেটওয়ার্কটি কেমন দেখাচ্ছে তা পান docker network ls

একটি নতুন নেটওয়ার্ক তৈরি করুন docker network create -d my-net

প্রথম পাত্রে শুরু করুন docker run -d -p 5000:5000 --network="my-net" --name "first_container" <MyImage1:v0.1>

প্রথম ধারকটির জন্য নেটওয়ার্ক সেটিংস দেখুন docker inspect first_container। "নেটওয়ার্কস": 'মাই নেট' থাকা উচিত

দ্বিতীয় পাত্রে শুরু করুন docker run -d -p 6000:6000 --network="my-net" --name "second_container" <MyImage2:v0.1>

দ্বিতীয় ধারকটির জন্য নেটওয়ার্ক সেটিংস পরীক্ষা করে দেখুন docker inspect second_container। "নেটওয়ার্কস": 'মাই নেট' থাকা উচিত

আপনার দ্বিতীয় ধারক মধ্যে ssh docker exec -it second_container shবা docker exec -it second_container bash

দ্বিতীয় ধারকটির ভিতরে, আপনি প্রথম ধারকটি দিয়ে পিং করতে পারেন ping first_container। এছাড়াও, আপনার কোড কলগুলি যেমন http://localhost:5000প্রতিস্থাপন করা যেতে পারেhttp://first_container:5000


ঠিক আমি খুঁজছেন ছিল কি। ধন্যবাদ: ডি
সিমার সিং

5

উইন্ডোজ জন্য,

আমি বসন্তের কনফিগারেশনে ডাটাবেস url পরিবর্তন করেছি: spring.datasource.url=jdbc:postgresql://host.docker.internal:5432/apidb

তারপরে ছবিটি তৈরি করুন এবং রান করুন। এটা আমার জন্য কাজ করেছে।


আকর্ষণীয় ....
ফিলি

আমার জন্য কাজ করে না। লোকালহোস্ট মাইএসকিএলে সংযোগ করার জন্য আমার কাছে ম্যাক রয়েছে এবং একটি পিএইচপি কন্টেইনার থেকে চেষ্টা করছি। কোন ধারণা ?
এ। জালোনিস

4

আমি থমাসলভিলের উত্তরটির সাথে একমত নই।

172.17.42.1 এ mysql বাইন্ড তৈরি করা হোস্টের ডেটাবেস ব্যবহার করে অন্যান্য প্রোগ্রামগুলিতে এটি পৌঁছাতে বাধা দেয়। এটি কেবল তখনই কাজ করবে যদি আপনার সমস্ত ডাটাবেস ব্যবহারকারীদের ডকরাইজ করা থাকে।

০.০.০.০-এর সাথে মাইএসকিএল বাঁধাই ডিবি বাইরের বিশ্বে উন্মুক্ত করে দেবে যা কেবল খুব খারাপ কাজই নয়, মূল প্রশ্ন লেখক যা করতে চায় তার বিপরীতেও। তিনি স্পষ্টতই বলেছিলেন যে "মাইএসকিএল লোকালহোস্টে চলছে এবং বহির্বিশ্বে কোনও বন্দর বহির্ভূত করছে না, তাই এটি লোকালহোস্টের উপর আবদ্ধ"

আইভ্যান্ট থেকে মন্তব্য উত্তর

"মাইএসকিএলকে পাশাপাশি ডকার0-এ কেন বাঁধবেন না?"

সপ্তাহের দিন. মাইএসকিএল / মারিয়্যাডবি ডকুমেন্টেশন স্পষ্টভাবে বলেছে যে বেশ কয়েকটি ইন্টারফেসের সাথে বাঁধাই সম্ভব নয়। আপনি কেবল 0, 1 বা সমস্ত ইন্টারফেসকে আবদ্ধ করতে পারেন।

উপসংহার হিসাবে, আমি ডকারের ধারক থেকে হোস্টের (কেবলমাত্র লোকালহোস্ট) ডাটাবেসে পৌঁছানোর কোনও উপায় খুঁজে পাই না। এটি অবশ্যই খুব সাধারণ প্যাটার্নের মতো মনে হচ্ছে তবে এটি কীভাবে করা যায় তা আমি জানি না।


4
ডকার হোস্ট থেকে আপনি এখনও 172.17.42.1ঠিকানাটি ব্যবহার করে মাইএসকিউএল সার্ভারের সাথে সংযোগ করতে পারেন । তবে আপনার নোটটি অন্যথায় সঠিক। এসো, আমি আমার উত্তরটি hostনেটওয়ার্কিং মোড দিয়ে সম্পাদনা করেছি যা মাইএসকিউএল সার্ভারকে আবদ্ধ করার 127.0.0.1সময় কনটেইনারগুলিকে সংযোগ স্থাপনের অনুমতি দেয়
টমাসলভিল

না, যেমনটা আমি বলেছি, আপনি যদি 172.17.42.1 এর সাথে সংযোগ করতে পারবেন না যদি মাইএসকিএল লোকালহোস্টের সাথে আবদ্ধ থাকে।
অর্জেল

4
"172.17.42.1 এ mysql বাইন্ড তৈরি করা হোস্টের ডেটাবেস ব্যবহার করে অন্যান্য প্রোগ্রামগুলিতে এটি পৌঁছাতে বাধা দেবে" " - ওটা সত্যি না. অন্যান্য প্রোগ্রামগুলি মাইএসকিএল ব্যবহার করতে পারে, তাদের কেবল লোকালহোস্ট / 127.0.0.1 এর পরিবর্তে 172.17.42.1 এ সংযোগ করতে হবে।
0x89

এই উত্তরের সমস্যার সমাধানটি সাধারণত মাইএসকিউএল সার্ভারকে আবদ্ধ করার জন্য 0.0.0.0এবং তারপরে একটি ফায়ারওয়াল সেটআপ করা যাতে ডিবি ইন্টারনেট থেকে অ্যাক্সেসযোগ্য না হয়।
অর্ধ

4

এখানে আমার সমাধান: এটি আমার ক্ষেত্রে কাজ করে

  • #bind-address = 127.0.0.1 /etc/mysql/mysql.conf.d এ মন্তব্য করে স্থানীয় মাইএসকিএল সার্ভারকে সর্বজনীন অ্যাক্সেসে সেট করুন

  • মাইএসকিএল সার্ভার পুনরায় চালু করুন sudo /etc/init.d/mysql restart

  • যে কোনও হোস্টের ব্যবহারকারীর রুট অ্যাক্সেস খুলতে নিম্নলিখিত কমান্ডটি চালান mysql -uroot -proot GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; FLUSH PRIVILEGES;

  • sh স্ক্রিপ্ট তৈরি করুন: run_docker.sh

    #! বিন / ব্যাশ

    HOSTIP = `ip -4 অ্যাডারে স্কোপ গ্লোবাল ডেভ এথ0 দেখায় | গ্রেপ ইনট | awk '{মুদ্রণ \ $ 2}' | কাটা-ডি / -ফ 1`


      ডকার রান -ইট-ডি - নাম ওয়েব-অ্যাপ \
                  --add-host = স্থানীয়: $ O হোস্টিপ}
                  -পি 8080: 8080 \
                  -এ DATABASE_HOST = $ {হোস্টিপ}
                  -তে DATABASE_PORT = 3306 \
                  -e DATABASE_NAME = ডেমো \
                  -e DATABASE_USER = মূল \
                  -e DATABASE_PASSWORD = মূল \
                  sopheamak / springboot_docker_mysql

  
  • ডকার-সুরকারের সাথে চালান

    সংস্করণ: '২.১'

    সেবা:
    tomcatwar: extra_hosts: - "স্থানীয়: 10.1.2.232" চিত্র: সোফেইমাক / স্প্রিংবুট_ডোকার_মাইএসকিএল
    পোর্ট: - 8080: 8080 পরিবেশ: - DATABASE_HOST = স্থানীয় - DATABASE_USER = মূল - DATABASE_PASSWORD = মূল - DATABASE_NAME = ডেমো - DATABASE_PORT = 3306


4

বেশ কয়েকটি সমাধান মাথায় আসে:

  1. আপনার নির্ভরতা প্রথমে ধারকগুলিতে সরান
  2. আপনার অন্যান্য পরিষেবাগুলিকে বাহ্যিকভাবে অ্যাক্সেসযোগ্য করুন এবং সেই বাহ্যিক আইপি দিয়ে তাদের সাথে সংযুক্ত করুন
  3. নেটওয়ার্ক বিচ্ছিন্নতা ছাড়াই আপনার পাত্রে চালান
  4. নেটওয়ার্কের সাথে সংযোগ এড়াতে, পরিবর্তে ভলিউম হিসাবে মাউন্ট করা একটি সকেট ব্যবহার করুন

বাক্সটির বাইরে কাজ না করার কারণটি হ'ল পাত্রে ডিফল্টরূপে তাদের নিজস্ব নেটওয়ার্ক নেমস্পেস দিয়ে চালানো হয়। তার মানে লোকালহোস্ট (বা 127.0.0.1 লুপব্যাক ইন্টারফেসের দিকে ইঙ্গিত করে) প্রতি ধারক অনন্য। এটির সাথে সংযোগ স্থাপনটি নিজেই ধারকটির সাথে সংযোগ স্থাপন করবে এবং ডকারের বাইরে বা কোনও ভিন্ন ডকারের ধারকের অভ্যন্তরের পরিষেবাগুলি নয়।

বিকল্প 1 : যদি আপনার নির্ভরতা কোনও ধারক মধ্যে স্থানান্তরিত করা যায়, আমি প্রথমে এটি করব। অন্যরা নিজের পরিবেশে আপনার ধারক চালানোর চেষ্টা করার ফলে এটি আপনার অ্যাপ্লিকেশনটিকে স্ট্যাক বহনযোগ্য করে তোলে। এবং আপনি এখনও আপনার হোস্টে পোর্টটি প্রকাশ করতে পারেন যেখানে স্থানান্তরিত হয়নি এমন অন্যান্য পরিষেবাগুলি এখনও এটি পৌঁছে দিতে পারে। এমনকি -p 127.0.0.1:3306:3306প্রকাশিত বন্দরটির মতো একটি সিনট্যাক্সের মাধ্যমে বাহ্যিকভাবে অ্যাক্সেসযোগ্য হওয়া এড়াতে আপনি পোর্টটি আপনার ডকার হোস্টের লোকালহোস্ট ইন্টারফেসে প্রকাশ করতে পারেন ।

বিকল্প 2 : ধারকটির অভ্যন্তর থেকে হোস্ট আইপি ঠিকানা সনাক্ত করার বিভিন্ন উপায় রয়েছে, তবে প্রত্যেকের কাছে তারা যেখানে কাজ করে সেখানে সীমিত সংখ্যক পরিস্থিতি রয়েছে (যেমন ম্যাকের জন্য ডকার প্রয়োজন)। সর্বাধিক বহনযোগ্য বিকল্প হ'ল পরিবেশক পরিবর্তনশীল বা কনফিগারেশন ফাইলের মতো কিছু দিয়ে আপনার হোস্ট আইপিটি ধারকটিতে ইনজেক্ট করা eg যেমন:

docker run --rm -e "HOST_IP=$(ip r s 0/0 | awk '{print $3}')" ...

এটির প্রয়োজন নেই যে আপনার পরিষেবাটি সেই বাহ্যিক ইন্টারফেসে শুনছে, যা কোনও সুরক্ষা উদ্বেগ হতে পারে। ধারকটির অভ্যন্তর থেকে হোস্টের আইপি ঠিকানা পেতে অন্যান্য পদ্ধতির জন্য, এই পোস্টটি দেখুন

বিকল্প 3 : নেটওয়ার্ক বিচ্ছিন্নতা ছাড়াই দৌড়ানো, অর্থাত্‍ চলমান --net host, মানে আপনার অ্যাপ্লিকেশনটি হোস্ট নেটওয়ার্ক নেমস্পেসে চলছে। এটি ধারকটির জন্য কম বিচ্ছিন্নতা এবং এর অর্থ আপনি ডিএনএসের সাথে ভাগ করা ডকার নেটওয়ার্কের মাধ্যমে অন্যান্য পাত্রে অ্যাক্সেস করতে পারবেন না (পরিবর্তে, আপনাকে অন্যান্য ধারকযুক্ত অ্যাপ্লিকেশনগুলি অ্যাক্সেস করার জন্য প্রকাশিত বন্দরগুলি ব্যবহার করতে হবে)। তবে যে অ্যাপ্লিকেশনগুলিতে কেবল হোস্টে শোনার জন্য হোস্টের অন্যান্য পরিষেবাদি অ্যাক্সেস করা দরকার, তাদের পক্ষে 127.0.0.1এটি সহজ বিকল্প হতে পারে।

বিকল্প 4 : বিভিন্ন পরিষেবাদি একটি ফাইল সিস্টেম ভিত্তিক সকেটের মাধ্যমে অ্যাক্সেসের অনুমতি দেয়। এই সকেটটি বাইন্ড মাউন্ট ভলিউম হিসাবে পাত্রে মাউন্ট করা যেতে পারে, আপনাকে নেটওয়ার্কের উপরে না গিয়ে হোস্ট পরিষেবাটিতে অ্যাক্সেসের অনুমতি দেয়। ডকার ইঞ্জিনে অ্যাক্সেসের জন্য, আপনি প্রায়শই /var/run/docker.sockপাত্রে মাউন্ট করার উদাহরণ দেখতে পান (হোস্টটিতে সেই ধারককে রুট অ্যাক্সেস দেওয়া)। মাইএসকিএল দিয়ে আপনি এর মতো কিছু চেষ্টা করতে পারেন -v /var/run/mysqld/mysqld.sock:/var/run/mysqld/mysql.sockএবং তারপরে সংযুক্ত করতে পারেন localhostযা সকেটটি ব্যবহার করে মাইএসকিএল রূপান্তর করে।


3

আপনি আলপাইন চিত্র ব্যবহার করে হোস্ট আইপি পেতে পারেন

docker run --rm alpine ip route | awk 'NR==1 {print $3}'

এটি আরও সামঞ্জস্যপূর্ণ হবে কারণ আপনি সর্বদা কমান্ডটি চালানোর জন্য আলপাইন ব্যবহার করেন।

মারিয়ানোর জবাবের মতো আপনি পরিবেশের পরিবর্তনশীল সেট করতে একই আদেশ ব্যবহার করতে পারেন

DOCKER_HOST=$(docker run --rm alpine ip route | awk 'NR==1 {print $3}') docker-compose up

3

লিনাক্সের জন্য, যেখানে আপনি ইন্টারফেসটি পরিবর্তন করতে পারবেন না লোকালহোস্ট পরিষেবা বাঁধাই

আমাদের দুটি সমস্যা সমাধান করতে হবে

  1. হোস্টের আইপি পেয়েছি
  2. আমাদের লোকালহোস্ট পরিষেবাটি ডকারের কাছে উপলব্ধ করা

অন্যান্য উত্তর দ্বারা প্রদত্ত, কুনোমনের ডকার-হোস্ট চিত্র ব্যবহার করে প্রথম সমস্যাটি সমাধান করা যেতে পারে ।

আপনার অন্য ধারক হিসাবে একই ব্রিজ নেটওয়ার্কে আপনাকে এই ধারকটি যুক্ত করতে হবে যাতে আপনি এটি অ্যাক্সেস করতে পারেন। আপনার ধারকটির ভিতরে একটি টার্মিনাল খুলুন এবং নিশ্চিত করুন যে আপনি পিং করতে পারেন dockerhost

bash-5.0# ping dockerhost
PING dockerhost (172.20.0.2): 56 data bytes
64 bytes from 172.20.0.2: seq=0 ttl=64 time=0.523 ms

এখন, আরও কঠিন সমস্যা, পরিষেবাটি ডকারে অ্যাক্সেসযোগ্য making

আমরা হোস্টের কোনও বন্দর অ্যাক্সেস করতে পারি কিনা তা পরীক্ষা করতে আমরা টেলনেট ব্যবহার করতে পারি (আপনার এটি ইনস্টল করার প্রয়োজন হতে পারে)।

সমস্যাটি হ'ল আমাদের ধারক কেবল সেই পরিষেবাগুলিতে অ্যাক্সেস করতে সক্ষম হবেন যা সমস্ত ইন্টারফেসের সাথে জড়িত, যেমন এসএসএইচ:

bash-5.0# telnet dockerhost 22
SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3

তবে কেবল লোকালহোস্টের সাথে আবদ্ধ পরিষেবাগুলি অ্যাক্সেসযোগ্য হবে:

bash-5.0# telnet dockerhost 1025
telnet: can't connect to remote host (172.20.0.2): Connection refused

এখানে যথাযথ সমাধান হ'ল পরিষেবাটি ডকার ব্রিজ নেটওয়ার্কের সাথে আবদ্ধ করা। যাইহোক, এই উত্তরটি ধরে নিয়েছে যে এটির জন্য এটি আপনার পক্ষে সম্ভব নয়। সুতরাং আমরা পরিবর্তে ব্যবহার করব iptables

প্রথমত, আমাদের ব্রিজ নেটওয়ার্কের নাম খুঁজে বের করতে হবে যা ডকার ব্যবহার করছে ifconfig। আপনি যদি নামবিহীন সেতু ব্যবহার করেন তবে এটি ঠিক হবে docker0। তবে, আপনি যদি একটি নামকৃত নেটওয়ার্ক ব্যবহার করছেন তবে আপনার br-পরিবর্তে সেই ডকার ব্যবহার করে একটি ব্রিজ থাকবে। আমার হয় br-5cd80298d6f4

একবার আমাদের এই ব্রিজটির নাম হয়ে গেলে, আমাদের এই ব্রিজটি থেকে লোকালহোস্টে যাওয়ার অনুমতি দেওয়া দরকার। এটি সুরক্ষা কারণে ডিফল্টরূপে অক্ষম করা হয়েছে:

sysctl -w net.ipv4.conf.<bridge_name>.route_localnet=1

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

এই কাজের জন্য, আমরা সব অনুরোধ ফরোয়ার্ড করব <docker_bridge>:portকরারlocalhost:port

iptables -t nat -A PREROUTING -p tcp -i <docker_bridge_name> --dport <service_port> -j DNAT --to-destination 127.0.0.1:<service_port>

উদাহরণস্বরূপ, 1025 পোর্টে আমার পরিষেবার জন্য

iptables -t nat -A PREROUTING -p tcp -i br-5cd80298d6f4 --dport 1025 -j DNAT --to-destination 127.0.0.1:1025

আপনি এখন ধারক থেকে আপনার পরিষেবা অ্যাক্সেস করতে সক্ষম হওয়া উচিত:

bash-5.0# telnet dockerhost 1025
220 127.0.0.1 ESMTP Service Ready

1
এটি @ রে-ডি উপরে উল্লিখিত হিসাবে একই, তবে সুন্দরভাবে ব্যাখ্যা করা হয়েছে। ধন্যবাদ! অতিরিক্তভাবে, ডকার-রচনাটি ব্যবহার করার সময়, ডকার0 ইন্টারফেসে আগত সমস্ত প্যাকেটের জন্যও আমাকে PREOUTING চেইনে একটি DNAT নিয়ম যুক্ত করতে হয়েছিল: কারণ, ডকার-কমপস বিল্ড চলাকালীন ডকার0 ব্যবহার করছে বলে মনে হয় (রানের সময় নয়, আশ্চর্যরকম): sysctl -w net.ipv4.conf.docker0.route_localnet=1এবংiptables -t nat -A PREROUTING -p tcp -i docker0 --dport 1025 -j DNAT --to-destination 127.0.0.1:1025
আর্কাইন্ড হয়েছে

2

সিগ্রুপস এবং নেমস্পেসগুলি কনটেইনার ইকোসিস্টেমে প্রধান ভূমিকা পালন করছে।

নেমস্পেস বিচ্ছিন্নতার একটি স্তর সরবরাহ করে। প্রতিটি ধারক পৃথক নেমস্পেসে চলে এবং এর অ্যাক্সেসটি সেই নামস্থানটিতে সীমাবদ্ধ। সিগ্রুপগুলি প্রতিটি ধারকটির রিসোর্স ব্যবহার নিয়ন্ত্রণ করে, অন্যদিকে নেমস্পেস কোনও প্রক্রিয়া কীভাবে সম্পর্কিত উত্সটি দেখতে এবং অ্যাক্সেস করতে পারে তা নিয়ন্ত্রণ করে।

আপনি যে সমাধানের পদ্ধতির অনুসরণ করতে পারেন তার প্রাথমিক বোঝাপড়া এখানে রয়েছে,

নেটওয়ার্ক নেমস্পেস ব্যবহার করুন

কোনও ধারক যখন চিত্রের বাইরে ছড়িয়ে পড়ে তখন একটি নেটওয়ার্ক ইন্টারফেস সংজ্ঞায়িত হয় এবং তৈরি হয়। এটি ধারকটিকে অনন্য আইপি ঠিকানা এবং ইন্টারফেস দেয়।

$ docker run -it alpine ifconfig

হোস্টে নেমস্পেস পরিবর্তন করে, কোটেনার্স নেটওয়ার্কগুলি তার ইন্টারফেসের জন্য বিচ্ছিন্ন থাকে না, প্রক্রিয়াটিতে হোস্ট মেশিনগুলির নেটওয়ার্ক ইন্টারফেসের অ্যাক্সেস থাকবে।

$ docker run -it --net=host alpine ifconfig

প্রক্রিয়াটি যদি পোর্টগুলিতে শোনে তবে সেগুলি হোস্ট ইন্টারফেসে শোনা যাবে এবং ধারকটিতে ম্যাপ করা হবে।

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

এই ধারকটি তার নিজস্ব নেমস্পেসে চলবে।

$ docker run -it alpine ps aux

হোস্টের নাম-স্থান পরিবর্তন করে, ধারকটি অন্য সমস্ত প্রক্রিয়াও সিস্টেমে চলতে দেখবে।

$ docker run -it --pid=host alpine ps aux

নেমস্পেস ভাগ করে নেওয়া

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

প্রথম ধারক হ'ল এনগিনেক্স সার্ভার। এটি একটি নতুন নেটওয়ার্ক তৈরি করবে এবং নেমস্পেস প্রক্রিয়া করবে। এই ধারকটি নিজেকে নতুনভাবে নির্মিত 80 টি নেটওয়ার্ক ইন্টারফেসের পোর্টে আবদ্ধ করবে।

$ docker run -d --name http nginx:alpine

অন্য একটি ধারক এখন এই নেমস্পেসটি পুনরায় ব্যবহার করতে পারেন,

$ docker run --net=container:http mohan08p/curl curl -s localhost

এছাড়াও, এই ধারকটি একটি ভাগ করা পাত্রে প্রক্রিয়াগুলির সাথে ইন্টারফেস দেখতে পারে।

$ docker run --pid=container:http alpine ps aux

এটি আপনাকে অ্যাপ্লিকেশন পরিবর্তন বা পুনরায় চালু না করে পাত্রে আরও বেশি সুযোগ সুবিধা দেবে। একইভাবে আপনি হোস্টে মাইএসকিএল-তে সংযোগ করতে পারেন, আপনার অ্যাপ্লিকেশন চালনা এবং ডিবাগ করতে পারেন। তবে, এটি এই পথে যাওয়ার পরামর্শ দেয় না। আশা করি এটা সাহায্য করবে.


2

আপনার প্রবেশদ্বারটি জানতে হবে ! স্থানীয় সার্ভারের সাথে আমার সমাধানটি এটির অধীনে প্রকাশ করা ছিল 0.0.0.0:8000, তারপরে সাবনেট দিয়ে ডকার চালানো এবং এটির মতো ধারক চালানো :

docker network create --subnet=172.35.0.0/16 --gateway 172.35.0.1 SUBNET35
docker run -d -p 4444:4444 --net SUBNET35 <container-you-want-run-place-here>

সুতরাং, এখন আপনি নিজের লুপব্যাকটি অ্যাক্সেস করতে পারবেন http://172.35.0.1:8000


2

এটা চেষ্টা কর:

version: '3.5'
services:
  yourservice-here:
    container_name: container_name
    ports:
      - "4000:4000"
    extra_hosts: # <---- here
      - localhost:192.168.1.202
      - or-vitualhost.local:192.168.1.202

পেতে 192.168.1.202 , ব্যবহারifconfig

এটি আমার পক্ষে কাজ করেছে। এই সাহায্য আশা করি!


1

উইন্ডোজ মেশিনের জন্য: -

বিল্ড টাইমের সময় এলোমেলোভাবে ডকার পোর্ট উন্মুক্ত করতে নীচের কমান্ডটি চালান

$docker run -d --name MyWebServer -P mediawiki

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

উপরের ধারক তালিকায় আপনি 32768 হিসাবে নির্ধারিত বন্দরটি দেখতে পারবেন ing অ্যাক্সেস করার চেষ্টা করুন

localhost:32768 

মিডিয়াউইকি পৃষ্ঠাটি দেখতে পারেন


5
যদিও এই উত্তরটি কিছু ব্যবহারকারীর জন্য দরকারী তথ্য সরবরাহ করতে পারে তবে এটি ভুল উপায়ে ! এটি হোস্ট মেশিন থেকে ধারকটিতে চলমান একটি পরিষেবা অ্যাক্সেস সম্পর্কে । প্রশ্নটি অবশ্য কনটেইনার থেকে হোস্টে চলমান একটি পরিষেবা অ্যাক্সেস সম্পর্কে ছিল ।
einjohn

1

স্থিরmaster শাখায় একত্রীকরণ না করা অবধি , হোস্ট আইপি পেতে কেবল ধারকটির ভিতরে থেকে চালানো:

ip -4 route list match 0/0 | cut -d' ' -f3

(যেমনটি @ মাহনি এখানে পরামর্শ দিয়েছেন )।


1

আমি ধারকটির আইপির জন্য মাইএসকিউএলে একটি ব্যবহারকারী তৈরি করে এটি সমাধান করেছি:

$ sudo mysql<br>
mysql> create user 'username'@'172.17.0.2' identified by 'password';<br>
Query OK, 0 rows affected (0.00 sec)

mysql> grant all privileges on database_name.* to 'username'@'172.17.0.2' with grant option;<br>
Query OK, 0 rows affected (0.00 sec)

$ sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
<br>bind-address        = 172.17.0.1

$ sudo systemctl restart mysql.service

তারপরে কনটেইনার: jdbc:mysql://<b>172.17.0.1</b>:3306/database_name


এটি সহজ সমাধান। এটি আমার পক্ষে কাজ করেছে এবং আমি অনেককে উল্লেখ করেছি
সোপিয়া আলফ্রেড

-1

আমি যেভাবে এটি করি সেটি হল কনটেইনার হিসাবে পরিবেশগত পরিবর্তনশীল হিসাবে হোস্ট আইপি পাস করা। ধারক তারপরে সেই পরিবর্তনশীল দ্বারা হোস্টটি অ্যাক্সেস করুন।


আপনি কীভাবে এটি চিত্রিত করতে পারেন? আমি এই পদ্ধতির চেষ্টা করেছি কিন্তু খুব বেশি সাফল্য
পাইনি

ock ডকার রান -i -t -e HOST = 10.145.2.123 উবুন্টু রুট @ ce2a843da3ee: / tmp # ./telnet $ HOST 22 10.145.2.123 চেষ্টা করছে ... 10.145.2.123 এর সাথে সংযুক্ত। পালানোর চরিত্রটি '^]'। SSH-2.0-OpenSSH_7.4`
এফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.