আমি কি ডকার পাত্রে একাধিক প্রোগ্রাম চালাতে পারি?


150

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


2
স্পট অন: আমাকে কেন অবাক করে দিয়েছে ডকার কেন এত জনপ্রিয় ছিল .. (একক প্রক্রিয়া ..?) - তবে আসুন দেখুন উত্তরগুলি আমাদের কী বলে ..
জাভাদ্বা

উত্তর:


120

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

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

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

কমপক্ষে দুটি সম্ভাবনা রয়েছে যেগুলি অ্যাপ্লিকেশনগুলি যখন বিভিন্ন পাত্রে চালিত হয় তখন কীভাবে একে অপরের সাথে যোগাযোগ করতে পারে:

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

1
দেখে মনে হচ্ছে নতুন সংস্করণ এর ডকার এখন ডকারের ধারক নেটওয়ার্কগুলিকে সমর্থন করে
jpierson

ডক-শ্রমিক এখন সুপারভাইজার চালানোর জন্য, আপনাকে এমন autorestart = সত্য, stdout_logfile, stderr_logfile ইত্যাদির এ দেখে নিন প্রতিটি প্রক্রিয়ার জন্য আচরণ sepcify করতে সক্ষম হবেন সমর্থন docs.docker.com/engine/admin/using_supervisord
আন্দ্রিয়াস Lundgren

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

@ নিকোলাস-ভ্যান এটি সহজ কেন? এটির কারণ যদি ডিবি মারা যায় তবে আমি পুরো জিনিসটি আরম্ভ করার পরিবর্তে ডিবি'র ধারকটি পুনরায় চালু করতে পারি?
উজ্জ্বল

একই মেশিনের অ্যাপ্লিকেশনগুলি ইউনিক্স ডোমেন সকেটেও যোগাযোগ করতে পারে । সর্বোচ্চ পারফরম্যান্স গ্যারান্টিযুক্ত।
সংশয়ী জুলে

21

আমার যেমন এলএএমপি স্ট্যাক, মঙ্গো ডিবি এবং আমার নিজের পরিষেবা চালানোর অনুরূপ প্রয়োজন ছিল

ডকার হ'ল ওএস ভিত্তিক ভার্চুয়ালাইজেশন, এজন্য এটি চলমান প্রক্রিয়াটির চারপাশে তার ধারককে পৃথক করে, সুতরাং এটির জন্য কমপক্ষে একটি প্রক্রিয়া বিদেশে চলছে requires

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

সুতরাং আমার ডকার চিত্র ফাইলটির একেবারে শেষের দিকে দুটি লাইন রয়েছে:

COPY myStartupScript.sh /usr/local/myscripts/myStartupScript.sh
CMD ["/bin/bash", "/usr/local/myscripts/myStartupScript.sh"]

আমার স্ক্রিপ্টে আমি সমস্ত মাইএসকিউএল, মঙ্গোডিবি, টমক্যাট ইত্যাদি চালাচ্ছি শেষ পর্যন্ত আমি আমার অ্যাপাচি অগ্রভাগের থ্রেড হিসাবে চালাচ্ছি।

source /etc/apache2/envvars
/usr/sbin/apache2 -DFOREGROUND

এটি আমার সমস্ত পরিষেবা শুরু করতে সক্ষম করে এবং শেষ পরিষেবাটি পটভূমিতে শুরু হওয়া পাত্রে জীবন্ত রাখতে সক্ষম করে

আশা করি এটা সাহায্য করবে

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


6

আমি পূর্ববর্তী কয়েকটি সমাধানগুলির সাথে দৃ strongly়ভাবে একমত নই যা একই পাত্রে উভয় পরিষেবা চালানোর জন্য সুপারিশ করেছে। ডকুমেন্টেশনে এটি স্পষ্টভাবে বলা হয়েছে যে এটি কোনও প্রস্তাবিত নয় :

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

সুপারভাইজার বা অনুরূপ প্রোগ্রামগুলির জন্য ভাল ব্যবহারের কেস রয়েছে তবে ওয়েব অ্যাপ্লিকেশন + ডাটাবেস চালানো সেগুলির অংশ নয়।

এটি করতে আপনার অবশ্যই স্পষ্টভাবে ডকার-রচনা ব্যবহার করা উচিত এবং একাধিক পাত্রে বিভিন্ন দায়িত্ব নিয়ে অর্কেস্টেট করা উচিত।


2
এটি একটি মন্তব্য নয়, কোনও উত্তর নয়। এই অবস্থানটি সমর্থন করার জন্য দয়া করে একটি ব্যাখ্যা এবং / অথবা লিঙ্ক যুক্ত করার বিষয়টি বিবেচনা করুন। অন্যথায় এটি সহায়ক নয়।
ইভান ইভানভ

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

