# Docker While [Anaconda](https://docs.anaconda.com/anaconda/) is an environment-level container, Docker (and Singularity below) are OS-level containers.[^f106] [Docker](https://www.docker.com/) 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 {ref}`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.[^rootless] [^rootless]: Strictly speaking, you can in theory run Docker in "rootless" mode, either on its own or using the docker alternative [podman](https://podman.io/). 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. The first step is to install Docker. For Mac and Windows systems, use [Docker Desktop](https://www.docker.com/products/docker-desktop); there's a [different procedure](https://ostechnix.com/install-docker-almalinux-centos-rocky-linux/) 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- where `` 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:[^amd64] 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 [^amd64]: 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` with `arm64`. ## 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](https://pip.pypa.io/en/stable/user_guide/)) to install new Python packages or [yum](http://yum.baseurl.org/wiki/YumCommands.html)) to install new Linux packages.[^f107] 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](https://docs.docker.com/engine/reference/commandline/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](https://docs.docker.com/engine/reference/commandline/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-md} containers-fig :class: align-center xkcd containers by Randall Munroe ::: [^f106]: In contrast to emulators like VMware, which are machine-level containers. [^f107]: If you install something of general interest, let me know. I may add it to the main jupyter-pyroot container.