阿里云 Docker支持

Docker支持

介绍https://help.aliyun.com/document_detail/batchcompute/user-guide/v20150630/docker.html

BatchCompute v20150630支持Docker镜像了。

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

1. BatchCompute对Docker支持的原理

这里要和普通VM支持对比说明一下:

(1)先说使用普通VM, 用户提交作业,每个作业可以有多个任务,每个任务指定一个镜像(支持linux 和 window), 系统运行这个任务时,会根据指定的镜像启动VM, 用户任务将运行在这个VM上。任务完成后结果会被上传到指定的OSS目录,VM销毁。然后执行下一个任务。

(2)使用Docker:每个任务也可以指定使用一个Docker容器镜像来运行。 运行task时,会先启动一个VM运行支持Docker的系统镜像(如:支持Docker的ubuntu), 然后会从OSS上下载你指定的Docker镜像,在这个VM中启动起来,用户的任务将运行在这个Docker容器内。 任务完成后结果上传到指定的OSS目录,VM销毁。然后执行下一个任务。

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

# 使用VM:
---
  |-- job
       |-- task
             |-- VM (用户指定的VM,支持windows和linux)
                  |-- program (用户程序)

# 使用Docker模式:
---
  |-- job
       |-- task
             |-- VM (支持docker的ubuntu)
                 |-- Docker-Container(用户指定的Docker的容器镜像)
                      |-- program (用户程序)

快速开始

1. 创建阿里云账号

登陆阿里云官网,点左上角“注册”创建阿里云账号。

2. 开通BatchCompute

使用注册成功的阿里云账号登陆,点左上角“产品”,在“大规模计算”中找到批量计算(BatchCompute)进入产品主页,开通BatchCompute服务。

3. 获取 AccessKeyId 和 AccessKeySecret

进入AK控制台 获取 AccessKeySecret:

  • 找到启用状态的 AccessKeyId 点击显示,即可获取对应的 AccessKeySecret。

  • 如果没有可用的 AccessKeyId 可点击右上角的"创建 Access Key"按钮,创建成功后,系统会生成一对 AccessKeyId 和 AccessKeySecret。

4. 下载 OSS SDK

由于 BatchCompute 使用 OSS 作为存储,请花 10 分钟时间了解 OSS。下载您的开发语言对应的 OSS SDK

5. 创建 OSS Bucket

方法如下:

登录阿里云首页->开放存储服务 OSS -> 管理控制台 -> 新建Bucket

  • 本例中我们创建的 OSS Bucket 为 your-bucket,如要运行本例子,您需要在OSS中创建自己的bucket。

具体请参考OSS文档

6. 理解基本概念

为更好的继续下面的操作,首先简单理解BatchCompute中的几个核心概念

7. 安装Docker

(1) 在 Ubuntu 上安装

sudo apt-get update  #更新软件源
sudo apt-get install docker.io #安装docker
#检查是否成功
sudo docker ps

(2) 在 window/Mac 上安装

从官网下载docker toolbox:

https://www.docker.com/docker-toolbox

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

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

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

8. 制作Docker镜像

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

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

dockerUbuntu
  |-- Dockerfile

文件 Dockerfile 的内容:

FROM ubuntu:14.04

# 这里要替换 your_name 为您的名字, 和your_email 为您的Email
MAINTAINER your_name <your_email>

# 更新源
RUN apt-get update

# 安装python
RUN apt-get install -y python

# 安装jdk (如果需要jdk,请去掉下面的注释)
# RUN apt-get install -y openjdk-7-jdk

# 启动时运行这个命令
CMD ["/bin/bash"]

运行以下命令,build镜像:

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

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

docker images
  • 注意:在制作镜像时,推荐使用ubuntu:14.04作为基础镜像,因为我们的支持Docker的VM镜像中 已经安装了ubuntu:14.04 docker镜像,这样做可以减少下载成本。

9. 镜像上传到OSS

(1) 安装 OSS Docker registry

使用BatchCompute Docker服务,需要将制作的Docker镜像上传到OSS。

假设您想要将docker存储到oss的目录路径为:

oss://your-bucket/dockers/

我们先安装一个将OSS作为Docker registry(私服)的工具, 这个工具本身也是一个Docker镜像,将OSS映射成一个Docker私服。

