您的位置:首页 > 运维架构 > Docker

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

地址在这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

参考

Docker — 从入门到实践

Docker MAINTAINER Instruction

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: