Running docker command in a Java application executing in a docker container - docker

I am creating a Spring Boot monitoring agent that collects docker metrics. The agent can be attached through POM dependency to any client Spring Boot application that runs inside a docker container.
In the agent, I am trying to programatically run docker stats
But, it fails to execute because the docker container doesn't have docker client installed in it.
So how can I run docker commands in docker container? Please note, I can't make changes to the Dockerfile of client.

You may execute docker commands within the container by defining the docker socket in the container.
run the container and mount the 'docker.sock' in the following manner:
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
so mainly you have to mount docker.sock to order to run docker commands within container.

Related

Why would it be necessary to give a docker container access to the docker socket?

I am reading a docker run command where it maps /var/run/docker.sock
like:
docker run -it --net=host --rm -v /var/run/docker.sock:/var/run/docker.sock theimage /bin/bash
Why would the container would need access to the socket? (this article says it is a very bad idea.)
What would be one case where the container need access to the socket?
It is not necessary until the container needs to invoke itself the docker daemon, for example, in order to create and run an inner container.
For example, in my CI chain Jenkins builds a docker image to run the build and test process. Inside it we need to create an image to test and then submit it to K8S. In such situation Jenkins, when builds the pipeline container, passes to it the docker socket to allow the container to create other containers using the host server docker daemon.

Restart a docker container from another running container

I am using docker-compose for deployment.
I want to restart my "centos-1" container from "centos-2" container. Both containers are running on the same host.
Please suggest, How could I achieve this in a simplest and automated way?
I followed How to run shell script on host from docker container? and tried to run a script on Host from "centos-2" container, but the script is executing inside a container and not on the host.
Script:
#!/bin/bash
sudo docker container restart centos-1
Error:
line 2: docker: command not found
(Docker isn't installed inside any centos-2 container)
You need:
Install docker CLI (command line interface) on second container. Do not confuse with full scale installation - you dont need docker daemon, only command line tool (docker executable)
Share you host's docker daemon (service) to make it accessible in second container. That is achieved with simply sharing /var/run/docker.sock when launching 2nd container, example:
docker run ... -v "/var/run/docker.sock:/var/run/docker.sock" container2 ...
Now you can execute any docker command, like docker stop from second container and these commands are happily passed to your main (and the only) docker daemon.
There is a approach from the CI-context to control the Docker Daemon on System from a running container called Docker-out-of-Docker (DooD):
you have to install docker inside your container
Map you docker installation from your system inside your container using volumes
-v /var/run/docker.sock:/var/run/docker.sock
Now each docker command inside your container are execute on the system docker installation. E.g. if you type docker image list inside your container there should be the same list as if your type the command on your system.

Control docker swarm from within a running container

I have a few micro-services deployed as a stack on docker swarm, with each micro-service running in a separate container.
How do I give commands to the swarm from within one of the services running inside a container on the swarm manager host? e.g running "docker service update" command from within a container to update one of the services in the swarm.
I read somewhere that it can be done by bind mounting the docker socket using:
-v /var/run/docker.sock:/var/run/docker.sock
But this does not work for me. I get docker not found error upon trying to run docker command from within the container.

Can I run a docker container inside of a docker container?

E.g., my local setup is to run a server (listens to :1111) and a docker container (with -p 5555:5555). The purpose is that a server can send the requests to docker container as well (to :5555).
I think that the typical way to deploy servers is to wrap it in a docker image and run the docker image in the cloud. How can I do the same thing but run my custom docker container inside of a server automatically (e.g., add docker run command to a Dockerfile)?

How to run build on a docker container when jenkins is in a docker container

I have a jenkins single instance running in a docker container. The host is AWS 16.04.3 LTS (Xenial Xerus) system. I want the jenkins run my build inside a docker container but since jenkins is already running inside a docker. I don't want a nested docker container running in the build. How can I make jenkins launch a docker container on the host instead of itself container?
I found a solution for that is to mount this directory on jenkins container:
docker run -v /var/run/docker.sock:/var/run/docker.sock

Resources