zoukankan      html  css  js  c++  java
  • docker 安装与使用

    初学记录,如有问题,请留言

    docker 安装与使用

    个人理解:

    我们把所有的环境、依赖、所需要的数据文件等都集成到一个镜像文件中;再通过镜像去生成容器,就可以使用了,跨设备移植非常方便
    镜像是基础,容器是体现;也就是说一个镜像可以产生多个容器;类似一个Win10镜像可以安装在多台电脑上,因此当使用镜像生成一个容器后,我们就只要在容器里面进行操作即可;

    • 前提要求:安装好对应的Nvidia 驱动版本,无需安装cuda和cudnn(安装了也没关系);选择下载GPU docker镜像时注意对应自己的NVIDIA驱动,如下表,一般来说,按照当前主机的CUDA进行选择;若下表的匹配不成功,将会导致 Pytorch 无法调用GPU
      image.png

    • 目的:拉取别人做好的基础版本镜像,再把自己要加的内容给加进去;(当然,也可以自己做自己的镜像,但是比较麻烦,这里不讨论)

    1. 安装docker(CPU使用)

    sudo apt-get install docker.io
    

    1.1 添加权限

    • 执行Docker需要用户具有sudo权限,所以可以将需要使用Docker的普通用户加入docker用户组

    • 先查看下是否存在docker用户组cat /etc/group | grep docker(注意不是dockerroot),如果不存在则创建groupadd docker。然后将普通用户添加至docker用户组中usermod -aG docker $USER

    1.2 测试

    sudo docker run hello-world
    

    输出:

    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
     1. The Docker client contacted the Docker daemon.
     2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
     3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you are currently reading.
     4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container with:
     $ docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker ID:
     https://hub.docker.com/
    
    For more examples and ideas, visit:
     https://docs.docker.com/get-started/
    
    

    2. 安装NVIDIA-Docker (GPU使用)

    2.1 如果之前安装过 nvdia-docker1.0,需要先删掉该版本和之前创建的容器

    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
    

    2.2 添加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
    

    不出意外的话就添加好了;本人安装时出现的坑:

    • 第一步添加gpg就失败了,参考:https://ubuntuqa.com/article/7602.html
      gpg: 找不到有效的 OpenPGP 数据。
      原因说是网络问题,访问不到gpg
      解决方法:
      直接将gpg下载下来(下载到当前目录,名称为 "gpgkey"),再手动添加,也就是将上面1步分为2步

      wget https://nvidia.github.io/nvidia-docker/gpgkey
      sudo ape-key add gpgkey
      
    • 第三步,添加软件源失败,这里直接打开第三步网址,得到软件源,手动添加
      在浏览器中打开:https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list
      得到:

    deb https://nvidia.github.io/libnvidia-container/ubuntu16.04/$(ARCH) /
    deb https://nvidia.github.io/nvidia-container-runtime/ubuntu16.04/$(ARCH) /
    deb https://nvidia.github.io/nvidia-docker/ubuntu16.04/$(ARCH) /
    

    将其复制到系统软件源文件:/etc/apt/sources.list

    sudo vi /etc/apt/sources.list
    

    复制进去后再刷新列表

    sudo apt-get update
    

    能够看到nvidia-docker的更新字样表示成功

    安装docker2

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

    测试:

    sudo docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi
    

    能够输出显存占用列表则成功

    参考:https://blog.csdn.net/weixin_42749767/article/details/82934294

    增加sudo权限

    Docker 需要用户的具有sudo权限,为了避免每次命令都输入 sudo,可以把用户加入Docker用户组

    sudo usermod -aG docker $USER
    


    2. 常用命令

    2.1. 列出本机所有的镜像(image)以及删除镜像

    # 列出本机的所有 image 文件
    docker image ls
    
    # 删除 image 文件
    docker image rm [ImageName]
    

    image 文件是通用的,一台机器的 image 文件拷贝到另一台机器,照样可以使用。一般来说,为了节省时间,我们应该尽量使用别人制作好的 image 文件,而不是自己制作。即使要定制,也应该基于别人的 image 文件进行加工,而不是从零开始制作

    2.2. 从镜像生成容器

    docker container run -it [options] [ImageName/ImageId] 
    

    options

    • --name 为容器指定一个名称
    • -d 后台运行容器,并返回容器Id,即 启动守护式容器
    • -i 以交互式运行容器,通常与 -t 同时使用
    • -t 为容器重新分配一个伪输入终端,通常与 -i 连用
    • -P 随机端口映射;
    • -p 指定端口映射

    2.3. 进入一个正在运行的容器,dockerdocker container exec

    docker container exec命令用于进入一个正在运行的 docker 容器。如果docker run命令运行容器的时候,没有使用-it参数,就要用这个命令进入容器。一旦进入了容器,就可以在容器的 Shell 执行命令了

    docker container exec -it [containerID] /bin/bash
    

    2.4. 列出当前正在运行的容器

    docker ps [options]
    
    • -a 列出当前所有正在运行的容器+历史上运行过的
    • -l 显示最近创建的容器
    • -n 显示最近创建的 n 个容器

    2.5. 退出一个容器

    exit
    

    或者 CTRL+P+Q

    2.6. 停止一个容器

    docker stop [ContainerId/ContainerName]
    docker kill [ContainerId/ContainerName]
    

    2.7. 删除一个容器

    docker rm [ContainerId/ContainerName]
    

    2.8 宿主机和容器的文件挂载

    目录挂载时需要采取绝对路径,不能采用相对路径

    nvidia-docker run -it -v /home/mtc/data/:/tcdata [ImageId] /bin/bash
    

    参考:https://blog.csdn.net/sunhuaqiang1/article/details/88317987


    3. 深度学习训练

    这里以 mmdetection 目标检测框架为例子

    docker pull registry.cn-shanghai.aliyuncs.com/tcc-public/mmdetection:pytorch1.3-cuda10.1-py3
    
    • 下载好后,通过docker images 可以看到当前所有的镜像
    • 从镜像生成容器,且将容器命名为 mmdet, 方便后续打开:
      这里要求设置 shm-size 为了数据加载时候的存储占用,默认是64M,即container中挂载的 /dev/shm的容量
    nvidia-docker run -it  --shm-size=8g --name mmdet registry.cn-shanghai.aliyuncs.com/tcc-public/mmdetection:pytorch1.3-cuda10.1-py3
    
    mtc:~$ nvidia-docker run -it --name mmdet registry.cn-shanghai.aliyuncs.com/tcc-public/mmdetection:pytorch1.3-cuda10.1-py3
    root@d9541e9160c7:/mmdetection# nvidia-smi 
    Tue Feb 11 04:54:57 2020       
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 430.26       Driver Version: 430.26       CUDA Version: 10.2     |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |===============================+======================+======================|
    |   0  GeForce RTX 208...  Off  | 00000000:01:00.0  On |                  N/A |
    | 22%   41C    P8    31W / 250W |    160MiB / 11018MiB |     37%      Default |
    +-------------------------------+----------------------+----------------------+
    |   1  GeForce RTX 208...  Off  | 00000000:02:00.0 Off |                  N/A |
    | 22%   33C    P8    14W / 250W |      1MiB / 11019MiB |      0%      Default |
    +-------------------------------+----------------------+----------------------+
                                                                                   
    +-----------------------------------------------------------------------------+
    | Processes:                                                       GPU Memory |
    |  GPU       PID   Type   Process name                             Usage      |
    |=============================================================================|
    +-----------------------------------------------------------------------------+
    root@d9541e9160c7:/mmdetection# python
    Python 3.6.9 |Anaconda, Inc.| (default, Jul 30 2019, 19:07:31) 
    [GCC 7.3.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import torch
    >>> torch.cuda.is_available()
    True
    >>> 
    

    从镜像生成容器是若容器要求GPU的话需要用 Nvidia-Docker;

    3.1 安装软件,比如 zip 之类的

    需要先更新软件源,再对应安装,由于在docker中就是root,所以无需sudo

    apt-get update
    
    apt-get install zip
    

    3.2 添加自己的文件(如训练测试数据)到镜像中去

    最简单的方法

    docker cp [主机上的地址文件] [容器上的地址]
    docker cp test.zip mmdet:/mmdetection
    

    进入容器中可以看到:

    $ docker container exec -it mmdet /bin/bash
    root@4e36037199c1:/mmdetection# ll
    total 414540
    drwxr-xr-x 1 root root      4096 Feb 11 12:44 ./
    drwxr-xr-x 1 root root      4096 Feb 11 12:50 ../
    drwxr-xr-x 3 root root      4096 Dec 12 07:06 .eggs/
    drwxr-xr-x 8 root root      4096 Dec 12 07:00 .git/
    drwxr-xr-x 3 root root      4096 Dec 12 07:00 .github/
    -rw-r--r-- 1 root root      1364 Dec 12 07:00 .gitignore
    -rw-r--r-- 1 root root       315 Dec 12 07:00 .isort.cfg
    -rw-r--r-- 1 root root       538 Dec 12 07:00 .pre-commit-config.yaml
    -rw-r--r-- 1 root root       126 Dec 12 07:00 .style.yapf
    -rw-r--r-- 1 root root      1321 Dec 12 07:00 .travis.yml
    -rw-r--r-- 1 root root     11400 Dec 12 07:00 LICENSE
    -rw-r--r-- 1 root root      7152 Dec 12 07:00 README.md
    drwxr-xr-x 4 root root      4096 Dec 12 07:06 build/
    -rw-rw-r-- 1 1000 1000 107924711 Dec 23 07:47 test.zip
    drwxrwxr-x 1 1000 1000      4096 Feb  9 13:15 configs/
    drwxr-xr-x 2 root root      4096 Dec 12 07:00 demo/
    drwxr-xr-x 2 root root      4096 Dec 12 07:00 docker/
    drwxr-xr-x 2 root root      4096 Dec 12 07:00 docs/
    drwxr-xr-x 1 root root      4096 Dec 12 07:00 mmdet/
    drwxr-xr-x 2 root root      4096 Dec 12 07:06 mmdet.egg-info/
    -rw-r--r-- 1 root root       293 Dec 12 07:00 pytest.ini
    -rw-r--r-- 1 root root       122 Dec 12 07:00 requirements.txt
    -rw-r--r-- 1 root root      6484 Dec 12 07:00 setup.py
    drwxr-xr-x 2 root root      4096 Dec 12 07:00 tests/
    drwxr-xr-x 3 root root      4096 Dec 12 07:00 tools/
    

    3.3 从已经构建好的容器映射成镜像

    docker commit [ContainerId/ContainerName] [NewImageName]
    
    $ docker commit mmdet mmdet_zql
    sha256:309a7a3976077727d7dc974516fdbffb69e21eb338c601fb4737eabe03a4bfa0
    $ docker images
    REPOSITORY                                                 TAG                       IMAGE ID            CREATED             SIZE
    mmdet_zql                                                  latest                    309a7a397607        14 seconds ago      10.6GB
    helloworld                                                 latest                    56b1259900c4        46 hours ago        929MB
    <none>                                                     <none>                    ca9a69dcc726        46 hours ago        929MB
    koa-demo                                                   latest                    064588efbfa2        47 hours ago        675MB
    ubuntu                                                     latest                    ccc6e87d482b        3 weeks ago         64.2MB
    registry.cn-shanghai.aliyuncs.com/tcc-public/mmdetection   pytorch1.3-cuda10.1-py3   80d6aa11963c        2 months ago        8.26GB
    registry.cn-shanghai.aliyuncs.com/tcc-public/python        3                         a4cc999cf2aa        9 months ago        929MB
    hello-world                                                latest                    fce289e99eb9        13 months ago       1.84kB
    node                                                       8.4                       386940f92d24        2 years ago         673MB
    

    4. 阿里云 天池Docker使用

    进去网址 https://www.aliyun.com/product/acr?spm=5176.12586973.0.0.228d2232ZXzGRe 注册并开通镜像托管;开通后进入镜像仓库:https://cr.console.aliyun.com
    image.png

    切换标签页到命名空间,创建地址唯一的命名空间

    image.png

    根据任务/比赛要求选择对应的地域
    image.png
    选择代码源为本地仓库,灵活度大,完成创建。(后期熟悉选择Github版本迭代更方便)
    image.png
    点击管理,可查看详情。

    image.png
    详情页如下,有基本的操作命令,仓库地址一般使用公网地址即可;操作指南下面有对应的如何在命令行登陆,push本地镜像到云仓库
    image.png

  • 相关阅读:
    2017.4.18下午
    2017.4.18上午
    2017.4.17上午
    2017.4.14下午
    2017.4.14上午
    4.17下午
    4.17上午
    4.13下午
    4.13上午
    4.10上午
  • 原文地址:https://www.cnblogs.com/qiulinzhang/p/13525192.html
Copyright © 2011-2022 走看看