Tested with Vagrant box generic/ubuntu2004 (libvirt, 3.2.16)
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_20.04/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_20.04/Release.key | sudo apt-key add -
sudo apt-get update
sudo apt-get -y install npm podman python3-venvBased on the RHEL 8 guide
mkdir -p ~/.config/systemd/user
cat << EOF > ~/.config/systemd/user/podman.socket
[Unit]
Description=Podman API Socket
[Socket]
ListenStream=%h/podman.sock
SocketMode=0660
[Install]
WantedBy=sockets.target
EOF
cat << EOF > ~/.config/systemd/user/podman.service
[Unit]
Description=Podman API Service
Requires=podman.socket
After=podman.socket
StartLimitIntervalSec=0
[Service]
Type=oneshot
Environment=REGISTRIES_CONFIG_PATH=%h/.config/containers/registries.conf
ExecStart=/usr/bin/podman system service unix://%h/podman.sock
TimeoutStopSec=30
KillMode=process
[Install]
WantedBy=multi-user.target
Also=podman.socket
EOF
mkdir -p ~/.config/containers
cat << EOF > ~/.config/containers/storage.conf
[storage]
driver = "overlay"
[storage.options]
mount_program = "/usr/bin/fuse-overlayfs"
EOFSeveral registries are configured by default in /etc/containers/registries.conf.
You can either copy it and use fully qualified image names, or if you want the default Docker behaviour configure a single registry
ln -s /etc/containers/registries.conf ~/.config/containers/registries.conf
# cat << EOF > ~/.config/containers/registries.conf
# unqualified-search-registries = ["docker.io"]
# EOFStart the Podman service, and set DOCKER_HOST (for Docker client) and CONTAINER_HOST (for Podman client) to point to the user's podman socket
systemctl --user daemon-reload
systemctl --user enable --now podman.socket
export DOCKER_HOST=unix://$HOME/podman.sock
export CONTAINER_HOST=unix://$HOME/podman.sockDocker expects there to be a default bridge network.
podman network create bridgeInstall configurable-http-proxy without root
mkdir "${HOME}/.npm-packages"
npm config set prefix "${HOME}/.npm-packages"
export PATH="$PATH:${HOME}/.npm-packages/bin"
npm install -g configurable-http-proxyInstall JupyterHub into a virtualenv and create a configuration file
python3 -mvenv ~/jh
. ~/jh/bin/activate
pip install jupyterhub dockerspawner
cat << EOF > jupyterhub_config.py
c.JupyterHub.authenticator_class = "dummy"
c.JupyterHub.spawner_class = "docker"
c.JupyterHub.hub_ip = '0.0.0.0'
# Get external IP https://stackoverflow.com/a/166589
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
c.JupyterHub.hub_connect_ip = s.getsockname()[0]
s.close()
c.DockerSpawner.image = 'docker.io/jupyter/base-notebook'
c.DockerSpawner.remove = True
EOFjupyterhub --debug --config=jupyterhub_config.pyConnect to http://<IP>:8000/, login with any username and password
You may get an error the first time the Docker client makes a call to the Podman API. If this happens retry.
Thanks for these hints!