之前一直想学Docker,但是一拖再拖,最近看到一个大佬写的关于Docker的博客不错。特来学(ban)习(yun)一下。
特此声明,下面大部分内容来自于 这位大佬 ,除此之外,还添加了一些自己的理解。
简介
Docker 是一种容器技术,它可以 将应用和环境等进行打包 ,形成一个独立的,类似于手机APP形式的「应用」,这个应用可以 直接被分发到任意一个支持 Docker 的环境中 ,通过简单的命令即可启动运行。Docker 是一种最流行的容器化实现方案。和虚拟化技术类似,它极大的方便了应用服务的部署;又与虚拟化技术不同,它以一种更轻量的方式实现了应用服务的打包。使用 Docker 可以让每个应用彼此相互隔离,在同一台机器上同时运行多个应用,不过他们彼此之间共享同一个操作系统。Docker 的优势在于,它可以在更细的粒度上进行资源的管理,也比虚拟化技术更加节约资源。
看到这个概念,立马想到了 虚拟机 ,两者有点像,下面给出官网的对比图,直观感受下二者的区别 ( 参考 )
简单的说, Docker 可以共享物理机的硬件和系统资源,而 虚拟机 要对硬件进行虚拟化并且需要额外的资源开销用于运行虚拟的操作系统导致资源利用率低、性能差。在一台物理机上同时启动多个 Docker 容器或多个 虚拟机 就能有鲜明的对比了。
目前国内有好几家提供 Docker 云服务平台: 道客云 、 时速云 、 灵雀云 、 希云 等,本人使用过道客云和时速云,界面类似于阿里云的控制台 ( 阿里云 上也有 容器服务 ),功能上包含了 镜像仓库 、 云服务器管理 , 持续集成 等等。虽然这几个平台的功能都是围绕 Docker 展开的,但业务侧重点也都有所不同,大家自己把玩吧。一般 个人版 是免费的,对于个人小项目的管理绰绰有余了,至于收费的 企业版 没用过就不发表意见了。
Docker 的特点和优势
可移植性,一次配置,随处移植
开发环境搭建绝对是开发过程中最令人头痛的环节,费时费劲费脑不说,开发到一半环境突然坏了,简直是灾难啊。
- 比如说有这样的场景, 工具1 只能运行在 系统A 上, 工具2 只能运行在 系统B 上,然而残酷的需求是 工具1 和 工具2 都必须得用…
- 再比如说,来了一个新同事,准备大展身手帮忙配环境,结果出现各种神奇的问题,各种 运行不了 ,内心也是崩溃得不要不要的…
标准化应用发布和使用
资源利用率高,启动迅速
启动 Docker 容器运行应用相当于是运行本地进程,相比 虚拟机 既可充分利用硬件性能,又节约启动时间,操作也简便。
持续集成
配合 持续集成 工具如 Jenkins , 版本控制 工具如 Git 、 SVN , 项目构建 工具如 Maven 可以实现 一键发布 或者 自动化构建 ,结束人肉运维的惨淡人生。就拿 Tomcat 来说,没有彻底重启的功能,只能靠自己写 脚本 杀进程,有时又会莫名其妙关闭 ( 大部分原因还是代码没写好 ),这又需要写脚本定时监控重启 Tomcat 。针对这两个痛点,这时 Docker 就派上了用场,对于 Docker 来说,重启容器即等价于重启应用,而且 Docker 自身可以很方便地设置开机启动容器和自动重启容器保证服务不中断。
隔离性
子服务器搭建
Docker 涉及到的一些关键概念
镜像
容器
镜像仓库
Docker安装与配置
安装
1 |
#使用 apt-get 进行安装 |
1 |
sudo docker run hello-world |
镜像加速:
sudo vim /etc/docker/daemon.json
,添加
"registry-mirrors"
字段。
1 |
{ |
1 |
sudo systemctl daemon-reload |
普通用户权限配置
docker的操作需要sudo,如果你自己的服务器账号没有sudo权限,可以把创建一个docker组,把没有sudo权限的账号加进去,这样就可以在没有sudo权限的账号下操作docker了,具体详见 官方文档 。具体过程如下:
首先新建一个组:
1 |
$ sudo groupadd docker |
然后加入没有sudo权限的账户:
1 |
$ sudo usermod -aG docker zdaiot |
zdaiot 是我的账户名,这里什么修饰也不要加。
然后查看下group里面有没有刚刚添加的账户:
1 |
$ sudo cat /etc/group | grep docker |
发现有自己的账户,然后更新一下,在windows和mac系统上需要重启机器,但是linux端可以不用重启,执行下面命令即可
1 |
$ newgrp docker |
然后登录刚刚添加的账户,执行
1 |
$ docker run hello-world |
没有报错即可。
NVIDIA Docker
简介
Nvidia-docker
项目就是为了解决这个问题,它让
Docker image
不需要知道底层
GPU
的相关信息,而是通过启动
container
时
mount
设备和驱动文件来实现的。
在你使用
Nvidia-docker
的时候,你需要做的有如下几件事
-
安装你电脑中
GPU的driver(必备的) -
安装
docker 19.03(安装包通用) -
安装
nvidia-docker2(安装包通用) -
下拉附带
CUDA的镜像(镜像文件是通用的,可以打包后拷贝到另外一台电脑上)
官方提供了,
nvidia-docker2
升级步骤:
Upgrading with nvidia-docker2
安装
官方地址
nvidia-docker 安装流程
。官网明确说过,如果你有
nvidia-docker1.0
要么升级,要么卸载后安装
nvidia-docker2
。
我们是通过
apt-get
安装。但是,
apt-get
的下载通道中没有这个下载通道,所以,我们要添加一下。
1 |
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) |
然后安装
nvidia-docker2
。
1 |
sudo apt-get update |
重新打开
1 |
sudo systemctl restart docker |
然后官网会给你一个命令检测你安装成功了吗。
1 |
sudo docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi |
这个命令不一定可以,因为,你的驱动可能太低了,不能运行
cuda11.0
。所以,你可以自己进行降版本运行。
1 |
sudo docker run --rm --gpus all nvidia/cuda:10.0-base nvidia-smi |
这个时候因为会自动下载
image
,例如
'nvidia/cuda:10.2-base'
。也就是可以这样理解,首先要安装
Docker
,然后安装
NVIDIA Docker
。
NVIDIA Docker
可以看做是一种特殊的
Docker
,若想使用这种
Docker
,需要安装对应的镜像。上面检测安装是否成功的命令就可以自动下载镜像。
Docker-Compose、Docker Swarm与Kubernetes
常见错误
unknown flag: —gpus
如果遇到错误
unknown flag: --gpus
,则执行
sudo apt-get install docker-ce-cli
。
unknown or invalid runtime name: nvidia.
1 |
docker run --runtime=nvidia ... |
1 |
docker: Error response from daemon: unknown or invalid runtime name: nvidia. |
报错的信息显示nvidia无法识别,这说明我得daemon.json配置文件出错。
修改
/etc/docker/daemon.json
(需要管理员权限),添加如下的内容:
1 |
"runtimes": { |
1 |
{ |
1 |
sudo systemctl daemon-reload |
参考
Docker 学习总结
Ubuntu20.04成功安装Docker
docker 和 nvidia-docker 的离线安装和基本使用
docker笔记(13)——nvidia-docker简介
nvidia-docker | 简介和扫盲
NVidia Docker介绍
【Docker】daemon.json的作用(八)
nvidia-docker镜像加速
unknown flag: —gpus #1165
docker启动容器报错 Unknown runtime specified nvidia.
【服务器端实现推理加速】一、安装FasterTransformer加速库
docker、docker-compose、docker swarm和k8s的区别