In a directory of your choice, create a new text file named `Dockerfile`. Open the `Dockerfile` in an IDE or text editor and then add the following contents.
```dockerfile
# syntax=docker/dockerfile:1
FROM quay.io/jupyter/base-notebook
RUN pip install --no-cache-dir matplotlib scikit-learn
```
This Dockerfile uses the `quay.io/jupyter/base-notebook` image as the base, and then runs `pip` to install the dependencies. For more details about the instructions in the Dockerfile, see the [Dockerfile reference](/reference/dockerfile/).
Before you proceed, save your changes to the `Dockerfile`.
### Build your environment into an image
After you have a `Dockerfile` to define your environment, you can use `docker
build` to build an image using your `Dockerfile`.
Open a terminal, change directory to the directory where your `Dockerfile` is
located, and then run the following command.
```console
$ docker build -t my-jupyter-image .
```
The command builds a Docker image from your `Dockerfile` and a context. The
`-t` option specifies the name and tag of the image, in this case
`my-jupyter-image`. The `.` indicates that the current directory is the context,
which means that the files in that directory can be used in the image creation
process.
You can verify that the image was built by viewing the `Images` view in Docker Desktop, or by running the `docker image ls` command in a terminal. You should see an image named `my-jupyter-image`.
## Run your image as a container
To run your image as a container, you use the `docker run` command. In the
`docker run` command, you'll specify your own image name.
```console
$ docker run --rm -p 8889:8888 my-jupyter-image start-notebook.py --NotebookApp.token='my-token'
```
To access the container, in a web browser navigate to
[localhost:8889/lab?token=my-token](http://localhost:8889/lab?token=my-token).
You can now use the packages without having to install them in your notebook.
1. In the **Launcher**, under **Notebook**, select **Python 3**.
2. In the notebook, specify the following code.
```python
from sklearn import datasets
iris = datasets.load_iris()
import matplotlib.pyplot as plt
_, ax = plt.subplots()
scatter = ax.scatter(iris.data[:, 0], iris.data[:, 1], c=iris.target)
ax.set(xlabel=iris.feature_names[0], ylabel=iris.feature_names[1])
_ = ax.legend(
scatter.legend_elements()[0], iris.target_names, loc="lower right", title="Classes"
)
```
3. Select the play button to run the code. You should see a scatter plot of the Iris dataset.
In the terminal, press `ctrl`+ `c` to stop the container.
## Use Compose to run your container
Docker Compose is a tool for defining and running multi-container applications.
In this case, the application isn't a multi-container application, but Docker
Compose can make it easier to run by defining all the `docker run` options in a
file.
### Create a Compose file
To use Compose, you need a `compose.yaml` file. In the same directory as your
`Dockerfile`, create a new file named `compose.yaml`.
Open the `compose.yaml` file in an IDE or text editor and add the following
contents.
```yaml
services:
jupyter:
build:
context: .
ports:
- 8889:8888
volumes:
- jupyter-data:/home/jovyan/work
command: start-notebook.py --NotebookApp.token='my-token'
volumes:
jupyter-data:
name: jupyter-data
```
This Compose file specifies all the options you used in the `docker run` command. For more details about the Compose instructions, see the
[Compose file reference](/reference/compose-file/_index.md).
Before you proceed, save your changes to the `compose.yaml` file.
### Run your container using Compose
Open a terminal, change directory to where your `compose.yaml` file is located, and then run the following command.
```console
$ docker compose up --build
```
This command builds your image and runs it as a container using the instructions
specified in the `compose.yaml` file. The `--build` option ensures that your