"হোস্টনাম" এর মাধ্যমে ডকার পাত্রে কীভাবে যোগাযোগ করবেন


91

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

লক্ষ্য পরিস্থিতি

আমি জানি যে কীভাবে পাত্রে একসাথে লিঙ্ক করতে হবে এবং কীভাবে বন্দরগুলি প্রকাশ করতে হয়, তবে এর সমাধানগুলির কোনওটিই আমার সন্তুষ্ট নয়।

Aতিহ্যবাহী সার্ভার নেটওয়ার্কের মতো ধারকগুলির মধ্যে হোস্টনামের (কনটেইনার নাম) মাধ্যমে যোগাযোগের কোনও সমাধান আছে কি?


আপনি যা সন্ধান করছেন ঠিক সেভাবেই আমি সম্প্রতি একটি দস্তাবেজ লিখেছি । এটি মূলত একাধিক পাত্রে কীভাবে ইনস্টল করতে হবে (প্রতিটি প্রক্রিয়া অনুযায়ী একটি) এবং সেগুলি একীভূত করার জন্য দলিল করে "আন্তঃ-ধারক যোগাযোগ" গেমের অংশ
xuhdev

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

ডকার ১.১০ আউট, এবং ডকার সংযোগ দুর্দান্ত esome ( github.com/docker/docker/blob/… )। দেখুন নীচের আমার সম্পাদিত উত্তর
VonC

4
আমার মনে হয় আপনার ডকর-রচনার চেষ্টা করা উচিত । খুব ভাল কাজ করে।
সুহাস চিক্কান্না

উত্তর:


27

সম্পাদনা করুন: ডকার ১.৯-এর পরে, docker networkকমান্ডটি ( https://stackoverflow.com/a/35184695/977939 নীচে দেখুন ) এটি অর্জনের প্রস্তাবিত উপায়।


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

#!/bin/bash

# 10 seconds interval time by default
INTERVAL=${INTERVAL:-10}

# dnsmasq config directory
DNSMASQ_CONFIG=${DNSMASQ_CONFIG:-.}

# commands used in this script
DOCKER=${DOCKER:-docker}
SLEEP=${SLEEP:-sleep}
TAIL=${TAIL:-tail}

declare -A service_map

while true
do
    changed=false
    while read line
    do
        name=${line##* }
        ip=$(${DOCKER} inspect --format '{{.NetworkSettings.IPAddress}}' $name)
        if [ -z ${service_map[$name]} ] || [ ${service_map[$name]} != $ip ] # IP addr changed
        then
            service_map[$name]=$ip
            # write to file
            echo $name has a new IP Address $ip >&2
            echo "host-record=$name,$ip"  > "${DNSMASQ_CONFIG}/docker-$name"
            changed=true
        fi
    done < <(${DOCKER} ps | ${TAIL} -n +2)

    # a change of IP address occured, restart dnsmasq
    if [ $changed = true ]
    then
        systemctl restart dnsmasq
    fi

    ${SLEEP} $INTERVAL
done

আপনার dnsmasq পরিষেবা চালু আছে তা নিশ্চিত করুন docker0। তারপরে, --dns HOST_ADDRESSএই মিনি ডিএনএস পরিষেবাটি ব্যবহার করার জন্য আপনার ধারকটি শুরু করুন ।

তথ্যসূত্র: http://docs.blowb.org/setup-host/dnsmasq.html


এটি আমার - লিঙ্ক উত্তরের চেয়ে আকর্ষণীয় দেখায় much +1
ভোনসি

@ ভনসি দেখে মনে হচ্ছে নতুন লাইবনেট ওয়ার্কটি এই কাজের পরিবর্তন করতে পারে। যদিও দেখা যাক।
xuhdev

@xuhdev হিসেবে আমি সেটআপ dnsmasq docs.blowb.org/setup-host/dnsmasq.html । তবে ডকারের ধারক থেকে খনন করার সময় আমি সমস্যার মুখোমুখি হয়েছি, এটি সময় হয়ে যায়। কিন্তু হোস্ট ডিংগার 0 ইন্টারফেস আইপ কাজ করে। এছাড়াও ডকার হোস্টের কাজগুলি থেকে একই ডকার0 আইপি দিয়ে খনন করুন। আপনার কি কোনও ছদ্মবেশ আছে?
সত্যীশ

4
@ সতীশ সম্ভবত এটি আপনার ফায়ারওয়াল সেটিংস যা আপনার ধারকটিকে হোস্ট থেকে ডিএনএস জিজ্ঞাসা করতে বাধা দেয়?
xuhdev

@ এক্সহদেব ধন্যবাদ এটি আমার হোস্ট মেশিনের ফায়ারওয়াল্ড, যা সমস্যার কারণ হয়েছে। একবার আমি ফায়ারওয়াল্ডের সামনে এসে
দাঁড়ালাম

206

নতুন নেটওয়ার্কিং বৈশিষ্ট্যটি আপনাকে তাদের নামের সাথে পাত্রে সংযোগ করার অনুমতি দেয়, সুতরাং আপনি যদি একটি নতুন নেটওয়ার্ক তৈরি করেন তবে সেই নেটওয়ার্কের সাথে সংযুক্ত যে কোনও ধারক তাদের নামে অন্য পাত্রে পৌঁছাতে পারে। উদাহরণ:

1) নতুন নেটওয়ার্ক তৈরি করুন

$ docker network create <network-name>       

2) পাত্রে নেটওয়ার্কের সাথে সংযুক্ত করুন

