ডকার_কম্পোস.আইএমএলে লিঙ্ক এবং নির্ভরযোগ্যতার মধ্যে পার্থক্য


291

ডকার কম্পোজের রচনা-ফাইল ডকুমেন্টেশন অনুসারে :

আমি অন্যান্য পাত্রে লিঙ্ক করার উদ্দেশ্য বুঝতে পারি না তাই দুটি বিকল্পের মধ্যে পার্থক্য এখনও আমার পক্ষে বেশ কঠিন বলে মনে হচ্ছে।

এটির উদাহরণ থাকলে খুব সহজ হবে, তবে আমি এর সন্ধান করতে পারি না।

আমি লক্ষ করেছি, আমি যখন ধারক বি এর সাথে কন্টেনার এ সংযুক্ত করব তখন ধারক বি কনটেইনার এ এর ​​শেলের ভিতরে "পিংযোগ্য" হবে।

আমি ping Bধারক এ এর ​​ভিতরে দৌড়েছি bashএবং এর মতো ফলাফল পেয়েছি (কেবল রেফারেন্সের জন্য, ইন্টারনেট থেকে চিত্র)

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


6
--linkফ্ল্যাগ বর্তমানে Docker এর একটি অননুমোদিত উত্তরাধিকার বৈশিষ্ট্য এবং ডকুমেন্টেশন সুপারিশ "এটা শেষ পর্যন্ত সরিয়ে ফেলা হতে পারে" Docker: উত্তরাধিকার ধারক লিঙ্কডকার নেটওয়ার্ক বৈশিষ্ট্য বা ডকার রচনা পদ্ধতিটি ব্যবহার না করার পরামর্শ দেওয়া হচ্ছে । আমি অনুভব করেছি যে এখানে এই বৈশিষ্ট্যটি সম্পর্কে জানতে শেখার পক্ষে এটি সহায়ক হবে।
একটি তারকা

উত্তর:


120

linksবিকল্পটি হ্রাসের পরে পোস্টটির আপডেট দরকার ।

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

এর জন্য docker run, --linkএটি অবচয় করা হয় এবং একটি কাস্টম নেটওয়ার্ক দ্বারা প্রতিস্থাপন করা উচিত।

docker network create mynet
docker run -d --net mynet --name container1 my_image
docker run -it --net mynet --name container1 another_image

depends_onশৃঙ্খলাবদ্ধ শৃঙ্খলা প্রকাশ করে (এবং স্পষ্টতই চিত্র টানতে ক্রম), যা এর ভাল পার্শ্ব প্রতিক্রিয়া ছিল links


13
সাধারণ স্ট্যাকওভারফ্লো, কেন আমাকে 1 পয়েন্ট উত্তর পেতে নীচে 147 এবং 43 পয়েন্ট উত্তর নীচে স্ক্রোল করতে হবে যা আসলে সেরা।
u8it

3
@ u8it এটি সময় এবং ইন্টারনেটের প্রকৃতি।
মাইকেল কোল

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

ডকর -রচনা সংস্করণ 3 ডক্সে লিঙ্কগুলি অবমূল্যায়ন সম্পর্কে তথ্য দেখতে পাচ্ছি না: ডকস.ডোকার . com / compose / compose - file / #links । আমি বিকল্পটি খুব দরকারী দেখতে পাচ্ছি না, যেহেতু আমরা নেটওয়ার্কগুলি ভাগ করে নিয়েছি এবং নির্ভর করে_, তবে আমি যদি ডকগুলি সঠিকভাবে পড়ে থাকি তবে এটি অবচয় করা হয় না (তারা কেবল ডকারের ধারকটিতে লিঙ্ক পতাকা উল্লেখ করে)।
রাইডারস্টেস্টর্ম

দ্রষ্টব্য: একই নেটওয়ার্কের পাত্রে (আসলে পরিষেবাগুলি) পরিষেবা নাম দ্বারা অ্যাক্সেসযোগ্য, ধারকটির নাম নয়। অফিসিয়াল ডকুমেন্টেশন: docs.docker.com/compose/networking/#links
গ্যারিওন

194

