title: docker 用 dockerfile 制作镜像
tags:

  • 虚拟化
  • 容器

Docker 是近年来非常火的容器技术,而且Docker不仅仅是红帽和Canonical等Linux巨头眼里的宠儿,微软等专有软件公司也在热烈拥抱 Docker,可想而知 Docker技术有多么火了。

docker与nvidia-docker的安装

ubuntu安装docker
Nvidia-Docker安装使用 -- 可使用GPU的Docker容器
具体安装方法参考官方github文档
值得注意的是上面的教程都是针对 nvidia-docker 1.0版本的,而最近我测试安装时不成功的,所以我安装了最新的nvidia-docker 2.0, nvidia-docker 2.0要求docker 版本为 18.06.0-ce,而这个版本的docker 使用apt-get 是无法安装的,所以我们从官网手动下载deb文件,进行安装。

docker 各版本下载位置

卸载老版本的docker

apt-get remove docker-ce

下载安装新版本的docker

wget https://download.docker.com/linux/ubuntu/dists/trusty/pool/stable/amd64/docker-ce_18.06.0~ce~3-0~ubuntu_amd64.deb 
dpkg -i docker-ce_18.06.0~ce~3-0~ubuntu_amd64.deb  
rm docker-ce_18.06.0~ce~3-0~ubuntu_amd64.deb  

然后安装nvidia-docker的github的方式安装nvidia-docker-2.

使用dockerfile制作docker镜像

Dockerfile的指令根据作用可以分为两种,构建指令和设置指令

  • 构建指令用于构建image,其指定的操作不会在运行image的容器上执行;
  • 设置指令用于设置image的属性,其指定的操作将在运行image的容器中执行。

构建指令

FROM(指定基础image)
必须指定且需要在Dockerfile其他指令的前面。

FROM 镜像名:标签名

MAINTAINER(用来指定镜像创建者信息)

MAINTAINER 作者名

RUN(安装软件用)
RUN可以运行任何被基础image支持的命令。如基础image选择了ubuntu,那么软件管理部分只能使用ubuntu的命令。

RUN <command> (the command is run in a shell - /bin/sh -c)
RUN ["executable", "param1", "param2" ... ] 

** CMD(设置container启动时执行的操作)**

CMD ["executable","param1","param2"]

ENV(用于设置环境变量)
ENV指令可以用于为docker容器设置环境变量,ENV设置的环境变量,可以使用docker inspect命令来查看。同时还可以使用docker run --env =来修改环境变量。

ENV <key> <value>

** ADD(从src复制文件到container的dest路径)**
如果是一个目录,那么会将该目录下的所有文件添加到container中,不包括目录;如果文件是可识别的压缩格式,则docker会帮忙解压缩(注意压缩格式);如果是文件且中不使用斜杠结束,则会将视为文件,的内容会写入;如果是文件且中使用斜杠结束,则会文件拷贝到目录下。

ADD <src> <dest>
  • 是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件url;
  • 是container中的绝对路径

** COPY(复制本地主机的src文件为container的dest) **
复制本地主机的src文件(为Dockerfile所在目录的相对路径、文件或目录 )到container的dest。目标路径不存在时,会自动创建。

COPY <src> <dest>

当使用本地目录为源目录时,推荐使用COPY

构建镜像

使用当前目录的 Dockerfile 创建镜像,标签为 runoob/ubuntu:v1。

docker build -t runoob/ubuntu:v1 .

安装脚本

echo "install gfortran"
apt-get install -y gfortran
export LDFLAGS=-L/usr/lib/gcc/x86_64-linux-gnu/4.7/
echo "install open blas"
git clone git://github.com/xianyi/OpenBLAS
cd OpenBLAS && make FC=gfortran >/dev/null && make PREFIX=/usr/local install ; cd -
apt-get install -y libopenblas-base
#apt-get install libgtest-dev
#cd /usr/src/gtest && cmake . && cmake --build . && mv libg* /usr/local/lib/ ; cd -

安装gtest

清华pypi镜像站
ubuntu安装gcc5.4

编译glibc(gcc)以及过程中遇到的一些错误

安装cudnn

dockerfile 例子

FROM gitlabci/cuda8.0_gcc4.9:latest
MAINTAINER maxiaolong maxiaolong@sensetime.com

