暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Docker从安装到入门

L的算法成长之路 2021-06-01
1058

最近有用到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


文章转载自L的算法成长之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论