$ docker run --net=<network-name> ...

বা

$ docker network connect <network-name> <container-name>

3) নাম দিয়ে পিং পাত্রে

docker exec -ti <container-name-A> ping <container-name-B> 

64 bytes from c1 (172.18.0.4): icmp_seq=1 ttl=64 time=0.137 ms
64 bytes from c1 (172.18.0.4): icmp_seq=2 ttl=64 time=0.073 ms
64 bytes from c1 (172.18.0.4): icmp_seq=3 ttl=64 time=0.074 ms
64 bytes from c1 (172.18.0.4): icmp_seq=4 ttl=64 time=0.074 ms

দেখা ডকুমেন্টেশনের এই বিভাগটি ;

দ্রষ্টব্য: উত্তরাধিকারের মতো নয়links নতুন নেটওয়ার্কিং পরিবেশের ভেরিয়েবল তৈরি করবে না , বা অন্যান্য পাত্রে পরিবেশগত পরিবর্তনগুলি ভাগ করবে না

এই বৈশিষ্ট্যটি বর্তমানে এলিয়াস সমর্থন করে না


4
দুর্দান্ত কাজ করে। ডিফল্ট নেটওয়ার্ক কেন ডিফল্টরূপে এটি সক্ষম করে না ??
স্টাফেন

কম স্পষ্ট অংশটি হ'ল, আপনাকে একটি ভিন্ন ধারকটিতে চলমান একটি অ্যাপ পুনরায় চালু করতে হবে। তাহলে কনটেইনার এ কীভাবে একটি অ্যাপ পুনরায় চালু করতে ধারক বি তে চলমান একটি অ্যাপ তৈরি করতে পারে? স্পষ্টতই, মনে হচ্ছে কোনও ধরণের যোগাযোগের বাসের দরকার আছে। আমার মনের শীর্ষে সিগন্যালিং এবং আন্তঃ-ধারক যোগাযোগের জন্য রেডিস ব্যবহার করা হয় .. সুতরাং সমস্ত পাত্রে রেডিস চ্যানেলে সাবস্ক্রাইব করে এবং সেখানেই তারা কথা বলবে ... ডকার-রচনাটিতে প্রকাশিত বন্দরগুলির পরিবর্তন সম্পর্কে কীভাবে .ml ফাইল একটি সম্পূর্ণ প্রয়োজন docker-compose down,up,restart?
ইগেনফিল্ড

