In the previous article, we introduced the basic use of Docker. Today let me show you how to write our own docker image with Dockerfile.
A Docker image is a blueprint for a Docker container, which contains the application and everything needed to run the software. The container is the runtime instance of the image. In this article, I will explain what a Dockerfile is, how to create a Dockerfile and how to use Dockerfile to build a Docker image.
What is dockerfile?
Dockerfile is essentially just a text file (we can modify it with any text editor), which contains all the instructions that users can run on the command line to create an image. It contains all the instructions Docker needs to build the image.
A Docker image is composed of a series of file system layers, which represent the instructions in the Dockerfile of the image and these instructions constitute an executable software application as we want.
The instructions are like the followings:
# Comment INSTRUCTION arguments
The syntax of Dockerfile is very simple, the commonly used instructions are listed in the following table:
|Instructions||Description of instructions|
|FROM||Specify the base image used to build our new image. This instruction is generally the first non-comment instruction in the Dockerfile.|
|MAINTAINER||Creator of the new image|
|ENV||Set environment variables|
|RUN||The command specified in this instruction will be executed during execution. Each RUN instruction creates a new layer on top of the current image|
|ADD||Used to copy files or directories from the specified source to the container. The source can be a local file or directory, or even a URL|
|COPY||Similar to ADD instruction, but the source can only be a local file or directory|
|WORKDIR||Specify working directory. Similar to cd command in bash|
|EXPOSE||Expose the a port and allow external connections to this port|
|CMD||Used to run a command. Unlike the RUN command executed during the construction phase of the image file, the execution result will be packaged into the image file; the CMD command is executed after the container is started. In addition, a Dockerfile can contain multiple RUN commands, but only one CMD command|
|VOLUME||Mount the host directory to the container|
To exclude files or directories from the image, we can create a file named .dockerignore in the root directory. The syntax of .dockerignore is similar to git’s .gitignore file. For a complete reference and detailed description of Dockerfile instructions, please see the official Dockerfile reference page.
Create a dockerfile
Now let me show you hot to create to build Redis image with dockerfile.
Step 1: Preparation.
Create a clean directory and download Redis source code.
$ cd ~ $ mkdir docker-redis $ cd docker-redis $ wget https://download.redis.io/releases/redis-5.0.10.tar.gz
Step 2: Write Dockerfile
# base image: centos7 FROM centos:centos7 # install dependencies to compile redis source code RUN ["yum" , "install" , "-y" ,"gcc","gcc-c++","net-tools","make"] # set workdir to /usr/local WORKDIR /usr/local # copy a file to workdir ADD redis-5.0.10.tar.gz . # reset workdir to compile redis WORKDIR /usr/local/redis-5.0.10/src # install redis RUN make && make install # reset dir where redis is installed WORKDIR /usr/local/redis-5.0.10 # expose a port EXPOSE 6379 # run redis after container starts CMD ["redis-server"]
Step 3: Build image.
Now we can build image using below command.
docker image build -t redis_demo .
In this command above, the -t parameter is used to specify the name of the image file, and a colon can also be used to specify the label. If not specified, the default label is latest. The last dot represents the path where the Dockerfile file is located. The above example is the current path.
Now run docker image ls to check result.
$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE redis_demo latest f9394bc3aa12 10 minutes ago 516MB
Note: Now, we have built a Redis image of our own. There is no need to do this in production environment. The Redis official has already provided relevant images. This article is only a comprehensive demo of the previous Dockerfile commands and docker commands.
In the next article, I will introduce some best practice of Dockerfile.