Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将静态IP分配给Docker容器_Docker - Fatal编程技术网

将静态IP分配给Docker容器

将静态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}}'

我现在尝试在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
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主机上的所有服务创建ip别名
  • 然后我运行每个服务,将端口从这个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
    ...
    

    我在尝试Dockrise Avahi时偶然发现了这个问题,Avahi需要了解其公共IP才能正常运行。由于在Docker中,为容器分配静态IP是很棘手的

    描述如何将静态IP分配给上的容器的技术:

  • Docker服务应使用
    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