`docker run`在远程主机上

时间:2017-06-08 22:21:02

标签: linux docker

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

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

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

[A]$> DOCKER_HOST=$MACHINE_B_IP:$MACHIN_B_PORT docker run hello-from-B

但是这个命令实际上会拉出图像hello-from-B并尝试在机器A上运行它,最终导致某些exec format error因为显然你无法运行特定于{{{ 1}}到ARM机器。

机器A和B之间的通信运行良好。我可以运行x86images之类的命令,它会给我预期的结果:

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 并且尚未尝试过,但根据我的理解,这不会解决我的问题。

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

提前致谢,

TL; DR;

docker如何在DOCKER_HOST=... docker run something上运行something而不是在我的本地计算机上运行它。

4 个答案:

答案 0 :(得分:11)

检查最新的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二进制文件对于此功能是无效的配置,因此我们可以依靠它始终存在。 / p>      

如何验证

docker -H ssh://me@server run -it --rm busybox

到目前为止的反应:

  

来自世界各地的运维人员和系统管理员,我们感谢您的出色和意外功能。
  我希望这将大大减少我看到人们打开不带TLS的dockerd TCP并仅选择SSH端点作为远程mgmt的次数。

答案 1 :(得分:6)

如果您的目标机器B可以在these platform之一上创建,那么我想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"

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

答案 2 :(得分:4)

本文非常好地解释了这个概念: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访问权限。确保你   控制对码头的访问。如果您绑定到TCP端口,任何人   访问该端口具有完整的Docker访问权限;所以事实并非如此   建议在开放的网络上使用。

  

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

     

同样,Docker客户端可以使用-H连接到自定义端口。   Docker客户端默认连接到   Linux上为unix:///var/run/docker.socktcp://127.0.0.1:2376上为tcp://[host]:[port][path] or unix://path   视窗。

     

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

     

# 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

  

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

Rosie & Jim

答案 3 :(得分:0)

正如您所说,服务器之间的连接可用,您可以使用Docker丰富的API。

配置docker守护程序端口有两种方法

1)配置 / etc / default / docker文件

DOCKER_OPTS="-H tcp://127.0.0.1:5000 -H unix:///var/run/docker.sock"

2)在 /etc/docker/daemon.json 配置:

{
"hosts": ["tcp://127.0.0.1:5000", "unix:///var/run/docker.sock"]
}

有关配置docker守护程序端口的详细信息, refer configure-docker-daemon-port

配置Docker端口后,您可以访问远程主机中的Docker API。

JSON输入文件:

#cat container_create.json 
{
  "AttachStdin": true,
  "AttachStdout": true,
  "AttachStderr": true,
  "ExposedPorts": {
    "property1": {},
    "property2": {}
  },
  "Tty": true,
  "OpenStdin": true,
  "StdinOnce": true,
  "Cmd": null,
  "Image": "ubuntu:14.04",
  "Volumes": {
    "additionalProperties": {}
  },
  "Labels": {
    "property1": "string",
    "property2": "string"
  }
}

用于创建容器的API:

curl -X POST http://192.168.56.101:6000/containers/create -d @container_create.json --header "Content-Type: application/json" | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   602  100    90  100   512   1737   9883 --:--:-- --:--:-- --:--:-- 10039
{
  "Warnings": null,
  "Id": "f5d3273e48350d606bd8b9d2a5bd876dc5c2d1a73183f876a1dd56473cad8940"
}

生成的ID是容器ID,状态不会处于活动/运行状态。

用于启动已创建容器的API。

# curl -X POST http://192.168.56.101:6000/containers/f5d3273e48350/start | jq .  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

用于检查状态/检查容器的API:

