ডকার পোর্টগুলিতে vhosts বরাদ্দ করা হচ্ছে


83

আমার একটি ওয়াইল্ডকার্ড ডিএনএস সেটআপ আছে যাতে ডক হোস্টের আইপি ঠিকানায় একটি কাস্টম ডোমেন (* .foo) ম্যাপের সমস্ত ওয়েব অনুরোধ। যদি আমার একাধিক পাত্রে অ্যাপাচি (বা এনগিনেক্স) চলমান থাকে তবে প্রতিটি পাত্রে অ্যাপাচি পোর্ট (80) কিছু বাহ্যিক অভ্যন্তরীণ বন্দরে মানচিত্র করে maps

আমি যা করতে চাই তা হ'ল কনটেইনার ১..foo এর অনুরোধ করা, যা আমার কাস্টম ডিএনএস সার্ভারের মাধ্যমে ইতিমধ্যে সঠিক আইপি ঠিকানায় (ডকার হোস্টের) ম্যাপ করা হয়েছে, তবে সঠিক ডকার বহিরাগতের জন্য প্রক্সি ডিফল্ট পোর্ট 80 অনুরোধ পোর্ট যেমন নির্দিষ্ট পাত্রে সঠিক অ্যাপাচি উদাহরণটি কাস্টম ডোমেনের উপর ভিত্তি করে প্রতিক্রিয়া জানাতে সক্ষম। তেমনিভাবে ধারক -২.foo একটি দ্বিতীয় ধারকটির অ্যাপাচি এবং তারপরে প্রক্সি করবে।

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


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

কটাক্ষপাত github.com/dotcloud/hipache , যা redis মাধ্যমে রিভার্স প্রক্সি কনফিগার করা যাবে।
জিসিস

উত্তর:


81

এই উত্তরটি কিছুটা দেরিতে হতে পারে তবে আপনার যা প্রয়োজন তা একটি স্বয়ংক্রিয় বিপরীত প্রক্সি। আমি এর জন্য দুটি সমাধান ব্যবহার করেছি:

  • jwilder / nginx-proxy
  • ট্রাফিক

সময়ের সাথে সাথে আমার পছন্দটি ট্র্যাফিক ব্যবহার করা। বেশিরভাগ কারণেই এটি ভাল নথিভুক্ত এবং রক্ষণাবেক্ষণযোগ্য এবং আরও বৈশিষ্ট্য সহ আসে (বিভিন্ন কৌশল এবং অগ্রাধিকার, স্বাস্থ্য পরীক্ষা, সার্কিট ব্রেকার, এসিএমই / লেটস এনক্রিপ্ট সহ স্বয়ংক্রিয় এসএসএল শংসাপত্রগুলি ...) লোড ব্যালেন্সিং।


জুইল্ডার / এনগিনেক্স-প্রক্সি ব্যবহার করা

ডকার কনটেইনার জেসন ওয়াইল্ডারের এনগিনেক্স-প্রক্সি ডকার ইমেজ চালানোর সময় , আপনি কোনও অন্যান্য কনটেইনার বজায় রাখার জন্য কনভার্ট না রেখে একটি বিপরীত প্রক্সি হিসাবে একটি এনগিনেক্স সার্ভার পাবেন get

VIRTUAL_HOSTপরিবেশের পরিবর্তনশীল সহ আপনার অন্যান্য ধারকগুলি কেবল চালিত করুন এবং এনগিনেক্স-প্রক্সি তাদের আইপ: পোর্টটি আবিষ্কার করবে এবং আপনার জন্য এনগিনেক্স কনফিগারেশন আপডেট করবে।

যাক আপনার ডিএনএস সেট আপ হয়েছে যাতে *.test.localআপনার ডকার হোস্টের আইপি ঠিকানায় মানচিত্র তৈরি হয়, তারপরে দ্রুত ডেমো চালানোর জন্য কেবল নিম্নলিখিত পাত্রে শুরু করুন:

# start the reverse proxy
docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock jwilder/nginx-proxy

# start a first container for http://tutum.test.local
docker run -d -e "VIRTUAL_HOST=tutum.test.local" tutum/hello-world

# start a second container for http://deis.test.local
docker run -d -e "VIRTUAL_HOST=deis.test.local" deis/helloworld

ট্র্যাফিক ব্যবহার করা হচ্ছে

ট্রাফিক ধারক চালানোর সময় , আপনি একটি বিপরীত প্রক্সি সার্ভার সেট আপ পাবেন যা আপনার ধারকগুলিতে পাওয়া ডকার লেবেলের প্রদত্ত তার ফরোয়ার্ডিং বিধিগুলি পুনরায় কনফিগার করবে ।

যাক আপনার ডিএনএস সেট আপ হয়েছে যাতে *.test.localআপনার ডকার হোস্টের আইপি ঠিকানায় মানচিত্র তৈরি হয়, তারপরে দ্রুত ডেমো চালানোর জন্য কেবল নিম্নলিখিত পাত্রে শুরু করুন:

