如何在远程主机上运行docker-compose?

时间:2016-02-16 12:51:33

标签: docker docker-compose

我在本地撰写文件。如何使用docker-compose up -dDOCKER_HOST=<some ip>等远程主机上运行容器包?

6 个答案:

答案 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.ymlscp文件复制到远程主机,在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-composedocker-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>

SSH隧道

现在,在本地位置和远程计算机上的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客户端

将终端保持打开状态,然后打开第二个终端。在其中,让您的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
  • 让您的Docker客户端再次与本地Unix套接字通信(如果未设置,则为默认值):unset DOCKER_HOST

这样做的好处是,您省去了在远程计算机上复制docker-compose.yml文件和其他资源或在远程计算机上设置环境变量的麻烦(这很困难)。

非交互式SSH隧道

如果要在无法使用交互式终端的脚本环境中使用此命令,可以使用open and close the SSH tunnel in the backgroundSSH 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/