是否可以(直接使用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之间的通信运行良好。我可以运行x86
或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
客户端,但我希望尽可能避免使用此解决方案。
提前致谢,
TL; DR;
docker
如何在DOCKER_HOST=... docker run something
上运行something
而不是在我的本地计算机上运行它。
答案 0 :(得分:11)
检查最新的docker 18.09是否包含该功能。
参见docker/cli PR 1014
添加了对SSH连接的支持。例如
docker -H ssh://me@server
- cli应该为
ssh://me@server
和DOCKER_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.sock
,tcp://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"
}
有关详细信息,请参阅此处:
<强> How to build an Image using Docker API? 强>
How to commit Docker Container using API
希望这些信息对他有帮助。