`

Docker中使用固定IP

 
阅读更多
方法一: pipwork工具
1. 安装
下载pipework工具, 然后配置到path路径.
$ git clone https://github.com/jpetazzo/pipework.git
$ sudo cp -rp pipework/pipework /usr/local/bin/
$ sudo yum -y install apring bridge-utils


2. 网络设定
# 删除容器之后删除网络 
ip link set br0 down
brctl delbr br0
# 创建网络
brctl addbr br0;
ip link set dev br0 up;
ip addr add 192.168.2.1/24 dev br0;

docker stop db;
docker start db;
pipework br0 db 192.168.2.103/24;




3. 创建容器和设定IP
docker run -d -e SERVERADMIN="mail@domain.com" -e DEFAULT_LOGS_DIR="/logs/httpd/defaults" --name=apache -v /home/pandy/docker-resources/apache/conf:/etc/httpd/conf -v /home/pandy/docker-resources/apache/html:/var/www/html pandy/apache
pipework br0 apache 192.168.2.100/24;





方法二: Docker中使用固定IP: http://yaxin-cn.github.io/Docker/docker-container-use-static-IP.html
注意:重启电脑之后ip依然改变
创建容器
docker run -i -t --rm --net='none' --name test centos:centos7 /bin/bash
container id =>b3ae71122656
docker inspect -f "{{.State.Pid}}"  b3ae71122656
   //这个容器id对应的pid
输出:8948    , 注意, 记住这个符号

创建一个链接, 打开另一个终端, 输入
sudo mkdir -p /var/run/netns
sudo ln -s /proc/8948/ns/net /var/run/netns/8948


然后创建一对端到端的网卡,将veth_db84e747c3绑定到docker0网桥,并启动。将另一块网卡X放到container内部
sudo ip link add veth_db84e747c3 type veth peer name X
sudo brctl addif docker0 veth_db84e747c3
sudo ip link set veth_db84e747c3 up
sudo ip link set X netns 8948


在docker容器里面查看:ip addr
[root@b3ae71122656 /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
6: X: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether c6:d8:5f:f6:fa:6a brd ff:ff:ff:ff:ff:ff

   
然后对container内部新添加的网卡进行配置(可以通过man ip-netns更详细查看)
sudo ip netns exec 8948 ip link set dev X name eth0   //重新命名容器内部的网卡叫eth0
sudo ip netns exec 8948 ip link set eth0 up
sudo ip netns exec 8948 ip addr add 172.17.111.10/16 dev eth0   //配置网卡
sudo ip netns exec 8948 ip route add default via 172.17.42.1


测试:
ping 172.17.111.10
PING 172.17.111.10 (172.17.111.10) 56(84) bytes of data.
64 bytes from 172.17.111.10: icmp_seq=1 ttl=64 time=0.097 ms
64 bytes from 172.17.111.10: icmp_seq=2 ttl=64 time=0.076 ms


命令组成的文件
#!/usr/bin/env bash 
# filename: bind_addr.sh
# 调用方式:[root@bogon pandy]# ./bind_addr.sh test 192.168.2.11
if [ `id -u` -ne 0 ];
  then echo '必须使用root权限' exit 
fi 

if [ $# != 2 ]; 
  then echo "使用方法: $0 容器名字 IP" exit 1 
fi 

container_name=$1 bind_ip=$2 container_id=`docker inspect -f '{{.Id}}' $container_name 2> /dev/null` 

if [ ! $container_id ];
  then echo "容器不存在" exit 2
fi 

bind_ip=`echo $bind_ip | egrep '^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$'` 

if [ ! $bind_ip ];
  then echo "IP地址格式不正确" exit 3
fi 

container_minid=`echo $container_id | cut -c 1-10`
container_netmask=`ip addr show docker0 | grep "inet\b" | awk '{print $2}' | cut -d / -f2`
container_gw=`ip addr show docker0 | grep "inet\b" | awk '{print $2}' | cut -d / -f1`
bridge_name="veth_$container_minid"
container_ip=$bind_ip/$container_netmask
#pid=`docker inspect -f '{{.State.Pid}}' salt-master 2> /dev/null`
pid=`docker inspect -f '{{.State.Pid}}' $container_name 2> /dev/null`
echo "pid=$pid"
if [ ! $pid ];
  then echo "获取容器$container_name的id失败" exit 4 
fi 

if [ ! -d /var/run/netns ];
  then mkdir -p /var/run/netns 
fi

ln -sf /proc/$pid/ns/net /var/run/netns/$pid 

echo "开始设定IP"
echo "====================================================="
ip link add $bridge_name type veth peer name X 
brctl addif docker0 $bridge_name 
ip link set $bridge_name up 
ip link set X netns $pid 
ip netns exec $pid 
ip link set dev X name eth0 
ip netns exec $pid 
ip link set eth0 up 
ip netns exec $pid 
ip addr add $container_ip dev eth0 
ip netns exec $pid 
ip route add default via $container_gw
echo "====================================================="
分享到:
评论

相关推荐

    Docker如何固定IP设置的方法

    由于工作需要,需要给Docker设置固定IP,在网上的查找了一些资料,自己试着实践一下,留个笔记。 经常用Docker模拟项目在生产环境中的部署,往往需要同时开好几台Docker容器,而且有时安装的软件需要绑定Docker...

    Docker容器固定IP分配详解

    本文主要围绕在CentOS 7环境下的Docker中使用pipework脚本分配固定IP的详细步骤和相关知识进行讨论。 首先,我们需要了解Docker提供了几种网络模式,它们分别是bridge、host、container和none。 1. bridge模式:这...

    docker compose自定义网络实现固定容器ip地址

    主要介绍了docker compose自定义网络实现固定容器ip地址,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Docker 容器指定自定义网段的固定IP/静态IP地址

    主要介绍了Docker 容器指定自定义网段的固定IP/静态IP地址的相关资料,需要的朋友可以参考下

    Docker 配置固定IP及桥接的实现方法

    本文将详细讨论如何在Docker中配置固定IP地址以及如何实现桥接。 Docker 默认采用的是 `bridge` 模式,这种模式下,Docker 会创建一个名为 `docker0` 的虚拟网桥,容器通过这个网桥连接到宿主机。容器内的IP地址是...

    docker 指定IP地址、与主机同网段IP

    安装完docker,系统会自动添加一个供docker使用的网桥docker0,我们创建一个新的容器时,容器通过DHCP获取一个与docker0同网段的IP地址。并默认连接到docker0网桥,以此实现容器与宿主机的网络互通。如下: 2:host...

    Docker不能绑定静态的外网固定ip的问题及解决办法

    前段时间,我一直在研究如何给Docker分配静态ip,主要的用途是让thrift进来和出来都走一个ip,还有就是爬虫可以独立ip地址,这样就很好的实现了爬虫的多ip方式… 但是随着nginx tcp的加入和开发了一个基于Python ...

    VMWARE配置net网络及安装Docker.docx

    首先,如果主机使用无线网络,我们需要固定主机的IP地址,以便后续配置。这通常通过查看无线网的DHCP分配信息,然后手动在IPv4设置中输入相应的IP、子网掩码、默认网关和DNS服务器地址完成。在主机和虚拟机之间进行...

    seata-1.4.2源码(支持指定ip和端口注册到nacos)

    通过修改源码,用户可以设置 Seata Server 使用预定义的 IP 和端口进行注册,从而更好地适应这些特定场景。 要实现这一功能,开发者可能修改了以下几个关键部分: 1. **配置类**:增加对 IP 和端口的读取,这通常...

    docker for windows 容器内网通过独立IP直接访问的方法

    在使用Docker for Windows的过程中,有时我们需要容器内部的服务能够通过独立的IP地址被宿主机或局域网中的其他设备直接访问。默认情况下,Docker容器是通过端口映射与外部世界交互的,但这可能在某些场景下不够灵活...

    Docker容器内部端口映射到外部宿主机端口的方法小结

    ### Docker容器内部端口映射到外部宿主机端口的...无论是固定的端口映射还是随机端口映射,甚至是针对特定IP地址的映射,Docker都能轻松应对。掌握这些端口映射技巧,对于高效地管理和部署Docker容器是非常有帮助的。

    基于docker的分布式爬虫服务Zerg.zip

    如果单机有多个 IP,你可以单机启动多个容器,并在 -P 中分别指定 IP。第四步:调用样例代码进入 examples 目录,运行go run zerg_crawl.go --endpoints http://&lt;你的 etcd host:ip&gt; --url ...

Global site tag (gtag.js) - Google Analytics