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

  • 相关阅读:
    [saiku] 系统登录成功后查询Cubes
    216. Combination Sum III
    215. Kth Largest Element in an Array
    214. Shortest Palindrome
    213. House Robber II
    212. Word Search II
    211. Add and Search Word
    210. Course Schedule II
    分硬币问题
    开始学习Python
  • 原文地址:https://www.cnblogs.com/licsber/p/docker.html
Copyright © 2011-2022 走看看