Docker
While Anaconda is an environment-level container, Docker (and Singularity below) are OS-level containers.1 Docker is probably the best method of running Jupyter+pyroot without having to worry about issues like package compilation, though you won’t be able to use it to go through The Basics. Its disadvantage is that it requires administrative access to the host computer system (e.g., your laptop), both to install Docker and to run the Docker container.2
The first step is to install Docker. For Mac and Windows systems, use Docker Desktop; there’s a different procedure needed for Linux systems.
Once Docker is installed and running, you’ll be able to download and run a Docker container:
sudo docker run -p 8080:8080 -v $PWD:/work wgseligman/jupyter-pyroot:latest-<proc>
where <proc>
is amd64
for any machine with an Intel or AMD processor,
or arm64
for a system with an ARM processor (such as a Mac with an M1
or M2 chip).
(Windows users will probably need to use %CD%
instead of $PWD
.)
The first time you run this command, it will download a ~2.5GB container. Give it time.
Finally, you’ll see some output. Look at that output carefully, as it will tell you how to access Jupyter via a web browser. For example, assume the output contains something like this:
To access the notebook, open this file in a browser:
file:///root/.local/share/jupyter/runtime/nbserver-1-open.html
Or copy and paste one of these URLs:
http://649d0c4b4dc1:8080/?token=97d7242fc79734f1429bc425c627ccc4f586675c01ecdd9c
or
http://127.0.0.1:8080/?token=97d7242fc79734f1429bc425c627ccc4f586675c01ecdd9c
Remember, your complicated token won’t be 97d7242fc79734f1429bc425c627ccc4f586675c01ecdd9c
. That was just the value returned by Jupyter at the time I created this example.
Start up a web browser and visit (in this example):
http://127.0.0.1:8080/?token=97d7242fc79734f1429bc425c627ccc4f586675c01ecdd9c
You’ll see the standard Jupyter home page.
That will get you started. The next few sub-sections are for refining your use of Docker.
Changing the port
Consider the command:3
sudo docker run -p 8080:8080 -v $PWD:/work wgseligman/jupyter-pyroot:latest-amd64
That first 8080
is the port to use on your local computer. If you
want to use a different port on your computer (for example, you’re
already using port 8080 for something else), change that first 8080
to a different port. Note that if you change the port, you’ll also have
to change the port in the URL in the output; e.g.,
sudo docker run -p 7000:8080 -v $PWD:/work wgseligman/jupyter-pyroot:latest-amd64
means you’ll have to change:
http://127.0.0.1:8080/?token=97d7242fc79734f1429bc425c627ccc4f586675c01ecdd9c
to:
http://127.0.0.1:7000/?token=97d7242fc79734f1429bc425c627ccc4f586675c01ecdd9c
Changing the directory
Again, consider:
sudo docker run -p 8080:8080 -v $PWD:/work wgseligman/jupyter-pyroot:latest-amd64
That $PWD
(%CD%
in Windows) just means “the current directory.”
The execution environment within the container uses /work
for its
files; the -v
option in the command means “map /work
to the
current directory in the terminal.” If you’d like to use a different
directory on your computer as the work directory in the Docker
container, substitute that directory for $PWD
. For example:
sudo docker run -p 8080:8080 -v ~jsmith/root-class:/work wgseligman/jupyter-pyroot:latest-amd64
Changing the container
You can use click on the Terminal icon within Jupyter to get a shell. Within that shell, you can modify anything within the container you want; for example, you can use pip3) to install new Python packages or yum) to install new Linux packages.4
However, any changes you make to the Docker container won’t be automatically saved when you quit the container. When you next start the container, it will start “fresh.” If you want to save your changes, you’ll have to commit.) them.
For example, assume that you’ve made some changes to your copy of the jupyter-pyroot container. Look up the ID of the container as assigned by your local docker process:
sudo docker container ls
CONTAINER ID IMAGE COMMAND [...]
1105371318e8 wgseligman/jupyter-pyroot "jupyter notebook ..." [...]
Your output will be different; I’ve omitted most of the columns, and
you’ll have a different CONTAINER ID
. Commit a revised container
using your own image name:
sudo docker commit 1105371318e8 $USER/jupyter-pyroot
You’ll can see your new image with the docker images command. For example, if $USER is “jsmith”:
sudo docker images
REPOSITORY TAG IMAGE ID [...]
jsmith/jupyter-pyroot latest 97ca601cbf9c [...]
docker.io/wgseligman/jupyter-pyroot latest 16c3bbdc8144 [...]
From that point forward, you’ll probably want to run your new container with your changes:
sudo docker run -p 8080:8080 -v $PWD:/work jsmith/jupyter-pyroot
Docker container notes
I prepared the container wgseligman/jupyter-pyroot
to be similar to the
environment of the notebook server; for example, it runs the same
version of the OS and of ROOT (as of May-2023, that’s AlmaLinx 9 and ROOT
6.28.02).
A little bit web searching will show there are other ROOT containers available. For example:
sudo docker run -p 3000:8080 pedwink/pyroot-notebook
That particular container uses Fedora 28 and ROOT 6.14, and it also
offers Python 2 versions of its notebook kernels
(wgseligman/jupyter-pyroot
only offers Python 3).
So, if you can’t find the feature you want in
wgseligman/jupyter-pyroot
, hunt around a bit. It’s probably out there.

Figure 68: https://xkcd.com/1988/ by Randall Munroe
- 1
In contrast to emulators like VMware, which are machine-level containers.
- 2
Strictly speaking, you can in theory run Docker in “rootless” mode, either on its own or using the docker alternative podman. In practice, when I tried this it led me down a road of complexity that was roughly equivalent to installing ROOT from scratch. If you don’t have administrative access to your computer, I recommend looking at a different solution than docker or podman.
- 3
For the rest of this page, I’m going to assume that you’re on a system with an Intel-compatible processor. If you’re on M1 or M2 Mac, don’t forget to replace
amd64
witharm64
.- 4
If you install something of general interest, let me know. I may add it to the main jupyter-pyroot container.