(一)利用docker在linux服务器上部署tensorflow、pytorch等环境

基本使用

关于镜像

查看现有镜像

输入docker image ls或者docker images查看本机现有镜像(这是本地已经有的)。
在这里插入图片描述

  • REPOSITORY:表示镜像的仓库源
  • TAG:镜像的标签
  • IMAGE ID:镜像ID
  • CREATED:镜像创建时间
  • SIZE:镜像大小

查看镜像信息

有些镜像的tag看起来信息也不是那么完整,所以还是能看到详细信息最好

docker inspect IMAGE_ID
# IMAGE_ID就是镜像列表中先是的镜像ID
# 例如:
docker inspect a6464e11be90

docker inspect命令返回的是一个JSON格式的消息,如果我们只要其中一项内容时,可以使用-f参数来指定,例如,获取镜像的Architecture信息:

$ sudo docker inspect -f {
    
    {
    
    ".Architecture"}} 550
amd64

在指定镜像ID的时候,通常使用该ID的前若干个字符组成的可区分字串(上面的550)来替代完整的 ID。
注意:这里的语法就是两对大括号,然后json每一项字段的key,需要加一个.;来进行使用,比如:

 sudo docker inspect -f {
    
    {
    
    ".Config"}} 550
 # 查看配置

搜索镜像

 docker search yolov5

所以之前这个服务器上有的镜像其实也是下载的公共镜像。

  • NAME: 镜像仓库源的名称
  • DESCRIPTION: 镜像的描述
  • OFFICIAL: 是否 docker 官方发布
  • stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
  • AUTOMATED: 自动构建。

关于这个自动构建,参考Docker自动化构建Automated Build实现过程图解
大意就是构建镜像的dockfile在github上的内容发生改变,这个镜像也会自动跟着改变,随时保持一致。

在这里插入图片描述
在这里插入图片描述

下载新的镜像

docker pull  XXX(这个xxx就是NAME代表的某个内容)

运行镜像

docker run httpd(如果这个名称不明确,可以直接使用IMAGE ID,只要名字可以区分开,一般前五个字母就可以)
# 如果要进行交互式操作,在镜像里开一个bash
docker run -t -i ubuntu:15.10 /bin/bash 
# 或者直接这样写 也可以
docker run -it ubuntu /bin/bash

参数说明:

  • -i: 交互式操作。
  • -t: 终端。
  • ubuntu:15.10: 这是指用 ubuntu 15.10 版本镜像为基础来启动容器。
  • /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。

以下图为例,实际在运行镜像时,也可以简单的

docker run -it a64
docker run -it a64 /bin/bash
# 这两个作用是一样的

然后就会进入到docker中的bash了
在这里插入图片描述
如果想要退出镜像,直接输入exit就可以了

关于容器

容器和镜像最简单的命令区分就是:镜像的命令里基本都会带有IMAGE_ID,容器的没有

启动已经停止的镜像

docker ps -a
# 这个命令就是显示容器(容器=镜像+读写)
# 所以这里显示的每个容器ID一定会对应一个镜像ID(用前四位数表征的)

在这里插入图片描述

docker ps -a --no-trunc
# 显示完整输出,主要想看看 command这一列的内容

可以看出来,容器ID很长,调用的command也有很多。
在这里插入图片描述

命令的详细说明参考:菜鸟教程-Docker ps 命令
另外,这里的Up 3 weeks意思就是持续运行了3周。

然后可以使用start来运行已经停止的容器:

docker start b750bbbcfd88 
> 运行上面的命令之后,会返回和start后面一样的容器ID,而不是直接进入容器/镜像中。

使用容器

在容器中进行操作的实现方式

问过了同事,同事说:通过镜像生成容器,所有的操作都是在容器中进行,尽量保证容器一直在后台运行状态(结合网上看到的说法:容器是出掉基础功能的linux系统,大概就明白了是什么意思)
参考:

重点是在pull了对应的镜像之后,如何创建容器,运行容器,
在这里插入图片描述
Docker start命令为容器文件系统创建了一个进程隔离空间。注意,每一个容器只能够有一个进程隔离空间。
docker run 命令先是利用镜像创建了一个容器,然后运行这个容器。

有两个示例:

runoob@runoob:~/python$ docker run  
-v $PWD/myapp:/usr/src/myapp  
-w /usr/src/myapp 
python:3.5 python helloworld.py

对上面这个命令的解释:

  • -v $PWD/myapp:/usr/src/myapp: 将主机中当前目录下的 myapp 挂载到容器的 /usr/src/myapp。(实现本机和容器文件夹的一个对应,这样在容器中就可以访问主机的文件夹,重点是能让你找到)
  • -w /usr/src/myapp: 指定容器的 /usr/src/myapp 目录为工作目录。
  • python helloworld.py: 使用容器的 python 命令来执行工作目录中的 helloworld.py 文件。
 docker run -it 
 -d 
 --gpus '"device=0"' 
 --ipc=host 
 -p 10008:22 
 -v /ws/xxx:/ws 
 --name "Order-Excution" 
 ultralytics/yolov5:latest  # 镜像名称
 bash -c "/etc/rc.local; /bin/bash"  # 在容器内执行/bin/bash命令
  • -d,docker 的服务是在后台运行的,我们可以过 -d 指定容器的运行模式。加了 -d 参数默认不会进入容器,想要进入容器需要使用指令 docker exec,使用这个指令,退出容器终端,不会导致容器的停止
  • –gpus,运行指定GPU,参考:[docker]运行指定 GPU
  • –ipc,这个参数是用来进行容器间通信的配置的。可以参考:docker容器间的IPC通信
  • -p 10008:22 会分配宿主机的端口映射到虚拟机(进行这个映射是为了方便从外部访问docker容器,而不是只能通过在本地run来访问)。参考:外部访问docker容器(docker run -p/-P 指令)

    docker指令: docker run -p ip:hostPort:containerPort redis
    ​使用-p参数 会分配宿主机的端口映射到虚拟机。
    ​IP表示主机的IP地址。(很多时候都不写ip这一项)
    ​ hostPort表示宿主机的端口。​ (上面的10008)
    containerPort表示虚拟机的端口。(上面的22)
    也就是说访问被本地主机的10008端口就相当于访问虚拟机的22端口(本地主机的端口一般可以随便指定)

    最常见的就是:将本地主机的 49155 映射到容器的 5000 端口。此时访问本机的 49155 端口即可访问容器内 web 应用提供的界面,访问本地49155就等于访问容器的5000

  • –name:例如 --name="nginx-lb":为容器指定一个名称;
  • bash -c:通常使用shell去运行脚本,两种方法 bash xxx.sh,另外一种就是bash -c “cmd string”
 docker run -it -d --gpus '"device=3"' --ipc=host -p 10035:22 -v 
 /ws/huangshan:/ws --name "OCR" ultralytics/yolov5:latest  
 bash -c "/etc/rc.local; /bin/bash"

建议创建一个.sh脚本,把这个命令写到脚本里,这样每次想用的话就去运行,会方便很多。

进阶:

镜像优化

参考:Docker镜像优化:如何从1.16GB优化到22.4MB

容器和镜像的区别

参考文章(其实是一篇,转来转去的,为了防止图片失效):

重点的一些内容:
容器 = 镜像 + 读写层。并且容器的定义并没有提及是否要运行容器。

另开了一个博客做记录。

参考

猜你喜欢

转载自blog.csdn.net/Castlehe/article/details/114986118
今日推荐