当前位置: 首页 > 知识库问答 >
问题:

将静态IP分配给Docker容器

杜联
2023-03-14

我现在尝试在启动Docker容器时分配静态IP172.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并链接到world fine。但是每当我尝试从本地ssh到这个容器时,它都不起作用。我可能遇到了什么问题?

共有3个答案

云景焕
2023-03-14

这不是一个直接的答案,但可能会有所帮助。

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

  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
...
聂琨
2023-03-14

对于docker-comment,您可以使用以下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

如果您想实现自动化,可以使用类似于此示例的内容

万志专
2023-03-14

轻松使用Docker版本1.10.1,构建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外壳中

ip addr

此外,您还可以使用

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

文档(以及为什么需要创建网络)位于https://docs.docker.com/engine/reference/commandline/network_create/

 类似资料:
  • 问题内容: 我一直在尝试将五个公共IP之一分配给我的docker容器。由于docker的性质及其用途,似乎这应该是可能的。我找到了我认为可以解释我要做什么的网站,但是自从Docker离开LXC以来,它不再起作用: http://programster.blogspot.com/2014/06/docker-run-multiple-docker-websites- on.html 我曾尝试与我的容

  • 问题内容: 有什么方法可以将分配给容器。因此,容器具有公共IP。客户端可以使用IP访问容器。 问题答案: 对于当前发布的Docker版本,这是不可能的(无需在Docker背后进行大量手动工作),尽管它几乎没有必要。 Docker通过使用端口映射在容器中公开网络服务,并且端口映射可以绑定到主机上的特定IP地址。所以,如果你想有一个在Web服务器,并在另一个网站服务器,首先确保该地址可在主机上: 然后

  • 问题内容: 我想为容器分配一个端口,以便在每次重新启动容器后都获得相同的端口。 示例:我有一个容器,其中有一个Apache。Apache在容器内的端口80上运行。现在,在启动容器后,docker将一个主机端口分配给该容器端口,例如:49154->80。但是该主机端口在重新启动后会更改,具体取决于正在运行的容器的数量。我试图在容器的config.json文件中指定端口,但该端口被覆盖。 是否可以手动

  • 问题内容: 我正在尝试为容器提供静态IP地址。我了解我必须创建一个自定义网络。我创建了它,并且桥接接口在主机(Ubuntu 16.x)上已启动。容器从该子网获取IP,但不是我提供的静态IP。 这是我的docker-compose.yml: 容器得到10.5.0.2和10.5.0.3,而不是5和6。 问题答案: 请注意,除非您做的事情允许容器网络从外部路由到内部(例如,macvlan),否则我不建议

  • 我正在尝试向容器提供静态IP地址。我知道我必须创建一个自定义网络。我创建它并且桥接接口在主机(Ubuntu 16. x)上。容器从此子网获取IP,但不是我提供的静态。 这是我的docker-compose.yml: 容器10.5.0.2和10.5.0.3,而不是5和6。

  • 问题内容: 不熟悉Unix网络,添加虚拟接口等,现在尝试学习。我们正在尝试对我们的应用程序进行docker化。 我的要求是:将ip分配给可从外部应用程序/浏览器访问的docker容器。 容器ip应该基本上可以从同一网络中的其他计算机ping通。我不想使用端口转发。 我想访问docker容器,就像我们使用ip地址访问VM。没有端口映射,-p标志。如果我在容器中运行任何服务器,例如Apache或Tom