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
挺不错 自带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 使用杂记 - 最佳实践尝试 - 实战的更多相关文章
- Java 服务 Docker 容器化最佳实践
转载自:https://mp.weixin.qq.com/s/d2PFISYUy6X6ZAOGu0-Kig 1. 概述 当我们在容器中运行 Java 应用程序时,可能希望对其进行调整参数以充分利用资源 ...
- Docker监控:最佳实践以及cAdvisor和Prometheus监控工具的对比
在DockerCon EU 2015上,Brian Christner阐述了“Docker监控”的概况,分享了这方面的最佳实践和Docker stats API的指南,并对比了三个流行的监控方案:cA ...
- Docker 跟 NodeJs 最佳实践
Level-1 简单实现 需求:简单的构建一个app应用并且用docker部署.Dockerfile编写为: FROM node:7.3.0 RUN mkdir -p /usr/src/app COP ...
- Docker Daemon 参数最佳实践
1. Docker Daemon 配置参数 限制容器之间网络通信 在同一台主机上若不限制容器之间通信,容器之间就会暴露些隐私的信息,所以推荐关闭 docker daemon –icc=false 使用 ...
- Docker日志收集最佳实践
传统日志处理 说到日志,我们以前处理日志的方式如下: · 日志写到本机磁盘上 · 通常仅用于排查线上问题,很少用于数据分析 ·需要时登录到机器上,用grep.awk等工具分析 那么,这种方式有什么缺点 ...
- Docker 日志管理最佳实践
开源Linux 回复"读书",挑选书籍资料~ Docker-CE Server Version: 18.09.6 Storage Driver: overlay2 Kernel V ...
- Docker笔记(十一):Dockerfile详解与最佳实践
Dockerfile是一个文本文件,包含了一条条指令,每条指令对应构建一层镜像,Docker基于它来构建一个完整镜像.本文介绍Dockerfile的常用指令及相应的最佳实践建议. 1. 理解构建上下文 ...
- 8.云原生之Docker容器镜像构建最佳实践浅析
转载自:https://www.bilibili.com/read/cv15220861/?from=readlist 本章目录 0x02 Docker 镜像构建最佳实践浅析 1.Dockerfile ...
- 【原创】Docker实战 Dockerfile最佳实践&&容器之间通信
官方最佳实践文档 https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#from Docker实战(三十) ...
随机推荐
- 隐藏windows7/8“卸载或更改程序”里的软件
隐藏windows7/8“卸载或更改程序”里的软件 通过修改注册表即可隐藏电脑中已安装的软件,这个方法会造成卸载列表无法加载已安装的软件,请谨慎操作!提示:删除注册表后windows自带的卸载程序.其 ...
- 新特DEV1光速发布背后:原来“开公司”也能风驰电掣
去年12月16日,总融资额达到200亿元的蔚来汽车正式推出电动SUV车型ES8:去年12月22日,威马汽车宣布最新一轮融资,累计获得120亿元的融资额:今年1月29日,小鹏汽车宣布启动总额为22亿元人 ...
- JavaScript replace() 方法+字符子集介绍(*)
重点两部分知识点 1.javascript replace()函数用法 以下replace用法转载自w3cSchool:http://www.w3school.com.cn/jsref/jsref_r ...
- LibreOJ β Round #2」贪心只能过样例
题目友链:https://loj.ac/problem/515 话说这题蛮简单,bitset暴力直接过. 话不多说,上代码! #include <bits/stdc++.h> using ...
- 如果你的unordered_map头文件报错请看这里
请将include<unordered_map>头文件换成下面代码 #if(__cplusplus == 201103L) #include <unordered_map> # ...
- Spring Boot 之 Redis详解
Redis是目前业界使用最广泛的内存数据存储. Redis支持丰富的数据结构,同时支持数据持久化. Redis还提供一些类数据库的特性,比如事务,HA,主从库. REmote DIctionary S ...
- <HAOI2008>硬币购物
和神奇dp的战斗 还有容斥原理 终于get到了 #include<cstdio> #include<cstring> #include<iostream> #inc ...
- MySQL树形结构的数据库表设计和查询
1.邻接表(Adjacency List) 实例:现在有一个要存储一下公司的人员结构,大致层次结构如下: 那么怎么存储这个结构?并且要获取以下信息: 1.查询小天的直接上司. 2.查询老宋管理下的直属 ...
- 部署描述符web.xml
部署描述符应用场景 需要传递初始参数给ServletContext 有多个过滤器,并要指定调用顺序 需要更改会话超时设置 要限制资源的访问,并配置用户身份验证方式 xsi:schemaLocation ...
- 杀死众筹的N种方法:没想到山寨大军也参与了
众筹作为当下创业者筹集资金,将创意变为现实的最重要手段之一,正面临着越来越多的困难,甚至衍生出杀死众筹的N种方法.甚至这些方法还分为了两类,就众筹本身看,杀死它们的主要方法是:创业者卷钱跑路. ...