如何制作镜像

什么是Docker?什么是Docker镜像

Docker是一个功能强大的开放软件平台。通过封装软件到Docker镜像(image)中,可以使软件在不同平台与环境下运行。同时人们可以将Docker镜像放在公共(Docker Hub)或私有的Docker仓库(repository)中,互相分享。这些都极大地方便了软件的安装、分享以及运行。

为什么要制作生物信息软件的Docker镜像

生物信息分析过程中,软件的安装、运行和管理往往依赖不同的操作系统(如Linux、Mac等)、不同软件包(如python、java或者是众多C语言的包)、不同的软件版本(如Picard的2.2.4版本要求Java 8版本)。因此将生物信息学的软件封装到Docker镜像中,可以使你的程序在不同环境下运行,不需要考虑环境依赖的问题。使用镜像来管理工作流,可以实现一处管理多处迁移,包括我们GeneDock的云平台。

GeneDock平台提供了公共镜像

Docker安装需要的依赖环境

对于RHEL6/Centos系列的机器,docker官网建议的操作系统的最低需求为:64-bit version of RHEL 7。
对于Ubuntu系列的机器,docker官网建议的操作系统的最低需求为:
Yakkety 16.10 Xenial 16.04 (LTS) Trusty 14.04 (LTS)
详细情况请访问:https://docs.docker.com/engine/installation/linux/ 。

如何安装Docker

Docker安装的具体步骤请参考:

如何制作Docker镜像

在安装完Docker之后,制作Docker镜像有两种方法, build 和 commit。我们强烈建议用户使用build的方法,以方便追溯和修改。

在使用docker build命令之前,需要编写Dockerfile来自定义镜像。Dockerfile包含了用户指定的基础镜像(即上层镜像依赖的一个基本环境,本文档目前建议使用ubuntu:14.04),所需要安装的软件和依赖关系。
写好Dockefile文件后并保存,在当前目录使用:

docker build -t <name:tag> .

<name:tag>指的是你希望Docker镜像叫什么名字,有什么标签。不要忘记最后的“.”.

例如,你写好Dockerfile保存在“~/program/dockerlib/bwa/”目录下,想创建一个镜像,名字为bwa,标签为latest,不过建议tag用1.0等版本控制,不要用latest不好追踪的tag。

cd ~/program/dockerlib/bwa/
docker build -t bwa:latest .

如何写Dockerfile文件

这里我们以常用的用于序列比对的生物信息软件BWA为例,介绍如何写Dockerfile(文末附录有完整的Dockerfile)。bwa的Docker镜像的制作主要有以下几个步骤:

  • 操作系统基础镜像

我们选择’ubuntu:14.04’这一常用的长期支持的linux系统,通过docker pull ubuntu:14.04Docker Hub上下载。之后在Dockerfile中用FROM命令导入(注:在Dockerfile中Docker特定的命令一般用大写)。

FROM ubuntu:14.04
  • 安装常用工具和依赖包

从Docker Hub上下载的ubuntu:14.04基础镜像很多包和工具均没有,我们可以通过ubuntu系统的apt-get包管理系统来安装。下载BWA源代码需要git命令,编译BWA需要build-essential,而BWA软件需要zlib包。运行命令,需要RUN命令。

RUN apt-get install -y apt-utils \
    git \
    build-essential \
    zlib1g.dev
  • 下载BWA源代码并编译

在github上下载最新的BWA源码,用make命令编译。

RUN git clone https://github.com/lh3/bwa.git --depth 1
RUN cd bwa
RUN make
  • 添加环境变量

利用ENV命令将bwa添加到环境变量中方便使用。假如你将bwa保存并编译在/bioapp/bwa目录下,你可以通过如下命令添加环境变量。

ENV PATH /bioapp/bwa:$PATH
  • 其他:

对于制作在GeneDock平台上可以运行的Docker镜像,你还需要注意以下几个问题:

  1. 将系统的时间更改为北京时间
  2. 将系统默认的ubuntu的源列表改成国内的镜像,以提高安装速度
  3. 建议创建一个bioapp的文件夹方便存储源代码
  4. 由于GeneDock使用目录’/var/data’存储数据,故最后将工作目录切换一下

这些步骤的细节请看附录。

如何在GeneDock平台上使用Docker镜像

制作完Docker镜像后,你需要将本地的镜像上传到GeneDock你自己用户名的私有仓库下。

  • 登录GeneDock Docker registry(私有注册服务器)
docker login cn-<endpoint>-registry.genedock.com

<endpoint>指的是你GeneDock账号所在的工作域(beijing或者shenzhen)。回车后,提示需要输入

Username:,请填写admin@企业账号,如您的账号名是account,则填写admin@account

为了方便记忆,可以使用

docker login cn-<endpoint>-registry.genedock.com -u admin@account -p PASSWD

登录GeneDock的docker镜像服务器

  • 更改本地Docker镜像的名字
docker tag <name:tag>  cn-beijing-registry.genedock.com/<yourname>/<name:tag>

<name:tag>指的是你的Docker镜像的名字和标签。

<yourname>指的是账号名,例如account

  • 上传镜像
docker push cn-beijing-registry.genedock.com/<yourname>/<name:tag>

例如,你的GeneDock账户叫account,在北京域,你在本地制作了Docker镜像bwa:latest,现在想在GeneDock平台上使用这个镜像。

