[英]How to run docker-compose on remote host?
我在本地撰寫文件。 如何在遠程主機上運行容器包,比如DOCKER_HOST=<some ip>
docker-compose up -d
和DOCKER_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
從撰寫文檔
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
來檢查),不過我沒有在舊版本上嘗試過。
現在,在本地位置和遠程機器上的 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 客戶端與新創建的隧道套接字通信,而不是你本地的 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
unset DOCKER_HOST
這樣做docker-compose.yml
是,您可以省去復制docker-compose.yml
文件和其他資源或在遠程機器上設置環境變量的麻煩(這很困難)。
如果您想在無法使用交互式終端的腳本環境中使用它,可以使用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.