এই উত্তরটি ডকার-রচনা সংস্করণ 2 এর জন্য এবং এটি 3 সংস্করণেও কাজ করে

আপনি depend_on ব্যবহার করার পরেও ডেটা অ্যাক্সেস করতে পারেন।

আপনি যদি ডকার ডকস ডকার কমপোজ এবং জ্যাঙ্গোর দিকে তাকান তবে আপনি এখনও এটির মতো ডাটাবেসটি অ্যাক্সেস করতে পারেন:

version: '2'
services:
  db:
    image: postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

লিঙ্ক এবং depend_on এর মধ্যে পার্থক্য কী?

লিঙ্ক:

আপনি যখন কোনও ডাটাবেসের জন্য ধারক তৈরি করেন, উদাহরণস্বরূপ:

docker run -d --name=test-mysql --env="MYSQL_ROOT_PASSWORD=mypassword" -P mysql

docker inspect d54cf8a0fb98 |grep HostPort

এবং আপনি খুঁজে পেতে পারেন

"HostPort": "32777"

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

web:
  links:
   - db

নির্ভর করে:

আমি জর্জিও ফেরারিস ডকার-কমপোজ.আইএমএল থেকে একটি দুর্দান্ত ব্লগ পেয়েছি: ভি 1 থেকে ভি 2

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

এবং

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

হালনাগাদ

নির্ভর করে

পরিষেবার মধ্যে নির্ভরতা প্রকাশ করা, যার দুটি প্রভাব রয়েছে:

  • docker-compose upনির্ভরতা ক্রমে পরিষেবা শুরু করবে। নিম্নলিখিত উদাহরণে, ওয়েবের আগে ডিবি এবং রেডিস শুরু হবে।
  • docker-compose up SERVICEস্বয়ংক্রিয়ভাবে SERVICE এর নির্ভরতা অন্তর্ভুক্ত করবে। নিম্নলিখিত উদাহরণে, ডকার-কমপেজ ওয়েবও তৈরি করবে এবং ডিবি এবং রিডিস শুরু করবে।

সাধারণ উদাহরণ:

version: '2'
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres

দ্রষ্টব্য: depend_on ওয়েব শুরু করার আগে db এবং redis "প্রস্তুত" হওয়ার অপেক্ষা রাখে না - কেবল সেগুলি শুরু না করা পর্যন্ত। আপনার যদি কোনও পরিষেবা প্রস্তুত হওয়ার অপেক্ষা করতে হয়, তবে এই সমস্যাটির আরও সমাধানের জন্য স্টার্টআপ অর্ডার এবং এটি সমাধানের কৌশলগুলি দেখুন।


আমি আমার উত্তরটি স্পষ্ট করে আপডেট করেছি যে উত্তরটি রচনা ফাইল ভি 1 এর জন্য ছিল।
জিওনগবিং জিন

1
এটি এখনও সংস্করণ 3 এর জন্য বৈধ?
ফিবিওমিয়া

হ্যাঁ, আপনি একবার দেখে নিতে পারেনhttps://docs.docker.com/compose/compose-file/compose-versioning/
উইন্ডসুন

"এর অর্থ আপনি আপনার লোকালহোস্ট পোর্ট 32777 (ধারক মধ্যে 3306) থেকে ডাটাবেস সংযোগ করতে পারবেন তবে এই পোর্টটি প্রতিবার আপনি যখনই পুনরায় চালু করবেন বা ধারকটিকে সরিয়ে ফেলবেন তখনই পরিবর্তন হবে" আপনি যদি ডকার-কমপোজ-ফাইলটিতে পোর্ট বাইন্ডিং নির্দিষ্ট করে থাকেন তবে তা হবে না । এবং যেহেতু এই প্রশ্নটি বিশেষত ডকার-রচনা সম্পর্কিত, তাই আমি অনুভব করি যে এখানে উদাহরণটি docker runসম্পূর্ণ অপ্রাসঙ্গিক, এটি কোনওভাবেই ধারকটি চালানো হবে না। আমি কী মিস করছি?
অ্যান্ড্রু সাভিনিখ 10:38

হ্যাঁ, আপনি বন্দরটি নির্দিষ্ট করে দিলে আপনি ঠিক বলেছেন। আমার docker run উদাহরণটি উল্লেখ করতে চায় যে আমাদের কেন একটি পোর্ট নম্বর হার্ড-কোডের পরিবর্তে depend_on বা লিঙ্কগুলি ব্যবহার করতে হবে just ঠিকঠাক কারণ আপনি যদি এটি নির্দিষ্ট না করেন তবে এটি প্রতিবার পরিবর্তিত হয়। আমি মনে করি এটি নির্ভরশীলতা বা লিঙ্কগুলি সম্পর্কে লোকদের আরও বুঝতে দেবে।
উইন্ডসুন

50

[সেপ্টেম্বর 2016 আপডেট করুন]: এই উত্তরটি ডকার কম্পোজ ফাইল ভি 1 এর জন্য তৈরি হয়েছিল (নীচে নমুনা রচনা ফাইলের দ্বারা দেখানো হয়েছে)। ভি 2 এর জন্য, @ উইন্ডসুন দ্বারা অন্যান্য উত্তর দেখুন।

[আসল উত্তর]:

ডকুমেন্টেশনে এটি বেশ পরিষ্কার। depends_onনির্ভরশীলতা এবং ধারক তৈরির ক্রম স্থির করে এবং কেবল এটিই linksকরে না, তাও করে

লিঙ্কযুক্ত পরিষেবার জন্য ধারকগুলি উপনামের মতো একটি হোস্টনামে বা পরিষেবাটির নাম উল্লেখ না করা থাকলে পরিষেবা নামটিতে পৌঁছে যাবে।

উদাহরণস্বরূপ, নিম্নলিখিত docker-compose.ymlফাইলটি ধরে নেওয়া :

web:
  image: example/my_web_app:latest
  links:
    - db
    - cache

db:
  image: postgres:latest

cache:
  image: redis:latest

এর সাথে linksকোডের অভ্যন্তরীণ কোডটি webব্যবহার করে ডাটাবেস অ্যাক্সেস করতে সক্ষম হবে db:5432, ধরে নিবেন যে পোর্ট 5432 dbচিত্রটিতে প্রকাশিত হয়েছে । যদি depends_onএটি ব্যবহার করা হয় তবে এটি সম্ভব হবে না তবে পাত্রে প্রারম্ভিক ক্রমটি সঠিক হবে।


তুমি কি আমাকে একটা উদাহরণ দিতে পারবে? কারণ সেই অংশটি সম্পর্কে আমি এখনও অস্পষ্ট। হতে পারে এমন অন্যান্য রচনা-ফাইল বিকল্প রয়েছে যা এটি আরও নির্দিষ্ট করে তুলতে পারে। আরও বিবরণ প্রদান করুন. ধন্যবাদ!
itjef

আপনাকে অনেক ধন্যবাদ! আমি বুঝতে পেরেছি. একটি চূড়ান্ত প্রশ্ন, দয়া করে। সুতরাং, আমার বিশেষ ক্ষেত্রে, আমি আমার রেল অ্যাপ্লিকেশন স্থাপন করছি, আমি কি ব্যবহার করব linksবা depends_onতাদের দুটি ঠিক আছে? আমার বর্তমান docker-compose.ymlব্যবহার depends_onএবং জিনিসগুলি ভাল কাজ করে বলে মনে হচ্ছে। :)
itjef

আপনার যদি অন্য পাত্রে সরাসরি প্রবেশ করার দরকার না হয় name:portতবে depends_onঠিক আছে।
জিওনগবিং জিন

9
নাম: আপনি যখন এক্সপোজ ব্যবহার করবেন তখন পোর্ট লিংক ছাড়াইও কাজ করে:
অমিত গোল্ডস্টেইন

7
"যদি নির্ভর_আপনি ব্যবহৃত হয় তবে এটি সম্ভব হবে না, তবে পাত্রে প্রারম্ভিক ক্রমটি সঠিক হবে would" এটি সঠিক নয়। আপনি কেবল depend_on ব্যবহার করলে এটি কাজ করবে। আপনি এখনও আপনার অ্যাক্সেস করতে পারেন dbমধ্যে webব্যবহার ডাটাবেস হোস্ট-নেম।
prog.Dusan
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.