Understanding containers (part 01): Run, Docker run!
Even if you haven’t worked with containers yet you might have heard that “containers are like light-weight virtual machines“.
And that’s the way we are going to use them at the beginning too. Along the way we will clarify differences between traditional VMs and containers.
Graphical UI – forget for now
If you used VM hypervisors on your computer, then I should assume you used an application with graphical UI — like VMware Player — to manage, configure, start or stop your virtual machines.
At the time of writing this post, the Docker Desktop is at the version 2.1 and comes with such a UI application as well. It is called Kitematic and its Alpha version is part of Docker Desktop installation.
In its current alpha version it is pretty much useless for what we want to do here, so let’s forget about it in the context of the current blog. Through the rest of the series we will focus mostly on command line tools.
If you are using Kitematic and would like to share your experience or tips&tricks with it, please share a link to your content in comments.
Our first toy: OrientDB
For our initial experiments with Docker we will play with the community edition of OrientDB.
Never heard about OrientDB so far? Well, it is about time! OrientDB is “the DBMS supporting Graph, Document, Reactive, Full-Text, Geospatial and Key-Value models in one Multi-Model database“. And its community edition is an open source. It is one of Top 3 databases to process graph data accordingly to https://db-engines.com/en/ranking/graph+dbms.
Run, Docker run!
Without further ado, let’s run our first container!
I assume you have access to Docker and it has access to the Internet (as described in the previous post). So, let’s run OrientDB database.
docker container run orientdb
If you have never ran it before, then you should see the output similar to this.
Yay, out of nowhere our first container is running! Or for all the purists among us: “Yay, our first container is up and the command to start OrientDB server is running!” There is a difference between these two statements, but we will get into details later.
And this first container did not came from nowhere. It was downloaded from the
orientdb repository hosted by public registry called Docker Hub: https://hub.docker.com/_/orientdb.
Let’s celebrate!! …or not?
Even though we have a database running in our very first container, there is no easy way to access it right now:
- Even though it exposed two services on ports
2480they are not visible outside of the container.
- We do not know the password for the database’s
rootuser, as it was auto-generated inside the container.
Let’s run it properly this time
Have a look at this command (without running it yet):
docker container run --detach --publish 0.0.0.0:2480:2480 --publish 0.0.0.0:2424:2424 --env ORIENTDB_ROOT_PASSWORD=root docker.io/library/orientdb:latest
Say whaaat?!! ?
Ok, do not get scared and discouraged at this moment. We agreed on avoiding graphical UI, so everything needs to go into the command line.
Let’s have a look what it means:
- We run the
dockerCLI tool — that’s obvious.
- We tell it to execute a command related to
containerDocker object (there are several kinds of objects you deal with using Docker, but we will get to that later)…
- …and the command is
run, which creates a new container from the Docker image
- This is the image from
orientdbrepository which has the tag
latestand stored in the public https://hub.docker.com registry, as can be identified by
- Everything in between the command and the image name are options specific for the docker command being executed. You can see the list of possible options and their meaning by attaching
--helpat the end, i.e.
docker container run --help.
- Similarly you can call for help for the tool using
docker --helpand for the list of commands related to container object using
docker container --help.
- What are the options we are going to use?
--detachsays that the container should start in the background;
--publish 0.0.0.0:2480:2480says that the port 2480 used by the application inside the container should be exposed to the host computer and mapped to the port 2480 accessible via any client IP because of
--envis the way to pass the environment variable to the container, like the database
rootuser password required during the first setup of the OrientDB database server
I hope it all makes sense so far.
Laziness is the Mother of Progress
But it is way too much typing, so luckily for lazy guys like me Docker comes with some help.
- Most common management commands have shorter forms, like
docker runis equivalent to
docker container run.
- Similarly the most common options have their short forms too, like
--env. You can check this by running
docker run --helpas mentioned before.
docker.io/library/is the default registry and the
latestis the default tag, so
orientdbis the same as
- And if you do not specify an IP in the
0.0.0.0is assumed by default.
Uff… So, finally we got to the command that we can and should run now!
Ctrl+C to stop the previously running container (started with
docker container run orientdb command).
Secondly, from the command line run the following complete and neat command:
docker run -d -p 2480:2480 -p 2424:2424 -e ORIENTDB_ROOT_PASSWORD=root orientdb
Once executed all you see in return is just some long hexadecimal string, like
897c8bd896e2cb3ec664a895cca86a3bf16ea42640a67b6ee1ae5193b46683f5 in my case. We will call it a container’s technical id for the moment.
You can now use this container ID in the commands, like to check the log of the container with
docker logs 897c8bd896e2cb3ec664a895cca86a3bf16ea42640a67b6ee1ae5193b46683f5, which is the short form of the
docker container logs command as you can guess by now.
Technical ID? I am a human!
I am a human. And I am lazy, And Docker came with some handy features for that.
Tip 1: Shortening a technical id
It is enough to use only as many first characters of the technical ids as they make unique combination among all technical ids used in your environment.
So, in my example instead of typing
docker logs 897c8bd896e2cb3ec664a895cca86a3bf16ea42640a67b6ee1ae5193b46683f5 I can just type three first characters to get the same:
docker logs 897
Tip 2: Human readable names
You can call your running container by some human readable name, so let’s call it
myorientdb01 for now, by using the shorter version of
docker container rename ... command:
docker rename 89 myorientdb01
Yes, it was enough to use even first two characters in the command above to uniquely identify my running container. Obviously you need to use digits from your running containers 😉
Now you should be able to check logs simply typing the following.
docker logs myorientdb01
Tip 3: Automatically generated container names
Let’s have a look at containers we have created so far with the following command, which is (less obviously this time) is the short version of
docker container list --all. By default this
ps command displays only running containers, so we added the option
-a to display containers in all states.
docker ps -a
In the last column you can see, that even the first container, which we ran, got its human readable name
sad_tu. It was automatically generated by Docker from the random combination of some adjective with some noun.
We can use this name (
sad_tu in my case, but some different on your machine) to delete that container as we do not need it anymore. The following command is the short version of
docker container rm --force to remove (delete) existing container.
docker rm -f sad_tu
We use the
--force option, because the previous container may still be running — depending if you are using Docker Desktop or Docker Toolbox and the way you exited it.
Tip 4: Name a container at
You do not need to leave it to Docker to autogenerate the name of the container you run for the very first time. We could have included
--name myorientdb01 option already into the run command, like
docker run --name myorientdb01 -d -p 2480:2480 -p 2424:2424 -e ORIENTDB_ROOT_PASSWORD=root orientdb to name your new container the way you want.
I’ve got it running in the container. Now what?
Now let’s try to connect to the Studio or that OrientDB database from
You might have noticed that line from the log, when you executed
docker logs myorientdb01:
INFO OrientDB Studio available at http://172.17.0.2:2480/studio/index.html
172.17.0.2 is the address seen only inside the container. But the port
2480 was published and mapped to the same port of the Docker host, when we run it. So, now depending on the Docker you are using the host address will be:
localhost, if you are running Docker Desktop, or
- the result of the
docker-machine ipcommand, if you using Docker Toolbox.
Here is the screenshot from my Macbook with Docker Desktop on it and OrientDB running. I opened the URL
Got so far? Congrats!
If you got so far, then hopefully you learned some of the Docker basics to run the new container and to understand some of the main concepts.
And since you have OrientDB running on your machine, then it is time to have some fun with it. Just go to:
- http://orientdb.com/docs/3.0.x/gettingstarted/tutorials/ to start with basics, or
- import from the cloud some of the sample databases using the user
rootand the password defined with
ORIENTDB_ROOT_PASSWORDenvironment variable earlier
There is a free Udemy course available as well: https://www.udemy.com/course/orientdb-getting-started/
Before you go
Once you are done playing with OrientDB and Docker for today, just remember to stop the container.
docker stop myorientdb01
Next time you want to continue playing with your instance of OrientDB just start it again…
docker start myorientdb01
…and check in logs when it is fully started.
We will keep digging into Docker and containers in next posts. I will tag these posts UnderstandContainers for easy search.
-Vitaliy (aka @Sygyzmundovych)