非 root 用户运行

  1. 新建用户组docker之前,查看用户组中有没有docker组

    1. sudo cat /etc/group | grep docker
  2. 创建docker分组,并将相应的用户添加到这个分组里面。

    1. sudo groupadd -g 999 docker
    2. #-g 999为组ID,也可以不指定
    3. sudo usermod -aG docker jarvis
  3. 检查一下创建是否有效

    1. cat /etc/group
  4. 退出当前用户登陆状态,然后重新登录,以便让权限生效,或重启docker-daemon

    1. sudo systemctl restart docker
  5. 确认你可以直接运行docker命令,执行docker命令

    1. docker info
  6. 如果提示get ……dial unix /var/run/docker.sock权限不够,则修改/var/run/docker.sock权限

    1. sudo chmod a+rw /var/run/docker.sock

国内加速

使用阿里云的加速服务, 首先点击下面的链接注册:
https://link.zhihu.com/?target=https%3A//cr.console.aliyun.com/%23/accelerator
然后在镜像加速器页面复制加速器地址, 按如下方式填写到 /etc/docker/daemon :

  1. {
  2. "runtimes": {
  3. "nvidia": {
  4. "path": "nvidia-container-runtime",
  5. "runtimeArgs": []
  6. }
  7. },
  8. "registry-mirrors": ["你的加速器地址"]
  9. }

重启 Docker

  1. sudo systemctl daemon-reload
  2. sudo systemctl restart docker

在Docker中使用GPU

首先在root下面安装了docker (参考 https://github.com/NVIDIA/nvidia-docker#quick-start)
报错 docker: Got permission denied while trying to connect to the Docker daemon socket
这是因为用户没有加入到docker组中,因此将自己的用户加入到docker的用户组

  1. sudo usermod -a -G docker $USER

(这是一个大坑,因为你会发现后面操作了很多步之后又可能会出现这个问题,因此你又要用这条命令。)
接下来报错 docker: Error response from daemon: Unknown runtime specified nvidia.
这个时候是我们需要安装nvidia-docker2

  1. sudo apt-get install -y nvidia-docker2

首先检查本机的 nvidia 驱动版本 (https://www.yuque.com/jarvis73/pukm54/pxoy6p)
然后确定相应的CUDA版本, 比如驱动版本396.26, 在linux上对应的CUDA版本为9.2.88
到 docker 网站寻找CUDA版本匹配的docker镜像 (https://hub.docker.com/r/nvidia/cuda/tags)
拉取

  1. docker pull nvidia/cuda:9.2-runtime-ubuntu16.04

运行

  1. sudo docker run --runtime=nvidia --rm nvidia/cuda:9.2-runtime-ubuntu16.04 nvidia-smi

还是报错:docker: Error response from daemon: Unknown runtime specified nvidia. 而运行

  1. nvidia-docker image ls

说明nvidia-docker2是安装成功了的。结果发现需要将docker重启过

  1. sudo systemctl daemon-reload
  2. sudo systemctl restart docker

重启大法好. 在使用docker最重要的一点是你所有的使用的脚本,运行的数据都在docker指定的目录之下,因为只有这样,创建的docker才能够找到你所使用的数据。

Docker基础操作 —- 使用已有的镜像

0. 从DockerHub获取一个镜像

  1. docker pull tensorflow/serving
  2. docker pull tensorflow/serving:latest-gpu

1. 从镜像(Image)开启一个容器(Container)

  1. docker run -t --rm -p 8501:8501 -v "D:/0WorkSpace/MedicalImageSegmentation/model_dir/tag/export:/models/tag" -e MODEL_NAME=tag tensorflow/serving

docker run 命令的参数:

  • -p 指定端口映射: hostport:containerport
  • -t 分配一个tty
  • -v 绑定主机目录到容器的目录 (可以避免复制)
  • -e 添加容器内的环境变量
  • --rm 容器退出时自动删除容器
  • -i 启动输入流 (相当于进入了 docker 的终端)
  • -d detach, 运行后从会话中分离出来回到host.
  • --name 指定container的名字

    2. 查看当前的进程

    1. docker ps # 查看正在运行的容器
    2. docker ps -a # 可以查看所有容器(包括已停止的容器)

    3. 停止容器

    1. docker stop [ID/NAME]

    4. 删除容器

    1. docker rm [ID/NAME]

    5. 启动已停止的容器

    1. docker start [ID/NAME]

    6. 列出所有镜像

    1. docker image ls
    2. docker images

    7. 列出所有容器

    1. docker contrainer ls

    8. 查看镜像配置

    1. docker inspect [ID/NAME]

    9. 查看当前镜像和容器所占磁盘体积

    1. docker system df

    10. 删除镜像

    1. docker rmi [ID/NAME]

    11. 从运行的容器会话中 detach

    使用快捷键: Ctrl+P Ctrl+Q

12. attatch 到正在运行的容器中

  1. docker attach <container name>

13. 在 Docker 里安装程序

  1. # 作为 root 进入容器
  2. docker run --runtime=nvidia -it -v /path/to/model:/model --name tensorflow tensorflow/tensorflow:nightly-gpu bash
  3. # 安装程序
  4. apt install git
  5. # Detach
  6. # Ctrl+P Ctrl+Q
  7. # 作为用户进入容器 (这样可以作为用户而不是root修改/model下的文件)
  8. docker exec -it -u $(id -u):$(id -u) tensorflow bash