安装方法一 (Mac/windows) :

打开Kitematic, 可以直接搜索到registry-oss, 安装完成后,配置一下即可。

如果没有看到STORAGE_PATH 这一项配置,请手动加上。本例子中其值为:dockers

安装方法二:

用以下命令安装运行:

docker run -e OSS_HOST={your_host}
        -e OSS_BUCKET=your-bucket
        -e STORAGE_PATH=dockers
        -e OSS_KEY={your_access_key_id}
        -e OSS_SECRET={your_access_key_secret}
        -p 5000:5000
        -d denverdino/registry-oss:0.9.1

其中的变量需要替换:

参数 描述
your_host您的 oss host
your_access_key_id您的 access key id
your_access_key_secret您的 access key secret

举例(假设我们使用深圳region):

docker run -e OSS_HOST=oss-cn-shenzhen.aliyuncs.com -e OSS_BUCKET=your-bucket -e STORAGE_PATH=dockers -e OSS_KEY=6s8hwj27hshwwushsjwi8 -e OSS_SECRET=k66****2us -p 5000:5000 -d denverdino/registry-oss:0.9.1
  • 注意:这里OSS_HOST使用 oss-cn-shenzhen.aliyuncs.com,表示使用深圳region的OSS,而后面提交作业也需要提交到相应的region才能正常工作。

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

docker ps       #查看运行的container

如果成功安装,可以看到denverdino/registry-oss。

(2) 运行下面命令,将镜像上传到 OSS:

docker tag myubuntu localhost:5000/myubuntu
docker push localhost:5000/myubuntu

注意:

  1. 要用 localhost:5000/ 作为前缀,用其他的字符串上传不了。 5000 端口是第(1)步中 -p 5000:5000 中(冒号前的5000)指定的。
  2. 您制作的镜像名称为 localhost:5000/myubuntu,而不是 myubuntu。

可以使用下面的命令检验是否上传成功:

docker pull localhost:5000/myubuntu

或者直接使用OSS控制台查看是否有这个目录: oss://your-bucket/dockers/repositories/library/myubuntu/

10. 作业准备

本作业采用 Python 语言编写,目的是找出给定三份数据里的所有质数并进行排序输出。

该作业包含两个任务: Find 任务和 Sort 任 务。其中,Find 任务会并行运行 3 个实例,每个实例寻找一份数据文件中的质数,然后将结果存到 OSS 中。Sort 任务只有一个实例,即从 OSS 中读出 Find 任务寻找出来的质数并进行排序, 最后再输出到 OSS 中。

(1) 存储输入文件

本作业需输入三份数据文件下载:data.tar,解压后,本别上传到OSS, 路径如下:

oss://your-bucket/find-prime/input-data-0.txt
oss://your-bucket/find-prime/input-data-1.txt
oss://your-bucket/find-prime/input-data-2.txt
  • your-bucket如上文所示创建,如要运行本例子, 请改成您自己在OSS上创建的bucket,并创建自己的OSS路径,并且把三份数据文件上传至您自己创建的bucket的路径下。如何上传到OSS,请参考OSS文档

(2) 编写作业任务

Find 任务和 Sort 任务的 Python 代码下载:find_sort.tar.gz

  • 如要运行本例子,请按照上文所述创建的您的bucket路径,填入以下参数:

Find.py

ACCESS_KEY_ID: AccessKeyId可以由上文所述获取
ACCESS_KEY_SECRET: AccessKeySecret可以由上文所述获取
BUCKET: 存储输入输出文件的bucket(注意:不包含"oss://")
FIND_INPUT_PATH: 输入文件在bucket下的路径
FIND_OUTPUT_PATH: 输出文件在bucket下的路径

Sort.py

ACCESS_KEY_ID: AccessKeyId可以由上文所述获取
ACCESS_KEY_SECRET: AccessKeySecret可以由上文所述获取
BUCKET: 存储输入输出文件的bucket(注意:不包含"oss://")
SORT_INPUT_PATH: 输入文件在bucket下的路径
SORT_OUTPUT_PATH: 输出文件在bucket下的路径

(3) 本地调试

如果你想要使用Docker镜像本地调试一下程序, 可以根据本节内容操作,如果不需要本地调试,请跳过本节。

任务程序可以使用的变量说明

