方式一:Pipework

借助pipework实现,容器重启后 IP 需要重新配置。

Pipework简介

Software-Defined Networking for Linux Containers(SDN). Pipework是一个Docker网络配置工具,由200多行shell实现, 来帮助你自动打通容器之间的网络连接,pipework允许你在一个复杂的环境下把容器连接在一起,pipework使用cgroup和namespace来和LXC容器协同工作,当然也可以和docker来一起工作。

需求

  • Docker 创建容器时,默认模式是 Bridge 模式。但是这个 Bridge 模式仅限于本机的 docker0,而不是像 VMware 虚拟机的 Bridge 模式一样可以得到主机所在 LAN 的 IP 地址。
  • 为了让局域网下的其他主机可以直接访问Docker容器,就像访问一台逻辑上的主机一样,无需经过NAT转换和端口映射,此时就需要Pipework进行配置

注:当你在docker中使用pipework之前,先去docker用户列表中询问一下,docker是否已经有了更加原生方法来实现相同的功能,这样你应该不用pipework,pipework后面应该被淘汰的。如果当前版本的docker真的没有办法使你的docker容器集中在一起,那么只能使用pipework了。

安装pipework

1
2
git clone https://github.com/jpetazzo/pipework.git
sudo cp -rp pipework/pipework /usr/local/bin/

使用 pipework 配置容器 IP

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
    $ docker run --name ip-test -it --net=none centos /bin/bash

    $ export PID=$(docker inspect -f "{.State.Pid}}" ip-test)
    echo ${PID}
    
    $ ln -s /proc/${PID}/ns/net/ /var/run/netns/${PID}
    $ ip netns list
    
    $ brctl addbr bridge-test 
    $ brctl show 
    $ ifconfig bridge-test 192.168.9.200 netmask 255.255.255.0 up
    
    $ ip link add veth[Bridge] type veth peer name veth[Container_id]     
    $ brctl addif bridge-test veth[Bridge]        
    $ ifconfig veth[Bridge] up        
    $ ip link set vethContainer netns ${PID}      
    $ ip netns exec ${PID} ifconfig vethContainer 192.168.9.10 netmask 255.255.255.0      
    $ ip netns exec ${PID} /etc/init.d/networking restart     
    
    $ ifconfig -a

方式二:Docker内嵌支持配置静态 IP

  • 创建自定义网络

    • docker network create -d bridge –subnet=172.18.0.0/16 –gateway=172.18.0.1 docker-br1
    • 注:docker-br1 为自定义网桥的名字
  • 查看所有docker网络

    • docker network ls
  • 为容器设置静态IP

    • docker run –name ip0 -it –net docker-br1 –ip 172.18.0.2 centos /bin/bash
    • 进入容器后,输入ifconfig查看IP
  • 查看容器IP

    • 方式一:docker inspect $(docker ps -q) | grep IPAddress
    • 方式二:docker inspect –format=“{{.Name}}: {{.NetworkSettings.IPAddress}}” $(docker ps -q)

See Also

Thanks to the authors 🙂

Pipework

Docker内置方式

–net=none 自定义网络方式