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

How to run docker-compose on remote host?

我已经在本地编写了文件。如何 运行 像 docker-compose up -dDOCKER_HOST=<some ip> 一样在远程主机上捆绑容器?

如果您不需要 运行 docker 本地机器上的容器,但仍在同一台远程机器上,您可以在 docker 设置中更改它。

在本地机器上: 可以用-H参数控制远程主机

docker -H tcp://remote:2375 pull ubuntu

要与 docker-compose 一起使用,您应该在 /etc/default/docker

中添加此参数

在远程机器上

您应该更改从外部地址监听,而不仅仅是 unix 套接字。

有关详细信息,请参阅 Bind Docker to another host/port or a Unix socket

如果你需要运行多个远程主机上的容器,你应该配置Docker Swarm

来自撰写文档

Compose CLI environment variables

DOCKER_HOST

Sets the URL of the docker daemon. As with the Docker client, defaults to unix:///var/run/docker.sock.

这样我们就可以做到

export DOCKER_HOST=tcp://192.168.1.2:2375
docker-compose up

鉴于您能够在远程计算机上登录,另一种在该计算机上执行 运行ning docker-compose 命令的方法是使用 SSH.

通过 scpdocker-compose.yml 文件复制到远程主机,运行 通过 SSH docker-compose 命令,最后通过删除再次归档。 这可能如下所示:

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 文件的发送和删除,方法是使用 docker-compose-f - 选项,这将需要 docker-compose.yml 文件从 stdin 进行管道传输。只需将其内容通过管道传输到 SSH 命令:

cat docker-compose.yml | ssh SomeUser@RemoteHost "docker-compose -f - up"

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

envsubst < docker-compose.yml | ssh SomeUser@RemoteHost "docker-compose up"

我最近发现的另一种可能性是通过 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

此外,一些消息来源提到通过 SSH 隧道转发 Unix 套接字只能从 OpenSSH v6.7 开始使用(运行 ssh -V 检查),我没有尝试过不过在旧版本上。

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 隧道

如果您想在无法使用交互式终端的脚本上下文中使用它,可以使用 open and close the SSH tunnel in the background using the 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   

发布后Docker 18.09.0 and the (as of now) upcoming docker-compose v1.23.1 release this will get a whole lot easier. This mentioned Docker release added support for the ssh protocol to the DOCKER_HOST environment variable and the -H argument to docker ... commands respectively. The next docker-compose release 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

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