远程主机上的“码头运行”
是否有可能(直接使用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
的原因很明显,你不能运行特定于图像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
我听说过docker-machine
,但还没有尝试过,但从我的理解来看,这并不能解决我的问题。
有没有什么办法可以直接实现使用docker
。 解决方法可能是使用ssh
连接远程主机,并直接从远程主机使用docker
客户端,但我想尽可能避免使用此解决方案。
提前致谢,
TL; DR;
DOCKER_HOST=... docker run something
如何DOCKER_HOST=... docker run something
something
在DOCKER_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