web-dev-qa-db-fra.com

Attribuer une adresse IP statique au conteneur Docker

J'essaie maintenant d'attribuer une adresse IP statique 172.17.0.1 lorsqu'un conteneur Docker doit être démarré. 

J'utilise le port 2122 comme port ssh de ce conteneur afin de laisser ce conteneur écouter le port 2122.

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

Cette commande exécutera un conteneur Docker avec une adresse IP aléatoire telle que 172.17.0.5, mais je dois attribuer une adresse IP spécifique au conteneur.

Le script Shell suivant correspond à la référence de la documentation Docker dans les paramètres réseau avancés.

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

Ce script shell attribue une adresse IP statique 172.17.0.1 et un lien vers le monde entier. Mais chaque fois que j'essaie de ssh à ce conteneur depuis mon local, cela ne fonctionne pas. Quel est le problème peut-être que j'ai rencontré?

138
LarryLo

Facile avec Docker version 1.10.1, build 9e83765.

Vous devez d’abord créer votre propre réseau de dockers (mynet123)

docker network create --subnet=172.18.0.0/16 mynet123

que simplement lancer l'image (je prends Ubuntu comme exemple)

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

puis dans Shell Ubuntu

ip addr

De plus, vous pouvez utiliser

  • --hostname pour spécifier un nom d'hôte
  • --add-Host pour ajouter plus d'entrées à/etc/hosts

Docs (et pourquoi vous devez créer un réseau) sur https://docs.docker.com/engine/reference/commandline/network_create/

214
cantSleepNow

Pour docker-compose, vous pouvez utiliser le docker-compose.yml suivant

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

à partir de l'hôte, vous pouvez tester en utilisant:

docker-compose up -d
curl 172.20.128.2

Le docker-compose moderne créera automatiquement des conteneurs avec une adresse IP statique pour vous. 

Pour rechercher les ips statiques de tous les conteneurs de votre docker-compose sur une seule ligne, utilisez:

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

Si vous voulez automatiser, vous pouvez utiliser quelque chose comme ceci exemple Gist

56
zainengineer

Pas une réponse directe mais cela pourrait aider.

J'exécute la plupart de mes services dockerisés liés à leurs propres ips statiques en utilisant l'approche suivante:

  1. Je crée des alias ip pour tous les services sur l'hôte docker
  2. Ensuite, je lance chaque service en redirigeant les ports de cette adresse IP vers un conteneur afin que chaque service dispose de sa propre adresse IP statique pouvant être utilisée par des utilisateurs externes et d'autres conteneurs.

Échantillon:

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

Vous pouvez définir l'adresse IP lors de son exécution.

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

Voir mon exemple à https://github.com/RvdGijp/mariadb-10.1-galera

2
HowRude

Je suis tombé sur ce problème lors d’une tentative de dockerise Avahi qui doit être conscient de son adresse IP publique pour fonctionner correctement. L'attribution d'adresse IP statique au conteneur est délicate en raison de du manque de prise en charge de l'attribution d'adresse IP statique dans Docker.

Cet article décrit la technique pour affecter une adresse IP statique au conteneur sur Debian :

  1. Le service Docker doit être démarré avec DOCKER_OPTS="--bridge=br0 --ip-masq=false --iptables=false". Je suppose que le pont br0 est déjà configuré.

  2. Le conteneur doit être démarré avec --cap-add=NET_ADMIN --net=bridge

  3. Le conteneur intérieur pre-up ip addr flush dev eth0 dans /etc/network/interfaces peut être utilisé pour supprimer l'adresse IP attribuée par Docker comme dans l'exemple suivant:


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. Le script d'entrée du conteneur doit commencer par /etc/init.d/networking start. De plus, le script d'entrée doit modifier ou renseigner le fichier /etc/hosts afin de supprimer les références aux adresses IP attribuées par Docker.
2
Onlyjob

Cela fonctionne pour moi.

Créer un réseau avec docker network create --subnet=172.17.0.0/16 selnet

Exécuter l'image de menu fixe docker run --net selnet --ip 172.18.0.2 hub

Au début je suis 

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

Solution: Augmentation du 2e quadruplet de l'ip [.18. au lieu de 0,17.]

2
Nils Zenker

Vous pouvez accéder au service des autres conteneurs par leur nom (ping Apache obtiendra l'adresse IP ou curl http://Apache accéderait au service http). Cela peut être une alternative à une adresse IP statique.

1
Guisong He

Si vous voulez que votre conteneur possède son propre socket Ethernet virtuel (avec sa propre adresse MAC), utilisez iptables, puis utilisez le pilote Macvlan. Cela peut être nécessaire pour acheminer le trafic vers votre routeur/FAI.

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

0
FlappySocks