当前位置:   article > 正文

Docker指定网桥和指定网桥IP_docker网桥地址

docker网桥地址
$  docker network ls
NETWORK ID          NAME                DRIVER
7fca4eb8c647        bridge              bridge
9f904ee27bf5        none                null
cf03ee007fb4        host                host
  • 1
  • 2
  • 3
  • 4
  • 5

Bridge
默认bridge网络,我们可以使用 docker network inspect命令 查看返回的网络信息,我们使用docker run 命令是将网络自动应用到新的容器

Host
如果是hosts模式,启动容器时不会获得独立的网络namespace,而是和宿主机使用同一个,容器不会有网卡和ip,但是除了网络其他方面还是独立的

Container
如果是container指定的新创建的会和已经存在的容器共享一个网络namespace,不和宿主机有共享网络,也不会有自己的网卡和ip,而是和指定的容器共享,除了网络之外其他都是独立的

None
docker容器有自己的网络namespace,但是和docker容器的网络配置没有关系,这个none的容器是没有网卡,ip,路由等,我们要手动指定

一,指定网桥

I. 1.1创建网桥

[root@linuxea ~]#  docker network create linuxea.com

af4526e387772f33b053ff2ab47e601ddf9618bc2d444770775723d76d3a1010

[root@linuxea ~]#  docker network ls

NETWORK ID          NAME                DRIVER              SCOPE
3ebf99e55db8        bridge              bridge              local          
7eb855581296        host                host                local          
af4526e38777        linuxea.com         bridge              local          
58d75a1a38bc        none                null                local  
        
[root@linuxea ~]# 

查看linuxea.com

[root@linuxea ~]#  docker network inspect linuxea.com
[


    {
        "Name": "linuxea.com",
        "Id": "af4526e387772f33b053ff2ab47e601ddf9618bc2d444770775723d76d3a1010",
        "Scope": "local",
         "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1/16"
                }
            ]
        },
        "Internal": false,
        "Containers": {},
        "Options": {},
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

下载镜像

[root@linuxea ~]#  docker pull nginx

Using default tag: latest
latest: Pulling from library/nginx
6a5a5368e0c2: Pull complete 
4aceccff346f: Pull complete 
c8967f302193: Pull complete 
Digest: sha256:1ebfe348d131e9657872de9881fe736612b2e8e1630e0508c354acb0350a4566
Status: Downloaded newer image for nginx:latest
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

II. 1.2指定网桥

[root@linuxea ~]# docker run  --network=linuxea.com  -itd  --name=mynginx  nginx

b0ec2c7951fa5343d20218811005b16304f9ec5cb3107d06abbf60d5a94df248

