1、网络模式

•bridge
–net=bridge
默认网络,Docker启动后创建一个docker0网桥,默认创建的容器也是添加到这个网桥中。

•host
–net=host
容器不会获得一个独立的network namespace,而是与宿主机共用一个。这就意味着容器不会有自己的网卡信息,而是使用宿主机的。容器除了网络,其他都是隔离的。

例子:
[root@linux-node1 ~]# docker pull busybox

[root@linux-node1 ~]# docker container run -itd --net=host --name=test1 busybox
[root@linux-node1 ~]# docker exec -it test1 sh
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    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
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq qlen 1000
    link/ether 00:50:56:b3:58:98 brd ff:ff:ff:ff:ff:ff
    inet 192.168.6.240/24 brd 192.168.6.255 scope global ens192
       valid_lft forever preferred_lft forever
    inet6 fe80::250:56ff:feb3:5898/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue 
    link/ether 02:42:4f:19:b7:3f brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:4fff:fe19:b73f/64 scope link 
       valid_lft forever preferred_lft forever
37: vethd67792f@if36: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue master docker0 
    link/ether ea:84:89:31:0a:da brd ff:ff:ff:ff:ff:ff
    inet6 fe80::e884:89ff:fe31:ada/64 scope link 
       valid_lft forever preferred_lft forever
39: veth844936e@if38: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue master docker0 
    link/ether ca:6a:cd:00:1e:71 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::c86a:cdff:fe00:1e71/64 scope link 
       valid_lft forever preferred_lft forever
41: vethdda9537@if40: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue master docker0 
    link/ether d2:0a:fc:6c:6c:af brd ff:ff:ff:ff:ff:ff
    inet6 fe80::d00a:fcff:fe6c:6caf/64 scope link 
       valid_lft forever preferred_lft forever
43: veth6869f9e@if42: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue master docker0 
    link/ether 4e:b1:9a:7f:3e:bf brd ff:ff:ff:ff:ff:ff
    inet6 fe80::4cb1:9aff:fe7f:3ebf/64 scope link 
       valid_lft forever preferred_lft forever
49: veth81dbb33@if48: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue master docker0 
    link/ether 6a:ed:dc:71:ec:55 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::68ed:dcff:fe71:ec55/64 scope link 
       valid_lft forever preferred_lft forever

•none
–net=none
获取独立的network namespace,但不为容器进行任何网络配置,需要我们手动配置。

例子:
[root@linux-node1 ~]# docker container run -itd --net=none --name=test2 busybox
[root@linux-node1 ~]# docker exec -it test2 sh
/ # ifconfig
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

•container
–net=container:Name/ID
与指定的容器使用同一个network namespace,具有同样的网络配置信息,两个容器除了网络,其他都还是隔离的。

例子:
[root@linux-node1 ~]# docker container run -itd  --name=bs -p 99:80 busybox
[root@linux-node1 ~]# docker exec -it bs sh
/ # netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name 
[root@linux-node1 ~]# docker run -itd --name=web --net container:bs nginx
[root@linux-node1 ~]# docker exec -it bs sh
/ # netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      -

•自定义网络与默认的bridge原理一样,但自定义网络具备内部DNS发现,可以通过容器名或者主机名容器之间网络通信。

例子:
[root@linux-node1 ~]# docker network create bs-network
[root@linux-node1 ~]# docker run -it --name bsa --net bs-network busybox
[root@linux-node1 ~]# docker run -it --name bsb --net bs-network busybox

docker的网络是基于iptables实现的

[root@linux-node1 ~]# iptables -vnL
[root@linux-node1 ~]# iptables-save

2、桥接主机网络与配置固定ip地址

临时生效:
# 网桥名称
br_name=br0
# 添加网桥
brctl addbr $br_name
# 给网桥设置IP
ip addr add 192.168.6.240/24 dev $br_name
# 删除已存在的eth0网卡配置
ip addr del 192.168.6.240/24 dev eth0
# 激活网桥
ip link set $br_name up
# 添加eth0到网桥
brctl addif $br_name eth0
# 添加路由
ip route add default via 192.168.6.254 dev br0

[root@linux-node1 ~]# brctl show
bridge name    bridge id        STP enabled    interfaces
br-224ff6667a50        8000.0242997f1769    no        veth3d5b99a
br0        8000.005056b35898    no        ens192
docker0        8000.02424f19b73f    no        veth9ca9d65

还需要在docker启动时桥接这个网桥:

#vim /usr/lib/systemd/system/docker.service 
ExecStart=/usr/bin/dockerd -b=br0
---------------------------------------------
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
#ExecStart=/usr/bin/dockerd -H unix://
ExecStart=/usr/bin/dockerd -b=br0
------------------------------------------------
#systemctl restart docker
永久生效:
#vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
BRIDGE=br0

#vi /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
TYPE=Bride
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.6.240
NETMASK=255.255.255.0
GATEWAY=192.168.6.254
DNS1=114.114.114.114

pipework工具配置容器固定IP

git clone https://github.com/jeptazzo/pipework.git
cp pipework/pipework /usr/local/bin
docker run -itd --net=none --name test01 centos
pipework br0 test01 192.168.1.88/24@192.168.1.1
文档更新时间: 2019-02-25 13:16   作者:李延召