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é?
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/hostsDocs (et pourquoi vous devez créer un réseau) sur https://docs.docker.com/engine/reference/commandline/network_create/
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
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:
É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
...
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
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 :
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é.
Le conteneur doit être démarré avec --cap-add=NET_ADMIN --net=bridge
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
/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.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.]
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.
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