基于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服务
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