I mentioned in my previous post that I’ll explain how to create your own Docker image and customize it however you’d like. While is great to just use an image from Docker Hub, it can be that you need some customized image to fit your needs. As said before, is not hard at all to create the image and worth knowing how to do it.
I’ll use for this tutorial a fresh Ubuntu 18.04 minimal installation. You can follow the same steps (or almost) using different Linux distro, Microsoft Windows or MacOS. The reason why I chose Ubuntu is simply because is the distro that I’m most familiar and enjoy working with.
For all steps below you need to be root or run the commands via sudo. So you’ll see either # at the begining of the command if you’re root or $ sudo if you pick to run it with elevated rights.
# apt install -y docker.io
A word of advice here. Be sure to have docker.io typed. If you miss the .io, the system will install a docker, but that’s a different package:
docker/bionic 1.5-1build1 amd64 System tray for KDE3/GNOME2 docklet applications
You’ll end up with something that cannot be used for what we want to achieve, since the docker command isn’t even there.
You can test if the installation completed successfully by using the following command:
# service docker status
You should see something like this in the output:
Since this is a new installation, you’ll have no images, no containers, nothing.
You can check, just to be sure.
# docker image ls
The result should be:
I’ll add at the end of the post some basic (and most important) Docker commands to get you started.
Pull Ubuntu 18.04 image – Optional step
This step is optional, but I’d advise to do it, just to test that everything is fine with your Docker installation In this case we’re going to use the official Ubuntu 18.04 minimal Docker image. If you want to read more about this image you can check the explanation on Ubuntu 18.04 minimal Docker image and check their repository on Docker Hub – Ubuntu.
# docker pull ubuntu:18.04
If everything goes well you should see a message ending with “Status: Downloaded newer image for ubuntu:18.04” :
Time to run our first container:
# docker run -i -t ubuntu:18.04 /bin/bash
You should be now in container shell:
Now that we tested you can type exit to leave the container.
The Dockerfile is nothing more than a text document which contains all the commands a user could call on the command line to create an image.
A detailed explanation is beyond the scope of this post, but if you’d like to learn more, you can check the Docker Documentation – Dockerfile
Here is a sample that’s good to start with:
# My custom Ubuntu 18.04 with # various network tools installed # Build image with: docker build mycustomlinux01 . FROM ubuntu:18.04 MAINTAINER Calin C., https://github.com/yotis1982 RUN apt-get update --fix-missing RUN apt-get upgrade -y RUN apt-get install -y software-properties-common RUN apt-get install -y build-essential RUN apt-get install -y net-tools mtr curl host RUN apt-get install -y iputils-arping iputils-ping iputils-tracepath RUN apt-get install -y iproute2 RUN apt-get install -y traceroute RUN apt-get install -y tcpdump
A short explanation:
# – This is a comment, add here whatever you think is useful. I’ve picked the name “mycustomlinux01”, but you can add whatever you like.
FROM – is always your first instruction, because it names the base image you’re building your new image from.
MAINTAINER – is the creator of the Dockerfile.
RUN – instruction to run the specified command, in this case apt-get to install various packages
There are multiple instructions for setting environment variables like ADD, COPY, ENV, EXPOSE, LABEL, USER, WORKDIR, VOLUME, STOPSIGNAL, and ONBUILD. You can read all about them in the Docker Documentation – Dockerfile
Using RUN you can add whatever package you need in your custom image. The same like you would do on a regular Ubuntu installation.
Yes, all the packages above could have been added in one RUN line, but for the sake of better visibility I would suggest to have separate lines.
Create your custom Docker image
After you save the Dockerfile is time to create your image
# docker build -t mycustomlinux01 .
You’ll see a lot of output, the same like when you’re installing new packages in any Linux distro. When you see the following lines, you’ll know that the image was successful created:
Let’s check if the image is listed using:
# docker image ls
You should see the mycustomlinux01 image listed:
Since the image is created successful I’d suggest that you run a container using this image following the same steps like in the “Pull Ubuntu 18.04 image”
Basically that’s it, you just created your custom image.
As mentioned above, here is a list of commands that I find useful to have at hand when working with Docker containers.
# docker image ls
Start a container from an image:
# docker run -i -t ubuntu:12.04 /bin/bash
Using an ID (you get the ID from List image command):
# docker run -i -t 8dbd9e392a96 /bin/bash
List all containers:
# docker ps -a
List running containers:
# docker ps -l
Attach running container:
# docker attach “container ID”
Remove a container:
# docker rm “container ID”
Last but not least. If you liked my Ubuntu 18.04 Docker image customized for network engineers who wants to learn Python and you would like to install additional packages, here is the Dockerfile:
# Ubuntu 18.04 with Python, Paramiko, Netmiko, Ansible # various other network tools installed and SSH activated # Build image with: docker build -t yotis/ubuntu1804-pfne . FROM ubuntu:18.04 MAINTAINER Calin C., https://github.com/yotis1982 RUN apt-get update --fix-missing RUN apt-get upgrade -y RUN apt-get install -y software-properties-common RUN apt-get install -y build-essential RUN apt-get install -y openssl libssl-dev libffi-dev RUN apt-get install -y net-tools mtr curl host socat RUN apt-get install -y iputils-arping iputils-ping iputils-tracepath RUN apt-get install -y iproute2 RUN apt-get install -y iptraf-ng traceroute RUN apt-get install -y tcpdump nmap RUN apt-get install -y iperf iperf3 RUN apt-get install -y python python-pip python-dev RUN apt-get install -y python3 python3-pip python3-dev RUN apt-get install -y openssh-client telnet RUN apt-get install -y nano RUN apt-get install -y netcat RUN apt-get install -y socat RUN pip install --upgrade pip RUN pip install cryptography RUN pip install paramiko RUN pip install netmiko RUN pip install pyntc RUN pip install napalm RUN apt-add-repository ppa:ansible/ansible RUN apt-get update RUN apt-get install -y ansible RUN apt-get clean VOLUME [ "/root" ] WORKDIR [ "/root" ] CMD [ "sh", "-c", "cd; exec bash -i" ]
Obviously there is more about Docker than is covered on this post. It wasn’t in my scope to make a detailed analyze of Docker, rather a cheatsheet on how to create your custom image. If you want to learn more there are plenty resources out there and a good starting point is the Docker website.
I hope you find this how-to useful. As always, if you need to add something or you have questions about, please use the Comments form to get in contact with me.