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)
Setup
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
/var/lib/docker
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).
Pull image
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
Use 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
Start/Stop container
Use container name (recommended) or container ID to start or stop a container.
Use docker start
docker start my-debian
Use docker stop
docker stop my-debian
Connect container
Use 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
Use docker ps
to get a list of running containers
docker ps
result (in my case)
pontikis@athena:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
List all containers
Use 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
List images
Use 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
Delete container
Use docker rm
to delete a container
docker rm my-debian
Delete image
Use 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 docker save
.
For example to save your container my-container
as a new image in your docker setup and apply the tag bkp1
, use
docker commit my-container username/my-image:bkp1
and
docker save username/my-image:bkp1 > my-image.tar
Load an image from backup
Use docker load
to restore an image from backup file
docker load < my-image.tar
Push image
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.
Use docker login
, docker push
and docker logout
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).
docker build
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 🙂
Transfer files
Use docker cp
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
Use docker info
to get information about your docker environment
docker info
Docker inspect
Use docker inspect
to get information for a specific docker object (eg image, container, network, etc)
docker inspect my-container
Docker GUI
Portainer
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
See https://docs.docker.com/docker-for-mac/
Official Docker Desktop for Windows
See https://docs.docker.com/docker-for-windows/
DockStation
Desktop UI (Linux/Mac/Windows)
LazyDocker
A simple terminal UI for both docker and docker-compose, written in Go (Linux/Mac/Windows)
See https://github.com/jesseduffield/lazydocker
docui
Terminal UI Client for Docker Written in Go (Mac/Linux)
See https://github.com/skanehira/docui
Related posts
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.