[root@linuxea ~]#  docker network inspect linuxea.com
[

    {
        "Name": "linuxea.com",
        "Id": "af4526e387772f33b053ff2ab47e601ddf9618bc2d444770775723d76d3a1010",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1/16"
                }
            ]
        },
        "Internal": false,
        "Containers": {
            "b0ec2c7951fa5343d20218811005b16304f9ec5cb3107d06abbf60d5a94df248": {
                "Name": "mynginx",
                "EndpointID": "adaec00497b42ada6f6b251bff18a26623cfe96890a47df8b5da3c3d75582482",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]
[root@linuxea ~]# linuxea
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

二,指定网桥ip地址

2.1 指定docker0网段内的ip

我们手动指定–net=none,可以发现,容器中并没有网卡

[root@linuxea ~]# docker run  --net=none  --name mynginx -d -p 80:80 nginx

09b9819234338e47a8df7d3eba8daf23bf919b9fa2ea114d60742c3318dc2d69

[root@linuxea ~]#  docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
09b981923433        nginx               "nginx -g 'daemon off"   7 seconds ago       Up 5 seconds                            mynginx

[root@linuxea ~]# /root/in.sh mynginx

root@09b981923433:/#  ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 


    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

root@09b981923433:/# 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

查看docker0地址从172.17.0.0网段

[root@LinuxEA ~]#  ip addr show docker0

4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 


    link/ether 02:42:af:55:9a:54 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:afff:fe55:9a54/64 scope link 
       valid_lft forever preferred_lft forever
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

2.2 获取pid

创建连接文件后创建端到端网卡,将veth_db84e747c3绑定到docker0,并且启动

[root@LinuxEA ~]#   docker inspect -f '{{.State.Pid}}' mynginx
28383
[root@LinuxEA ~]#  mkdir -p /var/run/netns

[root@LinuxEA ~]#   ln -s /proc/28383/ns/net /var/run/netns/28383

[root@LinuxEA ~]#  ip link add veth_db84e747c3 type veth peer name x
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.3安装brctl-tools

yum install bridge-utils

[root@LinuxEA ~]#  brctl addif docker0 veth_db84e747c3

[root@LinuxEA ~]#  ip link set veth_db84e747c3 up

[root@LinuxEA ~]#  ip link set x netns 28383
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

此时mynginx中已经有块网卡

[root@LinuxEA mysql]# /root/in.sh mynginx

root@e224723da286:/#  ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    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
47: x@if48: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 2a:bf:7a:75:58:5f brd ff:ff:ff:ff:ff:ff

root@e224723da286:/# 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

2.4 给新加网卡配置ip

[root@LinuxEA ~]# ip netns exec 28383 ip link set dev x name eth0

[root@LinuxEA ~]# ip netns exec 28383 ip link set eth0 up

[root@LinuxEA ~]# ip netns exec 28383 ip addr add 172.17.0.100/24 dev eth0

[root@LinuxEA ~]# ip netns exec 28383 ip route add default via 172.17.0.1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

回到mynginx查看ip已经固定设置

root@e224723da286:/# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 


    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
47: eth0@if48: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 2a:bf:7a:75:58:5f brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.100/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::28bf:7aff:fe75:585f/64 scope link 
       valid_lft forever preferred_lft forever

root@e224723da286:/# ping -w 3 www.baidu.com

PING www.a.shifen.com (103.235.46.39): 56 data bytes
64 bytes from 103.235.46.39: icmp_seq=0 ttl=46 time=197.858 ms
64 bytes from 103.235.46.39: icmp_seq=1 ttl=46 time=209.700 ms
64 bytes from 103.235.46.39: icmp_seq=2 ttl=46 time=196.508 ms
--- www.a.shifen.com ping statistics ---
4 packets transmitted, 3 packets received, 25% packet loss
round-trip min/avg/max/stddev = 196.508/201.355/209.700/5.926 ms

root@e224723da286:/# 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

2.5 添加ip脚本如下

[root@linuxea ~]# cat /root/ip.sh 

#!/bin/bash
#filename: bind_addr.sh

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}}' $container_name 2> /dev/null`
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

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55

III. 三,指定网桥并且指定网桥内固定IP

3.1 准备工作

停掉docker,并且删除掉docker0,创建新的网桥linuxea0

[root@linuxea ~]# service docker stop
Redirecting to /bin/systemctl stop  docker.service

[root@linuxea ~]# ip link set dev docker0 down

[root@linuxea ~]# brctl delbr docker0

[root@linuxea ~]# brctl addbr linuxea0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

ip段为192.168.100.0/24

[root@linuxea ~]# ip addr add 192.168.100.1/24 dev linuxea0

[root@linuxea ~]# ip link set dev linuxea0 up

[root@linuxea ~]# ip addr show linuxea0

63: linuxea0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN 

    link/ether 1e:28:a7:71:19:46 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.1/24 scope global linuxea0
       valid_lft forever preferred_lft forever

[root@linuxea ~]# 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

3.2 下载pipwork

[root@linuxea docker]# git clone https://github.com/jpetazzo/pipework.git
Cloning into 'pipework'...
remote: Counting objects: 475, done.
remote: Total 475 (delta 0), reused 0 (delta 0), pack-reused 475
Receiving objects: 100% (475/475), 158.46 KiB | 98.00 KiB/s, done.
Resolving deltas: 100% (250/250), done.

[root@linuxea docker]# cp -rp pipework/pipework /usr/local/bin/

