将静态IP分配给Docker容器

我现在试图分配一个静态IP 172.17.0.1当一个Docker容器启动。

我使用端口2122作为此容器的ssh端口,以便让此容器侦听端口2122。

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

这个命令将运行一个像172.17.0.5这样的随机IP的Docker容器,但是我需要为容器指定一个特定的IP地址。

以下shell脚本是我在高级networking设置中引用Docker文档的内容。

 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 

这个shell脚本将分配一个静态的IP 172.17.0.1并链接到世界上很好。 但是每当我尝试从本地ssh到这个容器,它都不起作用。 我遇到了什么问题?

使用Docker版本1.10.1可轻松构build9e83765。

首先你需要创build你自己的dockernetworking(mynet123)

 docker network create --subnet=172.18.0.0/16 mynet123 

比简单地运行图像(我将以ubuntu为例)

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

然后在ubuntu shell中

 ip addr 

另外你可以使用

  • --hostname指定一个主机名
  • --add-host将更多条目添加到/ etc / hosts

文档(以及为什么你需要创build一个networking)在https://docs.docker.com/engine/reference/commandline/network_create/

对于docker-compose.yml docker-compose你可以使用下面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 ip_range: 172.28.5.0/24 

从主机你可以testing使用:

 docker-compose up -d curl 172.20.128.2 

现代的docker-compose会自动为你创build带有静态IP的容器。

要finddocker中所有容器的静态ips,在一行中使用:

 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 

如果你想自动化,你可以使用像这样的例子要点

不是一个直接的答案,但它可以帮助。

我使用下面的方法运行与自己的静态ips关联的大部分dockerized服务:

  1. 我为docker主机上的所有服务创buildip别名
  2. 然后我运行每个服务redirect端口从这个IP到容器,所以每个服务都有自己的静态IP可以被外部用户和其他容器使用。

样品:

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

在尝试将Avahidocker服务的过程中,我偶然发现了这个问题,需要了解它的公共IP才能正常工作。 将静态IP分配给容器是棘手的,因为缺乏对 Docker中静态IP分配的支持 。

本文将介绍如何将静态IP分配给Debian上的容器:

  1. Docker服务应该以DOCKER_OPTS="--bridge=br0 --ip-masq=false --iptables=false" 。 我假设br0桥已经configuration好了。

  2. 容器应该以--cap-add=NET_ADMIN --net=bridge

  3. 内容容器pre-up ip addr flush dev eth0 /etc/network/interfaces pre-up ip addr flush dev eth0可用于closuresDocker分配的IP地址,如以下示例所示:


 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. 容器的入口脚本应该以/etc/init.d/networking start 。 此外,条目脚本需要编辑或填充/etc/hosts文件,以删除对Docker分配的IP的引用。

您可以在运行时设置IP。

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

https://github.com/RvdGijp/mariadb-10.1-galera查看我的示例;

你可以通过他们的名字访问其他容器的服务( ping apache会得到ip或curl http://apache会访问http服务)这可以是静态ip的替代。

如果你想让你的容器有自己的虚拟以太网套接字(使用它自己的MAC地址),iptables,那么使用Macvlan驱动程序。 将stream量路由到您的/ ISP路由器可能是必要的。

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