在不同计算机上进行相同的环境配置一直是一大难题,虚拟机(virtual machine)是一种传统的解决方案,然而具有启动慢、资源占用多、冗余步骤多等缺点。
由于虚拟机的这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。由于容器是进程级别的,相比虚拟机有体积小、启动快、资源占用少等优势。
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
Docker 的主要用途,目前有提供一次性的环境、提供弹性的云服务、组建微服务架构三大类。
Docker 是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。企业版包含了一些收费服务,个人开发者一般用不到。
这里只介绍在 Ubuntu x86_64 上安装 Docker CE 的相关步骤:
sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
sudo docker version # 或 sudo docker info
sudo service docker start # 或 sudo systemctl start docker
为了在 Docker 中使用 GPU,还需要安装 NVIDIA Docker
sudo docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f
sudo apt-get purge -y nvidia-docker
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
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 pkill -SIGHUP dockerd
sudo docker run --runtime=nvidia --rm nvidia/cuda:8.0-cudnn6-runtime nvidia-smi
运行使用 GPU 的 Docker 时,需要使用 nvidia-docker … 命令替代原有的 docker … 命令
通过 Docker 官方镜像加速,中国区用户能够快速访问最流行的 Docker 镜像。该镜像托管于中国大陆,本地用户现在将会享受到更快的下载速度和更强的稳定性,从而能够更敏捷地开发和交付 Docker 化应用。
使用 sudo 权限打开 /etc/default/docker 文件,在文件底部加上一行:
DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com"
重启服务:
sudo service docker restart
【注】下文中:
REPO 表示云端网址或官方/本地镜像名
TAG 表示所属镜像的特定标签,如果不指定 TAG 则默认标签为 latest
ID 表示通过 ls 查看到的镜像或容器的 id
sudo docker image ls -a # 查看所有镜像列表
sudo docker container ls -a # 查看所有容器列表
sudo docker login --username=USER SITE
sudo docker pull REPO:TAG
sudo docker push REPO:TAG
sudo docker search REPO
sudo nvidia-docker run -it --user root REPO:TAG /bin/bash
其中,参数 -it 表示将容器的 Shell 映射到当前的 Shell,然后在本机窗口输入的命令,就会传入容器;可选参数 -d 表示后台运行;可选参数 -rm 表示容器运行结束后自动删除;–user root 表示以 root 用户身份运行容器,具备所有权限;运行指令 /bin/bash 表示容器启动以后,内部第一个执行的命令,这里启动 Bash,保证用户可以使用 Shell
进入容器后结束运行并退出:Ctrl + D
进入容器后后台运行并退出:Ctrl + P + Q
sudo docker start ID # 运行已停止容器
sudo docker stop ID # 停止已运行容器
sudo nvidia-docker attach ID # 进入后台已运行容器
sudo docker cp 本地位置 ID:容器位置 # 本地文件复制到容器
sudo docker cp ID:容器位置 本地位置 # 容器文件复制到本地
sudo docker commit -m="MEMO" -a="AUTHOR" ID REPO:TAG
其中,ID 为容器 id,-m 与 -a 为可选信息
sudo docker tag ID REPO:TAG
其中,ID 为镜像 id
sudo docker save -o FILE REPO:TAG # 保存镜像到文件
sudo docker load -i FILE # 载入镜像文件
sudo docker rmi ID # 删除镜像
sudo docker rm ID # 删除容器
常用镜像:
Ubuntu
CUDA
PyTorch
anibali/PyTorch
TensorFlow
Caffe
Caffe2
……
更多可在 Docker Hub 上进行搜索
[1] Enterprise Application Container Platform | Docker
[2] Get Docker CE for Ubuntu | Docker Documentation
[3] Get Started, Part 1: Orientation and setup | Docker Documentation
[4] Docker Documentation | Docker Documentation
[5] Docker Hub
[6] GitHub - NVIDIA/nvidia-docker: Build and run Docker containers leveraging NVIDIA GPUs
[7] 镜像加速 | Docker 中国
[8] Docker 入门教程 - 阮一峰的网络日志
[9] Docker 镜像使用 | 菜鸟教程
[10] 如何进入docker 使用root用户的方式 - 乎然的专栏 - CSDN博客