[root@linuxea docker]# pipework
Syntax:
pipework <hostinterface> [-i containerinterface] [-l localinterfacename] [-a addressfamily] <guest> <ipaddr>/<subnet>[@default_gateway] [macaddr][@vlan]
pipework <hostinterface> [-i containerinterface] [-l localinterfacename] <guest> dhcp [macaddr][@vlan]
pipework route <guest> <route_command>
pipework --wait [-i containerinterface]

[root@linuxea docker]# 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

查看

[root@linuxea docker]# brctl show

bridge name     bridge id               STP enabled     interfaces
br-24418946eb12         8000.0242668f42e0       no       
linuxea0                8000.000000000000       no       
  • 1
  • 2
  • 3
  • 4
  • 5

写入内容如下:

[root@linuxea docker]# cat /etc/sysconfig/docker | grep 'OPTIONS='
OPTIONS='
OPTIONS=--selinux-enabled -b=linuxea -H fd://

  • 1
  • 2
  • 3
  • 4

删除了docker0后将默认桥指定了linuxea0,则在创建容器时加上net=none

3.3 run一个服务后

[root@linuxea docker]# docker run --rm -ti --net=none nginx /bin/bash

root@b6d29d0accf0:/#
  • 1
  • 2
  • 3

使用pipwork将linuxea0指定ip到run起的服务上

[root@linuxea ~]# docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
b6d29d0accf0        nginx               "/bin/bash"         38 seconds ago      Up 35 seconds                           condescending_minsky

[root@linuxea ~]# pipework linuxea0 -i eth0 b6d29d0accf0 192.168.100.100/24@192.168.100.1


root@b6d29d0accf0:/# ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 

    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
65: eth0@if66: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 72:78:ef:7b:f2:9b brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.100/24 brd 192.168.100.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::7078:efff:fe7b:f29b/64 scope link 
       valid_lft forever preferred_lft forever

root@b6d29d0accf0:/# 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

#默认不指定网卡设备名,则默认添加为 eth1

#另外 pipework 不能添加静态路由,如果有需求则可以在 run 的时候加上 --privileged=true 权限在容器中手动添加,

#但这种安全性有缺陷,可以通过 ip netns 操作

使用 ip netns 添加静态路由,避免创建容器使用 --privileged=true 选项造成一些不必要的安全问题

[root@linuxea ~]# docker inspect --format="{{ .State.Pid }}"  9f28a3f40737
15142
[root@linuxea ~]# ln -s /proc/15142/ns/net /var/run/netns/15142
[root@linuxea ~]# ip netns exec 15142 ip route add 192.168.100.0/24 dev eth0 via 192.168.100.1
[root@linuxea ~]# ip netns exec 15142 ip route
default via 192.168.100.1 dev eth0 

192.168.100.0/24 dev eth0  proto kernel  scope link  src 192.168.100.100 
[root@linuxea ~]# 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

到此为止虽然,IP或者网桥指定了,事实上使用起来并不是很方便,且每次都需要指定nat,本次到此为止

1,在容器中

route add default gw 10.0.0.1
  • 1

2,在docker宿主机上

route add -net 192.168.100.1 gw 10.0.0.1
  • 1

除了默认的 docker0 网桥,用户也可以指定网桥来连接各个容器。在启动 Docker 服务的时候,使用 -b BRIDGE或–bridge=BRIDGE 来指定使用的网桥。

如果服务已经运行,那需要先停止服务,并删除旧的网桥。

$ sudo  service docker stop

$ sudo  ip link set dev docker0 down

$ sudo  brctl delbr docker0
  • 1
  • 2
  • 3
  • 4
  • 5

然后创建一个网桥 bridge0。

要使Linux可以工作在网桥模式,必须安装网桥工具bridge-utils ,运行命令:

yum install bridge-utils
$ sudo  brctl addbr bridge0
$ sudo  ip addr add 192.168.5.1/24 dev bridge0
$ sudo  ip link set dev bridge0 up
  • 1
  • 2
  • 3
  • 4

查看确认网桥创建并启动。