docker login cn-beijing-registry.genedock.com
docker tag bwa:latest cn-beijing-registry.genedock.com/account/bwa:latest
docker push cn-beijing-registry.genedock.com/account/bwa:latest

至此,你就可以在GeneDock网站自己的账号下查看你上传的Docker镜像了。具体为:GeneDock管理控制台 -> 工具 -> 创建工具 -> 镜像。

公共镜像

为了方便用户创建工作流,GeneDock提供了WGS相关的等公共镜像。

  • 公共镜像说明

公共镜像已经上传到了dockerhub,地址为 https://hub.docker.com/orgs/seqflow/repositories.

镜像名称 tag名称 描述
seqflow/genedock_wgs 1.0 bwa:0.7.17 (可直接调用:bwa,也可绝对路径调用:/bioapp/bwa-0.7.17/bwa)
samtools: 1.10 (可直接调用:bwa,也可绝对路径调用:/bioapp/samtools-1.10/samtools)
fastqc: 0_11_9 (可直接调用:fqstqc,也可绝对路径调用:/bioapp/FastQC_0_11_9/fastqc )
sentieon:201808.01 (绝对路径调用:/bioapp/sentieon-genomics-201808.01/bin/sentieon )
gatk4: 4.1.8.0 (可直接调用:gatk,也可绝对路径调用:/bioapp/gatk-4.1.4.1/gatk )
trimmomatic:0.39 (绝对路径调用:java -jar /bioapp/Trimmomatic-0.39/trimmomatic-0.39.jar)
picrad: 2.23.1 (绝对路径调用:java -jar /bioapp/picard-2.23.1/picard.jar)
gatk3: 3.8 (绝对路径调用:java -jar /bioapp/gatk-3.8/GenomeAnalysisTK_3.8.jar)
tabix: 1.10 (可直接调用:tabix)
bgzip: 1.10 (可直接调用:tabix)
python: 2.7.5
java: 1.8
perl :5.16.3
  • 使用方式

    • 下载本地

    用户可以使用docker pull seqflow/genedock_wgs:1.0下载到本地进行测试

    • 制作工具

    用户在设置工具的runtime使用,例如:

    runtime {
          docker: "seqflow/genedock_wgs:1.0"
          memory: "4096m"
          disk: "10240m"
          cpu: 2
    

小贴士

  • 1 常见报错 不正确使用 docker login命令会有如下报错:
    • 报错Error response from daemon: Get https://cn-beijing-registry.genedock.com/v2/: unauthorized: authentication required。 原因:是用户名或者密码错误。
    • 报错 Error response from daemon: Get https://cn-beijing-registryxxx.genedock.com/v1/users/: dial tcp: lookup cn-beijing-registryxxx.genedock.com on 192.168.65.1:53: no such host。 原因:域名写错了,无法解析域名。
    • 报错 Could not resolve host: github.com。原因是daemon 的连接有问题,修改daemon的docker0网桥,参考网址

      一些常用Docker命令

这里我们再介绍一些其他常用的Docker命令,方便大家对创建好的镜像进行操作。

  • docker images:查看创建的Docker镜像
  • docker rmi:删除一个Docker镜像
  • docker run:运行Docker镜像,如在Docker镜像bwa:latest运行bwa命令,可以docker run bwa:latest bwa
  • docker run -it:以交互的模式运行一个Docker镜像,方便我们debug
  • docker --help:查看到Docker帮助
  • docker help <commands>:查看具体某个命令(command)的帮助

扩展阅读:

附录

完整的Dockerfile文件(注意后续的source.list和timezone文件也要确保在当前路径):

#Dockerfile to install Bio apps (include BWA)
#version 1.0
#http://bio-bwa.sourceforge.net/
#https://github.com/lh3/bwa

FROM ubuntu:14.04
MAINTAINER Li Ming, liming@genedock.com
MAINTAINER Wang Huanwei, wanghuanwei@genedock.com

#change the timezone
#import source package, update the source
# COPY ./sources.list  /
RUN bash -c 'echo -e "Asia/Shanghai" > /etc/timezone'
RUN bash -c 'echo -e "deb http://cn.archive.ubuntu.com/ubuntu/ trusty main restricted universe multiverse\ndeb http://cn.archive.ubuntu.com/ubuntu/ trusty-security main restricted universe multiverse\ndeb http://cn.archive.ubuntu.com/ubuntu/ trusty-updates main restricted universe multiverse\ndeb http://cn.archive.ubuntu.com/ubuntu/ trusty-backports main restricted universe multiverse\n" >/etc/apt/sources.list' && cat /etc/apt/sources.list && apt-get update

#install dependencies
#apt-utils, package managment related utility programs
#git, download source code from github
#build-essential, compile the source code
#zlib, a data compression library, required by bwa
#zlib1g (installed in ubuntu:14.04), runtime
#zlib1g.dev, development
RUN apt-get install -y apt-utils \
    git \
    build-essential \
    zlib1g.dev

##install bwa
RUN mkdir /bioapp
WORKDIR /bioapp
RUN git clone https://github.com/lh3/bwa.git --depth 1
WORKDIR /bioapp/bwa
RUN make

##configuration the env
ENV PATH /bioapp/bwa:$PATH

##clean
RUN apt-get clean

##switch the directory
WORKDIR /var/data