远程主机上的“码头运行”

是否有可能(直接使用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的原因很明显,你不能运行特定于图像ARMx86机器。

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

[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连接远程主机,并直接从远程主机使用docker客户端,但我想尽可能避免使用此解决方案。

提前致谢,


TL; DR;

DOCKER_HOST=... docker run something如何DOCKER_HOST=... docker run something somethingDOCKER_HOST运行,而不是在本地机器上运行它。


如果您的目标机器B可以在其中一个平台上创建,那么我猜Docker-machine会满足您的需求。 您可以使用docker-machine create --driver <..driver setup..> MACHINE_B创建您的机器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上进行远程操作。


本文很好地解释了这个概念: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守护程序侦听特定的IP和端口。 默认情况下,它将监听unix:///var/run/docker.sock ,只允许root用户进行本地连接。 您可以将其设置为0.0.0.0:2375或特定的主机IP,以授予所有人的访问权限,但不建议这样做,因为这对于某人获得对守护程序运行所在的主机的root访问权限并不重要。

同样,Docker客户端可以使用-H连接到自定义端口。 Docker客户端将默认连接到Linux上的unix:///var/run/docker.sock ,以及Windows上的tcp://127.0.0.1:2376

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

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


例如,如果您想要侦听TCP和Unix套接字,则可以使用多个-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

正如你所说服务器之间的连接可用,你可以使用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守护进程端口的更多详细信息, 请参阅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

如何使用Docker API构建图像?

如何使用API​​提交Docker容器

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

链接地址: http://www.djcxy.com/p/96397.html

上一篇: `docker run` on a remote host

下一篇: How can I get the devices battery level in javascript