---
title: Containerize an application
weight: 20
linkTitle: "Part 1: Containerize an application"
keywords: |
dockerfile example, Containerize an application, run docker file, running
docker file, how to run dockerfile, example dockerfile, how to create a docker container,
create dockerfile, simple dockerfile, creating containers
description: |
Follow this step-by-step guide to learn how to create and run a containerized
application using Docker
aliases:
- /get-started/part2/
- /get-started/02_our_app/
- /guides/workshop/02_our_app/
- /guides/walkthroughs/containerize-your-app/
---
For the rest of this guide, you'll be working with a simple todo
list manager that runs on Node.js. If you're not familiar with Node.js,
don't worry. This guide doesn't require any prior experience with JavaScript.
## Prerequisites
- You have installed the latest version of [Docker Desktop](/get-started/get-docker.md).
- You have installed a [Git client](https://git-scm.com/downloads).
- You have an IDE or a text editor to edit files. Docker recommends using [Visual Studio Code](https://code.visualstudio.com/).
## Get the app
Before you can run the application, you need to get the application source code onto your machine.
1. Clone the [getting-started-app repository](https://github.com/docker/getting-started-app/tree/main) using the following command:
```console
$ git clone https://github.com/docker/getting-started-app.git
```
2. View the contents of the cloned repository. You should see the following files and sub-directories.
```text
├── getting-started-app/
│ ├── .dockerignore
│ ├── package.json
│ ├── README.md
│ ├── spec/
│ ├── src/
│ └── yarn.lock
```
## Build the app's image
To build the image, you'll need to use a Dockerfile. A Dockerfile is simply a text-based file with no file extension that contains a script of instructions. Docker uses this script to build a container image.
1. In the `getting-started-app` directory, the same location as the
`package.json` file, create a file named `Dockerfile` with the following contents:
```dockerfile
# syntax=docker/dockerfile:1
FROM node:lts-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000
```
This Dockerfile starts off with a `node:lts-alpine` base image, a
light-weight Linux image that comes with Node.js and the Yarn package
manager pre-installed. It copies all of the source code into the image,
installs the necessary dependencies, and starts the application.
2. Build the image using the following commands:
In the terminal, make sure you're in the `getting-started-app` directory. Replace `/path/to/getting-started-app` with the path to your `getting-started-app` directory.
```console
$ cd /path/to/getting-started-app
```
Build the image.
```console
$ docker build -t getting-started .
```
The `docker build` command uses the Dockerfile to build a new image. You might have noticed that Docker downloaded a lot of "layers". This is because you instructed the builder that you wanted to start from the `node:lts-alpine` image. But, since you didn't have that on your machine, Docker needed to download the image.
After Docker downloaded the image, the instructions from the Dockerfile copied in your application and used `yarn` to install your application's dependencies. The `CMD` directive specifies the default command to run when starting a container from this image.
Finally, the `-t` flag tags your image. Think of this as a human-readable name for the final image. Since you named the image `getting-started`, you can refer to that image when you run a container.
The `.` at the end of the `docker build` command tells Docker that it should look for the `Dockerfile` in the current directory.
## Start an app container
Now that you have an image, you can run the application in a container using the `docker run` command.