zoukankan      html  css  js  c++  java
  • Docker 使用杂记

    Docker 使用杂记 - 最佳实践尝试 - 实战

    本文记录了一个项目中使用docker构建环境的过程

    Docker简介

    Docker NB!好了 其他简介自己看网上吧

    项目背景

    内在原因

    这次的代码基于一个特定的tensorflow版本构建(才不是tf2跑不起来呢!

    外在原因

    与别人分享代码的时候就可以不用告诉他怎么一步步配置环境了

    并且基于GPU的Docker镜像可以由nvidia-docker直接运行

    基础镜像

    FROM

    需求

    Tensorflow==1.14

    CUDA==10.0

    cuDNN==7.4

    openCV==3.4.2.16

    俗话说好的开始是成功的一半

    这次的基础镜像就由tensorflow官方搭的镜像为基础

    看了一圈选择了tensorflow/tensorflow:1.14.0-gpu-py3

    地址在这tensorflow:1.14.0-gpu-py3

    挺不错 自带GPU支持 要构建其他镜像的同学也可以在tags里面搜索即可 全都有

    镜像维护者

    LABEL

    这里是说的MAINTAINER这个标签 但是我刚敲出来 就发现 过期了(deprecated

    上网一搜发现解决方案是用LABEL

    最佳实践:

    LABEL maintainer="Licsber <Licsber@njit.edu.cn>"
    

    工作文件夹

    WORKDIR

    顾名思义 制定容器内默认的文件夹

    不指定的话默认就是/根目录

    WORKDIR /home
    

    文件

    ADD

    ADD的好处是tar.gz文件可以自动解压

    并且ADD可以从网络路径拷贝文件

    任何情况下尽量不使用ADD(因为各种奇怪行为

    COPY

    顾名思义 COPY:拷贝文件

    语义明确 推荐使用

    注意目标地址一定要是一个目录(不然报错

    源地址拷贝会自动相当于有一个 /*的拷贝

    于是乎造成的特性就是只拷贝文件夹内的内容

    COPY sources.list /etc/apt/
    
    COPY model /home/model/
    
    COPY *.py /home/
    

    另外的特性就是可以使用通配符(符合Go语法即可(GoNB

    宗卷

    VOLUME

    设置宗卷之后可以使用外置环境的内容了

    VOLUME /data
    

    挂载的方式:在docker run后面带上参数

    -v $源路径:$宗卷名称切记别反了(我第一次就反了 debug半天

    例如:

    sudo docker run -v /Users/licsber/Download:/data $项目名称
    

    这样在镜像内/data就能访问到外置环境了 方便保存结果 读取文件

    命令

    RUN

    RUN用于运行命令

    最佳实践:

    RUN apt update && apt install libsm6 libxrender1 libxext-dev ffmpeg -y && 
        pip install -U -i https://pypi.tuna.tsinghua.edu.cn/simple pip && 
        pip install matplotlib scipy ffmpy opencv-python==3.4.2.16 opencv-contrib-python==3.4.2.16 tqdm -i https://pypi.tuna.tsinghua.edu.cn/simple 
    

    新手会把RUN命令写多个 但是每一个Docker命令都会新建一层

    这样会让层数特别多 于是 如果只是为了构建环境 一句话就够

    入口点

    ENTRYPORT

    CMD命令差不多

    区别就是不会被默认替换

    如果只定义CMD 空参数运行默认执行CMD里的内容

    如果只定义CMD 带参数运行会覆盖CMD定义的命令

    ENTRYPOINT ["python", "main.py"]
    

    这样镜像名:tag后面的参数就会默认追加到入口点了

    CMD

    另外需要注意的就是Docker没有后台的概念

    如果在里面写这样:

    CMD service nginx start
    

    会发现容器秒退 因为Docker是容器 具体解释参见CMD容器启动命令

    Dockerfile

    okk 看完了前面 终于到了重点

    把这些命令一行行码好 放到一个Dockerfile

    就可以build

    build之后 run push 之类的操作岂不是顺手拈来

    另外可以看看阿里天池的Docker训练 也能摸索tag的使用方法

    还有关于tag的一个小坑 latest 这个自己谷歌吧

    完整的Dockerfile贴在这:

    FROM tensorflow/tensorflow:1.14.0-gpu-py3
    
    LABEL maintainer="Licsber <Licsber@njit.edu.cn>"
    
    WORKDIR /home
    VOLUME /data
    
    COPY sources.list /etc/apt/
    
    RUN apt update && apt install libsm6 libxrender1 libxext-dev ffmpeg -y && 
        pip install -U -i https://pypi.tuna.tsinghua.edu.cn/simple pip && 
        pip install matplotlib scipy ffmpy opencv-python==3.4.2.16 opencv-contrib-python==3.4.2.16 tqdm -i https://pypi.tuna.tsinghua.edu.cn/simple 
    
    COPY model /home/model/
    
    COPY *.py /home/
    
    ENTRYPOINT ["python", "Retargeting.py"]
    

    后记

    话说loop: 改代码 -> build同一个tag -> 运行是不是最佳实践呀?

    实测产生大量<none> 需要手动删除

    这里贴出来一键代码:清理无用的docker镜像

    alias dclean='sudo docker rmi $(sudo docker images -f "dangling=true" -q)'
    

    没错 我就是电脑里定义了100+alias的小天才(逃

    本文环境

    Docker engine==19.03.5

    参考

    Docker — 从入门到实践

    Docker MAINTAINER Instruction

  • 相关阅读:
    GDB的Breakpoint, Watchpoint和Catchpoint
    sed初学
    比较两个文本不同的行/比较两个文本相同的行
    sprintf()函数基本用法
    vim不用鼠标复制粘贴
    SQL基础-语法
    SQL基础-简介
    XPath学习笔记
    jQuery选择器
    Ubuntu常用命令
  • 原文地址:https://www.cnblogs.com/licsber/p/docker.html
Copyright © 2011-2022 走看看