一个用Dockerfile建立镜像的模板,和使用说明

简介

  • 为什么用Dockerfile?因为它生成镜像方便,方便订制,也就是为部署提供便利。
  • 这个东西有些格式,下面以这次部署做的Dockerfile为例,可以当成模板,修改部署的环境(cuda, cudnn,各种包)然后生成自己的镜像。

基本流程

  • 基础镜像(Cuda, Cudnn, ubuntu)
  • 基础安装(apt-get)
  • python环境建立(这里用miniconda建,因为方(省)便(心))
  • 安装各种包
  • 其他设置与清理(时区、软连接、清理等)
    下面分别说明按自己的需要构建时,要改哪些东西:

基础镜像(Cuda, Cudnn, ubuntu)

FROM nvidia/cuda:9.0-devel-ubuntu16.04
ENV CUDNN_VERSION=7.4.1.5

通过设定这两行,来指定ubuntu、cuda、cudnn版本。
FROM跟着基础镜像名,通过英伟达的镜像可以指定cuda9.0,ubuntu16.04。对于cudnn,英伟达的9.0-cudnn7-devel-ubuntu16.04镜像cudnn版本是7.0,如果想用别的版本cudnn,就用这个例子的方法即可。
ENV CUDNN_VERSION=7.4.1.5就是设定的版本。

基础安装(apt-get)

RUN apt-get update && apt-get install -y --no-install-recommends \
        build-essential \
        apt-utils curl g++ \
    cmake \
        git \
        wget \
        libopencv-dev \
        libsnappy-dev \
        python-dev \
        python-pip \
        tzdata \
        vim

这里是apt-get安装一些基础的东西,一般不用改。当然如果有需求,比如把wget换成aria2,或者前面换个下载源,都可以。

python环境建立

  • 法一,使用miniconda改python版本,这样好处是做其他一些配置会很方便,坏处是能镜像比不用miniconda大1.3G左右:

    # Create a Python 3.6 environment
    RUN /miniconda/bin/conda install -y conda-build \
    && /miniconda/bin/conda create -y --name py367 python=3.6.7 \
    && /miniconda/bin/conda clean -ya

    这里通过python=3.6.7设置python版本,可以按需改

    • 法二,在apt-get update -y后,加上这些:
      && apt-get install -y build-essential cmake git  vim curl python3.6 \
      && update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 2 \
      && update-alternatives --install /usr/bin/python python /usr/bin/python3.6 3 \
      && apt-get install -y python3-pip python3.6-dev python3-tk \
      && apt-get clean
      如果需要python2.7,就加上这个:
      && update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1 \

安装各种包

这个没啥,我们已经安了pip,直接pip install:

RUN pip install numpy==1.15.4 \
        pandas==0.20.3 \
        imgaug==0.2.9 \
        opencv_python==4.0.0.21 \
        h5py==2.7.0 \
        scikit_image==0.13.0 \
        scipy==0.19.1 \
        requests==2.18.4 \
        Pillow==6.1.0 \
        barcode_generator==0.1rc15 \
        easywebdav==1.2.0 \
        paramiko==2.6.0 \
        pydrive==1.3.1 \
        schedule==0.6.0 \
        wget \
        lxml && \
    pip install tensorflow-gpu==1.12.0 \
        Keras==2.2.4 \
        && \

注意,pip install各包直接不用&&,但是顺序很重要,被依赖的要放在前面安。这里单独把tensorflow放在后面安,确保前面的已安完了。

其他设置与清理(时区、软连接、清理等)

这里要注意两点:

  • Docker容器默认时间是UTC,如果代码运行时要用北京时间或别的时间,一个办法是生成容器时挂载这个来显示宿主机时间:-v /etc/localtime:/etc/localtime:ro; 另一个方法就是这里的,在Dockerfile里设置时区,
    ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
    这一行设置的是东京时间,如果改成Asia/Shanghai那就是北京时间(我也不知道为什么系统里用上海表示北京时间)
  • 设置cudnn软连接,因为某种奇怪的原因,tensorflow在容器里会找不到cudnn。因为cudnn7的文件是cudnn_v7.h而tf只认cudnn.h,所以要加个软连接,
    mkdir /usr/lib/x86_64-linux-gnu/include && \
      ln -s /usr/include/x86_64-linux-gnu/cudnn_v7.h /usr/lib/x86_64-linux-gnu/include/cudnn.h && \
    这里的cudnn是7,如果是别的版本的cudnn,可以先去官网看看对应版本名字是不是cudnn.h,然后按需修改。
    剩下的收尾工作,一般不用改。
    最后EXPOSE了一个端口,这个没什么影响,也可以按需修改。

镜像生成

在Dockerfile所在的目录里运行:

docker build -t {dockerhub库名}:{镜像标签名} .

注意最后是一个“.” 。
这样生成镜像,然后docker push到相应的docker hub就可以了。
例如:

docker build -t alexzhang101/fresh:v0_Tokyotime .    #生成镜像
docker login                                         #登录docker hub
docker push alexzhang101/fresh:v0_Tokyotime          #push镜像

另外,如果生成的镜像名字是个随便的名字,比如fresh:v1,那push之前只要改一下名字就好(与docker hub一致起来):

docker tag fresh:v1 alexzhang101/fresh:v0_Tokyotime