$ ip addr show bridge04: bridge0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state UP group default
    link/ether 66:38:d0:0d:76:18 brd ff:ff:ff:ff:ff:ff
    inet 192.168.5.1/24 scope global bridge0
       valid_lft forever preferred_lft forever
  • 1
  • 2
  • 3
  • 4

配置 Docker 服务,默认桥接到创建的网桥上。

$  echo 'DOCKER_OPTS="-b=bridge0"' >> /etc/default/docker
$ sudo  service docker start
  • 1
  • 2

启动 Docker 服务。新建一个容器,可以看到它已经桥接到了 bridge0 上。

可以继续用 brctl show 命令 查看桥接的信息。另外, 在容器中可以使用 ip addr 和 ip route 命令来查看 IP 地址配置和路由信息。

brctl addbr bridge
brctl addif bridge eth0
brctl addif bridge ath0
ifconfig eth0 0.0.0.0
ifconfig bridge 10.0.0.1 netmask 255.255.255.0 up
  • 1
  • 2
  • 3
  • 4
  • 5

添加iptables -t nat -A POSTROUTING -o eth1-j SNAT --to 192.168.2.173
将有线和无线都设置为10.0.0.*网段,即可通过网上邻居进行访问
当然了,要是Linux可以工作在网桥模式,必须安装网桥工具bridge-utils,运行命令:
yum install bridge-utils
或者下载bridge-utils-1.4.tar.gz进行安装,步骤如下:
编译安装bridge-utils

(1)进入到/usr/src目录下,下载bridge-utils-1.4.tar.gz :
#cd /usr/src
#wget http://launchpad.net/bridgeutils/main/1.4/+download/bridge-utils-1.4.tar.gz

(2)解压缩:
#tar zxvf bridge-utils-1.4.tar.gz
进入bridge-utils-1.4目录:
#cd bridge-utils-1.4

(3)编译安装:
#autoconf
生成configure文件:
#./configure
#make
#make install

编译安装完成。最后将命令brctl复制到/sbin下:

cp /usr/local/sbin/brctl    /sbin 
addbr bridge的名称 #添加bridge;
delbr bridge的名称 #删除bridge;
addif bridge的名称device的名称#添加接口到bridge;
delif bridge的名称device的名称#从bridge中删除接口
setageing bridge的名称时间 #设置老化时间,即生存周期
setbridgeprio bridge的名称 优先级#设置bridge的优先级
setfd bridge的名称时间 #设置bridge转发延迟时间
sethello bridge的名称时间 #设置hello时间
setmaxage bridge的名称时间 #设置消息的最大生命周期
setpathcost bridge的名称 端口 权重#设置路径的权值
setportprio bridge的名称 端口 优先级#设置端口的优先级
show #显示bridge列表
showmacs bridge的名称 #显示MAC地址
showstp bridge的名称 #显示bridge的stp信息
stp bridge的名称{on|off} #开/关stp
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

设置linux让网桥运行 配置网桥

1.我们需要让linux知道网桥,首先告诉它,我们想要一个虚拟的以太网桥接口:(这将在主机bridge上执行,不清楚的看看测试场景)

root@bridge:~> brctl addbr br0

2.其次,我们不需要STP(生成树协议)等。因为我们只有一个路由器,是绝对不可能形成一个环的。我们可以关闭这个功能。(这样也可以减少网络环境的数据包污染):

root@bridge:~> brctl stp br0 off

3.经过这些准备工作后,我们终于可以做一些立竿见影的事了。我们添加两个(或更多)以太网物理接口,意思是:我们将他们附加到刚生成的逻辑(虚拟)网桥接口br0上。

root@bridge:~> brctl addif br0 eth0

root@bridge:~> brctl addif br0 eth1

4.现在,原来我们的两个以太网物理接口变成了网桥上的两个逻辑端口。那两个物理接口过去存在,未来也不会消失。要不信的话,去看看好了。.现在他们成了逻辑网桥设备的一部分了,所以不再需要IP地址。下面我们将这些IP地址释放掉

5.最后,启用网桥

root@bridge:~> ifconfig br0 up

可选: 我们给这个新的桥接口分配一个IP地址