আমি সারা দিন ঠিক এটাই খুঁজছিলাম! আপনি জানেন না যে আপনি কোনও নেটওয়ার্ক নোডের কনটেইনার নাম / আইডি দিয়ে উল্লেখ করতে পারেন। ধন্যবাদ!
এলিওটওয়েসফ

4
@ স্টাফেন bridgeপিছনের সামঞ্জস্যের কারণে এটি ডিফল্ট নেটওয়ার্কে অক্ষম হয়েছে তবে হ্যাঁ, আমি সম্মত, এটি অবশ্যই ডিফল্টরূপে সক্ষম করা উচিত !
হেলমেসো

15

যে হওয়া উচিত কি --linkজন্য হোস্ট-নেম অংশ জন্য অন্তত।
সঙ্গে Docker 1.10, এবং জনসংযোগ 19242 , যে হতে হবে:

docker network create --net-alias=[]: Add network-scoped alias for the container

(নীচের শেষ বিভাগ দেখুন)

এটা কী আপডেট করা হচ্ছে /etc/hostsফাইল বিবরণ

পরিবেশের ভেরিয়েবলগুলি ছাড়াও ডকার /etc/hostsফাইলটিতে উত্স ধারকটির জন্য একটি হোস্ট এন্ট্রি যুক্ত করে ।

উদাহরণস্বরূপ, একটি এলডিএপি সার্ভার চালু করুন:

docker run -t  --name openldap -d -p 389:389 larrycai/openldap

এবং সেই এলডিএপি সার্ভারটি পরীক্ষা করতে একটি চিত্র নির্ধারণ করুন:

FROM ubuntu
RUN apt-get -y install ldap-utils
RUN touch /root/.bash_aliases
RUN echo "alias lds='ldapsearch -H ldap://internalopenldap -LL -b
ou=Users,dc=openstack,dc=org -D cn=admin,dc=openstack,dc=org -w
password'" > /root/.bash_aliases
ENTRYPOINT bash

আপনি --link দিয়ে পরীক্ষার চিত্রের মধ্যে ' openldap' ধারক হিসাবে ' internalopenldap' প্রকাশ করতে পারেন :

 docker run -it --rm --name ldp --link openldap:internalopenldap ldaptest

তারপরে, আপনি 'lds' টাইপ করলে, উপনামটি কাজ করবে:

ldapsearch -H ldap://internalopenldap ...

এটা মানুষ ফিরিয়ে দিতে হবে। অর্থ চিত্র internalopenldapথেকে সঠিকভাবে পৌঁছেছে ldaptest


অবশ্যই, ডকার ১.7 যোগ করবে libnetwork, যা সংযোগকারীদের সংযোগ করার জন্য একটি দেশীয় গো বাস্তবায়ন সরবরাহ করে। দেখুন ব্লগ পোস্টে
এটি কনটেইনার নেটওয়ার্ক মডেল (সিএনএম) সহ আরও একটি সম্পূর্ণ স্থাপত্যের সূচনা করেছে

https://blog.docker.com/media/2015/04/cnm-model.jpg

এটি নতুন "নেটওয়ার্ক" কমান্ড সহ ডকার সিএলআই আপডেট করবে এবং কীভাবে "-net নির্ধারণের জন্য " পতাকা ব্যবহার করা হবে তা ।


ডকার ১.১০ এর একটি নতুন বিভাগ নেটওয়ার্ক-স্কোপড ওরফে রয়েছে , যা এখন সরকারীভাবে network connectনথিযুক্ত :

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

উপরের উদাহরণটি দিয়ে চালিয়ে যেতে, isolated_nwএকটি নেটওয়ার্ক উপন্যাস সহ অন্য একটি ধারক তৈরি করুন ।

$ docker run --net=isolated_nw -itd --name=container6 -alias app busybox
8ebe6767c1e0361f27433090060b33200aac054a68476c3be87ef4005eb1df17

--alias=[]         

ধারকটির জন্য নেটওয়ার্ক-স্কোপযুক্ত উপন্যাস যুক্ত করুন

