将静态IP分配给Docker容器

Lar*_*yLo 172 docker

我现在尝试在启动Docker容器时分配静态IP 172.17.0.1.

我使用端口2122作为此容器的ssh端口,以便我让这个容器监听端口2122.

sudo docker run -i -t -p 2122:2122 ubuntu
Run Code Online (Sandbox Code Playgroud)

此命令将运行具有随机IP(如172.17.0.5)的Docker容器,但我需要为容器分配特定的IP.

以下shell脚本是我在高级网络设置中引用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
Run Code Online (Sandbox Code Playgroud)

这个shell脚本将分配一个静态IP 172.17.0.1并链接到世界正常.但每当我尝试从我的本地ssh到这个容器时,它都无法正常工作.我遇到的问题是什么?

can*_*Now 249

使用Docker 1.10.1版,轻松构建9e83765.

首先,您需要创建自己的docker网络(mynet123)

docker network create --subnet=172.18.0.0/16 mynet123
Run Code Online (Sandbox Code Playgroud)

而不是简单地运行图像(我将以ubuntu为例)

docker run --net mynet123 --ip 172.18.0.22 -it ubuntu bash
Run Code Online (Sandbox Code Playgroud)

然后在ubuntu shell中

ip addr
Run Code Online (Sandbox Code Playgroud)

另外你可以使用

  • --hostname 指定主机名
  • --add-host 向/ etc/hosts添加更多条目

文档(以及您需要创建网络的原因),访问https://docs.docker.com/engine/reference/commandline/network_create/


zai*_*eer 73

对于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
          #docker-compose v3+ do not use ip_range
          ip_range: 172.28.5.0/24
Run Code Online (Sandbox Code Playgroud)

从主机你可以测试使用:

docker-compose up -d
curl 172.20.128.2
Run Code Online (Sandbox Code Playgroud)

Modern docker-compose会自动为您创建具有静态IP的容器.

docker-compose在一行中查找所有容器的静态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
Run Code Online (Sandbox Code Playgroud)

如果你想自动化,你可以使用类似这个例子gist的东西

  • 当使用docker-compose v3 +删除`ip_range`时 (3认同)
  • 看起来这只适用于docker-compose v2,v3打破兼容性. (2认同)
  • 没有`ip_range`的解决方案对我来说很好。我正在使用版本:“ 3.4”。 (2认同)

ISa*_*ych 23

不是直接的答案,但它可以帮助.

我使用下一种方法运行大多数与自己的静态ips绑定的dockerized服务:

  1. 我为docker主机上的所有服务创建了ip别名
  2. 然后我运行每个服务将这个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
...
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常好的解决方案,我将附加此链接供新用户了解别名http://www.cyberciti.biz/faq/linux-creating-or-adding-new-network-alias-to-a -网卡网卡/ (3认同)

Onl*_*job 5

我在尝试 dockerise Avahi 时偶然发现了这个问题,它需要知道它的公共 IP 才能正常运行。由于Docker 中缺乏对静态 IP 分配的支持,因此为容器分配静态 IP 很棘手。

本文描述了如何在Debian上为容器分配静态 IP 的技术:

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

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

  3. 内部容器pre-up ip addr flush dev eth0in/etc/network/interfaces可用于关闭 Docker 分配的 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
Run Code Online (Sandbox Code Playgroud)
  1. 容器的入口脚本应该以/etc/init.d/networking start. 此外,入口脚本需要编辑或填充/etc/hosts文件以删除对 Docker 分配的 IP 的引用。


Nil*_*ker 5

这对我有用。

创建一个网络 docker network create --subnet=172.17.0.0/16 selnet

运行 docker 镜像 docker run --net selnet --ip 172.18.0.2 hub

起初,我得到

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
Run Code Online (Sandbox Code Playgroud)

解决方案:增加 IP [.18.2] 的第二个四倍。而不是 .17。]

  • 本页其他地方有一个 2 岁前的类似/相同答案:/sf/answers/2475142981/ (5认同)