安装使用可支持GPU的Docker容器

因研究需要,要使用Docker,参考官网上的安装方法也遇到了不少坑,博主是个聪明人懒人...不想再次踩坑,于是记录下来。聪明的你看了这篇以后也一定能避开这些技能点坑的。

安装环境:Ubuntu 16.04

docker的官方网站:https://www.docker.com/
docker的官方文档:https://docs.docker.com/
docker可支持的系统:https://docs.docker.com/install/
docker安装步骤详解(英文):https://docs.docker.com/install/linux/docker-ce/ubuntu/

其他的根据左侧的列表选择即可

一.Docker 安装

A.下载deb包的安装方式

1.ubuntu16.04 amd 架构对应的下载地址:

https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/

ps: ubuntu其他版本/架构的下载地址:

打开: https://download.docker.com/linux/ubuntu/dists/
选择您的Ubuntu版本对应的代号(不清楚代号是多少?看这里
进到pool / stable /
选择机器支持的架构amd64,armhf或s390x,进入下载列表.

2.安装

sudo dpkg -i /path/to/docker.deb

B.添加源的安装方式

(一)、安装docker前的准备

首先删除旧版本

 sudo apt-get remove docker docker-engine docker.io

更新
然后进行更新和安装必要的软件

sudo apt-get update
sudo apt-get install 
     apt-transport-https \\
     ca-certificates \\
     curl \\
     gnupg2 \\
     software-properties-common 

这时候就需要网本地源里添加GPG密钥了,我系统原本是阿里源可是不知怎么始终找不到https://download.docker.com/linux/ubuntu/gpg,万万妹想到,这真是个神坑,找遍了教程包括https://blog.csdn.net/u014155354/article/details/52904845为代表的一类,最后发现并不是同一个问题,我本地是apt源的问题。而你如果按照官方文档上写如下这个命令,会遇到这个问题,

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

Terminal报错:gpg: no valid OpenPGP data found.

我在尝试了各种解决办法后分析发现,,由于各种distribute发行版的不同,原来是https://download.docker.com/linux/(. /etc/os-release; echo "ID")/gpg是个无效的URL.那么该怎么办呢?
你需要在Terminal中输入如下命令,查看自己的发行版ID,然后替换上述命令中的debian即可。

 . /etc/os-release
echo $ID

这时你需要把官方文档那行命令中的debian替换成在上述命令后Terminal输出的结果(你系统对应的版本名centos,或者ubuntudebian等)即可。由于我是Ubuntu16.04于是就直接在千米的呢命令行里直接改成了ubuntu,而你需要根据自己的输出结果进行更改。

然后我们向本地源添加添加稳定版Docker的仓库源(按架构选择)
amd64:

   sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

armhf:

   sudo add-apt-repository \
   "deb [arch=armhf] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

s390x:

    sudo add-apt-repository \
   "deb [arch=s390x] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

(二)、安装Docker CE

sudo apt-get update
sudo apt-get install docker-ce

这个时候我们就已经安装好了
启动和停止docker的命令

sudo systemctl enable docker
sudo systemctl start docker

(三)、测试docker

为了测试一下我们的docker是否正常,我们这里使用hello world来测试一下

sudo docker run hello-world

补充

前面不是docker源出问题了嘛,我根据各种教程进行尝试修复,结果最后哪个源都不好使了,都崩了。还出现了如下报错:

Problem executing scripts APT::Update::Post-Invoke-Success 'if /usr/bin/test -w /var/cache/app-info -a -e /usr/bin/appstreamcli; then appstreamcli refresh > /dev/null; fi'

看起来很多的样子,但实际上只需要出现如下结果即证明安装成功了。

....
Hello from Docker!
....

那怎么办呢?下面三行命令可助你度过此劫:

sudo pkill -KILL appstreamcli
wget -P /tmp https://launchpad.net/ubuntu/+archive/primary/+files/appstream_0.9.4-1ubuntu1_amd64.deb https://launchpad.net/ubuntu/+archive/primary/+files/libappstream3_0.9.4-1ubuntu1_amd64.deb
sudo dpkg -i /tmp/appstream_0.9.4-1ubuntu1_amd64.deb /tmp/libappstream3_0.9.4-1ubuntu1_amd64.deb\

(四).更新/卸载Docker

1,更新

sudo apt upgrade

2,卸载

sudo apt-get purge docker-ce
sudo rm -rf /var/lib/docker
sudo apt-get install nvidia-docker2

二. 安装Docker后的一些准备工作

建立 docker 用户组

默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。

建立 docker 组:

$ sudo groupadd docker

将当前用户加入 docker 组:

$ sudo usermod -aG docker $USER

将用户加入组后需要log out并重新登录,这个时候运行docker时不用在前面添加sudo,如可直接运行docker run hello-world

镜像加速器

国内访问 Docker Hub 有时会遇到困难,此时可以配置镜像加速器。Docker官方和国内很多云服务商都提供了加速器服务,例如:

注册用户并且申请加速器,会获得如 https://jxus37ad.mirror.aliyuncs.com 这样的地址。我们需要将其配置给 Docker 引擎。

Ubuntu 14.04、Debian 7 Wheezy

对于使用 upstart 的系统而言,编辑 /etc/default/docker 文件,在其中的 DOCKER_OPTS 中添加获得的加速器配置 --registry-mirror=<加速器地址>,如:

DOCKER_OPTS="--registry-mirror=https://jxus37ad.mirror.aliyuncs.com"

重新启动服务。

$ sudo service docker restart

Ubuntu 16.04、Debian 8 Jessie、CentOS 7

对于使用 systemd 的系统,用 systemctl enable docker 启用服务后,编辑 /etc/systemd/system/multi-user.target.wants/docker.service 文件,找到 ExecStart= 这一行,在这行最后添加加速器地址 --registry-mirror=<加速器地址>,如:

ExecStart=/usr/bin/dockerd --registry-mirror=https://jxus37ad.mirror.aliyuncs.com

注:对于 1.12 以前的版本,dockerd 换成 docker daemon

重新加载配置并且重新启动。

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

Windows 10

对于使用 WINDOWS 10 的系统,在系统右下角托盘图标内右键菜单选择 Settings,打开配置窗口后左侧导航菜单选择 Docker Daemon。编辑窗口内的JSON串,填写如阿里云、DaoCloud之类的加速器地址,如:

{
  "registry-mirrors": [
    "https://sr5arhkn.mirror.aliyuncs.com",
    "http://14d216f4.m.daocloud.io"
  ],
  "insecure-registries": []
}

编辑完成,点击Apply保存后Docker服务会重新启动。

macOS X

对于macOS的用户,如果你使用的是Docker for Mac,那配置起来很简单。在任务栏点击应用图标 -> Perferences... -> Daemon -> Registry mirrors。在列表中添加云服务商提供的加速器地址即可。修改完成之后,点击Apply & Restart按钮,Docker就会重启并应用配置的镜像地址了。

检查加速器是否生效

Linux系统下配置完加速器需要检查是否生效,在命令行执行 ps -ef | grep dockerd,如果从结果中看到了配置的 --registry-mirror 参数说明配置成功。

$ sudo ps -ef | grep dockerd
root      5346     1  0 19:03 ?        00:00:00 /usr/bin/dockerd --registry-mirror=https://jxus37ad.mirror.aliyuncs.com
$

如果Docker版本大于1.13或17.05.0-ce,也可以

$ sudo docker info|grep "Registry Mirrors" -A 1
Registry Mirrors:
 https://registry.docker-cn.com/

修改Docker默认储存位置

docker的使用过程中会产生大量的文件,可使用sudo docker info查看docker的基本信息。

Containers: 1
 Running: 0
 Paused: 0
 Stopped: 1
Images: 1
Server Version: 17.06.2-ce
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 3
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins: 
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 6e23458c129b551d5c9871e5174f6b1b7f6d1170
runc version: 810190ceaa507aa2727d7ae6f4790c76ec150bd2
init version: 949e6fa
Security Options:
 apparmor
 seccomp
  Profile: default
Kernel Version: 4.4.0-21-generic
Operating System: Ubuntu 16.04 LTS
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 7.695GiB
Name: zhaoyong-TM1613
ID: B3ZW:3PST:A43E:XR6E:6KER:SG4C:XEHR:7ZIQ:SZ7Z:VBIK:CCAW:QP3W
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Experimental: false
Insecure Registries:
 127.0.0.0/8
Registry Mirrors:
 https://r1daq44j.mirror.aliyuncs.com/
Live Restore Enabled: false

WARNING: No swap limit support

可以看到, 其默认存放在/var/lib/docker目录, 下面我们将其转移到其他目录<my_new_location>.

  • 停止 Docker 服务
sudo /etc/init.d/docker stop
  • 将原来默认的/var/lib/docker备份一下,然后复制到别的位置并建立一个软链接
cd /var/lib
sudo mv docker <my_new_location>
sudo ln -s <my_new_location>/docker docker
  • 启动 Docker 服务
sudo /etc/init.d/docker start
  • 最后使用 docker info 查看更新结果:
Containers: 1
 Running: 0
 Paused: 0
 Stopped: 1
Images: 1
Server Version: 17.06.2-ce
Storage Driver: aufs
 Root Dir: /home/heyu/soft/docker/
 Backing Filesystem: extfs
 Dirs: 3
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins: 
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 6e23458c129b551d5c9871e5174f6b1b7f6d1170
runc version: 810190ceaa507aa2727d7ae6f4790c76ec150bd2
init version: 949e6fa
Security Options:
 apparmor
 seccomp
  Profile: default
Kernel Version: 4.4.0-21-generic
Operating System: Ubuntu 16.04 LTS
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 7.695GiB
Name: heyu-pc
ID: B3ZW:3PST:A43E:XR6E:6KER:SG4C:XEHR:7ZIQ:SZ7Z:VBIK:CCAW:QP3W
Docker Root Dir: /home/heyu/soft/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Experimental: false
Insecure Registries:
 127.0.0.0/8
Registry Mirrors:
 https://r1daq44j.mirror.aliyuncs.com/
Live Restore Enabled: false

WARNING: No swap limit support

其根目录成功转移到了/home/heyu/soft/docker。

三.nvidia-docker2 安装

nvdia-docker2为机器学习提供了一个隔离的开发环境,能够减少各个程序对环境的依赖。

(一)、安装前的需求

系统需求:

  • GNU/Linux x86_64 with kernel version > 3.10
  • Docker >= 1.12
  • NVIDIA GPU with Architecture > Fermi (2.1)
  • NVIDIA drivers ~= 361.93 (untested on older versions)

1.1 删除老版本的nvidia-docker 1.0

如果你的系统之前安装过nvidia-docker 1.0, 考虑到兼容性,需要将其删除。

Ubuntu distributions

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 nvidia-docker

CentOS distributions

docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f
sudo yum remove nvidia-docker

(二)、安装nvidia-docker2

确保你的系统安装了正确版本的Nvidia driver

如果你设置了/etc/docker/daemon.json文件,那么nvidia-docker2可能会覆盖这个文件。

2.1 设置软件源

1) Ubuntu系统下源的设置

