如何在远程Ubuntu服务器上部署Docker容器?

37
我已经在Docker容器内实现了一个API,现在我想将这个容器部署到远程的Ubuntu服务器上。请问如何操作? 我的API使用了很多资源,并且我使用了MLDB框架来实现它。 我希望能够在远程Ubuntu服务器上部署包含API的容器。 目前,我找到了很多关于在AWS和DigitalOcean上部署API的指南,但既然我已经可以访问远程Ubuntu服务器,那我就不需要它们了,对吗? 那么,我该如何部署我的容器,以便其他人可以测试我的API呢?如果有更好的方法可以部署我的API(最好是免费或成本较低),请告诉我。 谢谢!
3个回答

34
自从发布了Docker 18.09.0,这个过程变得简单多了。此版本为DOCKER_HOST环境变量和docker ...命令分别添加了对ssh协议的支持。
首先,您需要访问目标机器的SSH(任何方法都可能需要)。
然后,要么:
# Re-direct to remote environment.
export DOCKER_HOST="ssh://my-user@remote-host"

# Run a container. To prove that we are on remote-host, this will print its hostname.
docker run --rm --net host busybox hostname -f

# All docker commands here will be run on remote-host.

# Switch back to your local environment.
unset DOCKER_HOST

或者,如果您愿意,可以只用一个命令一次性完成所有操作:

docker -H "ssh://my-user@remote-host" run --rm --net host busybox hostname -f

请注意,这在当前最新版本为1.23.1的docker-compose及以下版本中还不被支持。然而,它将成为下一个版本的一部分


13
  1. 在目标机器上设置无密码SSH。可以参考此处

  2. 运行以下命令以在目标虚拟机上远程管理Docker(如有必要,还将安装Docker):

docker-machine create --driver generic --generic-ip-address=10.123.2.74 --generic-ssh-user=docker --generic-ssh-key ~/.ssh/id_rsa some_name

有关通用驱动程序的更多信息,请点击此处

  1. 为新配置的Docker机器设置所需的环境变量:

eval $(docker-machine env some_name)

  1. 在此终端/cmd窗口中运行的任何Docker命令都将在远程机器上运行。要测试,请运行:

docker ps

现在,您可以像本地一样运行Docker容器。

PS - 如果您需要通过Docker Toolbox远程管理在Windows上运行的Docker实例,则情况会变得有点复杂。(需要解决访问docker Linux VM(ssh,docker引擎,容器端口)所需端口的网络访问,可以通过VirtualBox的桥接网络适配器或通过端口转发解决;还需要解决Windows防火墙问题)。


+1,但是你忘记在“docker-machine create”命令中添加新的机器名称,这将导致错误。 - greyhairredbear
“some_name” 不是机器名称吗? - Sergiu Indrie

4
我建议在本地开发环境安装docker-machine,并使用generic driver添加remote_server,然后使用eval $(docker-machine env remote_server)连接到它并部署您的API。
以下是相关链接: 引用如下:

驱动程序将在创建时执行一系列任务:

  • 如果主机上未运行Docker,则会自动安装。
  • 它将更新主机包(apt-get update,yum update…)。
  • 它将生成证书以保护Docker守护程序。
  • Docker守护程序将重新启动,因此所有正在运行的容器都将停止。
  • 主机名将更改以适应机器名称。
remote_server添加到docker-machine中后,请按照以下步骤将本地容器部署到remote_server
  • 获取服务器的环境变量:docker-machine env remote_server

  • 连接到服务器的shell:eval $(docker-machine env remote_server)

  • 构建API镜像:docker build -t api_image .(Dockerfile DIR)

  • 运行容器:docker run -d -p 1111:1111 api_image

  • 使用curlcurl $(docker-machine ip remote_server):1111

希望这对您有所帮助。

这似乎是我需要的解决方案。假设我能连接到远程主机,那么如何部署API呢? - sniper71
1
在执行 eval $(docker-machine env remote_server) 后,您可以使用通常用于构建和运行容器的 dockerdocker-compose 命令。 - thoba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接