全部产品
阿里云办公

前言

更新时间:2018-10-31 11:23:14

BatchCompute 除了支持把软件直接安装到 ECS 镜像,还支持通过 Docker 镜像部署应用程序。

也可以自定义制作一个 Docker 镜像,使用 registry 工具上传到阿里云 OSS,然后您可以指定您的作业的任务在这个镜像中运行。

1. BatchCompute 对 Docker 支持的原理

以 AutoCluster 模式为例,对比VM 方式Docker方式的使用过程。

  • VM 方式。用户提交作业,每个作业可以有多个任务,每个任务指定一个镜像(支持 Linux 和 Windows);系统运行任务时,会根据指定的镜像启动VM;用户任务将运行在这个VM上;任务完成后,结果会被上传到指定的持久化存储,然后销毁 VM,准备执行下一个任务。

  • Docker 方式:用户提交作业运行任务时,会先启动 VM 来支持 Docker 的系统镜像(如:支持 Docker 的 Ubuntu);然后,会从 OSS 下载指定的 Docker 镜像,并在该 VM 中启动,用户的任务将在该 Docker 容器内运行;任务完成后,结果上传到指定的持久化存储,然后销毁 VM,准备执行下一个任务。

目前一个 VM,只支持运行一个 Docker 镜像。

  1. # 使用VM:
  2. ---
  3. |-- job
  4. |-- task
  5. |-- VM (用户指定的 VM,支持 Windows Linux)
  6. |-- program (用户程序)
  7. # 使用Docker模式:
  8. ---
  9. |-- job
  10. |-- task
  11. |-- VM (支持 docker Ubuntu)
  12. |-- Docker-Container(用户指定的 Docker 的容器镜像)
  13. |-- program (用户程序)

2. 使用Docker和不使用Docker区别

- 不使用 Docker 使用 Docker
使用镜像 指定 ECS 镜像 ID 指定支持 Docker Container 的 ECS 镜像 ID(例如,官网提供的 Ubuntu),还需指定自定义 Docker 镜像。
程序运行平台 支持 Windows 和 Linux 支持 Linux
本地调试 不支持本地调试 镜像在本地制作,支持本地调试

3. 安装 Docker

A) 请到 Docker 官网下载安装

  • 在 Windows/Mac 上安装 toolbox

安装完成后会有2个快捷方式:

Kitematic: 用来管理 docker container 的图形化界面

Docker Quickstart Terminal: 可以快速启动 docker 命令行界面。

注意: 确保安装的 Docker 版本 >= 1.10, 否则会有兼容问题。

B) 配置加速器

使用加速器,将会提升您在国内获取 Docker 官方镜像的速度:阿里云容器服务开发者平台

4. 制作 Docker 镜像

本例中我们将制作一个 Ubuntu 镜像,内置 Python,镜像名称:myubuntu。

新建一个目录 dockerUbuntu,结构如下:

  1. dockerUbuntu
  2. |-- Dockerfile

文件 Dockerfile 的内容:

  1. FROM ubuntu:14.04
  2. # 这里要替换 your_name 为您的名字, 和your_email 为您的Email
  3. MAINTAINER your_name <your_email>
  4. # 更新源
  5. RUN apt-get update
  6. # 清除缓存
  7. RUN apt-get autoclean
  8. # 安装python
  9. RUN apt-get install -y python
  10. # 启动时运行这个命令
  11. CMD ["/bin/bash"]

运行以下命令,build 镜像:

  1. cd dockerUbuntu #进入 dockerUbuntu 目录
  2. docker build -t myubuntu ./ #正式build, 命名为 myubuntu
  • 注意:docker 命令在 ubuntu 中默认需要加 sudo 才能运行,而在 Mac/Windows 中,需要从 “Docker Quickstart Terminal” 中启动的命令行工具中运行。

build 完成后, 运行以下命令查看:

  1. docker images

可以看到类似下面的结果:

制作 docker 镜像,除了 Dockerfile 这种方式外,还有 快速制作方式

5. 将 docker 镜像上传到 OSS

使用 BatchCompute 的 Docker 服务,需要将制作的 Docker 镜像 myubuntu 上传到 OSS,系统将会从 OSS 下载镜像来运行任务程序。

A) 安装 OSS Docker Registry 2

假设 docker 存储到 OSS 的目录路径为oss://your-bucket/dockers/,利用 Docker Registry 2 官方镜像创建一个私有镜像仓库,需要配置了 OSS 的 Access Key ID, Access Key Secret,Region,Bucket 等信息。

具体安装步骤如下:

i. 在当前目录生成文件 config.yml

  1. version: 0.1
  2. log:
  3. level: debug
  4. storage:
  5. oss:
  6. accesskeyid: your_access_key_id
  7. accesskeysecret: your_access_key_secret
  8. region: oss-cn-shenzhen
  9. bucket: your-bucket
  10. rootdirectory: dockers
  11. secure: false
  12. internal: false
  13. http:
  14. addr: 0.0.0.0:5000

其中的变量需要替换:

参数 描述
your_access_key_id 阿里云的 access key id
your_access_key_secret 阿里云的 access key secret
your-bucket 阿里云的 bucket
oss-cn-shenzhen bucket 所在的 region

关于 OSS 配置的详细信息请参见 Docker 官方文档

ii. 运行命令安装

  1. docker pull registry:2
  2. docker run -v `pwd`/config.yml:/etc/docker/registry/config.yml -p 5000:5000 --name registry -d registry:2
  • 注意:region 使用 oss-cn-shenzhen, 表示使用华南1(深圳) region 的 OSS,而后面提交作业也需要提交到相应的 region 才能正常工作。

iii.查看结果

  1. docker ps #查看运行的container

如果成功安装,可以看到 registry:2

B) 镜像上传 OSS

  1. docker tag myubuntu localhost:5000/myubuntu
  2. docker push localhost:5000/myubuntu

注意:

  1. 要用 localhost:5000/ 作为前缀,用其他的字符串无法上传。5000 端口是第(1)步中 -p 5000:5000 中(冒号前的5000)指定的。
  2. 您制作的镜像名称为 localhost:5000/myubuntu,而不是 myubuntu。
  3. 检验镜像上传是否成功, 可以使用 OSS 控制台查看是否有这个目录: oss://your-bucket/dockers/docker/registry/v2/repositories/myubuntu/,使用 Docker 时,对应参数填写如下:
    • BATCH_COMPUTE_DOCKER_REGISTRY_OSS_PATH:oss://your-bucket/dockers
    • BATCH_COMPUTE_DOCKER_IMAGE:localhost:5000/myubuntu:xxxx (xxxx 为 myubuntu 的版本号)

6. 使用 Docker 注意事项

  • Docker container 运行时,用户为 root,path 环境变量默认为:/sbin:/usr/sbin:/bin:/usr/bin。注意没有/usr/local/bin

  • PWD 环境变量如果没有设置,则为’/batchcompute/workdir’。用户的程序包始终会被解压到 /batchcompute/workdir。

  • 使用 ClusterID 提交任务时, 因为 Docker registry 一旦启动后就不停止,因此提交到一个 cluster 中的所有 job,其 BATCH_COMPUTE_DOCKER_REGISTRY_OSS_PATH 必须相同。

  • 目前 InputMapping,OutputMapping 不能同时挂载到同一个目录。

  • BatchCompute 启动 Docker 容器时使用 —privileged=false 模式,所以不允许在docker 容器中启动 docker 容器。