Docker कंटेनर में स्थिर IP असाइन करें


205

मैं अब एक स्थिर IP 172.17.0.1 असाइन करने का प्रयास कर रहा हूं जब एक डॉकटर कंटेनर शुरू किया जाएगा।

मैं इस कंटेनर के ssh पोर्ट के रूप में पोर्ट 2122 का उपयोग करता हूं ताकि मैं इस कंटेनर को पोर्ट 2122 सुनूं।

sudo docker run -i -t -p 2122:2122 ubuntu

यह कमांड 172.17.0.5 जैसे यादृच्छिक आईपी के साथ एक डॉक कंटेनर को चलाएगा, लेकिन मुझे कंटेनर को एक विशिष्ट आईपी आवंटित करने की आवश्यकता है।

निम्नलिखित शेल स्क्रिप्ट है जो मैं उन्नत नेटवर्क सेटिंग्स में डॉकर प्रलेखन का संदर्भ देता हूं।

pid=$(sudo docker inspect -f '{{.State.Pid}}' <container_name> 2>/dev/null)
sudo rm -rf /var/run/netns/*
sudo ln -s /proc/$pid/ns/net /var/run/netns/$pid
sudo ip link add A type veth peer name B
sudo brctl addif docker0 A
sudo ip link set A up
sudo ip link set B netns $pid
sudo ip netns exec $pid ip link set eth0 down
sudo ip netns exec $pid ip link delete eth0
sudo ip netns exec $pid ip link set dev B name eth0
sudo ip netns exec $pid ip link set eth0 address 12:34:56:78:9a:bc
sudo ip netns exec $pid ip link set eth0 down
sudo ip netns exec $pid ip link set eth0 up
sudo ip netns exec $pid ip addr add 172.17.0.1/16 dev eth0
sudo ip netns exec $pid ip route add default via 172.17.42.1

यह शेल स्क्रिप्ट एक स्थिर IP 172.17.0.1 असाइन करेगा और दुनिया को ठीक से लिंक करेगा। लेकिन जब भी मैं अपने स्थानीय से इस कंटेनर में जाने की कोशिश करता हूं, तो यह काम नहीं करता है। संभवतः मुझे क्या समस्या है?


मुझे डर है कि उस प्रश्न का सरल उत्तर नहीं है, github.com/docker/docker/issues/6743 और github.com/docker/docker/issues/1179 देखें , और पढ़ें github.com/jockazzo/pipework
user2915097

@larrylo क्या आप पुष्टि कर सकते हैं कि आपने कंटेनर के अंदर एक sshd शुरू किया है?
ब्रायन

5
आप सभी रूटिंग को पूर्ववत कर रहे हैं जो डॉकटर डेमॉन आपके लिए करता है। कंटेनर VMs नहीं हैं।
user2105103

हां, मैं पुष्टि करता हूं कि मैं कंटेनर के अंदर sshd शुरू कर सकता हूं
लैरीएलओएल

जवाबों:


291

डॉकर संस्करण 1.10.1 के साथ आसान, 9e83765 का निर्माण करें।

सबसे पहले आपको अपना खुद का डॉकटर नेटवर्क बनाने की जरूरत है (mynet123)

docker network create --subnet=172.18.0.0/16 mynet123

बस छवि चलाने के लिए (मैं उदाहरण के रूप में ubuntu ले जाऊँगा)

docker run --net mynet123 --ip 172.18.0.22 -it ubuntu bash

फिर उबंटू खोल में

ip addr

इसके अतिरिक्त आप उपयोग कर सकते हैं

  • --hostname होस्टनाम निर्दिष्ट करने के लिए
  • --add-host / etc / मेजबान में अधिक प्रविष्टियाँ जोड़ने के लिए

डॉक्स (और आपको नेटवर्क बनाने की आवश्यकता क्यों है) https://docs.docker.com/engine/reference/commandline/network_create/ पर


1
शानदार उत्तर - बस कुछ अतिरिक्त जानकारी जोड़ रहे हैं: blog.jessfraz.com/post/ips-for-all-the-things
Ole

@ cantSleepNow किसी कारण से मुझे बस अपने स्वयं के डिफ़ॉल्ट बनाए गए ब्रिज br0 का उपयोग करने की आवश्यकता है जो सिस्टम बूट के दौरान इंटरफेस फ़ाइल में बनाया गया है (इसलिए यह docker नेटवर्क बनाने का उपयोग करके नहीं बनाया गया है), क्या आप मुझे सुझाव दे सकते हैं कि मैं कैसे उसी प्रभाव को प्राप्त कर सकता हूं - -पैक पैरामीटर का उपयोग करें (कंटेनर के लिए निश्चित आईपी पता प्राप्त करें) docker का उपयोग किए बिना मेरा पुल बनाएं?
मोहम्मद नौरेलिन

@MohammedNoureldin मुझे पूरी तरह से समझ में नहीं आता है - यह भी एक नया प्रश्न लगता है, मुझे लगता है कि आपको इसे इस तरह से पूछना चाहिए।
cantSleepNow

@ cantSleepNow मेरा मतलब है कि मुझे कंटेनर का IP पता ठीक करने की आवश्यकता है, हालांकि मैं कस्टम ब्रिज का उपयोग नहीं कर रहा हूं (इसलिए --ip पैरामीटर का उपयोग नहीं किया जा सकता), क्या आप इसे प्राप्त करने का कोई तरीका सुझाते हैं?
मोहम्मद नौरेलिन

@MohammedNoureldin मुझे यकीन नहीं है। जैसा कि मैंने कहा, अपने प्रश्न को प्रश्न के रूप में पोस्ट करें और टिप्पणी के रूप में नहीं - शायद कोई ऐसा व्यक्ति है जो उत्तर जानता है।
cantSleepNow

89

के लिए docker-composeआप निम्न का उपयोग कर सकतेdocker-compose.yml

version: '2'
services:
  nginx:
    image: nginx
    container_name: nginx-container
    networks:
      static-network:
        ipv4_address: 172.20.128.2
networks:
  static-network:
    ipam:
      config:
        - subnet: 172.20.0.0/16
          #docker-compose v3+ do not use ip_range
          ip_range: 172.28.5.0/24

मेजबान से आप का उपयोग कर परीक्षण कर सकते हैं:

docker-compose up -d
curl 172.20.128.2

आधुनिक docker-composeअक्सर IP पता नहीं बदलता है।

docker-composeएक लाइन में अपने सभी कंटेनरों के ips खोजने के लिए:

for s in `docker-compose ps -q`; do echo ip of `docker inspect -f "{{.Name}}" $s` is `docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $s`; done

यदि आप स्वचालित करना चाहते हैं, तो आप इस उदाहरण की तरह कुछ का उपयोग कर सकते हैं


2
ऐसा लगता है कि यह केवल docker-compose v2 में काम करेगा, v3 ने संगतता को तोड़ दिया।
आंद्रेजे रहमान


हालांकि मुझे ip_range नहीं मिलता है। यह सबनेट द्वारा कवर नहीं है? वैसे भी, धन्यवाद! यह तय है कि "मुझे अपने मोंगो कंटेनर का आईपी फिर से देखना होगा" - मुद्दा
बेन

1
वहाँ संस्करण 3 में आईपी पते को निर्दिष्ट करने का एक तरीका है?
एलियोन

2
समाधान मेरे बिना ठीक काम करता है ip_range। मैं संस्करण का उपयोग कर रहा हूं: '3.4'।
मिखाइल मोरफिकोव

24

सीधा जवाब नहीं है लेकिन यह मदद कर सकता है।

मैं अपनी अधिकांश डोकेराइज़्ड सेवाओं को अगले दृष्टिकोण का उपयोग करते हुए स्वयं स्थिर स्थैतिक से जुड़ा हुआ चलाता हूं:

  1. मैं डॉक होस्ट पर सभी सेवाओं के लिए आईपी उपनाम बनाता हूं
  2. फिर मैं प्रत्येक सेवा को इस आईपी से पोर्ट में कंटेनर में पुनर्निर्देशित करता हूं, ताकि प्रत्येक सेवा का अपना स्थिर आईपी हो जो बाहरी उपयोगकर्ताओं और अन्य कंटेनरों द्वारा उपयोग किया जा सके।

नमूना:

docker run --name dns --restart=always -d -p 172.16.177.20:53:53/udp dns
docker run --name registry --restart=always -d -p 172.16.177.12:80:5000 registry
docker run --name cache --restart=always -d -p 172.16.177.13:80:3142 -v /data/cache:/var/cache/apt-cacher-ng cache
docker run --name mirror --restart=always -d -p 172.16.177.19:80:80 -v /data/mirror:/usr/share/nginx/html:ro mirror
...

धन्यवाद ~ मुझे यह पता है। जैसे github.com/brandon-rhodes/fopnp/tree/m/playground करते हैं। मैं कोशिश करुंगा।
लैरीएलो

1
यह एक बहुत ही अच्छा समाधान, मैं सिर्फ नए उपयोगकर्ताओं aliasing बारे में जानने के लिए इस लिंक देते हैं cyberciti.biz/faq/...
मोहम्मद Noureldin

अच्छा समाधान के लिए धन्यवाद।
रविंदरसिंह 13

4

यह मेरे लिए काम करता है।

के साथ एक नेटवर्क बनाएँ docker network create --subnet=172.17.0.0/16 selnet

डॉकटर छवि चलाएँ docker run --net selnet --ip 172.18.0.2 hub

सबसे पहले, मुझे मिल गया

docker: Error response from daemon: Invalid address 172.17.0.2: It does not belong to any of this network's subnets.
ERRO[0000] error waiting for container: context canceled

समाधान: आईपी [.18 की दूसरी चौगुनी वृद्धि हुई है। इसके बजाय .17।]


3
इस पृष्ठ पर 2 वर्ष पुराना / समान उत्तर कहीं और है: stackoverflow.com/a/35359185/694469
KajMagnus

2

मैं अवही को डॉक्यूमेंट करने की कोशिश के दौरान इस समस्या पर लड़खड़ा गया, जिसे ठीक से काम करने के लिए इसके सार्वजनिक आईपी के बारे में पता होना चाहिए। डॉकटर में स्थिर आईपी असाइनमेंट के लिए समर्थन की कमी के कारण कंटेनर को स्थिर आईपी सौंपना मुश्किल है ।

यह आलेख तकनीक का वर्णन करता है कि डेबियन पर कंटेनर को स्थिर आईपी कैसे असाइन किया जाए :

  1. डॉकर सेवा के साथ शुरू किया जाना चाहिए DOCKER_OPTS="--bridge=br0 --ip-masq=false --iptables=false"। मुझे लगता है कि br0पुल पहले से ही कॉन्फ़िगर है।

  2. कंटेनर के साथ शुरू किया जाना चाहिए --cap-add=NET_ADMIN --net=bridge

  3. निम्न उदाहरण में डॉकर द्वारा निर्दिष्ट आईपी पते को खारिज करने के लिए अंदर के कंटेनर pre-up ip addr flush dev eth0का /etc/network/interfacesउपयोग किया जा सकता है:


auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    pre-up ip addr flush dev eth0
    address 192.168.0.249
    netmask 255.255.255.0
    gateway 192.168.0.1
  1. कंटेनर की प्रविष्टि स्क्रिप्ट के साथ शुरू होना चाहिए /etc/init.d/networking start/etc/hostsडॉक-असाइन किए गए आईपी के संदर्भ को हटाने के लिए प्रविष्टि स्क्रिप्ट को फ़ाइल को संपादित करने या आबाद करने की आवश्यकता है ।

2

इसे चलाते हुए आप IP सेट कर सकते हैं।

docker run --cap-add=NET_ADMIN -dit imagename /bin/sh -c "/sbin/ip addr add 172.17.0.12 dev eth0; bash"

मेरा उदाहरण https://github.com/RvdGijp/mariadb-10.1-galera पर देखें


दुर्भाग्य से यह एक और आईपी पता जोड़ता है, अगर एक आईपी पते को प्रक्रिया में पहले सौंपा गया था, तो दो आईपी पते होने का परिणाम है
davey

1

आप अन्य कंटेनरों की सेवा उनके नाम ping apacheसे प्राप्त कर सकते हैं ( आईपी ​​प्राप्त करेंगे या curl http://apachehttp सेवा तक पहुंच प्राप्त करेंगे) और यह एक स्थिर आईपी का विकल्प हो सकता है।


3
1.8 के डॉक वर्जन में यह सीधे काम करता है। नए संस्करण में, आपको इन कंटेनरों को मुट्ठी से जोड़ना होगा।
गिसॉन्ग हे

0

यदि आप चाहते हैं कि आपके कंटेनर में स्वयं का वर्चुअल ईथरनेट सॉकेट हो (इसके साथ इसका स्वयं का मैक पता हो), iptables, तो MacLlan ड्राइवर का उपयोग करें। ट्रैफ़िक को आपके / ISPs राउटर के लिए रूट करने के लिए यह आवश्यक हो सकता है।

https://docs.docker.com/engine/userguide/networking/get-started-macvlan

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.