# start the reverse proxy
docker run --rm -it -p 80:80 -v /var/run/docker.sock:/var/run/docker.sock traefik:1.7 --docker

# start a first container for http://tutum.test.local
docker run -d -l "traefik.frontend.rule=Host:tutum.test.local" tutum/hello-world

# start a second container for http://deis.test.local
docker run -d -l "traefik.frontend.rule=Host:deis.test.local" deis/helloworld

-v /var/run/docker.sock:/tmp/docker.sockএটি কি বিপজ্জনক সমাধান? ধারকটির এই প্রিন্সিটির ডকার হোস্ট ডেমনটিতে অ্যাক্সেস রয়েছে? এটি কি সম্ভব নিরাপত্তা গর্ত হতে পারে?
মিক্ল

সম্ভবত এছাড়াও নোট করুন যে ভাগ /var/run/docker.sockনা করা হয় এমন কোনও ওয়্যারেন্টি নয় যে ডকার হোস্টটি কোনও ধারক থেকে শোষণ করা যায় না। ডকার সুরক্ষার নিজস্ব একটি বিষয়।
থমাসলেভিল

সুরক্ষার কোন সমস্যা আছে? আপনি যখন ধারক থেকে ডকার হোস্ট পৌঁছাতে পারেন।
মিক্ল

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

4
আপনি পৃথকভাবে এনজিনেক্স-প্রক্সি এবং ডকার-জেনও চালাতে পারেন যাতে ডকার সকেটটি এনগিনেক্স ধারকটিতে মাউন্ট না হয়।
জেসন ওয়াইল্ডার

42

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

পদ্ধতি 1 এ (সরাসরি ডকারের সাথে পোর্টগুলি বরাদ্দ করুন)

পদক্ষেপ 1: হোস্টে nginx.conf বা অ্যাপাচি সেট করুন, পছন্দসই পোর্ট নম্বর অ্যাসাইনমেন্ট সহ। হোস্টে চলমান এই ওয়েব সার্ভারটি ভোস্ট প্রক্সিং করবে। ডকারের ক্ষেত্রে এ সম্পর্কে বিশেষ কিছু নেই - এটি সাধারণ ভোস্ট হোস্টিং। ডকারকে সঠিক হোস্ট পোর্ট নম্বরটি ব্যবহার করার জন্য, দ্বিতীয় অংশটি পরবর্তী অংশে আসে next

পদক্ষেপ 2: ডকারের পোর্ট ম্যাপিংস সেট করতে "-p" দিয়ে ডকারে পোর্ট নম্বর ক্রিয়াকলাপ এবং ফোনের মধ্যে কাস্টম এনভায়রনমেন্ট ভেরিয়েবল সেট করার জন্য "-e" চাপ দিন:

port=12345 # <-- the vhost port setting used in nginx/apache
IMAGE=myapps/container-1
id=$(docker run -d -p :$port -e PORT=$port $IMAGE)
# -p :$port will establish a mapping of 12345->12345 from outside docker to
# inside of docker.
# Then, the application must observe the PORT environment variable
# to launch itself on that port; This is set by -e PORT=$port.

# Additional goodies:
echo $id # <-- the running id of your container
echo $id > /app/files/CONTAINER # <-- remember Docker id for this instance
docker ps # <-- check that the app is running
docker logs $id # <-- look at the output of the running instance
docker kill $id # <-- to kill the app

পদ্ধতি 1 বি হার্ড-কোডেড অ্যাপ্লিকেশন পোর্ট

... আপনি যদি অ্যাপ্লিকেশনটিতে একটি হার্ডকোডযুক্ত পোর্ট ব্যবহার করেন, উদাহরণস্বরূপ পোর্ট 5000 (যেমন পোর্ট এনভায়রনমেন্ট ভেরিয়েবলের মাধ্যমে কনফিগার করা যায় না, পদ্ধতি 1 এ যেমন) তবে ডকারের মাধ্যমে এটি হার্ডকোড করা যেতে পারে:

publicPort=12345
id=$(docker run -d -p $publicPort:5000 $IMAGE)
# -p $publicPort:5000 will map port 12345 outside of Docker to port 5000 inside
# of Docker. Therefore, nginx/apache must be configured to vhost proxy to 12345,
# and the application within Docker must be listening on 5000.

পদ্ধতি 2 (ডক্কু বন্দরগুলি বের করতে দিন)

এই মুহুর্তে, ডকার vhosts পরিচালনার জন্য খুব ভাল বিকল্প হ'ল ডক্কু । একটি আসন্ন বিকল্পটি ফ্লিন ব্যবহার করা হতে পারে , তবে ঠিক এখনই ফ্লিন সবে শুরু করছে এবং বেশ প্রস্তুত নয়। অতএব আমরা এখনই ডক্কুর সাথে যাচ্ছি: একক ডোমেনের জন্য ডক্কু ইনস্টল নির্দেশাবলী অনুসরণ করার পরে "ভিএইচএসটি" ফাইল তৈরি করে ভোস্টগুলি সক্ষম করুন:

