Assegna IP statico al contenitore Docker

Ora sto provando ad assegnare un IP 172.17.0.1 statico all’avvio di un container Docker.

Io uso la porta 2122 come porta ssh di questo contenitore in modo da consentire a questo contenitore di ascoltare la porta 2122.

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

Questo comando eseguirà un contenitore Docker con un IP casuale come 172.17.0.5, ma ho bisogno di assegnare un IP specifico al contenitore.

Il seguente script di shell è quello che faccio riferimento alla documentazione di Docker nelle impostazioni di rete avanzate.

 pid=$(sudo docker inspect -f '{{.State.Pid}}'  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 

Questo script di shell assegnerà un IP 172.17.0.1 statico e collegherà il mondo alla multa. Ma ogni volta che provo a ssh con questo contenitore dal mio locale, non ha funzionato. Qual è il problema che ho incontrato?

Facile con Docker versione 1.10.1, build 9e83765.

Innanzitutto è necessario creare la propria rete mobile (mynet123)

 docker network create --subnet=172.18.0.0/16 mynet123 

di eseguire semplicemente l’immagine (prenderò Ubuntu come esempio)

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

quindi nella shell di Ubuntu

 ip addr 

Inoltre è ansible utilizzare

  • --hostname per specificare un nome host
  • --add-host per aggiungere più voci a / etc / hosts

Documenti (e perché è necessario creare una rete) su https://docs.docker.com/engine/reference/commandline/network_create/

Per la docker-compose puoi usare il seguente 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 

dall’host puoi testare usando:

 docker-compose up -d curl 172.20.128.2 

La moderna docker-compose creerà automaticamente contenitori con IP statico.

Per trovare ips statici di tutti i contenitori nella docker-compose in un’unica riga:

 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 

Se vuoi automatizzare, puoi usare qualcosa come questo esempio gist

Non una risposta diretta, ma potrebbe aiutare.

Gestisco la maggior parte dei miei servizi dockerizzati legati ai propri IP statici utilizzando il prossimo approccio:

  1. Creo alias IP per tutti i servizi sull’host di docker
  2. Quindi eseguo ogni servizio reindirizzando le porte da questo ip al contenitore in modo che ogni servizio disponga di un proprio IP statico che potrebbe essere utilizzato da utenti esterni e altri contenitori.

Campione:

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

Mi sono imbattuto in questo problema durante il tentativo di rendere disponibile Avahi che deve essere a conoscenza del suo IP pubblico per funzionare correttamente. Assegnare l’IP statico al contenitore è complicato a causa della mancanza di supporto per l’assegnazione statica di IP in Docker.

Questo articolo descrive la tecnica su come assegnare l’IP statico al contenitore su Debian :

  1. Il servizio Docker deve essere avviato con DOCKER_OPTS="--bridge=br0 --ip-masq=false --iptables=false" . Suppongo che br0 bridge sia già configurato.

  2. Il contenitore dovrebbe essere avviato con --cap-add=NET_ADMIN --net=bridge

  3. All’interno del contenitore pre-up ip addr flush dev eth0 in /etc/network/interfaces può essere utilizzato per eliminare l’indirizzo IP assegnato da Docker come nell’esempio seguente:


 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. Lo script di entrata del contenitore dovrebbe iniziare con /etc/init.d/networking start . Anche lo script di immissione deve modificare o popolare il /etc/hosts per rimuovere i riferimenti all’IP assegnato da Docker.

È ansible impostare l’IP durante l’esecuzione.

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

Vedi il mio esempio su https://github.com/RvdGijp/mariadb-10.1-galera

È ansible accedere al servizio di altri contenitori con il loro nome ( ping apache otterrà l’ip o curl http://apache accederà al servizio http) e questo può essere un’alternativa a un ip statico.

Se si desidera che il proprio contenitore abbia il proprio socket Ethernet virtuale (con il proprio indirizzo MAC), iptables, quindi utilizzare il driver Macvlan. Questo potrebbe essere necessario per indirizzare il traffico verso il router / ISP.

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