Xenial x86_64 (LinuxMint 18)

curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/ubuntu16.04/amd64/nvidia-docker.list | \
sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update

Xenial ppc64le

curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/ubuntu16.04/ppc64el/nvidia-docker.list | \
sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update

2) Debian系统下源的设置

Stretch x86_64

curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/debian9/amd64/nvidia-docker.list | \
sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update

3) CentOS系统下源的设置

RHEL7 x86_64

curl -s -L https://nvidia.github.io/nvidia-docker/centos7/x86_64/nvidia-docker.repo | \
sudo tee /etc/yum.repos.d/nvidia-docker.repo

RHEL7 ppc64le

curl -s -L https://nvidia.github.io/nvidia-docker/centos7/ppc64le/nvidia-docker.repo | \
sudo tee /etc/yum.repos.d/nvidia-docker.repo

2.2 安装

1) Ubuntu distributions:
Install the nvidia-docker2 package and reload the Docker daemon configuration:

sudo apt-get install nvidia-docker2
sudo pkill -SIGHUP dockerd

2) CentOS distributions:
Install the nvidia-docker2 package and reload the Docker daemon configuration:

sudo yum install nvidia-docker2
sudo pkill -SIGHUP dockerd

(三)、使用

nvidia-docker registers a new container runtime to the Docker daemon.
You must select the nvidia runtime when using docker run:

docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi

参考文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容