Each Dockerfile is a script, composed of various commands (instructions) and arguments listed successively to automatically perform actions on a base image in order to create (or form) a new one. They are used for organizing things and greatly help with deployments by simplifying the process start-to-finish.
Dockerfiles begin with defining an image FROM which the build process starts. Followed by various other methods, commands and arguments (or conditions), in return, provide a new image which is to be used for creating docker containers.
They can be used by providing a Dockerfile’s content – in various ways – to the docker daemon to build an image. To Know More About Dockerfile Click Here
Dockerfile Syntax Example
Dockerfile syntax consists of two kind of main line blocks: comments and commands + arguments.
# Line blocks used for commenting
command argument argument ..
A Simple Example:
# Print "Hello docker!" RUN echo "Hello docker!"
Dockerfile Commands (Instructions)
Currently there are about a dozen different set of commands which Dockerfiles can contain to have docker build an image. In this section, we will go over all of them, individually, before working on a Dockerfile example.
The ADD command gets two arguments: a source and a destination. It basically copies the files from the source on the host into the container’s own filesystem at the set destination.
# Usage: ADD [source directory or URL] [destination directory] ADD /usr /var/www
The command CMD, similarly to RUN, can be used for executing a specific command. However, unlike RUN it is not executed during build, but when a container is instantiated using the image being built. Therefore, it should be considered as an initial, default command that gets executed (i.e. run) with the creation of containers based on the image.
To clarify: an example for CMD would be running an application upon creation of a container which is already installed using RUN (e.g. RUN apt-get install …) inside the image. This default application execution command that is set with CMD becomes the default and replaces any command which is passed during the creation.
# Usage 1: CMD application "argument", "argument", .. CMD "echo" "I am FoxuTech!!"
ENTRYPOINT argument sets the concrete default application that is used every time a container is created using the image. For example, if you have installed a specific application inside an image and you will use this image to only run that application, you can state it with ENTRYPOINT and whenever a container is created from that image, your application will be the target.
If you couple ENTRYPOINT with CMD, you can remove “application” from CMD and just leave “arguments” which will be passed to the ENTRYPOINT.
# Usage: ENTRYPOINT application "argument", "argument", .. # Remember: arguments are optional. They can be provided by CMD # or during the creation of a container. ENTRYPOINT /
The ENV command is used to set the environment variables (one or more). These variables consist of “key = value” pairs which can be accessed within the container by scripts and applications alike. This functionality of docker offers an enormous amount of flexibility for running programs.
# Usage: ENV key value ENV NGINX_VERSION 1.13.2
The EXPOSE command is used to associate a specified port to enable networking between the running process inside the container and the outside world (i.e. the host).
# Usage: EXPOSE [port] EXPOSE 80
FROM directive is probably the most crucial amongst all others for Dockerfiles. It defines the base image to use to start the build process. It can be any image, including the ones you have created previously. If a FROM image is not found on the host, docker will try to find it (and download) from the docker image index. It needs to be the first command declared inside a Dockerfile.
# Usage: FROM [image name] FROM ubuntu
One of the commands that can be set anywhere in the file – although it would be better if it was declared on top – is MAINTAINER. This non-executing command declares the author, hence setting the author field of the images. It should come nonetheless after FROM.
# Usage: MAINTAINER [name] MAINTAINER FoxuTech
The RUN command is the central executing directive for Dockerfiles. It takes a command as its argument and runs it to form the image. Unlike CMD, it actually is used to build the image (forming another layer on top of the previous one which is committed).
# Usage: RUN [command] RUN yum install -y nginx
The USER directive is used to set the UID (or username) which is to run the container based on the image being built.
# Usage: USER [UID] USER 1008
The VOLUME command is used to enable access from your container to a directory on the host machine (i.e. mounting it).
# Usage: VOLUME ["/dir_1", "/dir_2" ..] VOLUME ["/var/www/html"]
The WORKDIR directive is used to set where the command defined with CMD is to be executed.
# Usage: WORKDIR /path WORKDIR ~/var
How to Use Dockerfiles
Using the Dockerfiles is as simple as having the docker daemon run one. The output after executing the script will be the ID of the new docker image.
# docker build -t nginx .
After you have appended everything to the file, it is time to save and exit. Press CTRL+X and then Y to confirm and save the Dockerfile.
Read More: Explore More About Docker
This is how the final file should look like:
# Pull base image. FROM ubuntu # Install Nginx. RUN \ add-apt-repository -y ppa:nginx/stable && \ apt-get update && \ apt-get install -y nginx && \ rm -rf /var/lib/apt/lists/* && \ echo "\ndaemon off;" >> /etc/nginx/nginx.conf && \ chown -R www-data:www-data /var/lib/nginx # Define mountable directories. VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"] # Define working directory. WORKDIR /etc/nginx # Define default command. CMD ["nginx"] # Expose ports. EXPOSE 80 EXPOSE 443
Building Our First Image
Using the explanations from before, we are ready to create our first Nginx image with docker!
# docker build -t nginx .
Note: The -t [name] flag here is used to tag the image. To learn more about what else you can do during build, run docker build –help.
Running A Nginx Instance
Using the image, we have build, we can now proceed to the final step: creating a container running a Nginx instance inside, using a name of our choice (if desired with -name [name]).
# docker run -name webserver -it nginx