我现在试图在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}}' <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到这个容器时,它都不起作用。我可能遇到了什么问题?
我在尝试dockerise Avahi时偶然发现了这个问题,它需要知道它的公共IP才能正常工作。给容器分配静态IP是很棘手的,因为Docker不支持静态IP分配。
这篇文章描述了如何在Debian上为容器分配静态IP的技术:
Docker服务应该以DOCKER_OPTS="——bridge=br0——ip-masq=false——iptables=false"启动。我假设br0桥已经配置好了。
容器应该使用——cap-add=NET_ADMIN——net=bridge启动
在容器内部,可以使用/etc/network/interfaces中的eth0来解除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
容器的输入脚本应该以/etc/init.开头d /网络开始。此外,输入脚本需要编辑或填充/etc/hosts文件,以删除对docker分配的IP的引用。
Docker 1.10.1版本很容易,build 9e83765。
首先,你需要创建自己的docker网络(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
https://docs.docker.com/engine/reference/commandline/network_create/上的文档(以及为什么你需要创建一个网络)
对于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
如果你想自动化,你可以使用类似这个例子的要点