Last active 6 months ago

deploy_rootlessdocker.sh Raw
1#!/bin/bash
2# wget https://gist.githubusercontent.com/waja/0deb4dd5cd759371270dc3e1f5dabcb5/raw/deploy_rootlessdocker.sh -O /tmp/a && sh /tmp/a
3
4# Check if dockerd is installed
5[ $(which dockerd) ] || wget https://gist.githubusercontent.com/waja/01ba2641f93f461044f9/raw/docker_deploy.sh \
6 -O /tmp/docker_deploy.sh && bash /tmp/docker_deploy.sh
7
8# Stop and disable dockerd (runs as root)
9systemctl stop docker && systemctl disable docker && systemctl disable docker.socket
10
11# Install curl and needed (new) slirp4netns
12apt update && apt install -y curl && \
13 apt -t buster-backports install -y slirp4netns
14
15# Download and install docker rootless
16# Inspired by https://github.com/docker/docker-install/blob/master/rootless-install.sh
17tmp=$(mktemp -d)
18trap "rm -rf $tmp" EXIT INT TERM
19STATIC_RELEASE_ROOTLESS_URL="https://master.dockerproject.org/linux/x86_64/docker-rootless-extras.tgz"
20ROOTLESS_BIN="/usr/local/bin/"
21cd "$tmp"
22curl -L -o rootless.tgz "$STATIC_RELEASE_ROOTLESS_URL"
23tar zxf "$tmp/rootless.tgz" -C "$ROOTLESS_BIN" --strip-components=1
24
25cat <<EOF | sh -x
26apt install -y uidmap
27cat <<EOT > /etc/sysctl.d/50-docker-rootless.conf
28# https://github.com/moby/moby/blob/master/docs/rootless.md#debian-gnulinux
29kernel.unprivileged_userns_clone = 1
30# https://github.com/moby/moby/blob/master/docs/rootless.md#routing-ping-packets
31net.ipv4.ping_group_range = 0 2147483647
32EOT
33sysctl --system
34EOF
35
36global_priv_ports() {
37 cat <<EOF >> /etc/sysctl.d/50-docker-rootless.conf
38# https://github.com/moby/moby/blob/master/docs/rootless.md#exposing-privileged-ports
39net.ipv4.ip_unprivileged_port_start = 0
40EOF
41 sysctl --system
42}
43
44# maybe instead of allowing every user to bind on unprivileged ports via sysctl you may set capabilities just for `rootlesskit`. More restriced (and secure) but needs to be set again when redeploying the binary
45if [ "${1}" = "--global-priv-ports" ]; then
46 global_priv_ports
47else
48 if command -v setcap > /dev/null && setcap cap_net_bind_service=ep "$ROOTLESS_BIN/rootlesskit"; then
49 echo "Exposing privileged ports by setcap worked"
50 else
51 global_priv_ports
52 fi
53fi
54
55# https://github.com/moby/moby/blob/master/docs/rootless.md#debian-gnulinux
56# Make use of overlay2 storage
57cat <<EOF > /etc/modprobe.d/docker-rootless.conf
58options overlay permit_mounts_in_userns=1
59EOF
60#(Re)loading overlay kernel module
61rmmod overlay 2> /dev/null; modprobe overlay permit_mounts_in_userns=1
62
63# Set some environment variables and create needed directory
64cat <<EOF > /etc/profile.d/docker-rootless.sh
65export XDG_RUNTIME_DIR=/tmp/docker-\${UID}
66[ -d \${XDG_RUNTIME_DIR} ] || mkdir \${XDG_RUNTIME_DIR}
67export DOCKER_HOST=unix:///tmp/docker-\${UID}/docker.sock
68export PATH=\$PATH:/sbin
69alias dockerd-rootless='dockerd-rootless.sh --experimental --storage-driver overlay2'
70EOF
71