Docker-学习笔记
资料
docker.org.cn
知乎资料
Docker — 从入门到实践
docs docker
docs nvivida docker
Image,Container,Rigistry基本概念
镜像image:Docker Image 相当于一个 root 文件系统。除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像 不包含 任何动态数据,其内容在构建之后也不会被改变。
容器container:镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。
注册服务器,仓库: 镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是管理仓库的具体的服务器。
一个 Docker Registry 中可以包含多个仓库(Repository),一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像
install docker
step 1: install docker and nvidia docker2
docker install
nvidia-docker2
#安装curl
$ sudo apt install curl
$ curl https://get.docker.com | sh && sudo systemctl --now enable docker
$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
> && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
> && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ sudo apt-get update
$ sudo apt-get install -y nvidia-docker2
$ sudo systemctl restart docker
# test by running a base CUDA container:
$ sudo docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi
Unable to find image 'nvidia/cuda:11.0-base' locally
step 2: 建立docker用户组
$ sudo groupadd docker
$ sudo gpasswd -a $USER docker
$ newgrp docker
# 查看镜像
$ docker images
创建 image
# pull 一个镜像下来
docker pull pytorch/pytorch:1.9.0-cuda11.1-cudnn8-devel
1.9.0-cuda11.1-cudnn8-devel: Pulling from pytorch/pytorch
# 基于这个镜像,根据Dockerfile配置一个新的镜像
## step1 写一个Dockerfile文件
## step2
$ cd DockerFile
$ docker build -t test:v1 .
# 这样就生成了一个test的镜像,tag为v1
# 新建container名为mmdetection
$ docker run -it --gpus all -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY -e QT_X11_NO_MITSHM=1 -p 8080:8080 -p 8888:8888 -d -v /home/si/SIINNO/:/SIINNO/ --shm-size='8g' --name mmdetection test:v1
# 查看是否建好
$ docker ps -a
# 进入容器
$ docker attach mmdetection
# Expose the X server on the host.
$ xhost +local:root
# 配置容器环境
$ docker run \
-it \
--gpus all \
-e NVIDIA_DRIVER_CAPABILITIES=all \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-e DISPLAY=$DISPLAY \
-e QT_X11_NO_MITSHM=1 \
glvnd-x \
bash
#Inside the container, a good way to test that the GPU is being used is to install and run the OpenGL benchmark application glmark2.
$ apt-get update \
&& apt-get install -y -qq glmark2 \
$ glmark2
在container上配置环境
跑的网络所需要的环境配置,一般会根据 docker/requirestment.txt
下载最好用阿里源,在command后面加 -i https://mirrors.aliyun.com/pypi/simple/
安装时注意修改对应的 cuda/pytorch version
导出/导入/删除容器
docker export mmdetection > mmd.tar
#从容器快照文件中导入镜像
$ cat mmd.tar | docker import - test/mmd:v2
$ docker container rm mmdetection
$ docker commit my_container my_image
指令
# start a container, while docker is stopped
$ docker start ContainerName
$ docker container start
$ docker container stop
$ docker container restart
# log-in to a running container, when it is log-out before
$ docker attach ContainerName
# 退出容器
$ exit
# 查看运行过的容器
$ docker ps -a
# 查看镜像
$ docker images
# push image to Docker Hub
$ docker push imageName:Tag
数据卷, 本地文件挂载
数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
-
数据卷 可以在容器之间共享和重用
-
对 数据卷 的修改会立马生效
-
对 数据卷 的更新,不会影响镜像
-
数据卷 默认会一直存在,即使容器被删除
创建/挂载/删除