将静态IP分配给Docker容器

将静态IP分配给Docker容器

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


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


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

此命令将运行具有随机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

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


Qyouu
浏览 607回答 3
3回答

湖上湖

对于docker-compose您可以使用以下docker-compose.ymlversion:&nbsp;'2'services: &nbsp;&nbsp;nginx: &nbsp;&nbsp;&nbsp;&nbsp;image:&nbsp;nginx &nbsp;&nbsp;&nbsp;&nbsp;container_name:&nbsp;nginx-container &nbsp;&nbsp;&nbsp;&nbsp;networks: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static-network: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ipv4_address:&nbsp;172.20.128.2networks: &nbsp;&nbsp;static-network: &nbsp;&nbsp;&nbsp;&nbsp;ipam: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;config: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;subnet:&nbsp;172.20.0.0/16 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#docker-compose&nbsp;v3+&nbsp;do&nbsp;not&nbsp;use&nbsp;ip_range &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ip_range:&nbsp;172.28.5.0/24从主机你可以测试使用:docker-compose&nbsp;up&nbsp;-dcurl&nbsp;172.20.128.2Modern&nbsp;docker-compose会自动为您创建具有静态IP的容器。要docker-compose在一行中查找所有容器的静态ips,请使用:for&nbsp;s&nbsp;in&nbsp;`docker-compose&nbsp;ps&nbsp;-q`;&nbsp;do&nbsp;echo&nbsp;ip&nbsp;of&nbsp;`docker&nbsp;inspect&nbsp;-f&nbsp;"{{.Name}}"&nbsp;$s`&nbsp;is&nbsp;`docker&nbsp;inspect&nbsp;-f&nbsp;'{{range&nbsp;.NetworkSettings.Networks}}{{.IPAddress}}{{end}}'&nbsp;$s`;&nbsp;done如果你想自动化,你可以使用类似这个例子gist的东西

FFIVE

不是直接的答案,但它可以帮助。我使用下一种方法运行大多数与自己的静态ips绑定的dockerized服务:我为docker主机上的所有服务创建了ip别名然后我运行每个服务将这个ip的端口重定向到容器中,这样每个服务都有自己的静态ip,可以被外部用户和其他容器使用。样品:docker&nbsp;run&nbsp;--name&nbsp;dns&nbsp;--restart=always&nbsp;-d&nbsp;-p&nbsp;172.16.177.20:53:53/udp&nbsp;dnsdocker&nbsp;run&nbsp;--name&nbsp;registry&nbsp;--restart=always&nbsp;-d&nbsp;-p&nbsp;172.16.177.12:80:5000&nbsp;registrydocker&nbsp;run&nbsp;--name&nbsp;cache&nbsp;--restart=always&nbsp;-d&nbsp;-p&nbsp;172.16.177.13:80:3142&nbsp;-v&nbsp;/data/cache:/var/cache/apt-cacher-ng&nbsp;cachedocker&nbsp;run&nbsp;--name&nbsp;mirror&nbsp;--restart=always&nbsp;-d&nbsp;-p&nbsp;172.16.177.19:80:80&nbsp;-v&nbsp;/data/mirror:/usr/share/nginx/html:ro&nbsp;mirror...
打开App,查看更多内容
随时随地看视频慕课网APP