tipos - Asignar IP estática al contenedor Docker
qué tres redes por defecto crea docker (8)
Ahora estoy tratando de asignar una IP estática 172.17.0.1 cuando se inicia un contenedor Docker.
Uso el puerto 2122 como el puerto ssh de este contenedor, de modo que dejo que este contenedor escuche el puerto 2122.
sudo docker run -i -t -p 2122:2122 ubuntu
Este comando ejecutará un contenedor Docker con una IP aleatoria como 172.17.0.5, pero necesito asignar una IP específica al contenedor.
El siguiente script de shell es lo que hago referencia a la documentación de Docker en la configuración de red avanzada.
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
Este script de shell asignará una IP estática 172.17.0.1 y se vinculará al mundo bien. Pero cada vez que trato de enviar a este contenedor desde mi local, no funcionó. ¿Cuál es el problema que posiblemente conocí?
Esto funciona para mi.
Crear una red con
docker network create --subnet=172.17.0.0/16 selnet
Ejecutar docker image
docker run --net selnet --ip 172.18.0.2 hub
Al principio tengo
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
Solución: Aumentó el segundo cuádruple de la ip [.18. en lugar de .17.]
Fácil con Docker versión 1.10.1, compilación 9e83765.
Primero debe crear su propia red de acopladores (mynet123)
docker network create --subnet=172.18.0.0/16 mynet123
que simplemente ejecutar la imagen (tomaré ubuntu como ejemplo)
docker run --net mynet123 --ip 172.18.0.22 -it ubuntu bash
luego en ubuntu shell
ip addr
Además podrías usar
-
--hostname
para especificar un nombre de host -
--add-host
para agregar más entradas a / etc / hosts
Documentos (y por qué necesita crear una red) en https://docs.docker.com/engine/reference/commandline/network_create/
Me topé con este problema durante el intento de dockerise Avahi que necesita ser consciente de su IP pública para funcionar correctamente. Asignar IP estática al contenedor es complicado debido a la github.com/docker/docker/issues/6743 en Docker.
Este artículo describe la técnica de cómo asignar IP estática al contenedor en Debian :
-
El servicio Docker debe iniciarse con
DOCKER_OPTS="--bridge=br0 --ip-masq=false --iptables=false"
. Supongo que el puentebr0
ya está configurado. -
El contenedor debe iniciarse con
--cap-add=NET_ADMIN --net=bridge
-
El contenedor interno
pre-up ip addr flush dev eth0
en/etc/network/interfaces
se puede usar para descartar la dirección IP asignada por Docker como en el siguiente ejemplo:
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
-
El script de entrada del contenedor debe comenzar con
/etc/init.d/networking start
. Además, el script de entrada debe editar o completar el/etc/hosts
para eliminar las referencias a la IP asignada por Docker.
No es una respuesta directa pero podría ayudar.
Ejecuto la mayoría de mis servicios dockerizados vinculados a ips estáticos propios usando el siguiente enfoque:
- Creo alias de ip para todos los servicios en el host docker
- Luego ejecuto cada servicio redirigiendo puertos desde esta ip al contenedor para que cada servicio tenga su propia ip estática que podría ser utilizada por usuarios externos y otros contenedores.
Muestra:
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
...
Para
docker-compose
puede usar el siguiente
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
desde el host puedes probar usando:
docker-compose up -d
curl 172.20.128.2
docker-compose
moderno creará automáticamente contenedores con ip estática para usted.
Para encontrar ips estáticos de todos los contenedores en su
docker-compose
en una sola línea, use:
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 desea automatizar, puede usar algo como este ejemplo general
Puede acceder al servicio de otros contenedores por su nombre (
ping apache
obtendrá la ip o
curl http://apache
accedería al servicio http) Y esta puede ser una alternativa a una ip estática.
Puede configurar la IP mientras la ejecuta.
docker run --cap-add=NET_ADMIN -dit imagename /bin/sh -c "/sbin/ip addr add 172.17.0.12 dev eth0; bash"
Vea mi ejemplo en https://github.com/RvdGijp/mariadb-10.1-galera
Si desea que su contenedor tenga su propio socket virtual de ethernet (con su propia dirección MAC), iptables, use el controlador Macvlan. Esto puede ser necesario para enrutar el tráfico hacia su enrutador / ISP.
https://docs.docker.com/engine/userguide/networking/get-started-macvlan