对于docker的理解以及使用参考

1. 对docker的理解

docker可以理解为一个轻量化的虚拟机,虚拟机的虚拟是从硬件开始虚拟,从而再虚拟出一个操作系统,从而可以在我们想要的操作系统执行我们想要的不同程序,而docker则是直接虚拟我们执行具体进程的环境,并没有虚拟出整个操作系统,更不要谈对硬件的虚拟,从而导致docker可以快速的对我们需要执行的程序进行不设备上的移植。

打个比方,我们从海里打捞出了一条鱼,我们把它带回家养着,如果经济一点的方法,就是我们弄个水缸,里面提供氧气泵,食物等这条鱼生存所需要的必要条件,如果我们豪华一点,我们就直接建个水族馆模拟海洋里的条件,除了氧气,食物等必需品,海洋里的地形条件,海洋里其他的生物等非必须的条件我们也整上,这两种方法都可以保证鱼的存活,但很显然,第二种方法没有必要,因为我们只需要这条鱼活着就行了,我们不关心其他的海洋因素,这里面的鱼就类似于我们想要执行的程序,docker技术就相当于第一种方法,虚拟机技术相当于第二种方法。

但具体的docker还是和上面的有所不同,docker可以掌管的可不止一个“水缸“,正如docker图标表现的,他是一个平台,里面可以掌管很多的”水缸“,也就是可以为不同的程序创建不同的环境。打个比方,他就相当于一个大的动物园,动物园里面有很多的展馆,但不同的展馆里面的环境是不一样的,例如猴子展馆里的环境是各种数和藤蔓,企鹅展馆里的是各种冰块和水,这里面的动物就相当于我们的docker,而整个动物园就是一个”docker"。

在这里插入图片描述

还可以参考这篇博文了解:看完此文,妈妈还会担心你docker入不了门?

2. 基本概念

使用docker,必须了解一些关键词:

  • Image(镜像):镜像是一种轻量级的、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件。这里的镜像有点类似于我们定义的类,类定义了后只是一个静态的对象,我们在程序中每次操作的都是类实例化后的对象,而不是对一个类进行操作,而我们对镜像“实例化”后就可以得到我们想要的容器了
  • Container(容器):docker的容器是用镜像创建的运行实例,我们可以使用客户端或者API控制容器的启动、开始、停止、删除。每个容器之间是相互隔离的。

Docker 的整体架构分为三部分,Clint,Docker_Host,Registey:

  • Repository(仓库):我们所需要的镜像文件,很多时候大家都已经有现成的了,我们把这些现成的镜像文件上传到一个统一的网站上,需要的时候直接下载下来,有新的环境就直接上传上去,这样就方便大家获取的环境是一致的,类似于镜像文件的github

    例如我们在自己的主机上安装了docker,获取相应的镜像文件,docker检查本地是否有这个镜像,没有就直接从仓库里下载下来,如下就是直接下载tensorflow/tensorflow:1.15.5-gpu-py3-jupyter 这个image

在这里插入图片描述

  • Clint(客户端):docker客户端是用户与docker服务交互的窗口!我们进入docker容器后可以得到一个伪终端,这个伪终端就是客户端

我们自己电脑上终端的名字是vcc-MS-7D42,进入伪终端后给我们分配了一个虚拟的终端号4a2fd53325f5,这个号就是我们建立的这个容器的id号

  • Docker_Host(宿主机):可以是物理机,也可以是虚拟机,上面跑着一个dockers 服务,其中有一个称为docker daemon的守护进程,我们使用 docker daemon 实现对docker 对象生命周期管理。docker deamon监听着客户端的请求,并且管理着docker的镜像、容器、网络、磁盘(图中只列出了镜像与容器)等对象。docker的客户端与服务可以运行在同一机器上,也可以用某台机器上的客户端远程连接另一台机器上的docker服务

docker的整体运行框架如下:
在这里插入图片描述
这部分可以参考:docker中什么是宿主机

3. 使用docker

3.1 安装docker

此处参考回答:Ubuntu16.04安装nvidia-docker

Ubuntu 官方的版本库中并不一定是 Docker 最新的安装包,为了保证是最新版,我们从 Docker 官方库来安装。

首先,更新现有的软件包列表:

