簡體   English   中英

如何在遠程主機上運行 docker-compose?

[英]How to run docker-compose on remote host?

我在本地撰寫文件。 如何在遠程主機上運行容器包,比如DOCKER_HOST=<some ip> docker-compose up -dDOCKER_HOST=<some ip>

Docker 18.09.0和(截至目前)即將發布的docker-compose v1.23.1發布之后,這將變得更加容易。 這提到的 Docker 版本分別為DOCKER_HOST環境變量和DOCKER_HOST docker ...命令的-H參數添加了對ssh協議的支持。 下一個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

或者,如果您願意,也可以一次性執行一個命令:

docker-compose -H "ssh://my-user@remote-host" up

這樣做的一個docker-compose.yml是,您可能在docker-compose.yml文件中用於配置的所有本地環境變量都可用,而無需以某種方式將它們傳輸到remote-host

如果您不需要在本地機器上運行 docker 容器,但仍然在同一台遠程機器上,您可以在 docker 設置中更改此設置。

在本地機器上:您可以使用 -H 參數控制遠程主機

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

要將它與 docker-compose 一起使用,您應該在 /etc/default/docker 中添加此參數

在遠程機器上

您應該更改從外部地址的監聽,而不僅僅是 unix 套接字。

有關更多詳細信息,請參閱將Docker 綁定到另一個主機/端口或 Unix 套接字

如果你需要在多個遠程主機上運行容器,你應該配置 Docker Swarm

從撰寫文檔

編寫 CLI 環境變量

DOCKER_HOST

設置 docker 守護進程的 URL。 與 Docker 客戶端一樣,默認為 unix:///var/run/docker.sock。

這樣我們就可以做到

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

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

我最近發現的另一種可能性是通過 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 -登錄

此外,一些消息來源提到通過 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是,您可以省去復制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   

鑒於您能夠登錄遠程機器,在該機器上運行docker-compose命令的另一種方法是使用SSH

通過scp將您docker-compose.yml文件復制到遠程主機,通過SSH運行docker-compose.yml 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.yml docker-compose選項來省略docker-compose.yml文件的發送和刪除,這將期望docker-compose.yml文件從stdin管道傳輸。 只需將其內容通過管道傳輸到SSH命令:

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

如果您在docker-compose.yml文件中使用環境變量替換,則上述命令不會將它們替換為遠程主機上的本地值,並且您的命令可能會因未設置變量而失敗。 為了克服這個問題,在將內容傳送到SSH命令之前,可以使用envsubst 實用程序將變量替換為內存中的本地值:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM