如何在远程ubuntu服务器上部署docker容器?

时间:2017-04-19 20:09:32

标签: api ubuntu docker ubuntu-server mldb

我在docker容器中实现了一个API,我希望将此容器部署到远程ubuntu服务器。我怎么能这样做呢? 我的API使用了很多资源,我使用了MLDB框架来实现它。我想在这个远程ubuntu服务器上部署包含API的容器。 到目前为止,我已经找到了许多在AWS和DigitalOcean上部署API的指南,但是因为我已经可以访问远程ubuntu服务器而不是我不需要这些服务器了吗? 那么我如何部署我的容器以便其他人能够测试我的API?如果有更好的方式来部署我的API(希望免费或廉价),请告诉我。

提前致谢。

3 个答案:

答案 0 :(得分:7)

  1. 目标计算机上的设置passwordless SSH

  2. 运行以下命令以远程管理目标VM上的Docker(如果需要,还可以安装Docker):

  3.   

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

    您可以找到有关通用驱动程序here的更多信息。

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

      eval $(docker-machine env some_name)

      1. 在此终端/ cmd窗口中运行的任何Docker命令都将在远程计算机上运行。试运行:
      2.   

        docker ps

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

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

答案 1 :(得分:6)

Docker 18.09.0发布以来,这变得非常容易。此版本分别为ssh环境变量和DOCKER_HOST命令的-H自变量添加了对docker ...协议的支持。

首先,您需要SSH access to the target machine(使用任何方法都可能需要)。

然后,或者:

# 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

请注意,docker-compose v.1.23.1(撰写本文时为最新版本)及以下版本尚不支持此功能。但是,it will be part of the next release

答案 2 :(得分:3)

我建议您在本地开发环境中安装docker-machine并使用generic driver添加remote_server,然后您可以使用eval $(docker-machine env remote_server)连接到它并部署您的remote_server API。

  

驱动程序将在create:

上执行任务列表      
      
  • 如果Docker未在主机上运行,​​则会自动安装。
  •   
  • 它将更新主机包(apt-get update,yum update ...)。
  •   
  • 它将生成证书以保护docker守护程序。
  •   
  • 将重新启动docker守护程序,因此将停止所有正在运行的容器。
  •   
  • 主机名将更改为适合计算机名称。
  •   

将本地容器部署到remote_server:

通过docker-machinegeneric driver添加到docker-machine env remote_server后,请执行以下操作来部署您的API。

  • 获取服务器的envs:eval $(docker-machine env remote_server)

  • 将shell连接到服务器:docker build -t api_image .

  • 构建API图片:docker run -d -p 1111:1111 api_image。 (Dockerfile DIR)

  • 运行容器:curl

  • 使用curl $(docker-machine ip remote_server):1111 VehicleTypeImpl.Builder vehicleTypeBuilder = VehicleTypeImpl.Builder .newInstance("smallVehicle") .addCapacityDimension(0, 4); VehicleType vehicleType = vehicleTypeBuilder .build(); /** * Create vehicle. */ Builder vehicleBuilder = VehicleImpl.Builder .newInstance("audi"); vehicleBuilder.setStartLocation(Location.Builder .newInstance() .setCoordinate(new Coordinate(4, 4)) .setIndex(0).build()); vehicleBuilder.setType(vehicleType); // Start time and end time of the resource in seconds from 10AM to 8PM. vehicleBuilder.setEarliestStart(36000); vehicleBuilder.setLatestArrival(72000); VehicleImpl vehicle = vehicleBuilder.build(); /** * Create the services those should be accomplished by vehicle. */ Service service1 = Service.Builder .newInstance("1(11am-1pm)1hr") .addSizeDimension(0, 1) .setLocation( Location.Builder .newInstance() .setCoordinate( new Coordinate(4, 5)) .setIndex(1).build()) // Job should be started at 10AM and ends at 8PM. .addTimeWindow(39600,46800) // Time required to do job is 4 hours .setServiceTime(3600).build(); Service service2 = Service.Builder .newInstance("2(2pm-5pm)1hr") .addSizeDimension(0, 1) .setLocation( Location.Builder .newInstance() .setCoordinate( new Coordinate(5, 4)) .setIndex(1).build()) // Time required to complete job is 3 hours. .setServiceTime(3600) // Job should be started at 2PM and ends at 8PM. .addTimeWindow(50400, 61200).build(); Service service3 = Service.Builder .newInstance("3(6pm-8pm)1hr") .addSizeDimension(0, 1) .setLocation( Location.Builder .newInstance() .setCoordinate( new Coordinate(5, 8)) .setIndex(3).build()) // Service takes 1 hour to complete. .setServiceTime(3600) // From 12-1 .addTimeWindow(64800, 72000).build(); VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder .newInstance(); vrpBuilder.addVehicle(vehicle); vrpBuilder.addJob(service1).addJob(service2) .addJob(service3); vrpBuilder .setFleetSize(VehicleRoutingProblem.FleetSize.INFINITE); VehicleRoutingProblem vrp = vrpBuilder.build(); /** * Create the algorithm based on the VRP you have created. */ VehicleRoutingAlgorithm algorithm = Jsprit .createAlgorithm(vrp); Collection<VehicleRoutingProblemSolution> solutions = algorithm .searchSolutions(); /** * Get the best route among given sollutions. */ VehicleRoutingProblemSolution bestOne = Solutions .bestOf(solutions);

希望您觉得这很有帮助。