tres tipos redes qué por interfaz entre dockers defecto crea configurar docker

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 :

  1. El servicio Docker debe iniciarse con DOCKER_OPTS="--bridge=br0 --ip-masq=false --iptables=false" . Supongo que el puente br0 ya está configurado.

  2. El contenedor debe iniciarse con --cap-add=NET_ADMIN --net=bridge

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

  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:

  1. Creo alias de ip para todos los servicios en el host docker
  2. 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.