Docker 使用杂记 - 最佳实践尝试 - 实战
2020-03-15 17:23
656 查看
[TOC]
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
挺不错 自带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 /homeVOLUME /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 $(docker images -f "dangling=true" -q)'
没错 我就是电脑里定义了
100+alias的小天才(逃
本文环境
Docker engine==19.03.5
参考
相关文章推荐
- 大数据IMF传奇行动绝密课程第62课:Spark SQL下的Parquet使用最佳实践和代码实战
- Spark SQL下的Parquet使用最佳实践和代码实战
- 第62课:Spark SQL下的Parquet使用最佳实践和代码实战
- Spark SQL下的Parquet使用最佳实践和代码实战
- day62-Spark SQL下的Parquet使用最佳实践和代码实战
- 《Spark商业案例与性能调优实战100课》第21课:Spark性能调优之系统资源使用原理和调优最佳实践
- 《Spark商业案例与性能调优实战100课》第29课:彻底解密Spark 1.6.X以前Shuffle中JVM内存使用内幕及配置最佳实践
- 【云计算】使用supervisor管理Docker多进程-ntpd+uwsgi+nginx示例最佳实践
- Spark SQL下的Parquet使用最佳实践和代码实战
- 数据访问:使用 ADO.NET 的最佳实践
- chap 20:使用 Java Native Interface 的最佳实践2
- .net最佳实践二:使用finalize/dispose模式提升垃圾回收器性能
- chap 20:使用 Java Native Interface 的最佳实践
- 线程的最佳实践二:不使用stop方法停止线程
- ASP.NET应用-DataGrid使用最佳实践
- DataRabbit 轻量的ORM框架(17)-- 使用DataRabbit的最佳实践
- 团队基础生成自动化流程之最佳实践(V) - 使用Desktop Build
- WebGIS最佳实践4 使用pgRouting实现最佳路径搜索
- Hibernate4实战 之第七部分:最佳实践
- 使用 Java Native Interface 的最佳实践2