# curl -X GET http://192.168.56.101:6000/containers/f5d3273e48350/json | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  4076    0  4076    0     0   278k      0 --:--:-- --:--:-- --:--:--  306k
{
  "NetworkSettings": {
    "Networks": {
      "bridge": {
        "MacAddress": "02:42:ac:11:00:03",
        "GlobalIPv6PrefixLen": 0,
        "GlobalIPv6Address": "",
        "IPv6Gateway": "",
        "IPAMConfig": null,
        "Links": null,
        "Aliases": null,
        "NetworkID": "689d6b65ce1b06c93b2c70f41760a3e7fb2b50697d71cd9c1f39c64c865e5fa6",
        "EndpointID": "76bf1f8638d1ff0387e6c3fe89e8ccab1670c709ad550f9acc6f46e559654bee",
        "Gateway": "172.17.0.1",
        "IPAddress": "172.17.0.3",
        "IPPrefixLen": 16
      }
    },
    "MacAddress": "02:42:ac:11:00:03",
    "SecondaryIPAddresses": null,
    "SandboxKey": "/var/run/docker/netns/24a031d9dfda",
    "Ports": {
      "0/tcp": null
    },
    "LinkLocalIPv6PrefixLen": 0,
    "LinkLocalIPv6Address": "",
    "HairpinMode": false,
    "SandboxID": "24a031d9dfda70026a875f4841269c5e790b12ccafcc11869111faa240020b99",
    "Bridge": "",
    "SecondaryIPv6Addresses": null,
    "EndpointID": "76bf1f8638d1ff0387e6c3fe89e8ccab1670c709ad550f9acc6f46e559654bee",
    "Gateway": "172.17.0.1",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "IPAddress": "172.17.0.3",
    "IPPrefixLen": 16,
    "IPv6Gateway": ""
  },

    },
    "AttachStderr": true,
    "AttachStdout": true,
    "AttachStdin": true,
    "User": "",
    "Domainname": "",
    "Hostname": "f5d3273e4835",
    "OpenStdin": true,
    "StdinOnce": true,
    "Env": [
      "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
    ],
    "Cmd": [
      "/bin/bash"
    ],
    "ArgsEscaped": true,
    "Image": "ubuntu:14.04",

<*************REMOVING THE OUTPUT CONTENT********>

  "ExecIDs": null,
  "HostnamePath": "/var/lib/docker/containers/f5d3273e48350d606bd8b9d2a5bd876dc5c2d1a73183f876a1dd56473cad8940/hostname",
  "ResolvConfPath": "/var/lib/docker/containers/f5d3273e48350d606bd8b9d2a5bd876dc5c2d1a73183f876a1dd56473cad8940/resolv.conf",
  "Image": "sha256:132b7427a3b40f958aaeae8716e0cbb2177658d2410554ed142e583ef522309f",
  "State": {
    "FinishedAt": "0001-01-01T00:00:00Z",
    "StartedAt": "2017-06-09T06:53:45.120357144Z",
    "Error": "",
    "Status": "running",
    "Running": true,
    "Paused": false,
    "Restarting": false,

  "Path": "/bin/bash",
  "Created": "2017-06-09T06:52:51.820429355Z",
  "Id": "f5d3273e48350d606bd8b9d2a5bd876dc5c2d1a73183f876a1dd56473cad8940",
  "HostsPath": "/var/lib/docker/containers/f5d3273e48350d606bd8b9d2a5bd876dc5c2d1a73183f876a1dd56473cad8940/hosts",
  "LogPath": "/var/lib/docker/containers/f5d3273e48350d606bd8b9d2a5bd876dc5c2d1a73183f876a1dd56473cad8940/f5d3273e48350d606bd8b9d2a5bd876dc5c2d1a73183f876a1dd56473cad8940-json.log",
  "Name": "/objective_bartik",
  "RestartCount": 0,
  "Driver": "aufs",
  "MountLabel": "",
  "ProcessLabel": "",
  "AppArmorProfile": "docker-default"
}

有关详细信息,请参阅此处:

DOCKER APIs

<强> How to build an Image using Docker API?

How to commit Docker Container using API

希望这些信息对他有帮助。