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模式下才可以
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的转换