【Linux】Dockerfile 创建centos下pytorch程序运行环境的镜像

目的:

基于pytorch框架实现了一个卷积神经网络,现想创建该程序的运行镜像。

程序运行所需要的环境:

Centos

CUDA 8.0 

cudnn 7

ffmpeg

Anaconda3.4

cv2

Pytorch0.4.1

流程:

0. 我的程序在test文件夹下,因此先进入test文件夹所在的路径

1. 编写Dockerfile

2. service docker start 开启Docker服务

3. docker build 指令创建镜像 (docker build -t imageName:tag .)

4. docker tag 给本地镜像打标签 (docker tag 本地镜像名:标签 远程仓库名/镜像名/标签)

4. docker push 发布镜像(登陆仓库之后)(docker push 远程仓库名/镜像名/标签)

5. service docker stop 停止Docker服务

Dockerfile:

FROM nvidia/cuda:8.0-cudnn7-devel-centos7 #  基础镜像
LABEL maintainer "bbp94" #维护者信息

# 安装bzip2
RUN yum -y install bzip2

# 安装ffmpeg
RUN yum install -y epel-release && \
    rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 && \
    rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro && \
    rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm && \
    yum install -y ffmpeg

# 安装Anaconda
COPY ./Anaconda3-4.2.0-Linux-x86_64.sh /tmp/Anaconda3-4.2.0-Linux-x86_64.sh
WORKDIR /tmp
RUN sh -c '/bin/echo -e "\nyes\n\nyes" | sh Anaconda3-4.2.0-Linux-x86_64.sh'

#设置环境变量
ENV PATH /root/anaconda3/bin:$PATH

#安装opencv 和 threadpool 和 pytorch
COPY ./opencv_python-3.4.3.18-cp35-cp35m-manylinux1_x86_64.whl /tmp/opencv_python-3.4.3.18-cp35-cp35m-manylinux1_x86_64.whl
COPY ./torch-0.4.1-cp35-cp35m-linux_x86_64.whl /tmp/torch-0.4.1-cp35-cp35m-linux_x86_64.whl

RUN pip install threadpool && \
    pip install opencv_python-3.4.3.18-cp35-cp35m-manylinux1_x86_64.whl && \
    pip install torch-0.4.1-cp35-cp35m-linux_x86_64.whl && \
    pip install torchvision

# 设置软连接
RUN rm -rf /usr/bin/python && ln -s /root/anaconda3/bin/python /usr/bin/python

解释:

1. Dockerfile 有规定第一行必须是From命令行,From 后跟基础镜像,开源的基础镜像可以从Docker的官网获取,如在搜索框输入centos,就能得到一系列的相关基础镜像。若是不需要基础镜像,可以写From scrach代表空白镜像。

2. 安装bzip2,文件压缩工具,这是后续安装其他环境所需要的工具。

3. 安装Anaconda。安装过程中会询问安装路径之类的,所以加上sh -c '/bin/echo -e "\nyes\n\nyes" 即按询问的顺序回车,yes。ENV表示设置环境变量。

4. 安装程序所需要的其他库,如cv2。

5. 安装pytorch。由于本地已经存在whl文件,所以直接copy过来安装,若是不存在,可以直接pip install url。相关安装命令可以去pytorch官网查看。

6. 设置软连接,因为程序规定要使用/usr/bin/python xxx.py来执行程序,而/usr/bin/python指向系统自带的python2.7,因此先删除原先的软连接,再新建软连接指向python3。

创建好之后,可以用Docker build -t name:tag  . 来创建镜像,.表示build 上下文为当前目录,若是要指定其他目录为上下文可将.替换为目录路径指定。

 

总结:

个人的理解,以Dockerfile创建镜像,Dockerfile像一个shell脚本,把安装环境的步骤写进Dockerfile,再用build命令执行该“脚本”。RUN后面的命令行和用shell命令行安装环境所使用的命令行是一样的。

管理镜像:

创建过程中建议常用df -h指令查看磁盘使用情况,由于创建不当,往往会创建出好几个G的镜像,为避免root分区满载,因此对没用的容器和镜像要及时删除。

1. docker images可以查看当前存在的镜像

2. docker rmi 镜像ID 删除某镜像 

3. 遇到删除镜像失败并提示某容器正在使用该镜像时,可以先停止所有的container,指令:

docker stop $(docker ps -a -q)

再查看当前存在的容器:docker ps -a

删除容器指令:docker rm 容器ID

然后再重新执行删除镜像的命令

其他:

Pull 大镜像,如超过10G的镜像,会出现No space left on device的错误,主要原因有三个:

1.用df -h 查询磁盘空间是否不足。docker下载镜像默认存储在/var/lib/docker,该目录往往空间比较小,可以使用软链接指向空间更大的目录。

关闭docker服务:sudo service docker stop

新建/home/docker/作为目标目录:mkdir -p /home/docker

将/var/lib/docker下的文件拷贝到/home/docker/:cp -rf  /home/docker/*  /home/docker/

删除/var/lib/docker目录(可以在删除之前做个备份,以防万一):cd /var/lib/docker | rm -rf *(千万不要删错噢)

创建软连接,目标目录为/home/docker/  :ln -s /home/docker/  var/lib/docker

重启docker服务,就好了

2.用df -i查询inode是否不足。若不足,请查询资料按步骤清理不必要的inode

3.docker 配置文件空间限制,可用docker info查询当前配置。

关闭docker服务

设置空间:

设置data space total为1T

dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1G count=0 seek=1000

设置metadata space total为20G
dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/metadata bs=1G count=0 seek=20

重启docker:systemctl daemon-reload

                   systemctl restart docker

 

你可能感兴趣的:(linux,Docker)