在 BatchCompute 中,运行在 docker 容器中的环境和不使用 docker 容器时的环境变量相同。 请注意以下几个环境变量:

环境变量
USERadmin
PWD/home/admin
HOME/home/admin
ALI_BATCHCOMPUTE_INSTANCE_ID实例ID,视实际情况而定
ALI_BATCHCOMPUTE_TASK_ID任务名称,视实际情况而定
ALI_BATCHCOMPUTE_JOB_ID作业ID,视实际情况而定
ALI_BATCHCOMPUTE_JOB_NAME作业名称,视实际情况而定
ALI_BATCHCOMPUTE_OSS_HOSTOSS host,视实际情况而定
本地测试命令

在制作完成 docker 镜像后,您可以使用如下的命令进行本地测试。

docker run -it -v /home/local_folder:/home/admin/worker
        -e USER=admin              
        -e HOME=/home/admin
        -e ALI_BATCHCOMPUTE_INSTANCE_ID=<your_instance_id>
        -e ALI_BATCHCOMPUTE_TASK_ID=<your_task_name>
        -e ALI_BATCHCOMPUTE_JOB_ID=job-0000000000
        -e ALI_BATCHCOMPUTE_JOB_NAME=<your_job_name>
        -e ALI_BATCHCOMPUTE_OSS_HOST=<your_oss_host>
        your_docker_image_name your_command

其中

-v /home/local_folder:/home/admin/worker 表示挂载本地/home/local_folder目录到 docker容器镜像中的 /home/admin/worker 目录

-e key=value 表示指定环境变量

your_task_name 作业中 task 的名称

your_job_name: 作业的名称

your_instance_id: 任务实例ID,从0开始递增的整数, 如这个任务你要启动3个实例来运行,则id分别为0,1,2

your_oss_host: OSS主机名(域名,应包含region信息,且不带"http://"前缀)

your_docker_image_name: 您制作的 docker 镜像名称,如 myubuntu

your_command:命令行及参数

举例:

docker run -it -v /home/local_folder:/home/admin/worker -e USER=admin -e HOME=/home/admin -e ALI_BATCHCOMPUTE_INSTANCE_ID=0 -e ALI_BATCHCOMPUTE_TASK_ID=Find -e ALI_BATCHCOMPUTE_JOB_ID=job-0000000000 -e ALI_BATCHCOMPUTE_JOB_NAME=myJob1 -e ALI_BATCHCOMPUTE_OSS_HOST=oss-cn-shenzhen.aliyuncs.com myubuntu python /home/admin/Find.py

这个命令是在本地运行 myubuntu这个docker镜像, 将本地目录/home/local_folder/挂载到docker镜像的/home/admin/worker/目录, 并在这个镜像里运行python /home/admin/worker/Find.py命令。

注意:

  • 本地的/home/local_folder目录是程序所在目录, 目录中应当有Find.py。
  • ALI_BATCHCOMPUTE_INSTANCE_ID 从0开始,假如你配置该任务启动3个实例, 则ALI_BATCHCOMPUTE_INSTANCE_ID 分别为0,1,2。
  • 其中Find.py是你的任务程序,任务程序详细请参看快速开始中的"编写作业任务"一节。
  • 如果Find.py中有读取OSS的操作是会产生费用的,如果不想产生费用,建议调试时注释掉OSS操作的代码。

(4) 打包上传

将编写完成的 Find.py、Sort.py 和准备好的 OSS 的 Python SDK 开发包 中的.py子文件打成一个压缩包, 目录结构:

src
  |-- Find.py
  |-- Sort.py
  |-- oss
        |-- __init__.py
        |-- oss_api.py
        |-- oss_fs.py
        |-- oss_sample.py
        |-- oss_util.py
        |-- oss_xml_handler.py
        |-- pkg_info.py

打包命令如下:

> cd src
> tar -czf worker.tar.gz *

运行以下命令,查看内容是否正确:

> tar -tvf worker.tar.gz
Find.py
oss
Sort.py
oss/__init__.py
oss/oss_api.py
oss/oss_sample.py
oss/oss_util.py
oss/oss_xml_handler.py
oss/pkg_info.py
  • 注意:BatchCompute 只支持以 tar.gz 为后缀的压缩包,请注意务必用以上方式(gzip)打包, 否则将会无法解析。

