Bind to docker socket on Windows

Docker

Docker 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:

  1. create a .env file at the same location as the project's docker-compose.yml file

  2. in the CLI set COMPOSE_CONVERT_WINDOWS_PATHS=1

before running the docker-compose up command.

source

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTheolodusView Question on Stackoverflow
Solution 1 - DockerAlexander ChicheninView Answer on Stackoverflow
Solution 2 - DockerAli DehghaniView Answer on Stackoverflow
Solution 3 - DockerSean WView Answer on Stackoverflow
Solution 4 - DockerGabrielBBView Answer on Stackoverflow
Solution 5 - DockernaamanView Answer on Stackoverflow
Solution 6 - DockerJosh CloseView Answer on Stackoverflow
Solution 7 - DockerStefanView Answer on Stackoverflow
Solution 8 - Dockerzizhen zhanView Answer on Stackoverflow
Solution 9 - Dockerpaulofer85View Answer on Stackoverflow
Solution 10 - DockerjackstrappView Answer on Stackoverflow