`docker run`在远程主机上

cch*_*rly 14 linux docker

是否可以(直接使用docker命令或docker-pyAPI)从远程主机启动容器?

让我们假设我有两台具有不同架构的x86机器: - A是机器 - B是ARM机器

我想使用我的A机器在B机器上运行一个容器.起初,我认为可以使用此命令:

[A]$> DOCKER_HOST=$MACHINE_B_IP:$MACHIN_B_PORT docker run hello-from-B
Run Code Online (Sandbox Code Playgroud)

但这个命令实际上拉图像hello-from-B,并试图在其中一些最终的机器运行它exec format error的原因很明显,你不能运行特定于图像的ARM一个x86机器.

机器A和B之间的通信运行良好.我可以像images或那样运行命令ps,它给了我预期的结果:

[A]$> DOCKER_HOST=$MACHINE_B_IP:$MACHIN_B_PORT docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             SIZE
hello-from-B              <none>              fd5059044831        13 hours ago        1.26GB
Run Code Online (Sandbox Code Playgroud)

我听说过docker-machine并且还没有尝试过,但根据我的理解,这不会解决我的问题.

有没有办法docker直接实现这一点.解决方法可能是使用ssh连接到远程主机并docker直接从远程主机使用客户端,但我想尽可能避免使用此解决方案.

提前致谢,


TL; DR;

怎样才能DOCKER_HOST=... docker run something运行somethingDOCKER_HOST,而不是我的本地机器上运行它.

Von*_*onC 18

检查最新的docker 18.09是否包含该功能.
docker/cli PR 1014

添加了对SSH连接的支持.例如docker -H ssh://me@server

  • CLI中应该接受ssh://me@serverDOCKER_HOST-H.使用它将使用传递的配置执行ssh.
  • ssh命令将在远程端的docker CLI二进制文件上调用隐藏命令.例如,docker dial-stdio.

此命令将连接到本地DOCKER_HOST变量(几乎总是默认的本地套接字)并在命令stdio上转发该连接.
即使这个命令应该在本地运行到dockerd二进制文件,我们认为这个功能的一个无效配置是删除本地docker二进制文件,所以我们可以依赖它始终存在.

如何验证它

docker -H ssh://me@server run -it --rm busybox
Run Code Online (Sandbox Code Playgroud)

到目前为止的反应:

从各地的操作系统和系统管理员,我们感谢您提供这个梦幻和意想不到的功能.
我希望这会严重削减我看到人们打开没有dockerdTLS的TCP 的次数,并且只选择远程管理的SSH端点.

  • 非常感谢您发布此答案-就像一个魅力! (2认同)

Sha*_*bbY 6

如果您的目标机器B可以在这些平台之一上创建,那么我想docker-machine将满足您的需求.您将使用docker-machine create --driver <..driver setup..> MACHINE_B然后使用激活它来创建您的机器eval $(docker-machine env MACHINE_B). docker-machine env MACHINE_B 将打印出一些出口报表:

export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://...."
export DOCKER_CERT_PATH="/..."
export DOCKER_MACHINE_NAME="MACHINE_B"
Run Code Online (Sandbox Code Playgroud)

一旦您的机器处于活动状态,您就可以docker像在本地使用该命令一样在MACHINE_B上远程操作.


yos*_*row 5

这篇文章很好地解释了这个概念:https : //docs.docker.com/engine/reference/commandline/dockerd/#bind-docker-to-another-hostport-or-a-unix-socket

考虑到页面上的巨大警告,我建议您通过 SSH 使用安全连接,即。 ssh user@host 'docker run hello-from-B'

警告:更改默认 docker 守护进程绑定到 TCP 端口或 Unix docker 用户组将允许非 root 用户在主机上获得 root 访问权限,从而增加您的安全风险。确保您控制对 docker 的访问。如果你绑定到一个 TCP 端口,任何有权访问该端口的人都可以完全访问 Docker;所以不建议在开放网络上使用。


使用 -H 可以让 Docker 守护进程监听特定的 IP 和端口。默认情况下,它将侦听 unix:///var/run/docker.sock以仅允许 root 用户进行本地连接。您可以将其设置为0.0.0.0:2375或 特定的主机 IP 以向所有人授予访问权限,但不建议这样做,因为这样对于某个人获得对运行守护程序的主机的 root 访问权限是微不足道的。

同样,Docker 客户端可用于-H连接到自定义端口。Docker 客户端将默认连接到 unix:///var/run/docker.sockLinux 和tcp://127.0.0.1:2376Windows。

-H 接受以下格式的主机和端口分配:

tcp://[host]:[port][path] or unix://path


您可以使用多个 -H,例如,如果您想同时侦听 TCP 和 Unix 套接字

# Run docker in daemon mode
$ sudo <path to>/dockerd -H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock &
# Download an ubuntu image, use default Unix socket
$ docker pull ubuntu
# OR use the TCP port
$ docker -H tcp://127.0.0.1:2375 pull ubuntu
Run Code Online (Sandbox Code Playgroud)