本例将 worker.tar.gz 上传到 OSS 的 your-bucket 中, object 名字为

find-prime/worker.tar.gz

  • 如要运行本例子,您需要创建自己的bucket, 并且把worker.tar.gz文件上传至您自己创建的bucket的路径下。

OSS 全路径为

oss://your-bucket/find-prime/worker.tar.gz

11. 使用控制台提交作业

(1)Docker 特殊字段说明

本地测试通过后,您可以向 BatchCompute 提交作业了。

在 BatchCompute 中, 提交作业时使用 docker 与普通作业相同, 您只需要在作业描述的 ImageId 指定为 BatchCompute 的公共镜像的Id(支持Docker的镜像),并且在task描述的环境变量(EnvironmentVariables)中 增加如下两个参数:

字段名称 描述 是否可选
BATCH_COMPUTE_DOCKER_IMAGEDocker镜像名称可选
BATCH_COMPUTE_DOCKER_REGISTRY_OSS_PATHDocker镜像在 OSS-Registry 中的存储路径可选
  • 如果没有 BATCH_COMPUTE_DOCKER_IMAGE 参数,表示不使用 docker ,这时 BATCH_COMPUTE_DOCKER_REGISTRY_OSS_PATH 将被忽略。
  • 如果有 BATCH_COMPUTE_DOCKER_IMAGE,则表示使用 docker。

(2) 提交作业

登陆BatchCompute控制台

然后点击左侧导航栏“提交作业”进行作业提交。注意这里选择深圳region。

如果需要运行本例子,请把 PackageUri (作业打包上传的OSS路径,本例子中为 worker.tar.gz)、StdoutRedirectPath、StderrRedirectPath(任务结果和错误的输出地址),修改成与上文对应的您的OSS路径。

  • 注意:深圳支持Docker的镜像的ImageId 为 img-00000000561CB0FE000061CC00000411

作业JSON模板如下,具体参数含义请参照这里

{
  "JobName": "docker_demo",
  "JobTag": "BatchCompute",
  "Priority": 0,
  "TaskDag": {
    "TaskDescMap": {
      "Find": {
        "PackageUri": "oss://your-bucket/find-prime/worker.tar.gz",
        "ProgramName": "Find.py",
        "ProgramType": "python",
        "StdoutRedirectPath": "oss://your-bucket/find-prime/logs",
        "StderrRedirectPath": "oss://your-bucket/find-prime/logs",
        "ImageId": "img-00000000561CB0FE000061CC00000411",
        "Timeout": 1000,
        "InstanceCount": 3,
        "EnvironmentVariables": {
          "BATCH_COMPUTE_DOCKER_IMAGE": "localhost:5000/myubuntu",
          "BATCH_COMPUTE_DOCKER_REGISTRY_OSS_PATH": "oss://your-bucket/dockers"
        },
        "ResourceDescription": {
          "Cpu": 800,
          "Memory": 2000
        },
        "OssMappingLock": false
      },
      "Sort": {
        "PackageUri": "oss://your-bucket/find-prime/worker.tar.gz",
        "ProgramName": "Sort.py",
        "ProgramType": "python",
        "StdoutRedirectPath": "oss://your-bucket/find-prime/logs",
        "StderrRedirectPath": "oss://your-bucket/find-prime/logs",
        "ImageId": "img-00000000561CB0FE000061CC00000411",
        "Timeout": 1000,
        "InstanceCount": 1,
        "EnvironmentVariables": {
          "BATCH_COMPUTE_DOCKER_IMAGE": "localhost:5000/myubuntu",
          "BATCH_COMPUTE_DOCKER_REGISTRY_OSS_PATH": "oss://your-bucket/dockers"
        },
        "ResourceDescription": {
          "Cpu": 800,
          "Memory": 2000
        }
      }
    },
    "Dependencies": {
      "Find": [
        "Sort"
      ]
    }
  }
}
  • 注意:这个json中的oss路径只是举例使用,提交作业时请根据实际情况修改。

确定各个参数及路径填写正确后,点击左下角的“提交作业”,并确认。

12. 查询作业状态

提交作业后,页面将会自动跳转至控制台作业列表,列表第一列将会显示最新提交成功的作业。

以上内容是否对您有帮助?   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值