Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在远程主机上运行docker compose?_Docker_Docker Compose - Fatal编程技术网

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

如何在远程主机上运行docker compose?,docker,docker-compose,Docker,Docker Compose,我在本地编写了一个文件。如何在远程主机上运行容器包,如docker compose up-dwithdocker\u host=?如果您不需要在本地计算机上运行docker容器,但仍然在同一远程计算机上,您可以在docker设置中更改此设置 在本地计算机上: 可以使用-H参数控制远程主机 docker -H tcp://remote:2375 pull ubuntu 要与docker compose一起使用,应在/etc/default/docker中添加此参数 在远程计算机上 您应该更改外部

我在本地编写了一个文件。如何在远程主机上运行容器包,如
docker compose up-d
with
docker\u host=

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

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

docker -H tcp://remote:2375 pull ubuntu
要与docker compose一起使用,应在/etc/default/docker中添加此参数

在远程计算机上

您应该更改外部地址的侦听,而不仅仅是unix套接字

有关更多详细信息,请参阅


如果您需要在多个远程主机上运行container,您应该从compose文档中配置Docker Swarm

DOCKER_主机

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

这样我们就可以

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

考虑到您能够登录到远程计算机,在该计算机上运行
docker compose
命令的另一种方法是使用
SSH

通过
scp
docker 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"
您甚至可以使用
-f-
选项
docker compose
docker compose.yml
文件从
stdin
管道传输,从而缩短文件的长度并省略对
docker compose.yml
文件的发送和删除。只需将其内容传输到
SSH
命令:

cat docker-compose.yml | ssh SomeUser@RemoteHost "docker-compose -f - up"
envsubst < docker-compose.yml | ssh SomeUser@RemoteHost "docker-compose up"
如果在
docker compose.yml
文件中使用环境变量替换,上述命令将不会用远程主机上的本地值替换它们,并且由于变量未设置,命令可能会失败。为了克服这一问题,可以使用在将内容传输到
SSH
命令之前,将变量替换为内存中的本地值:

cat docker-compose.yml | ssh SomeUser@RemoteHost "docker-compose -f - up"
envsubst < docker-compose.yml | ssh SomeUser@RemoteHost "docker-compose up"
envsubst
我最近发现的另一种可能性是通过SSH隧道控制远程Docker Unix套接字(这要归功于我学习这种方法的地方)

先决条件 您可以通过SSH连接到目标计算机。出于安全和方便的考虑,首选无密码、基于密钥的访问,您可以学习如何进行设置,例如,此处:

此外,一些消息来源提到,通过SSH隧道转发Unix套接字仅在
OpenSSH
v6.7(运行
SSH-V
进行检查)开始时可用,但我没有在较旧的版本上尝试这一点

SSH隧道 现在,在本地位置和远程计算机上的Docker Unix套接字之间创建一个新的SSH隧道:
ssh-nNT-L$(pwd)/docker.sock:/var/run/docker.sockuser@someremote

或者,也可以绑定到本地端口而不是文件位置。确保端口已打开以供连接,并且尚未使用。
ssh-nNT-L localhost:2377:/var/run/docker.sockuser@someremote

重定向Docker客户端 让终端保持打开状态,然后打开第二个终端。在这里,让Docker客户端与新创建的隧道套接字而不是本地Unix Docker套接字通信

如果绑定到文件位置:

export DOCKER\u HOST=unix://$(pwd)/DOCKER.sock

如果绑定到本地端口(如上所述的示例端口):

export DOCKER\u HOST=localhost:2377

现在,运行一些Docker命令,比如
Docker ps
,或者启动容器、拉取映像等。只要SSH隧道处于活动状态,远程机器上的一切都会发生。要再次运行本地Docker命令,请执行以下操作:

  • 点击第一个终端中的
    Ctrl+C
    ,关闭隧道
  • 如果绑定到文件位置:再次删除临时通道套接字。否则,您以后将无法再次打开相同的文件:
    rm-f“$(pwd)”/docker.sock
  • 使Docker客户端再次与本地Unix套接字通信(如果未设置,则为默认值):
    unset Docker\u主机
这样做的好处是,您省去了复制
docker compose.yml
文件和其他资源或在远程机器上设置环境变量的麻烦(这很困难)

非交互式SSH隧道 如果要在无法使用交互式终端的脚本上下文中使用此选项,可以使用以下方法:

在发布和即将发布的
docker compose v1.23.1
发行版之后,这将变得更加容易。上述Docker版本分别为
Docker\u主机
环境变量和
Docker…
命令的
-H
参数添加了对
ssh
协议的支持。下一个
docker compose
release

首先,您需要(任何方法都可能需要)

然后,要么:

# 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
文件中使用的所有本地环境变量进行配置,而无需以某种方式将它们传输到
远程主机。

您现在可以使用docker上下文进行此操作:

docker上下文创建开发人员“docker”主机=ssh://user@远程机器“

docker compose-context dev up-d


更多信息请点击此处:

我不清楚您的问题。你真的想通过docker compose在远程主机上部署一个容器吗?是的,就像一台docker机器,但我想在没有docker机器的情况下这样做。请看这篇文章:我不明白这个问题<代码>DOCKER\u主机=。。。docker compose u