「Docker Compose」- 向远程主机部署服务

  CREATED BY JENKINSBOT

问题描述

通常,我们本地编写 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 服务信息,而是换成上下文的形式。并且该方法也具有方法二的局限性。

参考文献

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