miller
发布于

docker network 配置网卡

我们使用docker run创建容器时,可以使用--net选项指定容器的网络模式,docker一共有4中网络模式:
1:bridge模式,--net=bridge(默认)。
这是dokcer网络的默认设置。安装完docker,系统会自动添加一个供docker使用的网桥docker0,我们创建一个新的容器时,容器通过DHCP获取一个与docker0同网段的IP地址。并默认连接到docker0网桥,以此实现容器与宿主机的网络互通。如下:

2:host模式,--net=host。 ★ 此时进入container ifconfig 显示的跟主机host一致。 只支持linux
  这个模式下创建出来的容器,将不拥有自己独立的Network Namespace,即没有独立的网络环境。它使用宿主机的ip和端口。

3:container模式,--net=container:NAME_or_ID。

这个模式就是指定一个已有的容器,共享该容器的IP和端口。除了网络方面两个容器共享,其他的如文件系统,进程等还是隔离开的。

4:none模式,--net=none。
这个模式下,dokcer不为容器进行任何网络配置。需要我们自己为容器添加网卡,配置IP。
因此,若想使用pipework配置docker容器的ip地址,必须要在none模式下才可以

https://blog.51cto.com/u_15187242/2948696


docker network ls
docker network rm [name]
docker network inspect bridge 这里可以看到这个bridge模式下有哪些containers

root@VM-24-7-ubuntu:~# docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "7133433be14ec1f4392a6e7773a4fcbbc1de9e0c58ffd436173c97fb801fa7a5",
        "Created": "2022-06-13T12:31:00.568981098+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

测试小镜像 docker run --network qinnet alpine "curl ipinfo.io/ip"

里面不是apt了。是apk add curl

network 子网掩码

docker network create --driver macvlan --subnet 10.0.0.0/24 --gateway 10.0.0.254 -o parent=eth0 macvlan_1
--subnet=[自定义网络广播地址]/[子网掩码位数] [自定义网络名]

sudo docker network create --subnet=172.20.0.0/24 netnode1
--subnet :设置前 24 位为网络位,后 8 位为主机位,该网段可用 IP 地址:172.20.0.1 到 172.20.0.254 。

IP 地址32位: 2^8=256. 255.255.255.255 一共32位

其实关键就在“24”上。我们知道IP地址是四个十进制数组成的,相当于32位二进制。用CIDR表示形式,后一个数字将这32位进行了间隔(以24为例):前24位用"1"表示,后面8位用0表示,得到一个二进制数:
11111111111111111111111100000000。将其转化为十进制,就是:255.255.255.0了。
例如: 192.168.1.0/24表示网段是192.168.1.0,子网掩码是24位,子网掩码为:255.255.255.0,用二进制表示为:11111111111111111111111100000000,这里为什么是24呢,就是因为子网 掩码里面的前面连续的“1”的个数为24个,一定要连续的才行。
再给你举个例子, 192.168.1.0/28表示的意思是网段是192.168.1.0,子网掩码为:255.255.255.240,用二进制表示为:11111111111111111111111111110000。
这时候你也许就疑惑了,就是24和28两个字不一样,为什么网段是一样的呢?
24位说明网络位是24位,那么主机位就是32-24=8位了,则子网的IP个数是254个,即是从00000001到11111110.
28位说明网络位是28位,那么主机位4位,则子网的IP个数是14个,即是从00000001到00001110.


需求看上去是要求docker作为客户端访问外网,而不是外网主动访问docker。给一个简单的通过iptables解决思路:
假定楼主内部docker1的IP地址为IP_a,docker2的IP地址为IP_b,宿主机一块网卡IP地址为IP_A, 另外一块网卡IP地址为IP_B。通过iptables命令增加两条SNAT命令应该就可以实现。

iptables -t nat -A POSTROUTING -s IP_a/32 -j SNAT --to IP_A,建立IP_a和IP_A的转换

iptables -t nat -A POSTROUTING -s IP_b/32 -j SNAT --to IP_B,建立IP_b和IP_B的转换

浏览 (823)
点赞
收藏
评论