将静态IP分配给Docker容器
我现在尝试在Docker容器启动时分配一个静态IP 172.17.0.1 我使用端口2122作为该容器的ssh端口,以便让该容器侦听端口2122将静态IP分配给Docker容器,docker,Docker,我现在尝试在Docker容器启动时分配一个静态IP 172.17.0.1 我使用端口2122作为该容器的ssh端口,以便让该容器侦听端口2122 sudo docker run -i -t -p 2122:2122 ubuntu 这个命令将运行一个带有随机IP的Docker容器,如172.17.0.5,但我需要为容器分配一个特定的IP 下面的shell脚本是我在高级网络设置中引用Docker文档的部分 pid=$(sudo docker inspect -f '{{.State.Pid}}'
sudo docker run -i -t -p 2122:2122 ubuntu
这个命令将运行一个带有随机IP的Docker容器,如172.17.0.5,但我需要为容器分配一个特定的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
pid=$(sudo docker inspect-f'{{.State.pid}}'2>/dev/null)
sudo rm-rf/var/run/netns/*
sudo ln-s/proc/$pid/ns/net/var/run/netns/$pid
sudo ip link添加类型veth peer name B
sudo brctl addif DOCKR0 A
sudo ip链接设置为
sudo ip链路集B网络$pid
sudo ip netns exec$pid ip link设置eth0关闭
sudo ip netns exec$pid ip link delete eth0
sudo ip netns exec$pid ip链路集开发人员B名称eth0
sudo ip netns exec$pid ip link set eth0地址12:34:56:78:9a:bc
sudo ip netns exec$pid ip link设置eth0关闭
sudo ip netns exec$pid ip link设置eth0
sudo ip netns exec$pid ip addr add 172.17.0.1/16 dev eth0
sudo ip netns exec$pid ip路由通过172.17.42.1添加默认值
此shell脚本将分配一个静态IP 172.17.0.1并链接到world fine。但是每当我尝试从本地ssh到这个容器时,它都不起作用。我可能遇到的问题是什么?不是直接的答案,但可能会有所帮助 我使用下一种方法运行与自己的静态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
...
我在尝试Dockrise Avahi时偶然发现了这个问题,Avahi需要了解其公共IP才能正常运行。由于在Docker中,为容器分配静态IP是很棘手的 描述如何将静态IP分配给上的容器的技术:
Docker\u OPTS=“--bridge=br0--ip masq=false--iptables=false”
启动。我假设br0
网桥已经配置好了--cap add=NET\u ADMIN--NET=bridge
/etc/network/interfaces
中的容器内预安装ip地址flush dev eth0
可用于取消Docker分配的ip地址,如下例所示:/etc/init.d/networking start
开头。此外,输入脚本需要编辑或填充/etc/hosts
文件,以便删除对Docker分配的IP的引用轻松使用Docker版本1.10.1,构建9e83765 首先,您需要创建自己的docker网络(mynet123) 然后,只需运行映像(我将以ubuntu为例) 然后在ubuntu外壳中
ip addr
此外,您还可以使用
指定主机名--hostname
向/etc/hosts添加更多条目--添加主机
文档(以及为什么需要创建网络)在上,您可以在运行IP时设置IP
docker run --cap-add=NET_ADMIN -dit imagename /bin/sh -c "/sbin/ip addr add 172.17.0.12 dev eth0; bash"
请参见我在上的示例,您可以通过名称访问其他容器的服务(
ping apache
将获得ip或curl)http://apache
将访问http服务),这可以作为静态ip的替代。对于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
从主机,您可以使用以下各项进行测试:
docker-compose up -d
curl 172.20.128.2
现代docker compose
不会频繁更改ip地址
要在一行中查找docker compose
中所有容器的IP,请使用:
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
如果您想实现自动化,您可以使用类似这样的工具,如果您希望容器拥有自己的虚拟以太网套接字(具有自己的MAC地址)、iptables,然后使用Macvlan驱动程序。这可能是将流量路由到您的/ISPs路由器所必需的 这对我很有用 创建一个具有
docker网络创建——子网=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
解决方案:增加IP的第二个四倍
[.18.而不是.17.]恐怕这个问题没有一个简单的答案,请参阅和,并阅读@larrylo您能确认您在容器内启动了sshd吗?您正在撤消docker守护进程为您执行的所有路由。容器不是虚拟机。是的,我确认我可以在容器内启动sshd。谢谢~我知道这一点。就像你一样。我会尝试一下。这是一个非常好的解决方案,我只想附加这个链接,让新用户了解别名。谢谢你提供了很好的解决方案。在docker版本的1.8中,这可以直接工作。在较新的版本中,您必须首先链接这些容器。答案很好-只需添加一些附加信息:@cantSleepNow出于某种原因,我只需要使用我自己的默认创建网桥br0,它是在系统引导期间在接口文件中创建的(因此它不是使用docker network create创建的),你能建议我如何在不使用docker创建网桥的情况下获得与--ip参数(获取容器的固定ip地址)相同的效果吗?@MohammedNoureldin我不完全理解-听起来像是一个新问题,我想你应该这样问。@CantleepNow我的意思是我需要修复容器的IP地址,尽管我没有使用自定义网桥(因此--IP参数不能使用),你建议用什么方法来获得它吗?@MohammedNoureldin,我不确定。正如我所说,将你的问题作为问题而不是评论发布-也许有人知道答案。看起来这只适用于docker compose v2,v3破坏了兼容性。当使用docker compose v3+删除
ip_范围时,我不知道ip_范围。这不在子网的覆盖范围内吗?无论如何,谢谢你!T
docker-compose up -d
curl 172.20.128.2
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
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