echo yourdomain.com > /home/git/VHOST
# in your case: echo foo > /home/git/VHOST

এখন, যখন কোনও অ্যাপ্লিকেশন এসএসএইচের মাধ্যমে ডক্কুতে প্রেরণ করা হয় (এটি কীভাবে করা যায় তার জন্য ডক্কু ডক্স দেখুন), ডক্কু ভিএইচএসটি ফাইল এবং নির্দিষ্ট অ্যাপ্লিকেশনটির দিকে লক্ষ্য করবে (ধরা যাক আপনি "ধারক -১" ধাক্কা দিয়েছিলেন), এটি উত্পন্ন হবে নিম্নলিখিত ফাইল:

/home/git/container-1/nginx.conf

এবং এটিতে নিম্নলিখিত বিষয়বস্তু থাকবে:

upstream container-1 { server 127.0.0.1:49162; }
server {
  listen      80;
  server_name container-1.yourdomain.com;
  location    / {
    proxy_pass  http://container-1;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $remote_addr;
  }
}

যখন সার্ভারটি পুনরায় বুট করা হবে, তখন ডক্কু নিশ্চিত করবে যে এলোমেলোভাবে অন্য কোনও বন্দর নির্ধারণের পরিবর্তে ডকার তার প্রাথমিকভাবে মোতায়েন বন্দরে (49162 এখানে) ম্যাপযুক্ত পোর্ট দিয়ে অ্যাপ্লিকেশন শুরু করবে। এই নির্বিরোধী কার্য সম্পাদন করার জন্য, ডক্কু প্রাথমিকভাবে নির্ধারিত বন্দরটিকে সংরক্ষণ /home/git/container-1/PORTকরে এবং পরবর্তী প্রবর্তনে এটি PORTপরিবেশটিকে এই মান হিসাবে নির্ধারণ করে এবং ডকারের পোর্ট অ্যাসাইনমেন্টটিকে হোস্ট-সাইড এবং অ্যাপ্লিকেশন উভয় স্থানেই মানচিত্রটি মানচিত্র করে। এটি প্রথম লঞ্চের বিরোধী, যখন ডক্কু সেট করবে PORT=5000এবং তারপরে ভিপিএসের পাশের ডক্কু মানচিত্রের যেকোন মানচিত্রটি অ্যাপের পাশের 5000 এ বের করবে। এটি প্রায় (এবং ভবিষ্যতে এমনকি পরিবর্তন হতে পারে) চারপাশে, কিন্তু এটি কার্যকর!

হুডের নীচে ভিএইচএসটি যেভাবে কাজ করে তা হ'ল: এসএসএইচ-এর মাধ্যমে অ্যাপ্লিকেশনটির গিট ধাক্কা দেওয়ার পরে, ডক্কু বাস করে এমন হুকগুলি কার্যকর করবে /var/lib/dokku/plugins/nginx-vhosts। এই হুকগুলি এখানে ডক্কু উত্স কোডেও nginx.confরয়েছে এবং সঠিক ভোস্ট সেটিংস সহ ফাইলগুলি লেখার জন্য দায়বদ্ধ । যদি আপনার এই ডিরেক্টরিটি এর অধীনে না থাকে /var/lib/dokkuতবে চালনার চেষ্টা করুন dokku plugins-install


3

ডকারের সাহায্যে আপনি অভ্যন্তরীণ আইপিএসগুলি স্বাভাবিক থাকতে চান (উদাহরণস্বরূপ 80) এবং এলোমেলো বন্দরগুলি কীভাবে তারে যুক্ত করবেন তা নির্ধারণ করুন।

এগুলি হ্যান্ডেল করার একটি উপায় হিপাচের মতো বিপরীত প্রক্সি সহ। এটিতে আপনার ডিএনএসটি নির্দেশ করুন এবং তারপরে আপনার পাত্রে উপরে এবং নিচে নামার সাথে সাথে আপনি প্রক্সিটি পুনরায় কনফিগার করতে পারেন। Http://txt.fliglio.com/2013/09/protyping-web-stuff-with-docker/ এ একবার দেখুনএটি কীভাবে কাজ করতে পারে তা দেখতে ।

আপনি যদি আরও শক্তিশালী কিছু খুঁজছেন তবে আপনি "পরিষেবা আবিষ্কার" এর দিকে নজর দিতে পারেন। (Docker সঙ্গে সেবা আবিষ্কারের কটাক্ষপাত: http://txt.fliglio.com/2013/12/service-discovery-with-docker-docker-links-and-beyond/ )

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