然后再docker push alexzhang101/fresh:v0_Tokyotime
别的机器使用时:docker pull alexzhang101/fresh:v0_Tokyotime
然后:docker run --runtime=nvidia -it --name freshtst1 --shm-size="1g" -v /home/alex/heatmap:/tmp alexzhang101/fresh:v0_Tokyotime
容器名freshtst1,挂载了一个目录卷/home/alex/heatmap容器内显示为/tmp,申请内存1g

相关资料

  • 附完整Dockerfile文件:
    ##### 使用miniconda设置python环境:
FROM nvidia/cuda:9.0-devel-ubuntu16.04
ENV CUDNN_VERSION=7.4.1.5
LABEL com.nvidia.cudnn.version="${CUDNN_VERSION}"  
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections

RUN apt-get update && apt-get install -y --no-install-recommends \
            libcudnn7=$CUDNN_VERSION-1+cuda9.0 \
            libcudnn7-dev=$CUDNN_VERSION-1+cuda9.0 && \
    apt-mark hold libcudnn7 
# install basics
RUN apt-get update && apt-get install -y --no-install-recommends \
        build-essential \
        apt-utils curl g++ \
    cmake \
        git \
        wget \
        libopencv-dev \
        libsnappy-dev \
        python-dev \
        python-pip \
        tzdata \
        vim
# Install anaconda for python 3.6
# Install Miniconda
RUN curl -so /miniconda.sh https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh \
 && chmod +x /miniconda.sh \
 && /miniconda.sh -b -p /miniconda \
 && rm /miniconda.sh \
 && rm -Rf /var/lib/apt/lists/* \
 && apt-get update


ENV PATH=/miniconda/bin:$PATH

# Create a Python 3.6 environment
RUN /miniconda/bin/conda install -y conda-build \
 && /miniconda/bin/conda create -y --name py367 python=3.6.7 \
 && /miniconda/bin/conda clean -ya

ENV CONDA_DEFAULT_ENV=py367
ENV CONDA_PREFIX=/miniconda/envs/$CONDA_DEFAULT_ENV
ENV PATH=$CONDA_PREFIX/bin:$PATH
ENV CONDA_AUTO_UPDATE_CONDA=false
RUN pip install numpy==1.15.4 \
        pandas==0.20.3 \
        imgaug==0.2.9 \
        opencv_python==4.0.0.21 \
        h5py==2.7.0 \
        scikit_image==0.13.0 \
        scipy==0.19.1 \
        requests==2.18.4 \
        Pillow==6.1.0 \
        barcode_generator==0.1rc15 \
        easywebdav==1.2.0 \
        paramiko==2.6.0 \
        pydrive==1.3.1 \
        schedule==0.6.0 \
        wget \
        lxml && \
    pip install tensorflow-gpu==1.12.0 \
        Keras==2.2.4 \
        && \
# ==================================================================
# config & cleanup
# ------------------------------------------------------------------
    # Set timezone
    ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
    mkdir /usr/lib/x86_64-linux-gnu/include && \
    ln -s /usr/include/x86_64-linux-gnu/cudnn_v7.h /usr/lib/x86_64-linux-gnu/include/cudnn.h && \
    ldconfig && \
    apt-get clean && \
    apt-get autoremove && \
    rm -rf /var/lib/apt/lists/* /tmp/* ~/*  

EXPOSE 6016

无miniconda版(python3):

FROM nvidia/cuda:9.0-cudnn7-devel-ubuntu16.04

ENV TZ=Asia/Tokyo

RUN rm -rf /etc/apt/sources.list.d/cuda.list /etc/apt/sources.list.d/nvidia-ml.list \
    && chmod 777 /tmp \
    && apt-get clean \
    && apt-get update  -y \
    && apt-get install -y --allow-unauthenticated wget tzdata software-properties-common python-software-properties libffi-dev libssl-dev libsm6 libxrender1 libfontconfig1 \
    && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \
    && echo $TZ > /etc/timezone \
    && add-apt-repository -y ppa:jonathonf/python-3.6 \
    && apt-get update  -y \
    && apt-get install -y build-essential cmake git  vim curl python3.6 \
    && update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 2 \
    && update-alternatives --install /usr/bin/python python /usr/bin/python3.6 3 \
    && apt-get install -y python3-pip python3.6-dev python3-tk \
    && apt-get clean 

RUN pip3 install numpy==1.15.4 \
    opencv-python==4.0.0.21 \
    imgaug==0.2.9 \
    h5py==2.7.0 \
    pandas==0.20.3 \
    scikit-image==0.13.0 \
    scipy==0.19.1 \
    requests==2.18.4 \
    Pillow==6.1.0 \
    barcode-generator==0.1rc15 \
    easywebdav==1.2.0 \
    paramiko==2.6.0 \
    pydrive==1.3.1 \
    schedule==0.6.0 \
    lxml \
        && \
    pip3 install tensorflow-gpu==1.12.0 \
    Keras==2.2.4 \
    && \
    rm -rf ~/.cache/pip/* && \
    apt-get autoremove && \
    rm -rf /var/lib/apt/lists/* /tmp/* ~/* && \
    mkdir /usr/lib/x86_64-linux-gnu/include && \
    ln -s /usr/include/x86_64-linux-gnu/cudnn_v7.h /usr/lib/x86_64-linux-gnu/include/cudnn.h
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值