绑定到 Windows 上的 docker 套接字

在 * nix 系统上,可以通过以下方法将 docker 套接字从主机绑定到 VM:

docker run -v /var/run/docker.sock:/var/run/docker.sock ...

在 Windows 主机上运行 docker 时,是否有相同的方法来做到这一点?


我尝试了各种组合,比如:

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 ...

这些都没用。

64989 次浏览

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

For Docker for Windows following seems to be working:

-v //var/run/docker.sock:/var/run/docker.sock

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

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

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.

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

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

it works well :

docker run -it -v //var/run/docker.sock:/var/run/docker.sock -v /usr/local/bin/docker:/usr/bin/docker ubuntu

To bind to a Windows container you need to use pipes.

-v \\.\pipe\docker_engine:\\.\pipe\docker_engine

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/