# install gfortran
ADD sources.list /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y gfortran
RUN export LDFLAGS=-L/usr/lib/gcc/x86_64-linux-gnu/4.7/
RUN echo "install open blas"
RUN git clone git://github.com/xianyi/OpenBLAS
#RUN cd /OpenBLAS && make FC=gfortran >/dev/null && make PREFIX=/usr/local install && cd -
RUN apt-get install -y libopenblas-base
# set gcc4.8
RUN rm /usr/bin/gcc && ln -s /usr/bin/gcc-4.8 /usr/bin/gcc
# install GTest
RUN apt-get install -y cmake wget unzip
RUN git clone https://github.com/google/googletest.git
RUN cd googletest/googletest &&  cmake . &&  make
RUN mkdir /usr/local/gtest && cp -r googletest/googletest /usr/local/gtest/gtest-4.8
# install nccl
RUN git clone https://github.com/NVIDIA/nccl.git
RUN cd nccl  && make install -j4

# install cudnn
COPY cudnn-8.0-linux-x64-v6.0.tgz cudnn-8.0-linux-x64-v6.0.tgz
RUN tar zxvf cudnn-8.0-linux-x64-v6.0.tgz && cp cuda/include/cudnn.h /usr/local/cuda/include && cp cuda/lib64/libcudnn* /usr/local/cuda/lib64 && chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

# install gcc5.4
RUN wget http://ftp.gnu.org/gnu/m4/m4-1.4.18.tar.gz  && gunzip m4-1.4.18.tar.gz && tar -xvf m4-1.4.18.tar && cd m4-1.4.18/ &&  ./configure && make && make install

RUN wget https://gmplib.org/download/gmp/gmp-6.1.2.tar.xz && tar -Jxvf gmp-6.1.2.tar.xz && mkdir temp && cd temp && ../gmp-6.1.2/configure --prefix=/usr/local/gmp-6.1.2  && make && make install

Run wget https://www.mpfr.org/mpfr-3.1.6/mpfr-3.1.6.zip &&  unzip mpfr-3.1.6.zip && rm -rf temp && mkdir temp && cd temp && ../mpfr-3.1.6/configure --prefix=/usr/local/mpfr-3.1.6 --with-gmp=/usr/local/gmp-6.1.2 && make && make install


RUN wget https://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz && tar -zxvf mpc-1.0.3.tar.gz && rm -rf temp && mkdir temp && cd temp && ../mpc-1.0.3/configure --prefix=/usr/local/mpc-1.0.3 --with-gmp=/usr/local/gmp-6.1.2 --with-mpfr=/usr/local/mp
fr-3.1.6 && make && make install

RUN unset LIBRARY_PATH && wget ftp://ftp.mirrorservice.org/sites/sourceware.org/pub/gcc/releases/gcc-5.4.0/gcc-5.4.0.tar.gz &&  tar -zxvf gcc-5.4.0.tar.gz && rm -rf temp && mkdir temp && cd temp && ../gcc-5.4.0/configure --prefix=/usr/lo
cal/gcc-5.4 --enable-threads=posix --disable-checking --disable-multilib --enable-languages=c,c++ --with-gmp=/usr/local/gmp-6.1.2 --with-mpfr=/usr/local/mpfr-3.1.6 --with-mpc=/usr/local/mpc-1.0.3 && make && make install

RUN rm -rf /temp/
# set the gcc


# install python and pip
RUN apt-get install -y python2.7 python-pip python3.5 python3-pip python-dev python3-dev python3.5-dev cython libhdf5-dev python-numpy python3-numpy build-essential
RUN cd /usr/bin && rm python3 && ln -s python3.5 python3
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pytest-runner flake8 colorlog pyyaml numpy
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple cython requests setuptools --upgrade
RUN pip install h5py

RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple pytest-runner flake8 colorlog pyyaml
RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy cython requests setuptools --upgrade
RUN pip3 install h5py


RUN cd /OpenBLAS && make FC=gfortran >/dev/null && make PREFIX=/usr/local install && cd -
# make the gtest for gcc5.4

RUN rm /usr/bin/gcc && ln -s /usr/local/gcc-5.4/bin/gcc /usr/bin/gcc

RUN mkdir temp && cd temp &&  git clone https://github.com/google/googletest.git && cd googletest/googletest && cmake . && make && cd .. && cp -r googletest /usr/local/gtest/gtest-5.4

RUN rm -rf temp && rm /usr/bin/gcc && ln -s /usr/bin/gcc-4.8 /usr/bin/gcc

cuda9 + cudnn 7

FROM registry.sensetime.com/jiangbo/cuda9_ubuntu16.04:opencv
MAINTAINER maxiaolong maxiaolong@sensetime.com