প্রশ্নটি একটি ধারকটিতে 2 টি প্রক্রিয়া চালিত হওয়া সম্পর্কে, সুতরাং এটি সর্বোত্তম অনুশীলনের বিষয়ে চিন্তা করে না। আমি আপনাকে একটি উদাহরণ দেব: আমাকে PhotonOS ভিত্তিক চিত্র এবং একটি জাভা প্রক্রিয়াতেও খরগোশ চালাতে হয়েছিল ... সুতরাং আমি একটি এন্ট্রি স্ক্রিপ্ট ব্যবহার করেছি এবং ENTRYPOINT হিসাবে ব্যবহার করেছি :)
ভ্যালরিরিয়াস

মূল প্রশ্নটি ডকার পাত্রে দুটি প্রক্রিয়া চালনার প্রযুক্তিগত সম্ভাব্যতা সম্পর্কে সাধারণ প্রশ্ন নয় question এটিতে একটি নির্দিষ্ট ব্যবহারের ক্ষেত্রে উল্লেখ করা হয়েছে যা মংগোডিবি ডাটাবেসের সাথে পাইথন অ্যাপ্লিকেশন স্থাপন করা। এবং, সেই ব্যবহারের ক্ষেত্রে, সবচেয়ে ভাল পরামর্শটি হ'ল একক পাত্রে ব্যবহারকে নিরুৎসাহিত করা এবং ডকার-রচনাটির ব্যবহারের প্রস্তাব দেওয়া।
নিকোলাস-ভ্যান

5

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

একটি বহু-ধারক সিস্টেম আরো কিছু অর্কেস্ট্রারচনা প্রয়োজন হবে, সমস্ত প্রয়োজনীয় নির্ভরতা আসা পাবে Docker v0.6.5 + +, সেখানে নিজেই Docker পাতাটা যে সাহায্য করার জন্য একটি নতুন সুবিধা যদিও - লিঙ্ক । একটি বহু-মেশিন সমাধান সহ, এটি এখনও এমন কিছু যা ডকার পরিবেশের বাইরে থেকে সাজানো দরকার।

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

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


3

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

মধ্যে Hipache উদাহরণস্বরূপ, অন্তর্ভুক্ত Dockerfile supervisord রান, এবং উভয় hipache এবং redis-সার্ভার ফাইল supervisord.conf নির্দিষ্ট করে চালানো যাবে।


2

এটি কীভাবে করা যায় তার উপর ডকার কয়েকটি উদাহরণ সরবরাহ করে। লাইটওয়েট বিকল্পটি হ'ল:

আপনার সমস্ত কমান্ড একটি মোড়ক স্ক্রিপ্টে রাখুন, পরীক্ষার এবং ডিবাগিং তথ্যের সাথে সম্পূর্ণ। মোড়ক স্ক্রিপ্টটি আপনার হিসাবে চালান CMD। এটি একটি খুব নিষ্পাপ উদাহরণ। প্রথমে মোড়ক স্ক্রিপ্ট:

#!/bin/bash

# Start the first process
./my_first_process -D
status=$?
if [ $status -ne 0 ]; then
  echo "Failed to start my_first_process: $status"
  exit $status
fi

# Start the second process
./my_second_process -D
status=$?
if [ $status -ne 0 ]; then
  echo "Failed to start my_second_process: $status"
  exit $status
fi

# Naive check runs checks once a minute to see if either of the processes exited.
# This illustrates part of the heavy lifting you need to do if you want to run
# more than one service in a container. The container will exit with an error
# if it detects that either of the processes has exited.
# Otherwise it will loop forever, waking up every 60 seconds

while /bin/true; do
  ps aux |grep my_first_process |grep -q -v grep
  PROCESS_1_STATUS=$?
  ps aux |grep my_second_process |grep -q -v grep
  PROCESS_2_STATUS=$?
  # If the greps above find anything, they will exit with 0 status
  # If they are not both 0, then something is wrong
  if [ $PROCESS_1_STATUS -ne 0 -o $PROCESS_2_STATUS -ne 0 ]; then
    echo "One of the processes has already exited."
    exit -1
  fi
  sleep 60
done

পরবর্তী, ডকফায়াইল:

FROM ubuntu:latest
COPY my_first_process my_first_process
COPY my_second_process my_second_process
COPY my_wrapper_script.sh my_wrapper_script.sh
CMD ./my_wrapper_script.sh

2

আপনি অগ্রভাগে 2 টি প্রক্রিয়া ব্যবহার করে চালাতে পারেন wait। কেবলমাত্র নিম্নলিখিত বিষয়বস্তু দিয়ে একটি বাশ স্ক্রিপ্ট তৈরি করুন। যেমন start.sh:

# runs 2 commands simultaneously:

mongod & # your first application
P1=$!
python script.py & # your second application
P2=$!
wait $P1 $P2

আপনার ডকফাইফিল এ এটি দিয়ে শুরু করুন

CMD bash start.sh

0

যদি ডেডিকেটেড স্ক্রিপ্টটি খুব বেশি ওভারহেডের মতো মনে হয় তবে আপনি আলাদাভাবে পৃথক প্রক্রিয়াগুলি স্প্যানিশ করে স্প্যান করতে পারেন sh -c। উদাহরণ স্বরূপ:

CMD sh -c 'mini_httpd -C /my/config -D &' \
 && ./content_computing_loop
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.