$ sudo apt update

接下来,安装一些必备软件包,让 apt 通过 HTTPS 使用软件包

sudo apt install apt-transport-https ca-certificates curl software-properties-common

添加GPG密钥,需指定源(仍然采用中科大源,采用默认的源下载速度慢,经常失败),添加密钥的原因是可以通过密钥来验证我们下载的镜像文件是否来自于官方的,保证文件的可靠性,可以参考:What is docker‘s official GPG key

1. curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
2. sudo add-apt-repository "deb [arch=amd64,arm64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

更新软件包

sudo apt update

安装docker-ce(这个才是docker安装包)

sudo apt install docker-ce

测试docker安装成功

sudo docker run hello-world

在这里插入图片描述

3.2 创建容器并初始化

由于师兄传承的代码建议了我们可以直接使用 tensorflow/tensorflow:1.15.5-gpu-py3-jupyter 镜像文件来创建容器,所以直接使用docker run命令,这个命令相当于直接将一个 image 实例化为 一个 container,同时输入一对参数进行设定

在docker中安装tensorflow可以参考:TensorFlow Docker安装

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

此处我们的命令为:

nvidia-docker run -it --name aligner -p 8888:8888 -v /home/vcc/DockerFileTransfer/aligner/:/home/aligner/ --runtime=nvidia -e NVIDIA_VISIBLE_DEVICE=all tensorflow/tensorflow:1.15.5-gpu-py3-jupyter bash
  • -i 保持标准输出开启即使没有attached -t 分配伪终端 -it 相当于将两者合起来了

  • - - name 容器名称

  • -p 指定端口映射,容器—>宿主机

  • -v 挂载卷 (e.g., from the host: -v /host:/container, from docker: -v /container)

  • -runtime 容器核心技术:是指能够让 container 在 host 上运行起来的那些技术。

    如果大家用过 Java,可以这样来理解 runtime 与容器的关系:Java 程序就好比是容器,JVM 则好比是 runtime。JVM 为 Java 程序提供运行环境。同样的道理,容器只有在 runtime 中才能运行。

    此处参考:Docker 容器运行时runtime

    由于我们的没有nvidia容器化技术,因此我们还需要去安装nvidia-docker

  • -e 环境变量,这里设置为NVIDIA_VISIBLE_DEVICE表示所有的设备都需要用上

  • tensorflow/tensorflow:1.15.5-gpu-py3-jupyter:imgae名称

  • bash 表示执行该脚本的命令

再cp命令将文件从宿主机传递给容器,再执行脚本安装依赖项,以上操作需要退出伪终端在真实终端中执行才可以

4.一些常用的docker命令

docker容器的操作
关闭docker进程
Docker 删除image

5. 遇到的一些问题记录

4.1 bash: import: command not found

由于之前创建的容器,需要使用tensorflow中的CUDA支持,使用的nvidia容器技术,而我安装的docker是普通的docker,直接运行则-e的参数会找不到,显示出命令无法找到

在这里插入图片描述)

我们需要在安装了docker以后,继续安装nvidia-docker才可以使用到我们CUDA,具体教程可以参考:NVIDIA Container Toolkit,在安装nvidia-docker前,要确保nvidia驱动和docker都已经安装了才可以。在这个基础上安装nvidia-container-toolkit,来确保可以实现最后的nvidia-docker2技术,最后再来安装nvidia-docker2,具体流程可以参考: installation guide.

4.2 软件源的选项Signed-By中含有互相冲突的值

删除了一个含docker名字的文件,还删除了一个含nvidia-docker名字的文件,然后重新apt-get update就好了(具体文件不记得了)

4.3 docker: Error response from daemon: Unknown runtime specified nvidia.

在这里插入图片描述)
安装完了nvidia-docker2,还是无法运行一个docker,显示守护进程找不到,可以到 /etc/docker 中找到 daemon.json进行修改,结果发现自己连这个文件都没有,一查发现在安装nvidia-docker2的过程中可能不会写入一个这样的文件。直接进入文件夹修改:

vi daemon.json

registry-mirrors是我们的镜像加速网站

{
"registry-mirrors"["https://docker.mirrors.ustc.edu.cn/"],
"runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

具体参数可以参考:daemon

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值