At a Glance
Docker In A Nutshell is a quick guide to the most commonly used Docker commands in everyday use.
Using git you can share your source code. Using Docker you can share your infrastructure. For this reason, Docker is a must-have tool for every development team.
Docker is written in the Go (golang) programming language.
Docker looks like but it is not a virtualization solution. It is a containerization solution. Virtualization solutions provide hardware Virtualization. Docker provides Operation System Virtualization.
With a virtualization solution (eg Virtualbox), you use an image to create a virtual machine. With Docker, you use an image to create a container. Consider an image as a tar file, even though it is not exactly. A container is a live instance of an image.
On the contrary to a classic virtualization solution, Docker uses your computer resources (kernel, memory, etc) much smarter to run a container. This is the reason why Docker is extremely fast and lightweight.
Docker can run inside a Virtual machine.
You can easily create and share your images with your team using an online repository. The most used is the official Docker Hub. Docker Hub is for Docker what Github (or Bitbucket to Gitlab) is for git.
You can also Play with Docker even without install it, using an interactive Docker playground.
Docker is the ideal way to create and share development environments. However, in many cases it can be used to deploy production apps.
Examples of use
1. Different software versions
Let’s say you have an old project with Apache and PHP5 and another project with Nginx and PHP7. There are some ways to have multiple PHP versions, but it is not so easy and the most important it may harm your workstation.
With Docker, it’s a “piece of cake” to create a container with Apache and PHP5 and another with Nginx and PHP7. Moreover, it is possible to find ready images for every configuration (usually in Docker Hub)!
2. Software packages isolation
Some applications are difficult to set up or they may add tones of packages in your workstation. pgadmin4 (the famous Python management tool for Postgresql) is an example.
Instead of setup pgAdmin in your workstation, you can use Docker. There are many ready to use images for pgAdmin.
In this way the whole application is isolated from your workstation!
3. Easily mount your workstation
It is very easy to mount a folder with source code on your workstation computer from a running Docker container.
For example, Apache document root
/var/www/html inside the container can be mounted to
/work/my-projects on your workstation. See below “Create container from image”.
So, you can still use your favorite IDE and all your favorite development tools from the comfort of your computer.
Docker Is Awesome! – Why?
- Extremely Fast and Lightweight
- Cross-platform (Linux basically and others)
- It makes your “infrastructure” shareable with your team
- Great community and a lot of resources
- Free and Open Source (even though an Enterprise version exists)
Detailed instructions for every Operation System are available here.
To setup on Debian/Ubuntu:
Add GPG key:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Add Docker repo:
sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"
Install Docker Engine:
sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io
Add your user to docker group
Avoid running Docker as root user (using
sudo). It is strongly recommended to add your user to
docker group to run docker as common user:
sudo usermod -aG docker your-username
Log out and log in again for the changes to take effect.
Finally, install Docker Compose – instructions here.
Where are Docker files stored in my computer?
The Docker Root Dir on Linux is
pontikis@athena:~$ sudo ls -la /var/lib/docker/ total 96 drwx--x--x 14 root root 4096 Οκτ 10 08:21 . drwxr-xr-x 74 root root 4096 Αυγ 26 15:20 .. drwx------ 2 root root 4096 Αυγ 26 15:20 builder drwx--x--x 4 root root 4096 Αυγ 26 15:20 buildkit drwx------ 9 root root 4096 Οκτ 9 22:30 containers drwx------ 3 root root 4096 Αυγ 26 15:20 image drwxr-x--- 3 root root 4096 Αυγ 26 15:20 network drwx------ 308 root root 40960 Οκτ 10 08:21 overlay2 drwx------ 4 root root 4096 Αυγ 26 15:20 plugins drwx------ 2 root root 4096 Οκτ 10 08:21 runtimes drwx------ 2 root root 4096 Αυγ 26 15:20 swarm drwx------ 2 root root 4096 Οκτ 10 08:21 tmp drwx------ 2 root root 4096 Αυγ 26 15:20 trust drwx------ 11 root root 4096 Αυγ 26 21:42 volumes
You can find Docker Root Dir (in any O/S) using
docker info (see below).
Use docker pull to get an image from Docker Hub.
Additionally, you can update an existing image to its latest version with the same command.
For example, to download the latest Debian stable image from the official Debian Docker Hub repository, use
docker pull debian
Read details at https://hub.docker.com/_/debian.
Actually, you will find Docker images in Docker Hub for almost any Operating System, Server application, Database, etc.
Create container from image
docker run to start a container from an existing image
docker run debian
The container will get a random name. To give it the name you want (recommended), use:
docker run debian --name "my-debian"
Start a container and mount Apache document root to a local folder in your workstation:
docker run \ --name "my-debian" \ -it \ --mount type=bind,source=/work/my-projects,target=/var/www/html \ debian
Use container name (recommended) or container ID to start or stop a container.
docker start my-debian
docker stop my-debian
docker exec to get access to the command line of the running container:
docker exec -it my-debian /bin/bash
Now, you have
root access to the running container. It looks like an “SSH connection” (of course it is not).
List running containers
docker ps to get a list of running containers
result (in my case)
pontikis@athena:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
List all containers
docker ps to get a list of all containers (running or not)
docker ps -a
result (in my case)
pontikis@athena:~$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 134e70726d60 portainer/portainer "/portainer" 14 hours ago Exited (2) 13 hours ago portainer 0fc628dc70cc dpage/pgadmin4 "/entrypoint.sh" 14 hours ago Exited (0) 14 hours ago pgadmin4 2f8048acc456 pontikis/ansible "/bin/bash" 3 weeks ago Exited (0) 17 hours ago ansible 4bb7f96275c9 medisign/medisign "/bin/sh -c '/usr/lo…" 6 weeks ago Exited (137) 2 days ago medisign d80004852285 opexsa/opex "/bin/sh -c '/usr/lo…" 6 weeks ago Exited (137) 6 weeks ago opex 3e890168b7cd pontikis/content "/bin/sh -c '/usr/lo…" 6 weeks ago Exited (0) 6 weeks ago content 254a777d9cd9 pontikis/mariadb "/bin/sh -c '/usr/lo…" 6 weeks ago Exited (137) 6 weeks ago mariadb
docker image to get a list of all images in your docker setup
docker image ls
In my case
pontikis@athena:~$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE pontikis/ansible latest 5c760d2ba4e2 3 weeks ago 302MB dpage/pgadmin4 latest d316f8b2a079 3 weeks ago 221MB rclone/rclone latest 58fdc00acdcc 5 weeks ago 45.3MB pontikis/mariadb latest af4cf67988fc 7 weeks ago 2.4GB pontikis/content latest 32496aa97e8b 7 weeks ago 834MB ubuntu focal 4e2eef94cd6b 7 weeks ago 73.9MB dpage/pgadmin4 <none> ae36b8785e03 7 weeks ago 220MB medisign/medisign latest ee0f61de3382 2 months ago 1.86GB opexsa/opex latest 5317398e33a4 2 months ago 1.11GB portainer/portainer latest 62771b0b9b09 2 months ago 79.1MB d2dyno/rclone-gui latest 083f75b8ae9d 6 months ago 41.9MB
docker rm to delete a container
docker rm my-debian
docker rmi to delete an image
docker rmi debian
Save container as an image
The easiest way to save a container as an image after you make changes is to use
docker commit and
For example to save your container
my-container as a new image in your docker setup and apply the tag
docker commit my-container username/my-image:bkp1
docker save username/my-image:bkp1 > my-image.tar
Load an image from backup
docker load to restore an image from backup file
docker load < my-image.tar
You can push an image to Docker Hub (or any other repository). Then your team can pull this image. So, all team members are working with the same infrastructure. This is the meaning of the Docker!
You need an account on Docker Hub. Find pricing plans here. There is also a Free Plan with unlimited public repositories and one private.
docker push and
Full example below:
pontikis@athena:~$docker run -it busybox make a change - eg mkdir TEST_DIR and exit pontikis@athena:~$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d8ffaa393e92 busybox "sh" 2 minutes ago Exited (0) 4 seconds ago elated_haibt 47bd22924237 busybox "/bin/bash" 2 minutes ago Created flamboyant_taussig a2e69289f8ae pontikis/mosaas "/bin/bash" 39 minutes ago Exited (0) 2 minutes ago ecstatic_varahamihira 4402de60a228 portainer/portainer "/portainer" 43 minutes ago Up 43 minutes 0.0.0.0:9000->9000/tcp eloquent_wiles pontikis@athena:~$ docker commit d8ffaa393e92 pontikis/busybox sha256:27934e6fdd24a1cf34c67d76aa71feb01087dbb071464a3d51450e5a0dd98cf8 pontikis@athena:~$ docker login Login with your Docker ID to push and pull images from Docker Hub. If you dont have a Docker ID, head over to https://hub.docker.com to create one. Username: pontikis Password: WARNING! Your password will be stored unencrypted in /home/pontikis/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded pontikis@athena:~$ docker push pontikis/busybox The push refers to repository [docker.io/pontikis/busybox] 2df8244b5b04: Pushed 8a788232037e: Mounted from library/busybox latest: digest: sha256:6c48a209531e8f7089e245f205ecce445742979239954fd373ba095b915262e4 size: 734 pontikis@athena:~$ docker logout Removing login credentials for https://index.docker.io/v1/
Build an image
You can create custom images using
docker build. For example, you can start from a base image (eg Debian) and the install custom software according to your needs (php, Apache, MySQL or whatever).
In future posts I will provide examples.
Where I can find Dockerfiles?
- In Docker hub (for free images) See also.
- In http://dockerfile.github.io/
- and of course: Using Google 🙂
From local file system to running container:
docker cp /store/test.conf my-container:/etc/test.conf
From running container to local file system:
docker cp my-container:/etc/test.conf /store/test.conf
docker info to get information about your docker environment
docker inspect to get information for a specific docker object (eg image, container, network, etc)
docker inspect my-container
Portainer is a great cross-platform web-based Docker front-end, running as a Docker container! Find installation instructions here.
At a glance (on Linux with Docker installed):
docker volume create portainer_data docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
Then access Portainer at http://localhost:9000
Official Docker Desktop for Mac
Official Docker Desktop for Windows
Desktop UI (Linux/Mac/Windows)
A simple terminal UI for both docker and docker-compose, written in Go (Linux/Mac/Windows)
Terminal UI Client for Docker Written in Go (Mac/Linux)
You may also be interested in
- How To Setup The Perfect Linux Workstation With Xubuntu 20.04 LTS Focal Fossa
- How To Store MySQL Result To Array From Bash
- Debian 9 Stretch RC3 Dedicated Web Server Setup Step by Step. Time for PHP7 and MariaDB
- Package Management and System Update in Ubuntu Desktop
- When to Restart Services or Reboot after Update on Debian or Ubuntu
Docker In A Nutshell – Great tutorials
Entrepreneur | Full-stack developer | Founder of MediSign Ltd. I have over 15 years of professional experience designing and developing web applications. I am also very experienced in managing (web) projects.