Docker 在运行时分为 Docker 引擎(也就是服务端守护进程)和客户端工具。Docker 的引擎提供了一组 REST API,被称为 Docker Remote API,而如 docker 命令这样的客户端工具,则是通过这组 API 与 Docker 引擎交互,从而完成各种功能。因此,虽然表面上我们好像是在本机执行各种 docker 功能,但实际上,一切都是使用的远程调用形式在服务端(Docker 引擎)完成。也因为这种 C/S 设计,让我们操作远程服务器的 Docker 引擎变得轻而易举。

默认情况下 Docker 的守护进程启动会生成一个 socket (/var/run/docker.sock)进程通信文件,而并没有监听端口,只能在本机操作 Docker。如果想在其它地方操作 Docker 主机,就需要让 Docker daemon 监听一个端口号,这样可以通过端口号就能实现远程操作。

下面说下如何配置docker daemon 可让其被远程访问。

docker daemon的配置

linux 系统中的配置

可以自行创建 /etc/docker/daemon.json 配置文件 ,该文件不区分系统,是通用的,推荐使用。然后编辑如下内容

1
2
3
4
5
6
{
"hosts": [
"tcp://0.0.0.0:2375",
"unix:///var/run/docker.sock"
]
}

重启一下docker daemon

1
systemctl restart docker

macos 系统中的配置

在MacOS上 因为使用的是docker on mac,当我在daemon.json中设置了与上面linux系统相同的配置时出现了"hosts" : Cannot be used in Docker for mac这个报错。那么如何解决这个问题呢,我在网上找到了一个解决方案,就是可以使用socat(一个两个独立数据通道之间的双向数据传输的继电器),可以在这里看下介绍
下面介绍如何使用socat实现docker daemon的远程访问

  1. 安装socat
1
brew install socat
  1. 启动socat
1
socat -d TCP-LISTEN:2375,reuseaddr,fork UNIX:/var/run/docker.sock

当然也可以不在本地安装 通过启动一个docker来使用

1
2
docker run -d -v /var/run/docker.sock:/var/run/docker.sock -p 2376:2375 \
bobrik/socat TCP4-LISTEN:2375,fork,reuseaddr UNIX-CONNECT:/var/run/docker.sock

连接远端的docker daemon

1
2
3
4
docker -H tcp://127.0.0.1:2375 ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8dbd2e90b8a8 jumps "entrypoint.sh" 14 hours ago Up 14 hours 0.0.0.0:2222->2222/tcp, 0.0.0.0:8080->80/tcp hardcore_wilson

参考连接