# install gfortran
ADD sources.list /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y gfortran
RUN export LDFLAGS=-L/usr/lib/gcc/x86_64-linux-gnu/4.7/
RUN echo "install open blas"
RUN git clone git://github.com/xianyi/OpenBLAS
#RUN cd /OpenBLAS && make FC=gfortran >/dev/null && make PREFIX=/usr/local install && cd -
RUN apt-get install -y libopenblas-base
# set gcc4.8
RUN rm /usr/bin/gcc && ln -s /usr/bin/gcc-4.8 /usr/bin/gcc
# install GTest
RUN apt-get install -y cmake wget unzip
RUN git clone https://github.com/google/googletest.git
RUN cd googletest/googletest &&  cmake . &&  make
RUN mkdir /usr/local/gtest && cp -r googletest/googletest /usr/local/gtest/gtest-4.8
# install nccl
RUN git clone https://github.com/NVIDIA/nccl.git
RUN cd nccl  && make install -j4

# install cudnn
COPY cudnn-7.0.tgz cudnn-7.0.tgz
RUN tar zxvf cudnn-7.0.tgz && cp cuda/include/cudnn.h /usr/local/cuda/include && cp cuda/lib64/libcudnn* /usr/local/cuda/lib64 && chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

# install gcc5.4
RUN wget http://ftp.gnu.org/gnu/m4/m4-1.4.18.tar.gz  && gunzip m4-1.4.18.tar.gz && tar -xvf m4-1.4.18.tar && cd m4-1.4.18/ &&  ./configure && make && make install

RUN wget https://gmplib.org/download/gmp/gmp-6.1.2.tar.xz && tar -Jxvf gmp-6.1.2.tar.xz && mkdir temp && cd temp && ../gmp-6.1.2/configure --prefix=/usr/local/gmp-6.1.2  && make && make install

Run wget https://www.mpfr.org/mpfr-3.1.6/mpfr-3.1.6.zip &&  unzip mpfr-3.1.6.zip && rm -rf temp && mkdir temp && cd temp && ../mpfr-3.1.6/configure --prefix=/usr/local/mpfr-3.1.6 --with-gmp=/usr/local/gmp-6.1.2 && make && make install


RUN wget https://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz && tar -zxvf mpc-1.0.3.tar.gz && rm -rf temp && mkdir temp && cd temp && ../mpc-1.0.3/configure --prefix=/usr/local/mpc-1.0.3 --with-gmp=/usr/local/gmp-6.1.2 --with-mpfr=/usr/local/mp
fr-3.1.6 && make && make install

RUN unset LIBRARY_PATH && wget ftp://ftp.mirrorservice.org/sites/sourceware.org/pub/gcc/releases/gcc-5.4.0/gcc-5.4.0.tar.gz &&  tar -zxvf gcc-5.4.0.tar.gz && rm -rf temp && mkdir temp && cd temp && ../gcc-5.4.0/configure --prefix=/usr/lo
cal/gcc-5.4 --enable-threads=posix --disable-checking --disable-multilib --enable-languages=c,c++ --with-gmp=/usr/local/gmp-6.1.2 --with-mpfr=/usr/local/mpfr-3.1.6 --with-mpc=/usr/local/mpc-1.0.3 && make && make install

RUN rm -rf /temp/
# set the gcc


# install python and pip
RUN apt-get install -y python2.7 python-pip python3.5 python3-pip python-dev python3-dev python3.5-dev cython libhdf5-dev python-numpy python3-numpy build-essential
RUN cd /usr/bin && rm python3 && ln -s python3.5 python3
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pytest-runner flake8 colorlog pyyaml numpy
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple cython requests setuptools --upgrade
RUN pip install h5py

RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple pytest-runner flake8 colorlog pyyaml
RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy cython requests setuptools --upgrade
RUN pip3 install h5py

RUN cd /OpenBLAS && make FC=gfortran >/dev/null && make PREFIX=/usr/local install && cd -

# make the gtest for gcc5.4
RUN rm /usr/bin/gcc && ln -s /usr/local/gcc-5.4/bin/gcc /usr/bin/gcc
RUN mkdir temp && cd temp &&  git clone https://github.com/google/googletest.git && cd googletest/googletest && cmake . && make && cd .. && cp -r googletest /usr/local/gtest/gtest-5.4
RUN rm -rf temp && rm /usr/bin/gcc && ln -s /usr/bin/gcc-4.8 /usr/bin/gcc

reference

使用Dockerfile构建Docker镜像

[Docker build 命令](