আপনি --linkপছন্দসই উপন্যাসের সাথে অন্য ধারককে সংযুক্ত করতে বিকল্পটি ব্যবহার করতে পারেন

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

নির্দিষ্ট করা থাকলে কনটেইনার আইপি ঠিকানা (এস) পুনরায় প্রয়োগ করা হয় যখন থামানো ধারকটি আবার চালু করা হয়। যদি আইপি ঠিকানাটি আর উপলব্ধ না থাকে তবে ধারকটি শুরু করতে ব্যর্থ।

আইপি ঠিকানাটি উপলব্ধ কিনা তার গ্যারান্টি দেওয়ার একটি উপায় হ'ল --ip-rangeনেটওয়ার্ক তৈরি করার সময় নির্দিষ্ট করে দেওয়া এবং সেই ব্যাপ্তির বাইরে থেকে স্থির আইপি ঠিকানা (এস) চয়ন করা। এটি নিশ্চিত করে যে আইপি ঠিকানাটি অন্য ধারককে দেওয়া হয়নি, যখন এই ধারকটি নেটওয়ার্কে নেই।

$ docker network create --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20 multi-host-network

$ docker network connect --ip 172.20.128.2 multi-host-network container2
$ docker network connect --link container1:c1 multi-host-network container2

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

3

সম্পাদনা : এটি এখন আর প্রবাহিত হচ্ছে না: http://blog.docker.com/2016/02/docker-1-10/

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

সঠিক কনফিগারেশন ফাইলের সাথে (এটি সংস্করণ 2 এ রাখা দরকার), আপনি পরিষেবাগুলি তৈরি করবেন যা প্রত্যেকে একে অপরকে দেখতে পাবে। এবং, বোনাস, আপনি সেগুলিও ডকার-রচনা দিয়ে স্কেল করতে পারেন (হোস্টের পোর্টকে আবদ্ধ না করে এমন কোনও পরিষেবা আপনি স্কেল করতে পারেন)

এখানে একটি উদাহরণ ফাইল

version: "2"
services:
  router:
    build: services/router/
    ports:
      - "8080:8080"
  auth:
    build: services/auth/
  todo:
    build: services/todo/
  data:
    build: services/data/

এবং রচনা ফাইলের এই নতুন সংস্করণটির জন্য উল্লেখ: https://github.com/docker/compose/blob/1.6.0-rc1/docs/networking.md


1

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

আপনি যদি বাক্সের সমাধানটি বাইরে চান। একটি সমাধান উদাহরণস্বরূপ Kontena ব্যবহার করা হয় । এটা তোলে বুনা থেকে নেটওয়ার্ক আস্তরণ প্রযুক্তির সঙ্গে এসে এই প্রযুক্তির প্রতিটি সেবার জন্য ভার্চুয়াল প্রাইভেট LAN এর নেটওয়ার্ক তৈরি করতে ব্যবহার করা হয় এবং প্রত্যেক পরিষেবা দ্বারা পৌঁছে যাবে service_name.kontena.local-address

এখানে ওয়ার্ডপ্রেস অ্যাপ্লিকেশনটির ওয়াইএএমএল ফাইলের সহজ উদাহরণ রয়েছে যেখানে ওয়ার্ডপ্রেস পরিষেবা ওয়ার্ডপ্রেস- mysql.kontena.local ঠিকানার সাথে মাইএসকিউএল সার্ভারের সাথে সংযুক্ত রয়েছে:

wordpress:                                                                         
  image: wordpress:4.1                                                             
  stateful: true                                                                   
  ports:                                                                           
    - 80:80                                                                      
  links:                                                                           
    - mysql:wordpress-mysql                                                        
  environment:                                                                     
    - WORDPRESS_DB_HOST=wordpress-mysql.kontena.local                              
    - WORDPRESS_DB_PASSWORD=secret                                                 
mysql:                                                                             
  image: mariadb:5.5                                                               
  stateful: true                                                                   
  environment:                                                                     
    - MYSQL_ROOT_PASSWORD=secret
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.