如何 运行 docker-compose 在远程主机上?
How to run docker-compose on remote host?
我已经在本地编写了文件。如何 运行 像 docker-compose up -d
和 DOCKER_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
.
通过 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"
您甚至可以缩短它并省略 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/
我已经在本地编写了文件。如何 运行 像 docker-compose up -d
和 DOCKER_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
.
通过 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"
您甚至可以缩短它并省略 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/