root@bridge:~> ifconfig br0 10.0.3.129

或者把最后这两步合成一步:

root@bridge:~> ifconfig br0 10.0.3.129 up

就是多一个up!

这下我们做完了 。

关闭网桥命令

brctl delif ena eth1;

brctl delif ena eth0;

ifconfig ena down;

brctl delbr ena;

Docker服务进程在启动的时候会生成一个名为docker0的网桥,容器默认都会挂载到该网桥下,但是我们可以通过添加docker启动参数-b Birdge 或更改docker配置文件来选择使用哪个网桥。

删除docker0网桥

service docker stop //关闭docker服务

ip link set dev docker0 down //关闭docker0网桥

ip link del dev docker0 //删除docker0网桥

自定义网桥设置(/etc/sysconfig/network-scripts/ifcfg-br0文件)

DEVICE=“br0”
ONBOOT=“yes”
TYPE=“Bridge”
BOOTPROTO=“static”
IPADDR=“10.10.10.20”
NETMASK=“255.255.255.0”
GATEWAY=“10.10.10.20”
DEFROUTE=“yes”
NM_CONTROLLED=“no”

重启网络服务

service network restart

查看网桥

[black@test opt]$ brctl show
bridge name bridge id STP enabled interfaces
br0 8000.32e7297502be no
virbr0 8000.000000000000 yes

接下来我们需要重新启动docker,可以在启动docker服务进程时使用以下两种方式:

第一种:-b 参数指定网桥

[root@test opt]# docker -d -b br0

INFO[0000] Listening for HTTP on unix (/var/run/docker.sock)
INFO[0000] [graphdriver] using prior storage driver “devicemapper”
WARN[0000] Running modprobe bridge nf_nat failed with message: , error: exit status 1
INFO[0000] Loading containers: start.

INFO[0000] Loading containers: done.
INFO[0000] Daemon has completed initialization
INFO[0000] Docker daemon commit=786b29d execdriver=native-0.2 graphdriver=devicemapper version=1.7.1

不知道为什么这样启动docker 服务进程会阻塞当前终端(︶︿︶),只好重新开一个终端,然后运行一个容器

[root@test shell]# docker run -ti --rm centos:latest
[root@3c6874559411 /]# ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:0A:0A:0A:01
inet addr:10.10.10.1 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::42:aff:fe0a:a01/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:5 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:418 (418.0 b) TX bytes:508 (508.0 b)

容器成功使用br0网桥。

第二种:修改/etc/sysconfig/docker文件

我在进行这种操作的时候遇到了一点问题,我修改了/etc/sysconfig/docker文件

[root@test opt]# vi /etc/sysconfig/docker

#/etc/sysconfig/docker

#Other arguments to pass to the docker daemon process
#These will be parsed by the sysv initscript and appended
#to the arguments list passed to docker -d

other_args="-b br0"

接着使用service docker start启动docker服务,但是other_args并不生效,

在centos7下servicer docker start仍然会采用systemctl start docker.service命令来运行,于是我就打开/usr/lib/systemd/system/docker.service查看

[root@test opt]# vi /lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network.target docker.socket
Requires=docker.socket
[Service]
ExecStart=/usr/bin/docker -d -H fd://
MountFlags=slave
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity

[Install]
WantedBy=multi-user.target

发现ExecStart一项并没有运行参数,于是将ExecStart改为/usr/bin/docker -d -b br0 -H fd://,运行docker服务,启动一个容器发现能够成功使用br0网桥。

在网上看到了一种更好的方法,将docker.service改为如下

[black@test ~]$ vi /usr/lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network.target docker.socket
Requires=docker.socket
[Service]
EnvironmentFile=-/etc/sysconfig/docker
ExecStart=/usr/bin/docker -d $other_args -H fd://
MountFlags=slave
LimitNOFILE=1048576
LimitNPROC=1048576
LimitCORE=infinity

[Install]
WantedBy=multi-user.target

这个时候在other_args中添加的参数就有效了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/990669
推荐阅读
相关标签
  

闽ICP备14008679号