我在本地撰写文件。如何使用docker-compose up -d
在DOCKER_HOST=<some ip>
等远程主机上运行容器包?
答案 0 :(得分:13)
在Docker 18.09.0发行以及即将发布的docker-compose v1.23.1
发行之后,这将变得非常容易。提到的Docker版本分别为ssh
环境变量和DOCKER_HOST
命令的-H
参数添加了对docker ...
协议的支持。下一个docker-compose
版本will incorporate this feature as well。
首先,您需要SSH access to the target machine(使用任何方法都可能需要)。
然后,或者:
# Re-direct to remote environment.
export DOCKER_HOST="ssh://my-user@remote-host"
# Run your docker-compose commands.
docker-compose pull
docker-compose down
docker-compose up
# All docker-compose commands here will be run on remote-host.
# Switch back to your local environment.
unset DOCKER_HOST
或者,如果您愿意,也可以一次执行一个命令:
docker-compose -H "ssh://my-user@remote-host" up
关于这一点的一件好事是,您可以在docker-compose.yml
文件中进行配置的所有本地环境变量都可用,而不必以某种方式将它们转移到remote-host
上。
答案 1 :(得分:8)
如果您不需要在本地计算机上运行docker容器,但仍在同一台远程计算机上,则可以在docker设置中更改此设置。
在本地计算机上: 您可以使用-H参数
控制远程主机docker -H tcp://remote:2375 pull ubuntu
要与docker-compose一起使用,您应该在/ etc / default / docker中添加此参数
在远程计算机上
你应该改变外部地址的监听,而不仅仅是unix socket。
有关详细信息,请参阅Bind Docker to another host/port or a Unix socket。
如果需要在多个远程hoste上运行容器,则应配置Docker Swarm
答案 2 :(得分:7)
撰写文档
Compose CLI environment variables
DOCKER_HOST
设置docker守护程序的URL。与Docker客户端一样,默认为unix:///var/run/docker.sock。
这样我们就可以了
export DOCKER_HOST=tcp://192.168.1.2:2375
docker-compose up
答案 3 :(得分:4)
鉴于您可以登录远程计算机,另一种在该计算机上运行docker-compose
命令的方法是使用SSH
。
通过docker-compose.yml
将scp
文件复制到远程主机,在docker-compose
上运行SSH
命令,最后再次删除文件进行清理。
这看起来如下:
scp ./docker-compose.yml SomeUser@RemoteHost:/tmp/docker-compose.yml
ssh SomeUser@RemoteHost "docker-compose -f /tmp/docker-compose.yml up"
ssh SomeUser@RemoteHost "rm -f /tmp/docker-compose.yml"
你甚至可以缩短它并省略docker-compose.yml
文件的发送和删除,使用-f -
选项到docker-compose
,docker-compose.yml
文件将是stdin
文件从SSH
传来只需将其内容传递给cat docker-compose.yml | ssh SomeUser@RemoteHost "docker-compose -f - up"
命令:
docker-compose.yml
如果在SSH
文件中使用环境变量替换,则上述命令不会用远程主机上的本地值替换它们,并且由于未设置变量,命令可能会失败。为了解决这个问题,在将内容传递给envsubst < docker-compose.yml | ssh SomeUser@RemoteHost "docker-compose up"
命令之前,envsubst utility可以用来替换内存中本地值的变量:
<style>
div.rotate-text {
-webkit-transform: rotate(90deg);
-moz-transform: rotate(90deg);
-o-transform: rotate(90deg);
-ms-transform: rotate(90deg);
transform: rotate(90deg);
}
</style>
答案 4 :(得分:3)
我最近发现的另一种可能性是通过SSH隧道控制远程Docker Unix套接字(我在https://medium.com/@dperny/forwarding-the-docker-socket-over-ssh-e6567cfab160处学到了这种方法的信息)。
您可以SSH到目标计算机。出于安全性和便利性的考虑,首选无密码,基于密钥的访问权限,您可以了解如何进行设置,例如此处:https://askubuntu.com/questions/46930/how-can-i-set-up-password-less-ssh-login
此外,一些消息来源提到只能从OpenSSH
v6.7(运行ssh -V
开始)通过SSH隧道转发Unix套接字,但是我没有在较旧的版本上进行尝试。 / p>
现在,在本地位置和远程计算机上的Docker Unix套接字之间创建一个新的SSH隧道:
ssh -nNT -L $(pwd)/docker.sock:/var/run/docker.sock user@someremote
或者,也可以绑定到本地端口而不是文件位置。确保端口已打开以进行连接并且尚未使用。
ssh -nNT -L localhost:2377:/var/run/docker.sock user@someremote
将终端保持打开状态,然后打开第二个终端。在其中,让您的Docker客户端与新创建的隧道套接字(而不是本地Unix Docker套接字)对话。
如果您绑定到文件位置:
export DOCKER_HOST=unix://$(pwd)/docker.sock
如果绑定到本地端口(上面使用的示例端口):
export DOCKER_HOST=localhost:2377
现在,运行一些docker ps
之类的Docker命令或启动一个容器,拉取映像等。只要SSH隧道处于活动状态,一切都会在远程计算机上发生。为了再次运行本地Docker命令:
Ctrl+C
,关闭隧道。rm -f "$(pwd)"/docker.sock
unset DOCKER_HOST
这样做的好处是,您省去了在远程计算机上复制docker-compose.yml
文件和其他资源或在远程计算机上设置环境变量的麻烦(这很困难)。
如果要在无法使用交互式终端的脚本环境中使用此命令,可以使用open and close the SSH tunnel in the background来SSH ControlMaster and ControlPath options:
# constants
TEMP_DIR="$(mktemp -d -t someprefix_XXXXXX)"
REMOTE_USER=some_user
REMOTE_HOST=some.host
control_socket="${TEMP_DIR}"/control.sock
local_temp_docker_socket="${TEMP_DIR}"/docker.sock
remote_docker_socket="/var/run/docker.sock"
# open the SSH tunnel in the background - this will not fork
# into the background before the tunnel is established and fail otherwise
ssh -f -n -M -N -T \
-o ExitOnForwardFailure=yes \
-S "${control_socket}" \
-L "${local_temp_docker_socket}":"${remote_docker_socket}" \
"${REMOTE_USER}"@"${REMOTE_HOST}"
# re-direct local Docker engine to the remote socket
export DOCKER_HOST="unix://${local_temp_docker_socket}"
# do some business on remote host
docker ps -a
# close the tunnel and clean up
ssh -S "${control_socket}" -O exit "${REMOTE_HOST}"
rm -f "${local_temp_docker_socket}" "${control_socket}"
unset DOCKER_HOST
# do business on localhost again
答案 5 :(得分:3)
您现在可以为此使用docker上下文:
docker context create dev ‐‐docker “host=ssh://user@remotemachine”
docker-compose ‐‐context dev up -d
此处有更多信息:https://www.docker.com/blog/how-to-deploy-on-remote-docker-hosts-with-docker-compose/