How do Docker add a custom bridge

  • 2020-06-15 10:32:39
  • OfStack

The Docker service process generates a bridge named docker0 when it starts up. The container mounts to this bridge by default, but we can choose which bridge to use by adding the docker startup parameter -ES4en Birdge or changing the docker configuration file.

Operating system: centos7

Delete the docker0 bridge


service docker stop // Shut down docker service  
ip link set dev docker0 down // Shut down docker0 The bridge   
ip link del dev docker0    // delete docker0 The bridge  

Custom bridge Settings (/etc/sysconfig/ network-ES19en/ES20en-br0 file)


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" 

Restart network service


service network restart 

Look at the bridge


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

Next we need to restart docker, which we can do when starting the docker service process in one of two ways:

Type 1: The -ES35en parameter specifies the bridge


[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 

Don't know why starting the docker service process this way blocks the current terminal, so you have to reopen 1 terminal and run 1 container


[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) 

The container successfully used the br0 bridge.

Type 2: Modify the /etc/sysconfig/docker file

I ran into a problem when doing this and modified the /etc/sysconfig/docker file


[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" 

Then use service docker start start docker service, but other_args does not take effect, under the centos7 servicer docker start will still use systemctl start docker. service command to run, so I just open/usr/lib/systemd/system/docker service view


[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 

It was found that ExecStart1 item did not have operation parameters, so I changed ExecStart to /usr/bin/ docker-ES86en-ES89en fd://, ran br0-ES89en docker service, started 1 container and found that br0 bridge could be used successfully.

I found a better way to change docker. service to the following


[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 

At this point, the parameter added in other_args becomes valid.


Related articles: