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

Docker 使用杂记 - 最佳实践尝试 - 实战的更多相关文章

  1. Java 服务 Docker 容器化最佳实践

    转载自:https://mp.weixin.qq.com/s/d2PFISYUy6X6ZAOGu0-Kig 1. 概述 当我们在容器中运行 Java 应用程序时,可能希望对其进行调整参数以充分利用资源 ...

  2. Docker监控:最佳实践以及cAdvisor和Prometheus监控工具的对比

    在DockerCon EU 2015上,Brian Christner阐述了“Docker监控”的概况,分享了这方面的最佳实践和Docker stats API的指南,并对比了三个流行的监控方案:cA ...

  3. Docker 跟 NodeJs 最佳实践

    Level-1 简单实现 需求:简单的构建一个app应用并且用docker部署.Dockerfile编写为: FROM node:7.3.0 RUN mkdir -p /usr/src/app COP ...

  4. Docker Daemon 参数最佳实践

    1. Docker Daemon 配置参数 限制容器之间网络通信 在同一台主机上若不限制容器之间通信,容器之间就会暴露些隐私的信息,所以推荐关闭 docker daemon –icc=false 使用 ...

  5. Docker日志收集最佳实践

    传统日志处理 说到日志,我们以前处理日志的方式如下: · 日志写到本机磁盘上 · 通常仅用于排查线上问题,很少用于数据分析 ·需要时登录到机器上,用grep.awk等工具分析 那么,这种方式有什么缺点 ...

  6. Docker 日志管理最佳实践

    开源Linux 回复"读书",挑选书籍资料~ Docker-CE Server Version: 18.09.6 Storage Driver: overlay2 Kernel V ...

  7. Docker笔记(十一):Dockerfile详解与最佳实践

    Dockerfile是一个文本文件,包含了一条条指令,每条指令对应构建一层镜像,Docker基于它来构建一个完整镜像.本文介绍Dockerfile的常用指令及相应的最佳实践建议. 1. 理解构建上下文 ...

  8. 8.云原生之Docker容器镜像构建最佳实践浅析

    转载自:https://www.bilibili.com/read/cv15220861/?from=readlist 本章目录 0x02 Docker 镜像构建最佳实践浅析 1.Dockerfile ...

  9. 【原创】Docker实战 Dockerfile最佳实践&&容器之间通信

    官方最佳实践文档 https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#from Docker实战(三十) ...

随机推荐

  1. 数字签名和数字证书等openssl加密基本术语

    openssl 算法基础 1.1 对称算法 : 密钥相同,加密解密使用同一密钥 1.2 摘要算法:无论用户输入的数据什么长度,输出的都是固定长度的密文:即信息摘要,可用于判断数据的完整性:目前常用的有 ...

  2. android翻译应用、地图轨迹、视频广告、React Native知乎日报、网络请求框架等源码

    Android精选源码 android实现高德地图轨迹效果源码 使用React Native(Android和iOS)实现的 知乎日报效果源码 一款整合百度翻译api跟有道翻译api的翻译君 RxEa ...

  3. FPGA浮点数定点数的处理

    http://blog.chinaaet.com/justlxy/p/5100053166大佬博客,讲的非常有条理的 1,基础知识 (1)定点数的基础认知: 首先例如一个16位的数表示的定点数的范围是 ...

  4. [LC] 318. Maximum Product of Word Lengths

    Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the tw ...

  5. Transformer详解:各个特征维度分析推导

    谷歌在文章<Attention is all you need>中提出的transformer模型.如图主要架构:同样为encoder-decoder模式,左边部分是encoder,右边部 ...

  6. 吴裕雄--天生自然HTML学习笔记:HTML 表单和输入

    HTML 表单用于收集不同类型的用户输入. <!DOCTYPE html> <html> <head>  <meta charset="utf-8& ...

  7. [转]<版本二>写代码的小女孩

    天冷极了,下着雪,又快黑了.这是一年的最后一天——大年夜.在这又冷又黑的晚上,一个乖巧的小女孩在机房里调试程序.她从家里出来的时候还穿着一件外套,但是有什么用呢?那是一双很大的外套——那么大,不知是哪 ...

  8. linux安装fasttext报错,升级gcc后成功解决

    首先说一下存在问题: 本人打算在linux安装一个fasttext用来训练词向量,本来是想要从gensim来调用fasttext的,但是加载大的本地txt一直不对,没办法了只好在linux安装一个fa ...

  9. Google Play来华 象征意义 跳板而已

    Play来华 象征意义 跳板而已" title="Google Play来华 象征意义 跳板而已">   每当有大事发生,伴随的就是接连不断的小道消息传出来.就像苹 ...

  10. 脸书VS微软,为何“老年创业者”更担忧AI失控?

    作为互联网行业最知名的大会之一,近日举行的微软Build 2017大会,却增加了与以往不同的"调味品".除了新技术.智能硬件.系统.平台之外,微软CEO纳德拉在大会上对科技带给人类 ...