Skip to main content

Dockerfile

Official Dockerfile Documentation

Below, we define a Dockerfile within some exclusive directory on our system where we want to work on our docker image. Create this file with any text editor, where the following commands are possible in a CMD input format.

FROM defines the base image to build off of from a repository on dockerhub
LABEL
RUN defines a command to run in sequence as the Dockerfile is built.
SHELL Restarts into a given shell, seen below where we pass --login and -c parameters to bash
EXPOSE defines a port to expose on the container to the host

# https://hub.docker.com/_/nginx as our base image to build off of
FROM nginx:latest
LABEL maintainer='shaunrd0@gmail.com'
# Install additional packages we need
RUN apt-get update && apt-get -y upgrade && apt install -y curl vim
# Grab NVM and restart shell to load commands into bash
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
SHELL ["/bin/bash", "--login", "-c"]
# Install NVM stable version
RUN nvm install stable
RUN npm install -g hexo-cli
EXPOSE 8080

In the above context, SHELL restarts our shell to load the nvm commands into bash so we can in the next step nvm install stable. Otherwise, this command would fail saying that nvm did not exist.

Building Docker Images

To build a dockerfile into an image, run the following command, where -t is tagging the built image with a tag in the preferred format of dockerhub-username/dockerhub-reponame:version

docker build -t shaunrd0/nginx-hexo:0.1 .

Running Built Images

We can run docker images and see the following output displaying all the built docker images on our machine

REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
shaunrd0/nginx-hexo          0.1                 86513686e505        32 minutes ago      331MB

Now to start our newly built image, we run the following command

docker container run -d --name nginx-hexo \
shaunrd0/nginx-hexo:0.1

To check that our image is running, run docker container ls to see output similar to the below

CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS               NAMES
7a74d968f0d2        shaunrd0/nginx-hexo:0.1   "nginx -g 'daemon of…"   30 minutes ago      Up 30 minutes       80/tcp, 8080/tcp    nginx-hexo

Pushing Images to DockerHub

To login to docker, we need to run docker login and follow the prompts, supplying our username and password. On some systems, you could see the below error -

error getting credentials - err: exit status 1, out: `GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.secrets was not provided by any .service files`

To fix this, we run the following

sudo apt install gnupg2 pass

After logging into docker on your machine, since we already properly tagged our image when we built it with docker build -t <TAG> . above, we can simply docker push <TAG>. Below, we look up our image's local ID and retag it to ensure this matches our DockerHub username and preferred image name / tag. Then, we push the image to DockerHub, publicly. If you want this image to be private, which it should be if unstable, you can do so by logging into dockerhub and modifying the repository settings after making the first push.

Get the image ID -

docker images
shaunrd0/nginx-hexo          0.1                 86513686e505        32 minutes ago      331MB

Assign the image ID a new tag (This is the same as the old in this case) -

docker tag 86513686e505 shaund0/nginx-hexo:0.1

Push the docker image to DockerHub -

docker push shaunrd0/nginx-hexo:0.1

Saving Images Locally

docker save shaunrd0/nginx-hexo:0.1 > nginx-hexo.tar