DEV Community

Genne23v
Genne23v

Posted on

How to Write Dockerfile and Basic Docker Commands

Seneca OSD700 team project Starchart will use many Docker containers. I would like to summarize how to write Dockerfile and basic Docker commands.

First we need to write a Dockerfile which is a set of instruction to build a Docker image. A Docker image is a read-only template with instructions for creating a Docker container and the container is a runnable instance of an image. It's probably better to understand with below node project example.

FROM node:16.15.1
LABEL maintainer="Wonkeun No <wonkeun.no@gmail.com>"
ENV PORT=8080
WORKDIR /app
COPY package.json ./
RUN npm install
COPY ./src ./src
CMD npm start
EXPOSE 8080
Enter fullscreen mode Exit fullscreen mode

Dockerfile must begin with FROM to specify what parent image the container uses. In this case, I use node version 16.15.1. So my app will be running on top of node image which someone built for everybody.

LABEL is not a mandatory command, but you can add some metadata information about the image as a key=value pair. You can add more like version, description, etc.

Environment variable can be set with ENV command. It can be overridden with docker command.

WORKDIR sets the working directory. Multiple WORKDIR is also possible. When a relative path is provided, it will be relative to previous WORKDIR.

Then, copy package.json and paste it to ./ directory with COPY instruction. And run npm install with RUN to download npm dependencies in this case.

Finally copy all ./src files and paste into container's ./src directory and run npm start with CMD with port 8080 open outside of container. You can run many RUN instructions, but CMD can be run once as a container launch command. You can still write multiple CMD, but all will be ignored by last CMD.

Once Dockerfile is written, it's highly recommended to ignore some of files that are not necessary in docker build by adding them to .dockerignore. This process helps to reduce the size of image and build faster. You secret information files should not be in the image either.

There is more information about Dockerfile in the official Docker site. Docker reference

Now it's ready to build the image with below command.

docker build -t <image>:latest .
Enter fullscreen mode Exit fullscreen mode

-t can specify a tag for the image. This option can be combined with -i (i.e. shortened form of --interactive) to interact with container in a terminal. It's useful to see what is going on inside the container.

If the build is successful, you can find the image with below command.

docker image ls 
Enter fullscreen mode Exit fullscreen mode

Now it's time to actually run the container.

docker run --rm --name <image> --env-file .env -e LOG_LEVEL=debug -p 8080:8080 <image>:latest -d
Enter fullscreen mode Exit fullscreen mode

Here's explanation for each option.

  • --rm removes the container when it exits automatically
  • --name assign a name to the container
  • --env-file specifies a file that defines environment variables
  • -e sets an environment variable for the container
  • -p binds the host machine's port with container's port (i.e. [HOST_MACHINE_PORT:CONTAINER_PORT]
  • -d runs the container in background and print container ID

Once you run above command, you will see the container's ID. Run below to see the logs from the container. -f option is to continuously print out the logs as it generates.

docker logs -f <container_id>
Enter fullscreen mode Exit fullscreen mode

This article helps to create a Docker image and run a single container. I will write more about best practises of writing Dockerfile , DockerHub, and docker-compose.

Top comments (0)