Docker中的三个重要构成:Image(镜像),Container(容器),Repository(仓储)。Image相当于OOP中的类,Container相对于类实例,Repository是存放位置。
image:是一个只读模板,带有创建Docker容器的说明。
通常一个镜像是基于另一个镜像,并进行一些额外的拓展自定义。例如,用户可以构建一个基于ubuntu映像的映像,并安装Apache web服务器、应用程序以及所需的配置信息。也就是说,镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
操作系统分为内核和用户空间,Linux内核启动后,会挂载root文件系统为其提供用户空间支持。而Docker镜像就相当于是一个root文件系统,这个文件系统里面包含可以运行在 Linux 内核的程序以及相应的数据。可以创建自己的镜像,也可以只使用他人创建并在仓库中发布的镜像。
要构建自己的镜像,可以创建一个Dockerfile定义创建映像和运行映像所需的步骤。Dockerfile中的每个指令都会在映像中创建一个层。当更改Dockerfile并重建图像时,只会重建那些已更改的层。
Container:镜像运行时的实例
类似运行起来的虚拟机,里面运行着用户的的应用程序。通过一个镜像可以创建许多个互不影响的Container容器。Docker 镜像类似 Linux 的Root FileSystem,通过镜像启动一个容器。一个镜像就是一个可执行的包,其中包括运行应用程序所需要的代码、运行时、库、环境变量和配置文件等。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于独立的命名空间。容器存储层的生存周期和容器一样,皮之不存毛将焉附,容器消亡时,容器存储层也随之消亡。
Repository:集中存放镜像文件的地方
镜像构建完成后,可以在当前宿主上运行,但是如果需要在其它服务器上使用这个镜像,就需要一个类似Git仓库那样的集中存储、分发镜像的服务,Docker Registry就是这样的服务。
一个Docker
Registry中可以包含多个仓库,每个仓库可以包含多个Tag,每个Tag对应一个镜像。镜像仓库是Docker用来集中存放镜像文件的地方,类似于之前常用的代码仓库。
通常一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以latest作为默认标签。
docker 镜像操作
# dockerfile创建镜像
docker build -t image_name Dockerfile_path
eg: docker build -t ip_check . (代表当前目录)
# 列出镜像
docker images
# 拉取镜像
docker pull 镜像名
eg:docker pull python:3.5 :指定版本
# 删除镜像
docker rmi 镜像名
docker 容器操作
# 创建容器
docker run [option] 镜像名 [向启动容器中传入的命令]-i 表示以“交互模式”运行容器
-t 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即 分配一个伪终端。
--name 为创建的容器命名
-v 表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录,即 宿主机目录:容器中目录),可以使 用 多个-v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后 共享到容器上。
-d 在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不 会自动登录容器,如果只加-i - t 两个参数,创建后就会自动进去容器)。
-p 表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p 做多个端口映射
-e 为容器设置环境变量
--network=host 表示将主机的网络环境映射到容器中,容器的网络与主机相同
-i 表示以“交互模式”运行容器
-t 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即 分配一个伪终端。
# 查看容器列表
docker ps -a
# 交互式启动容器
docker run -it --name=mycentos centos
/bin/bash
# 启动已停止容器
docker start b750bbbcfd88
# 停止正在运行的容器
docker stop <容器 ID>
# 进入容器终端
docker exec -it 243c32535da7 /bin/bash
# 删除容器
docker rm 容器Id/容器名
# 保存容器为镜像
docker commit 容器名 镜像名
镜像打包与迁移
# 镜像打包成文件
docker save -o 保存的文件名 镜像名
# 异地加载镜像
docker load -i ./centos.tar
其他
# 启动docker服务
systemctl start docker
# docker 安装(centos7)
curl -fsSL https://get.docker.com | bash -s
docker --mirror Aliyun
常用命令
docker 进程
docer 进程启动、停止、重启等三种 常见操作
service docker start # 启动docker
service docker stop # 关机docker
service docker restart # 重启docker
镜像操作
镜像是容器执行的前提条件,一般需要掌握命令注意有搜索、下载、删除、创建。
docker images # 镜像列表
docker search xxx # 检索镜像, 从镜像仓库中检索
docker pull xxx # 下载镜像
docker rmi xxx # 删除镜像
容器操作
容器的各种操作主要包括,启动、关闭、重启和日志查询。
容器创建 :run
加载镜像,创建容器run 后面可以跟很多的参数,比如容器暴露端口指定,存储映射,权限等等,由于参数过多,下面只给出几个不同的例子,来具体的演示参数可以怎么加
docker run
-i # 打开 STDIN,用于控制台交互
-t # 支持终端登录
-d # 要求容器后台运行,默认前台 前三个标签可连写为itd
-v # 挂载数据卷
--name=dc_nm # 指定容器名
-p 8080:80 # 暴露容器端口 80,并与宿主机端口 8080 绑定
centos:latest # 镜像名:版本
更多参见文章。
基本操作:
容器本操作主要包括启动、停止、重启、删除
docker ps -a # 查看容器列表, 列出所有的容器
docker exec -it "ct_id" /bin/bash
# 进入容器,ct_id是容器id
# xxx可以是容器名,也可以是容器id
docker start xxx # 打开容器
docker stop xxx # 关闭容器
docker restart xxx # 重启
docker rm xxx # 删除
复制文件
# 宿主机 → 容器
docker cp 宿主机文件路径 容器名称:/home/your_path
# 容器 → 宿主机 注意,命令执行是在容器之外
docker cp 容器名称:/home/file.txt /home/宿主机目录
案例:搭建深度学习环境
创建docker
sudo apt-get install docker.io
docker -v #
# 避免docker操作必须要sudo,将当前用户加入docker用户组
sudo usermod -aG docker ${YOUR_NAME_HERE} # 自己好像没起作用
docker image ls
Nvidia-docker安装
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
&& curl -fsSL
https://nvidia.github.io/libnvidia-container/gpgkey | \
sudo gpg --dearmor -o
/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
&& curl -s -L
https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list
| \
sed 's#deb https://#deb
[signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg]
https://#g' | \
sudo tee
/etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
sudo apt-get install -y nvidia-docker2
sudo pkill -SIGHUP dockerd
检查安装是否成功
sudo docker run --rm --gpus all nvidia/cuda:11.3.1-base-ubuntu20.04
nvidia-smi
输出
创建容器
NVIDIA为Docker创建了CUDA的image,所以我们只需要找相应的镜像来直接生成container就好。
sudo docker pull nvidia/cuda:11.3.1-cudnn8-devel-ubuntu20.04
拉取镜像成功之后,创建容器
sudo docker run -itd -v ~/work:/work
-rm # 代表退出容器后就删除容器
--name=UOS20_NERF
--gpus all
nvidia/cuda:11.3.1-cudnn8-devel-ubuntu20.04
运行起container,通过nvidia-smi与nvcc -V进行检查,如果打印信息版本显示正常,则说明成功。
问题:nvidia-smi显示的是cuda 12.1,不是我预想的11.3。nvcc -V得到的是预期结果,不知道是不是安装有问题?
部署深度学习环境
进入容器
sudo docker exec -it 7d911f22e498 /bin/bash // 方法1
sudo docker attach 容器名称 // 方法2
安装所需要的环境,
apt-get update
apt-get install sudo
sudo apt-get install vim
替换源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo vim /etc/apt/sources.list
# sources.list内粘贴以下内容
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe
multiverse
#deb-src http://mirrors.aliyun.com/ubuntu/ focal main
restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted
universe multiverse
#deb-src http://mirrors.aliyun.com/ubuntu/ focal-security
main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted
universe multiverse
#deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates
main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted
universe multiverse
#deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed
main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted
universe multiverse
#deb-src http://mirrors.aliyun.com/ubuntu/
focal-backports main restricted universe multiverse
安装GCC
10,cmake
sudo apt install gcc-8 g++-8
# Ubuntu20默认情况下没有安装gcc和g++等工具
sudo apt install gcc-11 g++-11 # 这样装不上
sudo apt-get install software-properties-common
sudo apt-get update
sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test
sudo apt install -y gcc-11
sudo apt install -y g++-11
sudo apt install cmake # 可能默认的低版本不是自己需要的
安装3.21
sudo apt install wget
wget https://cmake.org/files/v3.22/cmake-3.22.1.tar.gz
sudo tar -xvzf cmake-3.22.1.tar.gz -C /usr/share
cd /usr/share/cmake-3.22.1
sudo ./configure
sudo chmod 777 ./configure
sudo apt install libssl-dev # 上一句失败,运行这一句
sudo make -j4
sudo make install
sudo update-alternatives --install /usr/bin/cmake cmake
/usr/local/bin/cmake 1 --force
安装python
sudo apt install python3
sudo ln -s /usr/bin/python3 /usr/bin/python
# 替换pip源
pip config set global.index-url
https://pypi.tuna.tsinghua.edu.cn/simple
pip config set install.trusted-host mirrors.aliyun.com
安装miniconda
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash *.sh
export PATH=/root/miniconda3/bin:$PATH # conda 的位置
source ~/.bashrc
后面的深度学习环境部署就和直接在本地机器上部署一样了。
Dockerfile编写
以上步骤可以通过Dockerfifile配置文件完成。Dockerfifile 是一个文本文件,包含了一条条的指令。每一条指令构建一层。基于基础镜像,最终构建出一个新的镜像。
在本地新建docker环境文件夹,将Dockerfile放入文件夹中,执行
mkdir docker
cd docker
vim Dockerfile
# 制作docker image
docker build -t IMAGE_NAME .
# 运行生成容器
docker run --runtime=nvidia -it --rm IMAGE_NAME /bin/bash
即可快速搭建相应的镜像环境,也可以自己写Dockerfile,来创建环境,环境有修改的时候可以直接修改Dockerfile,这样下次再创建相同环境的时候就很方便了,并且可以push到自己的私有库,方便异地使用
Dockerfile配置文件(根据网络参考改写,自己尚未运行,可能有问题)
# 定义父镜像
sudoFROM nvidia/cuda:11.3.1-cudnn8-devel-ubuntu20.04
# 定义作者信息
MAINTAINER Winston
# 定义工作目录
WORKDIR /src
# install basic dependencies
RUN apt-get update
RUN apt-get install -y wget vim cmake
# install miniconda3
RUN wget
https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O
~/Miniconda3-latest-Linux-x86_64.sh.sh
RUN bash ~/Miniconda3-latest-Linux-x86_64.sh.sh -b -p /home/miniconda3 &&
rm ~/Miniconda3-latest-Linux-x86_64.sh.sh
ENV PATH /home/miniconda3/bin:$PATH
# change mirror
RUN mkdir ~/.pip && cd ~/.pip
RUN echo -e "[global]\nindex-url = https://pypi.mirrors.ustc.edu.cn/simple/" >>
~/pip.conf
RUN /home/miniconda3/bin/pip install --upgrade pip
RUN /home/miniconda3/bin/pip install numpy==1.16.0
RUN /home/miniconda3/bin/pip install matplotlib
RUN /home/miniconda3/bin/pip install scipy
RUN /home/miniconda3/bin/pip install sklearn
RUN /home/miniconda3/bin/pip install echarts
RUN /home/miniconda3/bin/pip install tensorflow-gpu==1.9.0
RUN /home/miniconda3/bin/pip install torch===1.2.0 torchvision===0.4.0
-f https://download.pytorch.org/whl/torch_stable.html
参考: