Docker 简介
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
Docker Images (镜像)
:镜像是一个包含程序运行必要以来环境和代码的只读文件,它采用分层的文件系统,将每一层的改变以读写层的形式增加到原来的只读文件上,属于静态文件,类似于程序中的类。
Docker Containers (容器)
:由镜像文件生成的硬件载体,相当于轻量级的虚拟机,类似于程序中的实例。
Docker 机制中各个部分的关系概括为下图:
1 镜像
1.1 镜像基本命令
$ docker images # 查看本机镜像文件
$ docker rmi ImagesName:tag/id # 删除镜像文件
1.2 构建镜像
通过 docker file 构建新的镜像。
$ docker build -f /path/to/a/Dockerfile -t ImageName:ImageTag
# -f : Dockerfile文件路径
# -t : 新建镜像的名字:新建镜像的版本标签
以下为dockerfile的示例。
# Docker File Sample.
# Basic image
FROM nvidia/cuda:11.3.0-cudnn8-devel-ubuntu18.04
RUN sed -i "s/archive.ubuntu./mirrors.aliyun./g" /etc/apt/sources.list
RUN sed -i "s/deb.debian.org/mirrors.aliyun.com/g" /etc/apt/sources.list
RUN sed -i "s/security.debian.org/mirrors.aliyun.com\/debian-security/g" /etc/apt/sources.list
RUN sed -i "s/httpredir.debian.org/mirrors.aliyun.com\/debian-security/g" /etc/apt/sources.list
RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
# Install basics
RUN apt-get update -y \
&& apt-get install build-essential \
&& apt-get install -y apt-utils git curl ca-certificates bzip2 tree htop wget \
&& apt-get install -y libglib2.0-0 libsm6 libxext6 libxrender-dev bmon iotop g++ python3.7 python3.7-dev python3.7-distutils
# Install cmake v3.13.2
RUN apt-get purge -y cmake && \
mkdir /root/temp && \
cd /root/temp && \
wget https://github.com/Kitware/CMake/releases/download/v3.13.2/cmake-3.13.2.tar.gz && \
tar -xzvf cmake-3.13.2.tar.gz && \
cd cmake-3.13.2 && \
bash ./bootstrap && \
make && \
make install && \
cmake --version && \
rm -rf /root/temp
# Install python
RUN ln -sv /usr/bin/python3.7 /usr/bin/python
RUN wget https://bootstrap.pypa.io/get-pip.py && \
python get-pip.py && \
rm get-pip.py
# Install python packages
RUN PIP_INSTALL="python -m pip --no-cache-dir install" && \
$PIP_INSTALL numpy==1.19.3 llvmlite numba
1.3 拉取镜像
docker hub 提供了丰富的官方和第三方的镜像文件,搜索指定环境和版本,可直接复制 docker 命令到终端进行镜像文件的拉取。以pytorch为例,再docker hub中搜索pytorch,在Tags选项可以选取不同的版本。
将TAG对应的命令复制到终端中即可拉取对应版本的镜像。
$ docker pull bitnami/pytorch:latest
2 容器
2.1 容器基本命令
$ docker ps # 查看运行中的容器
$ docker ps -a # 查看所有的容器
$ docker stop ContainerName/id # 停止运行中的容器
$ docker start ContainerName/id # 启动已停止的容器
$ docker restart ContainerName/id # 重启容器
$ exit # 退出容器,可能停止进程
$ Ctrl + P + Q # 退出容器,不停止进程
$ docker rm ContainerName/id # 根据容器id删除容器(不能删除正在运行中的容器)
$ docker rm -f ContainerName/id # 强制删除指定容器(正在运行中的容器也可删除)
2.2 容器创建
通过 docker run
命令, 可以通过指定的镜像文件创建并运行一个容器,类似于编程语言中的对象实例化。
# docker run command sample.
$ docker run -it --gpus=all -e NVIDIA_DRIVER_CAPABILITIES=compute,utility -e NVIDIA_VISIBLE_DEVICES=all -v /home/junjie/IA-SSD/:/IA-SSD --name junjie_IA-SSD pytorch/pytorch:1.11.0-cuda11.3-cudnn8-devel /bin/bash
# -i : 交互式操作
# -t : 终端
# --gpus : 给定该容器的可使用的GPU权限
# -e : GPU设备的使用方式:cuda计算与程序
# -v : 宿主机与容器的文件映射(映射目录时宿主机与容器的目录实时同步,映射文件时容器关闭后同步)
# -v : 多目录映射(挂载)
# --name : 创建的容器的名称
# pytorch/pytorch:1.11.0-cuda11.3-cudnn8-devel : 使用的镜像文件
# /bin/bash : 交互式的Shell
2.3 进入容器
运行 docker run
命令之后,已经进入了容器的工作空间中。通过cd /
命令可以访问容器的根目录,挂载的文件夹可以在其中找到。
# In container workspace
root@fc40436c1c48:/IA-SSD# cd /
root@fc40436c1c48:/# ls
IA-SSD NGC-DL-CONTAINER-LICENSE bin boot dev etc home lib ...
dockers exec
: 进入已运行的容器,并且执行命令,退出容器该让其不会停止。
此时执行**exit
会退出容器但不会停止容器运行。**
# docker exec command
# 进入对应的容器,执行bash
$ docker exec -it CONTAINERNAME/CONTAINERID /bin/bash
docker attach
: 将本机的标准输入(键盘)、标准输出(屏幕)、错误输出(屏幕)附加到一个运行的容器。本机的输入直接输到容器中,容器的输出会直接显示在本机的屏幕上。
此时执行**exit
: 会退出容器并且停止容器运行。**
VS Code的丰富扩展为开发人员提供了便利,通过安装一下两个扩展,可以更加边界地进行调试。
Docker & Docker Explorer
VS Code扩展中安装 Docker
或 Docker Explorer
扩展,可以看到宿主机的镜像文件和容器,并且可以在右键菜单中对容器进行启动、停止。
Remote - Containers
安装 Remote -Containers
扩展,可以远程连接正在运行中的容器,进入到容器的文件目录中。在运行中的容器的右键菜单中选中 Attach Visual Studio Code
,输入远程密码后即可进入容器文件目录。
进入容器后的文件目录如下图