Change the IP subnet of Docker's docker0 interface
#!/bin/sh -e
#
# You can run this script directly from github as root like this:
# curl -sS https://gist.githubusercontent.com/epcim/7add443e68f0e820433f3581f5e9bb4f/raw/configure_docker0.sh | sudo bash -s - 10.18.0.0/16
#
# * Make sure you replace "192.168.254.0/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/docker daemon -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."