Skip to content

Instantly share code, notes, and snippets.

@kamermans
Last active April 26, 2024 00:58
Show Gist options
  • Save kamermans/94b1c41086de0204750b to your computer and use it in GitHub Desktop.
Save kamermans/94b1c41086de0204750b to your computer and use it in GitHub Desktop.
Change the IP subnet of Docker's docker0 interface
#!/bin/sh -e
#
# NOTE: Since Docker 1.10 (February 4, 2016), it has been possible to configure the
# Docker daemon using a JSON config file. On Linux, this file is normally located at
# /etc/docker/daemon.json. You should use this JSON config method if you are running
# a version of Docker that is at least 1.10!
# Here is an example configuration that sets the docker0 bridge IP to 192.168.254.1/24:
# {
# "bip": "192.168.254.1/24"
# }
#
# You can run this script directly from github as root like this:
# curl -sS https://gist.githubusercontent.com/kamermans/94b1c41086de0204750b/raw/configure_docker0.sh | sudo bash -s - 192.168.254.1/24
#
# * Make sure you replace "192.168.254.1/24" with the network that you want to use
#
# NOTE: This script is intended for Debian / Ubuntu only!
if [ $# -lt 1 ]; then
echo "Usage: sudo ./configure_docker0.sh <ip/CIDR>"
echo " examples: "
echo " ./configure_docker0.sh 10.200.0.57/16"
echo " ./configure_docker0.sh 172.31.0.21/16"
echo " ./configure_docker0.sh 192.168.254.1/24"
echo " "
echo " NOTE: You should stop Docker before running this script."
echo " When you restart it, Docker will use the new IP."
exit 2
fi
INIT_SYSTEM="sysv"
if ps -o comm -1 | grep -q systemd; then
INIT_SYSTEM="systemd"
fi
NEW_IP="$1"
DOCKER_INIT="/etc/default/docker"
if [ ! -f "$DOCKER_INIT" ]; then
cat << EOF > $DOCKER_INIT
# Docker Upstart and SysVinit configuration file
# Customize location of Docker binary (especially for development testing).
#DOCKER="/usr/local/bin/docker"
# Use DOCKER_OPTS to modify the daemon startup options.
#DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
DOCKER_OPTS="--bip=$NEW_IP"
# If you need Docker to use an HTTP proxy, it can also be specified here.
#export http_proxy="http://127.0.0.1:3128/"
# This is also a handy place to tweak where Docker's temporary files go.
#export TMPDIR="/mnt/bigdrive/docker-tmp"
EOF
echo "Created a new Docker default file at $DOCKER_INIT"
exit 0;
fi
echo "Removing old docker0 network(s)"
NETWORKS=$(ip addr list docker0 | grep "inet " | cut -d" " -f6)
for NET in $NETWORKS; do
echo " $NET"
ip addr del $NET dev docker0
done
echo "Adding new docker0 network"
ip addr add $NEW_IP dev docker0
echo "Removing old iptables rules"
iptables -t nat -F POSTROUTING
iptables -F DOCKER
CURRENT_OPTS=$(cat $DOCKER_INIT | grep "^ *DOCKER_OPTS" | sed 's/^/ /g')
NEW_OPTS=DOCKER_OPTS=\"--bip=$NEW_IP\"
echo " "
if [ "$CURRENT_OPTS" != "" ]; then
TEMP_FILE="/tmp/docker_config.tmp"
grep -v "^ *DOCKER_OPTS" $DOCKER_INIT > $TEMP_FILE
echo " " >> $TEMP_FILE
echo DOCKER_OPTS=\"--bip=$NEW_IP\" >> $TEMP_FILE
cat $TEMP_FILE > $DOCKER_INIT
rm -f $TEMP_FILE
echo "WARNING: The existing DOCKER_OPTS were overwritten in $DOCKER_INIT:"
echo "Old:"
echo "$CURRENT_OPTS"
echo "New:"
echo " $NEW_OPTS"
else
echo " " >> $DOCKER_INIT
echo DOCKER_OPTS=\"--bip=$NEW_IP\" >> $DOCKER_INIT
echo "Success: $DOCKER_INIT has been modified."
fi
SYSTEMD_DOCKER_DIR="/etc/systemd/system/docker.service.d"
if [ "$INIT_SYSTEM" = "systemd" ]; then
echo "Configuring systemd to use /etc/default/docker"
if [ ! -d $SYSTEMD_DOCKER_DIR ]; then
mkdir -p $SYSTEMD_DOCKER_DIR
fi
OPTS='$DOCKER_OPTS'
cat << EOF > $SYSTEMD_DOCKER_DIR/debian-style-config.conf
# Enable /etc/default/docker configuration files with Systemd
[Service]
EnvironmentFile=-/etc/default/docker
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// $OPTS
EOF
fi
echo ""
echo "Restarting Docker"
case $INIT_SYSTEM in
sysv)
service docker restart
;;
systemd)
systemctl daemon-reload
systemctl restart docker.service
sleep 1
systemctl status --lines=0 docker.service
;;
esac
echo "done."
@kamermans
Copy link
Author

Thanks @evan-wu, that is indeed the correct way to configure it in newer versions of Docker - I'm going to add a warning for people still using this script to use the new method:
Create / edit /etc/docker/daemon.json and set bip:

{
  "bip": "172.26.0.1/16"
}

@keyax
Copy link

keyax commented May 30, 2018

The new method with daemon.json dont reset the ip addr list, when restarting systemctl networking. I also tried robooting the system, no chance. With the script ifconfig and ip addr list changed to new ip. Thanks.

@en-medina
Copy link

Thanks for the script.

@sanatthomas
Copy link

Hi, when I try to start up docker, I get the error as below
sudo systemctl start docker
Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xe" for details.

And when I run- systemctl status docker.service, I get-
image
hostname profile.d yum.conf
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor pres>
Drop-In: /etc/systemd/system/docker.service.d
└─override.conf
Active: failed (Result: exit-code) since Mon 2020-11-02 06:41:38 UTC; 1min 3>
Docs: https://docs.docker.com
Process: 6095 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --/containerd.sock --bip 192.168.5.1/24 (code=exited, status=1/FAILURE)
Main PID: 6095 (code=exited, status=1/FAILURE)

docker.service: Service RestartSec=2s expired, scheduling restart.
docker.service: Scheduled restart job, restart counter is at 3.
Stopped Docker Application Container Engine
docker.service: Start request repeated too quickly
docker.service: Failed with result 'exit-code'.
Failed to start Docker Application Container Engine

Fyi- I had recently created an override.conf in (/etc/systemd/system/docker.service.d) to override the subnet settings to ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --/containerd.sock --bip 192.168.5.1/24

Please help me start up docker

@kamermans
Copy link
Author

Hi @sanatthomas,

I'm not sure why Docker isn't starting for you, but it's probably a configuration problem. I would try run it manually like sudo /usr/bin/dockerd to see if you get any more details that way. Anyway, this isn't a very good place to get help with Docker since it's just a random gist from 4 years ago.

You shouldn't need my Gist for a recent installation of Docker, this was mainly for older operating systems when I made this in 2016.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment