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.