問題描述
通常,我們本地編寫 docker-compose.yml 文件,然后運行測試。但是,我們需要在 arm64 環境中進行測試,無法在本地直接運行測試。
我們希望可以在本地編寫,然后本地使用 docker-compose up 直接在遠程 arm 主機上運行測試。
該筆記將介紹:在本地運行 docker-compose 命令,但是在遠程主機中啟動服務的方法。
方法一、在上傳后執行(傳統方法)
在傳統方法中,我們需要將 docker-compose.yaml 及相關文件,上傳到遠程主機,然后執行 docker-compose up 啟動服務。
這里不再贅述……
方法二、使用 DOCKER_HOST 變量
使用 tcp 協議
第一步、修改 Docker 服務配置,使其監聽 TCP/2375 端口(不再贅述)
第二步、通過 DOCKER_HOST 變量指定遠程服務,比如 DOCKER_HOST="tcp://0.0.0.0:2375" 指定遠程服務:
DOCKER_HOST="tcp://192.168.10.143:2375" docker-compose up -d docker-compose --host "tcp://192.168.10.143:2375" up -d
使用 ssh 協議(推薦)
我們想使用 TCP 協議(即我們不會改變 docker 配置,使其監聽 TCP 端口),而是使用 SSH 協議:
DOCKER_HOST="ssh://root@192.168.10.143" docker-compose up -d docker-compose --host "ssh://root@192.168.10.143" up -d
使用 SSH 協議需要注意以下問題:
1)從 Docker 18.09 開始支持 SSH 協議;
2)如果使用 SSH KEY 連接主機,需要 ssh-add -k /path/to/key-file 命令添加密鑰,因為 docker-compose 不支持命令行指定密鑰,也不會解析 .ssh/config 文件。
該方法的局限性
雖然是遠程執行,但本質上還是將命令發送到 Docker 守護進程,也就是說本地配置文件不會發送到遠程主機。即類似於 volumes: ["./config:/config"] 指令不會生效,因為在 config 下的配置文件不會發送到遠程主機。
方法三、使用 Docker Context 命令
在 Docker 19.03.0 中,引入 Docker Context 支持。Docker Engine release notes | Docker Documentation
第一步、創建並查看上下文:
docker context create remote ‐‐docker "host=ssh://user@remotemachine" docker context ls
第二步、使用上下文操作:
docker-compose ‐‐context remote up -d
該方法的局限性
在本質上「該方法」與「方法二」類似,只是不再在命令行中指定 Docker 服務信息,而是換成上下文的形式。並且該方法也具有方法二的局限性。
相關文章
「Docker Compose」- 配置 Bash 補全(Bash Completion)
「Docker Compose」- docker-compose.yaml(學習筆記)
「Docker Compose」- 在構建時,使用網絡加速(代理)
「Docker Compose」- 生成鏡像構建命令
「Docker Compose」- 開機自動啟動應用容器
參考文獻
How to deploy on remote Docker hosts with docker-compose - Docker Blog
dockerd | Docker Documentation
docker-compose fails with ssh:// protocol with PasswordRequiredException: Private key file is encrypted · Issue #6513 · docker/compose
paramiko ssh transport leads to strange discrepancies to docker cli · Issue #2289 · docker/docker-py
Docker Compose doesn't work when SSH connection used to remote Docker Engine · Issue #6336 · docker/compose
Docker Tips: Access the Docker Daemon via SSH | by Luc Juggery | Better Programming | Medium
Docker Context | Docker Documentation