前言
最近了解到了docker,才发现原来世界上还有这么好用的东西。
Docker是一个开放源代码软件项目,让应用程序布署在软件容器下的工作可以自动化进行,借此在Linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。
Docker的方便之处
从事linux嵌入式开发或者深度学习方向的研究人员往往都会遇到这样一个问题—-服务器的环境配置。linux嵌入式开发需要配置交叉编译所需要的工具,而深度学习研究有各种各样的框架,并且这些框架有概率是互不兼容的(比如说有些论文实现依托于cudnn5.1,而有些则需要更高的版本),总不能为了搭一个环境而舍弃另一个环境吧。
当服务器环境越配越多,此时,Docker的优势就体现出来了,Docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。
并且,Docker在迁移时更加方便,它没有其他依赖,可以说自己就是一个微型系统。
Docker使用介绍
docker中有镜像(image)和容器(container)的概念,镜像就是指已经打包好的容器,可以被pull或push的,而容器则是你正在使用的,已经实例化的镜像。
一般将镜像视为模版,不存放任何代码,只配置环境,代码使用volume挂载放入容器。(run
时用-v
来挂载)
docker常用命令
docker images
显示已有镜像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 52b10959e8aa 12 days ago 115MB
ubuntu 14.04 8789038981bc 12 days ago 188MB
docker rmi
删除镜像
docker system prune -a
释放空间
docker ps -a
显示所有容器
docker start
在退出容器后需要先start才可以进入。
$ docker start nnie
nnie
docker attach
容器开启后使用该命令进入容器。
docker run
语法
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
一般常用docker run -t -i -v /YOUR/PATH:/root/ ImageName /bin/bash
注意,挂载时要使用绝对路径。
OPTIONS说明:
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-p: 端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name="nginx-lb": 为容器指定一个名称;
--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-h "mars": 指定容器的hostname;
-e username="ritchie": 设置环境变量;
--env-file=[]: 从指定文件读入环境变量;
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
-m :设置容器使用内存最大值;
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
--link=[]: 添加链接到另一个容器;
--expose=[]: 开放一个端口或一组端口;
docker build
build指令是通过DockerFile来构建镜像的,具体使用下一篇介绍。
Docker常用构建方法
docker hub一般都有许多镜像提供给你直接拉取,如果刚好有你需要的,只要直接pull就可以了。 比如说我需要一个caffe的环境,那么我直接在docker hub上找到caffe,然后根据所需要的tag直接拉取镜像就可以了。
# 这里我拉取的是caffe的cpu版本
docker pull bvlc/caffe:cpu
# 通过下面这行命令就可以通过拉取的镜像生成自己的容器,并进入到容器中了
docker run -it bvlc/caffe:cpu /bin/bash
不过主流的可能还是使用DockerFile来构建镜像,DockerFile的优点如下,
- Dockerfile是Docker镜像的自动化脚本
- 它具有简单的图像语法,并自动做许多更改,手动将需要更多的时间。
- Dockerfile有一个系统的步骤,可以让别人很容易理解,并且很容易知道在基本映像中改变了什么确切的配置。