最近有用到Docker,在此记录一下安装过程以及一些常用命令~
Docker介绍
Docker 是一个开源的应用容器引擎,可以视为一个轻量级的虚拟机。它是做什么的呢?它可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的操作系统,比如 Linux/Windows/Mac 的机器上。说白了就是把一个特定的环境封装起来,如果我们要部署不同的模型,他们有的是需要python2有的需要python3,有的用tf1.x有的用tf2.x,那就需要好几套环境来进行部署,全都装在一个机器里太乱了。所以干脆搞一个集装箱式的东西,每一个集装箱里面装了一套环境(比如py2+tf1.x,或者py3+tf2.x),集装箱里面的环境与外界是独立的,然后把模型部署到这个集装箱里,整个机器的环境就不乱了。
那虚拟机也可以起到同样的作用,为什么不用虚拟机呢?因为相比之下Docker能灵活的分配资源。一个虚拟机占的资源(CPU、内存等)在他被创造出来时候就设定好的,哪怕这个虚拟机啥也不干,这些资源也不能被其他程序利用,这就造成了资源浪费。而Docker可以根据实际消耗来分配不同镜像所占的资源。
Docker安装
Docker的安装比较简单,因为我是Win10系统,所以讲讲Win10是怎么安装Docker的。
我们要下载的是Docker Desktop for Windows。Docker Desktop for Windows 支持 64 位版本的 Windows 10 Pro,且必须开启 Hyper-V(若版本为 v1903 及以上则无需开启 Hyper-V),或者 64 位版本的 Windows 10 Home v1903 及以上版本。我的系统是64位的Win10家庭版,版本号是1909。所以满足要求。
去官网下载Docker Desktop for Windows.exe。然后双击文件开始安装。安装完成后提示重启,根据指示重启即可。
官网:https://www.docker.com/get-started
重启之后又跳出一个框提醒我升级WSL2内核,点击其中的链接下载wsl_update_x64.msi,双击安装。再重启。Docker就自动运行起来了(默认是开机自启动的)。

启动之后任务栏就会出现一个鲸鱼图标。而且会有一个界面教你怎么简单使用。

安装完 Docker 后,不仅可以通过图形界面打开并运行 Docker,而且可以通过命令行来进行 Docker 相关的操作。
打开命令行,输入docker —version
查看版本。如果可以看到版本说明你的Docker已经安装好了。

Docker常用命令
现在我们就可以使用Docker啦,来看一些常用命令吧~
先来简单看看几个概念
镜像(Image):类似虚拟机镜像。
容器(Container):类似linux系统环境,运行和隔离应用。容器从镜像启动的时候,docker会在镜像的最上一层创建一个可写层,镜像本身是只读的,保持不变。
仓库(Repository):是集中存放镜像的地方。
Docker 运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker 会从镜像仓库下载该镜像。
镜像
查看本地镜像docker image ls

REPOSITORY表示镜像的仓库源,TAG是镜像的标签,IMAGE ID是镜像ID,然后是创建时间和镜像大小。因为我之前拉取过几个镜像,所以这里会有。
拉取镜像的命令是docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
。
具体的选项可以通过
docker pull --help
命令看到Docker 镜像仓库地址:地址的格式一般是
<域名/IP>[:端口号]
。默认地址是 Docker Hub(docker.io
)。仓库名:这里的仓库名是两段式名称,即
<用户名>/<软件名>
。对于 Docker Hub,如果不给出用户名,则默认为library
,也就是官方镜像。标签常用于对应软件的各个版本。如果不给出标签,将以
latest
作为默认标签。
比如要拉取TensorFlow官方专用的最新的稳定版的Docker镜像,命令就是docker pull tensorflow/tensorflow:latest
。运行后就会拉取镜像到本地。
再比例拉取TensorFlow serving的GPU版本:docker pull tensorflow/serving:1.14.0-gpu
删除镜像的命令docker image rm [选项] <镜像1> [<镜像2> ...]
<镜像>
可以是镜像长ID
、镜像短ID
(一般取前3个字符以上,只要足够区分于别的镜像就可以)、镜像名
(也就是<仓库名>:<标签>
) 或者镜像摘要
。镜像摘要默认不显示,需要用
docker image ls --digests
查询。
举例说明删除镜像的方法:

要删除镜像docker101tutorial,可以用docker image rm c90
,或者docker image rm docker101tutorial
。一般用镜像短ID比较多,因为方便O(∩_∩)O~
查找镜像的地方
官⽅镜像库docker_hub:https://hub.docker.com/
例如cuda相关镜像:https://hub.docker.com/r/nvidia/cuda/
容器
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(exited
)的容器重新启动。
基于镜像新建一个容器并启动:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS部分参数说明:
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-e: 设置环境变量
--gpus:指定想要使⽤的gpu,例如
--gpus '"device=1,2"'-i: 以交互模式运行容器,通常与 -t 同时使用;
--mount:表示将文件系统挂载附加到容器。例如
--mount type=bind,source=/src/webapp,target=/opt/webapp--name: 指定容器name,后续使用比用container_id更方便。例如
--name=mydemo-P: 随机端口映射,容器内部端口随机映射到主机的端口,让外部可访问容器
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口,例如
-p 8080:8080--restart:容器退出时重新启动策略以应用。可以设置为
--restart=always-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--rm:退出时自动删除容器,一般在临时调试时用
-v: 绑定挂载卷
-it 相当于设置了⼀个可以和容器内部交互的伪终端,便于调试和使用。
当利用 docker run
来创建容器时,Docker 在后台运行的标准操作包括:
检查本地是否存在指定的镜像,不存在就从 registry (管理仓库的具体服务器)下载
利用镜像创建并启动一个容器
分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
从地址池配置一个 ip 地址给容器
执行用户指定的应用程序
执行完毕后容器被终止
例如新建一个tensorflow的jupyter notebook的容器:docker run -it -p 8888:8888 tensorflow/tensorflow:latest-jupyter
,就会开始拉取相关镜像并启动容器

运行起来后命令行里可以看到一个http://127.0.0.1:8888/开头的url,复制该url在浏览器中打开,进入tensorflow-tutorials文件夹即可看到下面的内容。

现在就可以尽情地玩啦~都不用自己安装配置TensorFlow的环境,非常方便有木有!而且 docker 的运行与你的主系统是隔离的,如果把它“玩坏了”,再重新拉取全新的镜像就好。
容器其它命令
启动/停止容器docker container start/stop $container_id或$container_name
查看所有运行容器docker ps
或者docker container ls
(前者是老命令,建议用后者)
还可以用来查找:docker container ps | grep "tensorflow/serving"
查看全部容器docker ps -a
或者docker container ls -a
杀死指定容器docker container kill $container_id
删除指定容器docker container rm $container_id
查看运行容器的日志docker container logs -f $container_id
删除所有处于终⽌状态的容器docker container prune
查看运行的容器cpu占⽤及内存占⽤docker container stats $container_id
资料
https://github.com/yeasy/docker_practice
https://www.cnblogs.com/bethal/p/5942369.html




