No questions about containers been one of the latest big things. They are everywhere, everyone use them or want to use them and the truth is they are very useful and they have change the way we develop.
We have docker for example that provides us with docker
and docker-compose
command line tools to be able to run one or multiple containers with just a few lines or a configuration file. But, we, developers, tend to be lazy and we like to automize things. For example, what about when we are running our application in our favorite IDE the application starts the necessary containers for us? It will be nice.
The point of this article was to play a little bit the a docker java client library, the case exposed above is just an example, probably you readers can think about better cases but, for now, this is enough for my learning purposes.
Searching I have found two different docker java client libraries:
- docker-java: By GitHub
- docker-client: By Spotify
I have not analyze them or compare them, I have just found the one by GitHub before and it looks mature and usable enough. For this reason, it is the one I am going to use for the article.
Let’s start.
First, we need to add the dependency to our pom.xml
file:
<dependency>
<groupId>com.github.docker-java</groupId>
<artifactId>docker-java</artifactId>
<version>3.1.1</version>
</dependency>
The main class we are going to use to execute the different instructions is the DockerClient
class. This is the class that establishes the communication between our application and the docker engine/daemon in our machine. The library offers us a very intuitive builder to generate the object:
DockerClient dockerClient = DockerClientBuilder.getInstance().build();
There are some options that we can configure but for a simple example is not necessary. I am just going to say there is a class called DefaultDockerClientConfig
where a lot of different properties can be set. After that, we just need to call the getInstance
method with our configuration object.
Image management
Listing images
List<Image> images = dockerClient.listImagesCmd().exec();
Pulling images
dockerClient.pullImageCmd("postgres")
.withTag("11.2")
.exec(new PullImageResultCallback())
.awaitCompletion(30, TimeUnit.SECONDS);
Container management
Listing containers
// List running containers
dockerClient.listContainersCmd().exec();
// List existing containers
dockerClient.listContainersCmd().withShowAll(true).exec();
Creating containers
CreateContainerResponse container = dockerClient.createContainerCmd("postgres:11.2")
.withName("postgres-11.2-db")
.withExposedPorts(new ExposedPort(5432, InternetProtocol.TCP))
.exec();
Starting containers
dockerClient.startContainerCmd(container.getId()).exec();
Other
There are multiple operations we can do with containers, the above is just a short list of examples but, we can extended with:
- Image management
- Listing images:
listImagesCmd()
- Building images:
buildImageCmd()
- Inspecting images:
inspectImageCmd("id")
- Tagging images:
tagImageCmd("id", "repository", "tag")
- Pushing images:
pushImageCmd("repository")
- Pulling images:
pullImageCmd("repository")
- Removing images:
removeImageCmd("id")
- Search in registry:
searchImagesCmd("text")
- Listing images:
- Container management
- Listing containers:
listContainersCmd()
- Creating containers:
createContainerCmd("repository:tag")
- Starting containers:
startContainerCmd("id")
- Stopping containers:
stopContainerCmd("id")
- Killing containers:
killContainerCmd("id")
- Inspecting containers:
inspectContainerCmd("id")
- Creating a snapshot:
commitCmd("id")
- Listing containers:
- Volume management
- Listing volumes:
listVolumesCmd()
- Inspecting volumes:
inspectVolumeCmd("id")
- Creating volumes:
createVolumeCmd()
- Removing volumes:
removeVolumeCmd("id")
- Listing volumes:
- Network management
- Listing networks:
listNetworksCmd()
- Creating networks:
createNetworkCmd()
- Inspecting networks:
inspectNetworkCmd().withNetworkId("id")
- Removing networks:
removeNetworkCmd("id")
- Listing networks:
And, that is all. There is a project suing some of the operations listed here. It is call country
, it is one of my learning projects, and you can find it here.
Concretely, you can find the code using the docker java client library here, and the code using this library here, specifically in the class PopulationDevelopmentConfig
.
I hope you find it useful.