Docker kapsayıcısına statik IP atayın


206

Şimdi bir Docker kapsayıcısı başlatıldığında statik bir IP 172.17.0.1 atamaya çalışıyorum.

Bu kabın ssh portu olarak 2122 portunu kullanıyorum, böylece bu kabın 2122 portunu dinlemesine izin verdim.

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

Bu komut 172.17.0.5 gibi rasgele bir IP ile bir Docker kapsayıcısı çalıştıracaktır, ancak kapsayıcıya belirli bir IP atamam gerekiyor.

Aşağıdaki kabuk komut dosyası, gelişmiş ağ ayarlarında Docker belgelerine başvurduğum şeydir.

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

Bu kabuk betiği statik bir IP 172.17.0.1 atar ve dünya para cezasına bağlanır. Ama bu konteynere yerelden ssh yapmaya çalıştığımda işe yaramadı. Karşılaştığım sorun ne olabilir?



@larrylo kabın içinde bir sshd başlattığınızı doğrulayabilir misiniz?
Bryan

5
Docker arka plan programının sizin için yaptığı tüm yönlendirmeyi geri alıyorsunuz. Kapsayıcılar VM değildir.
user2105103


Yanıtlar:


293

Docker sürüm 1.10.1 ile kolay, 9e83765 derleyin.

Öncelikle kendi liman işçinizi oluşturmalısınız (mynet123)

docker network create --subnet=172.18.0.0/16 mynet123

sadece görüntüyü çalıştırmak daha (Ben ubuntu örnek olarak alacağım)

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

sonra ubuntu kabuğunda

ip addr

Ayrıca kullanabilirsiniz

  • --hostname bir ana bilgisayar adı belirtmek için
  • --add-host / etc / hosts dosyasına daha fazla giriş eklemek için

Https://docs.docker.com/engine/reference/commandline/network_create/ adresinden dokümanlar (ve neden ağ oluşturmanız gerektiğinde)


1
Harika yanıt - Sadece ek bilgi ekleme: blog.jessfraz.com/post/ips-for-all-the-things
Ole

@cantSleepNow nedense sadece sistem önyükleme sırasında arayüzler dosyasında oluşturulan kendi varsayılan oluşturulan köprü br0 kullanmam gerekiyor (bu yüzden docker ağ oluşturma kullanılarak oluşturulan DEĞİLDİR), bana nasıl aynı etkiyi alabilirim önerebilir misiniz - docker kullanarak köprümü oluşturmadan -ip parametresi (bir kap için sabit IP adresi al)?
Mohammed Noureldin

@MohammedNoureldin Tam olarak anlamadım - yeni bir soru gibi geliyor, bence böyle sormalısın.
cantSleepNow

@cantSleepNow Ben özel köprü (yani --ip parametresi kullanılamaz) kullanmıyorum rağmen kapsayıcının IP adresini düzeltmek gerekiyor demek, bunu almak için herhangi bir yol önerir misiniz?
Mohammed Noureldin

@MohammedNoureldin Emin değilim. Söylediğim gibi, sorunuzu yorum olarak değil, soru olarak gönderin - belki de cevabı bilen biri vardır.
cantSleepNow

89

İçin docker-composeaşağıdakileri kullanabilirsinizdocker-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

ana bilgisayardan aşağıdakileri kullanarak test edebilirsiniz:

docker-compose up -d
curl 172.20.128.2

Modern docker-composeIP adresini sık sık değiştirmez.

docker-composeTek bir satırda tüm kapsayıcıların ips'lerini bulmak için şunu kullanın:

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

Otomatikleştirmek istiyorsanız, bu örnek gist gibi bir şey kullanabilirsiniz


2
Bu sadece docker-compose v2, v3 kırılma uyumluluğunda çalışacak gibi görünüyor.
Andrzej Rehmann

4
ip_range
Docker

Ama ip_range almıyorum. bu alt ağ tarafından kapsanmıyor mu? Her neyse, teşekkürler! Bu benim "tekrar mongo konteyner benim ip bakmak zorunda" sabit - sorunu
Ben

1
sürüm 3 ip adresini belirtmek için bir yolu var mı?
ealeon

2
Çözüm benim için iyi çalışıyor ip_range. Sürüm kullanıyorum: '3.4'.
Mikhail Morfikov

24

Doğrudan bir cevap değil ama yardımcı olabilir.

Dockerized hizmetlerimin çoğunu, bir sonraki yaklaşımı kullanarak kendi statik ips'lerine bağlı olarak çalıştırıyorum:

  1. Docker ana bilgisayarındaki tüm hizmetler için ip takma adları oluşturuyorum
  2. Sonra her hizmet harici kullanıcılar ve diğer kaplar tarafından kullanılabilecek kendi statik ip var böylece bu ip konteyner her yönlendirme bağlantı noktaları çalıştırmak.

Örneklem:

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
...

Teşekkürler ~ Bunu biliyorum. Tıpkı github.com/brandon-rhodes/fopnp/tree/m/playground gibi. Deneyeceğim.
LarryLo

1
Bu çok iyi bir çözüm, sadece yeni kullanıcılar için cyberciti.biz/faq/…
Mohammed Noureldin

Güzel çözüm için teşekkürler.
RavinderSingh13

4

Bu benim için çalışıyor.

Şununla bir ağ oluşturun: docker network create --subnet=172.17.0.0/16 selnet

Docker görüntüsünü çalıştır docker run --net selnet --ip 172.18.0.2 hub

İlk başta,

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

Çözüm: IP'nin 2. dört katını artırdı [.18. yerine 17.]


3
Bu sayfada başka bir yerde 2 yaşında daha benzer / özdeş bir cevap var: stackoverflow.com/a/35359185/694469
KajMagnus

2

Ben düzgün çalışması için genel IP farkında olması gereken Avahi dockerise girişimi sırasında bu sorun üzerinde tökezledi . Docker'da statik IP ataması için destek sağlanamaması nedeniyle kaba IP atamak zor .

Bu makalede , Debian kapsayıcısına statik IP atama tekniği açıklanmaktadır :

  1. Docker hizmeti ile başlatılmalıdır DOCKER_OPTS="--bridge=br0 --ip-masq=false --iptables=false". br0Köprünün zaten yapılandırılmış olduğunu varsayıyorum .

  2. Kapsayıcı şununla başlatılmalıdır: --cap-add=NET_ADMIN --net=bridge

  3. İç kap pre-up ip addr flush dev eth0içinde /etc/network/interfaces, aşağıdaki örnekte olduğu gibi Docker tarafından atanan bir IP adresi kapatmak için kullanılabilir:


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. Kapsayıcı giriş komut dosyası ile başlamalıdır /etc/init.d/networking start. /etc/hostsDocker tarafından atanan IP'ye yapılan referansları kaldırmak için giriş komut dosyasının dosyayı düzenlemesi veya doldurması gerekir .


1

Diğer kapsayıcıların hizmetlerine isimlerine göre erişebilirsiniz ( ping apacheipi alacak veya curl http://apachehttp hizmetine erişecek) Ve bu statik bir ip alternatifi olabilir.


3
1.8 docker sürümünde bu doğrudan çalışır. Daha yeni sürümde, bu kapları yumrukla bağlamanız gerekir.
Guisong He

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.