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

Ars*_*sen 25 docker docker-compose

我在本地撰写文件.如何像远程主机上运行的集装箱捆docker-compose up -dDOCKER_HOST=<some ip>

Dir*_*irk 27

Docker 18.09.0发行版和(到目前为止)即将docker-compose v1.23.1发行的发行版之后,这将变得更加容易。提到的Docker版本分别sshDOCKER_HOST环境变量和命令-H参数添加了对协议的支持docker ...。下一docker-compose版本还将包含此功能

首先,您需要对目标计算机的SSH访问(使用任何方法都可能需要)。

然后,要么:

# 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
Run Code Online (Sandbox Code Playgroud)

或者,如果您愿意,也可以只执行一项命令:

docker-compose -H "ssh://my-user@remote-host" up
Run Code Online (Sandbox Code Playgroud)

一件很棒的事情是,您可以在docker-compose.yml文件中用于配置的所有本地环境变量都可用,而无需以remote-host某种方式将其转移到。

  • 我是否需要在远程服务器上进行撰写,或者它是否会在那里为我完成所有设置? (3认同)
  • 据我所知,远程服务器上不需要`docker-compose`。`docker-compose` 只是代表你运行各种常规 `docker` 命令的包装器。当运行 `docker-compose -H "ssh://my-user@remote-host" up` 时,这将在控制机器上转换为类似 `docker -H "ssh://my-user@ remote-host" run --name foo some-image ...`,因此不会在远程机器上运行 `docker-compose` 命令。 (3认同)

Thi*_*aut 12

如果您不需要在本地计算机上运行docker容器,但仍在同一台远程计算机上,则可以在docker设置中更改此容器.

在本地计算机上: 您可以使用-H参数控制远程主机

docker -H tcp://remote:2375 pull ubuntu
Run Code Online (Sandbox Code Playgroud)

要将它与docker-compose一起使用,您应该在/ etc/default/docker中添加此参数

在远程机器上

你应该改变外部地址的监听,而不仅仅是unix socket.

有关更多详细信息,请参阅将Docker绑定到另一个主机/端口或Unix套接字.

如果需要在多个远程hoste上运行容器,则应配置Docker Swarm

  • 请记住,默认情况下,这允许网络中的任何人访问该计算机的Docker守护程序。由于对Docker守护程序的访问类似于该机器上的`sudo`权限,因此仅应在受信任的环境中执行此操作。有一些方法可以保护或限制仅对受信任的客户端的访问,这在此处或有关该主题的几篇博客文章中都有介绍。但是,它更是一个高级主题。https://docs.docker.com/engine/security/https/#create-a-ca-server-and-client-keys-with-openssl (2认同)

dhu*_*hes 11

您现在可以为此使用 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/


gui*_*lem 8

从撰写文档

撰写CLI环境变量

DOCKER_HOST

设置docker守护程序的URL.与Docker客户端一样,默认为unix:///var/run/docker.sock.

这样我们才能做到

export DOCKER_HOST=tcp://192.168.1.2:2375
docker-compose up
Run Code Online (Sandbox Code Playgroud)


Dir*_*irk 6

然而,最近我发现另一种可能性是通过控制一个SSH隧道远程泊坞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 -登录

此外,一些消息来源提到只能通过OpenSSHv6.7(运行ssh -V检查)通过SSH隧道转发Unix套接字,尽管我没有在较旧的版本上尝试过。

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命令,例如docker ps或启动一个容器,拉取映像等。只要SSH隧道处于活动状态,一切都会在远程计算机上发生。为了再次运行本地Docker命令:

  • 通过打入Ctrl+C第一个终端来关闭隧道。
  • 如果绑定到文件位置:再次删除临时隧道套接字。否则,您以后将无法再次打开相同的文件:rm -f "$(pwd)"/docker.sock
  • 让您的Docker客户端再次与您的本地Unix套接字通信(如果未设置,则为默认值): unset DOCKER_HOST

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

非交互式SSH隧道

如果要在无法使用交互式终端的脚本环境中使用此脚本,则可以使用SSH ControlMaster和ControlPath选项在后台打开和关闭SSH隧道

# 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   
Run Code Online (Sandbox Code Playgroud)


Dir*_*irk 5

鉴于您能够登录远程计算机,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"
Run Code Online (Sandbox Code Playgroud)

你甚至可以把它缩短,并省略发送和取出的docker-compose.yml使用文件-f -选项docker-compose,将预计docker-compose.yml从管道文件stdin。只需将其内容通过管道传递给SSH命令:

cat docker-compose.yml | ssh SomeUser@RemoteHost "docker-compose -f - up"
Run Code Online (Sandbox Code Playgroud)

如果您在docker-compose.yml文件中使用环境变量替换,则上述命令不会将它们替换为远程主机上的本地值,并且您的命令可能会因未设置变量而失败。为了克服这个问题,可以使用envsubst 实用程序在将内容传送到SSH命令之前用内存中的本地值替换变量:

envsubst < docker-compose.yml | ssh SomeUser@RemoteHost "docker-compose up"
Run Code Online (Sandbox Code Playgroud)