Bind to docker socket on Windows
DockerDocker Problem Overview
On *nix systems, it is possible to bind-mount the docker socket from the host machine to the VM by doing something like this:
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
Is there an equivalent way to do this when running docker on a windows host?
I tried various combinations like:
docker run -v tcp://127.0.0.1:2376:/var/run/docker.sock ...
docker run -v "tcp://127.0.0.1:2376":/var/run/docker.sock ...
docker run -v localhost:2376:/var/run/docker.sock ...
none of these have worked.
Docker Solutions
Solution 1 - Docker
For Docker for Windows following seems to be working:
-v //var/run/docker.sock:/var/run/docker.sock
Solution 2 - Docker
As the Docker documentation states:
> If you are using Docker Machine on Mac or Windows, your Engine daemon
> has only limited access to your OS X or Windows filesystem. Docker
> Machine tries to auto-share your /Users
(OS X) or C:\Users
(Windows)
> directory. So, you can mount files or directories on OS X using:
docker run -v /Users/<path>:/<container path> ...
> On Windows, mount directories using:
docker run -v /c/Users/<path>:/<container path> ...
> All other paths come from your virtual machine’s filesystem, so if you > want to make some other host folder available for sharing, you need to > do additional work. In the case of VirtualBox you need to make the > host folder available as a shared folder in VirtualBox. Then, you can > mount it using the Docker -v flag.
With all that being said, you can still use the:
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
The first /var/run/docker.sock
refers to the same path in your boot2docker
virtual machine.
For example, when I run my own Jenkins image using the following command in a Windows machine:
$ docker run -dP -v /var/run/docker.sock:/var/run/docker.sock alidehghanig/jenkins
I can still talk to the Docker Daemon in the host machine using the typical docker
commands. For example, when I run docker ps
in the Jenkins container, I can see running containers in the host machine:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
65311731f446 jen... "/bi.." 10... Up 10.. 0.0.0.0:.. jenkins
Solution 3 - Docker
Just to top it off on the answers provided earlier
When using docker-compose, one must set the COMPOSE_CONVERT_WINDOWS_PATHS=1
by either:
-
create a
.env
file at the same location as the project's docker-compose.yml file -
in the CLI
set COMPOSE_CONVERT_WINDOWS_PATHS=1
before running the docker-compose up command.
Solution 4 - Docker
This never worked for me on Windows 10 even if it is a linux container:
-v /var/run/docker.sock:/var/run/docker.sock
But this did:
-v /usr/local/bin/docker:/usr/bin/docker
Solution taken from this issue i opened: https://github.com/docker/for-win/issues/4642
Solution 5 - Docker
Some containers (eg. portainer) work fine with -v /var/run/docker.sock:/var/run/docker.sock
The jenkins container required --user root
permissions on the docker run
command to successfully access the Docker UNIX socket (using Docker-Desktop on Windows).
> By default, a unix domain socket (or IPC socket) is created at
> /var/run/docker.sock
, requiring either root
permission, or docker
> group membership.
Source: https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-socket-option
--group-add docker
had no effect using Docker-Desktop on Windows.
Solution 6 - Docker
To bind to a Windows container you need to use pipes.
-v \\.\pipe\docker_engine:\\.\pipe\docker_engine
Solution 7 - Docker
This is what actually made it work for me
docker run -p 8080:8080 -p 50000:50000 -v D:\docker-data\jenkins:/var/jenkins_home -v /usr/local/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -u root jenkins/jenkins:lts
Solution 8 - Docker
it works well :
docker run -it -v //var/run/docker.sock:/var/run/docker.sock -v /usr/local/bin/docker:/usr/bin/docker ubuntu
Solution 9 - Docker
What it was suitable for me in Windows 10
was:
-v "\\.\pipe\docker_engine:\\.\pipe\docker_engine"
Have in mind that I was trying to access to portainer that I do recommend a lot it's a great app. For that I use this command:
docker run -d -p 9000:9000 -v "\\.\pipe\docker_engine:\\.\pipe\docker_engine" portainer/portainer
And then just go to:
http://localhost:9000/
Solution 10 - Docker
I never made it worked myself, but i know it works on windows container on docker for windows server 2016 using this technique: https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-socket-option
We actually have at the shop vsts-agents on windows containers that uses the host docker like that:
# listen using the default unix socket, and on 2 specific IP addresses on this host.
$ sudo dockerd -H unix:///var/run/docker.sock -H tcp://192.168.59.106 -H tcp://10.10.10.2
# then you can execute remote docker commands (from container to host for example)
$ docker -H tcp://0.0.0.0:2375 ps