共计 3401 个字符,预计需要花费 9 分钟才能阅读完成。
一、前言
Docker 容器已经发布许久,但作为一名程序员如今才开始接触,实在是罪过……
在此之前,我还没有对 Docker 进行过深入的了解,对它的认识仍停留在:这是一种新型的虚拟机。这样的层面。今天就我的初次体验进行记录。声明一点:以下内容大部分是主观片面的,另有来自百度的(嗯,就是百度)。要是有什么说的不对,或者是理解 有问题的地方,还请大家告诉我,先谢谢大家了。
二、环境
我的基础运行环境是运行在 Win10 专业版 HyperV 虚拟机中的 CentOS7-Minimal 版本。新装的虚拟机,保证运行环境不受奇奇怪怪的东西影响。
CentOS 安装 Docker 简洁明快:sudo yum install docker -y。等着就行……安装内容如下:
四、启动 Docker 服务
与安装一样简洁明快:sudo systemctl start docker。如果没有报错,那就是启动完成了。(我喜欢用 systemctl,反正只要能启动服务,你想咋启动就咋启动。)命令没有回显,我就不截图了。
五、获取容器镜像
Docker 提供镜像搜索命令(search),方便你快速找到自己想要的镜像。当然,镜像的源你可以自己配置,默认是 docker.io。我只打算找一个 CentOS 的镜像,所以默认的源就行。搜索命令如下:
可以看到,搜索到好多镜像。最后两列字面意思我没理解,但是应该是标记官方镜像和开发者上传的镜像。我选择第一个,标记着“官方的”,应该没有装任何其他的东西。
嗯,接下来就是下载(pull)镜像了。命令如下(渣渣网速):
可以看到,默认下载的是最新的(latest)。当然,你可以下载其他非最新的版本,具体操作请查询 pull 命令的相关参数。我只要最新的(傲娇脸)。这个镜像大小也是 6。这么小,估计真的是什么都没装吧(还是压缩了?)……
上面是下载完成后显示的信息。
六、创建容器
接下来就是从刚下载的镜像创建一个容器了。新的容器的所有内容都会从镜像里拷贝(那个改是拷贝吧)。
声明:由于输入 sudo 太麻烦,所以下面的演示都用 root 用户执行。
创建容器(run)命令就比较复杂了,参数较多:
如上,我来一个一个解释:
-itd:这是 -i -t -d 的简写。-i 表示保持打开标准输入流(stdin),无论是否连接到此容器。-t 为容器分配一个虚拟的 tty。-d 表示后台模式运行容器,即容器启动后将断开与当前终端的连接。(之后会演示怎么再连回来)。
–name:这是为容器起一个名字,之后与容器的交互需要用到,当然用容器的 Id 也是可以的(就是 run 命令后那个巨长的回显)。当然,不写的话也会有默认的名字。
-v:表示挂载宿主机(这个称呼对吗?)目录到容器的目录(宿主机目录路径: 容器目录路径)。当然可以设置读写属性,这个就不说了,可以自行探索。
-p:表示映射(端口转发?)主机端口至容器端口(主机端口: 容器端口)。这个参数可以重复出现,映射多个端口。这个参数也有许多情况,也请自行探索。
centos:这个是本地镜像名称(centos),必须是已经下载(pull)到本地的镜像。当然,若是本地没有,Docker 会执行 search 并询问你是不是要下载。
/bin/bash:这个是本次启动的镜像要执行的任务。这个门道比较多,我在后面会说一下。
此处省略了 -a 参数。- a 参数可以指定连接准输入流(STDIN)、标准输出流(STDOUT)和标准错误流(STDERR),默认好像是都连接。可以显式使用,以连接指定的流。
以上就是命令的相关解释,是我自己配合百度理解的,要是有不对的,请大家留言哦。
七、查看容器
使用 docker ps -a 命令可以查看当前存在的所有容器:
如上,我只运行了一个容器。命令显示了容器的 ID、使用的镜像、运行的命令、创建时间、运行时间、端口映射、名称。
八、连接容器
连接容器有多种办法。在宿主机中使用 Docker 的 attach 命令,即可连接到容器:
如上,就已经连接到容器了。可以看到命令行信息的变化。
我使用了 ps 命令查看了容器中的进程。可以看到一个 ID 为 1 的进程,这个进程就是 run 命令最后的那个参数。Run 命令所指定的任务进程 Id 一定是 1。我们使用 attach 命令连接的也是这个命令的标准输入输出流(错误流我不知道连接了没)。由于 run 指定的命令是 bash,所以 attach 也是连接到了 bash,这样就能随意操作容器了。
关闭连接很容易想到,就是退出 bash:exit。
但是、但是、但是,这样退出会导致一个问题,那时就是:容器因为 1 号进程的退出(就是 attach 命令连接的 bash),会认为任务已完成,容器就停止了。
如上,容器已经停止了(Exited)。
所以,我建议使用 exec 命令对容器进行操作。我们重启容器:
可以看到,start 加容器名称就能启动。
使用 exec 命令,可以让容器直接执行命令(docker exec 容器名称 命令):
如上,是我用 exec 对 nethost 执行 ps 命令查看进程,执行 ls 命令列出根目录。
也可以用 exec 执行 bash 并挂载输入输出流:
如上,是我用 exec 命令启动 bash 并挂载输入输出流。-it 参数的意义和 run 命令相同,不同的是没有使用 - d 命令,这样(前台模式)可以使命令执行后直接连接输入输出流。我执行了 ls 命令和 ps 命令。
从 ps 命令的显示可以看出,exec 命令启动了一个新的 bash,PID 为 24(当然,PID 应该是随机赋值的)。区别于 PID 为 1 的 bash,我们当前连接的就是这个 PID 为 24 的 bash,一样可以执行命令,随意操作。并且退出之后,也不会影响 PID 为 1 的 bash,这样就可以使容器继续运行。
上图可见,我退出了容器的 bash 后,容器依然在运行。我在宿主机中使用 exec 执行 ps 命令后,nethost 这个容器中 1 号进程仍然在运行。
九、停止和删除容器
上面提到了启动容器(start)命令,停止容器当然是停止命令(stop)了。
stop 命令执行效果如上。
删除容器更容易,使用 rm 命令:
如上,我删除了名为 nethost 的容器,因为只有一个容器,所以删除之后九没有容器了。要注意的是:rm 命令只能删除已经停止的容器。并且 rm 命令不像 linux 的 rm 命令那样会有删除确认,docker 的 rm 命令会直接删除容器,所以用的时候要小心。
十、其他
其他的内容,如:备份、迁移、上传镜像等,我还没有试过,暂时不进行记录。
更多 Docker 相关教程见以下内容:
Docker 安装应用(CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm
Ubuntu 14.04 安装 Docker http://www.linuxidc.com/linux/2014-08/105656.htm
Ubuntu 使用 VNC 运行基于 Docker 的桌面系统 http://www.linuxidc.com/Linux/2015-08/121170.htm
阿里云 CentOS 6.5 模板上安装 Docker http://www.linuxidc.com/Linux/2014-11/109107.htm
Ubuntu 15.04 下安装 Docker http://www.linuxidc.com/Linux/2015-07/120444.htm
在 Ubuntu Trusty 14.04 (LTS) (64-bit)安装 Docker http://www.linuxidc.com/Linux/2014-10/108184.htm
在 Ubuntu 15.04 上如何安装 Docker 及基本用法 http://www.linuxidc.com/Linux/2015-09/122885.htm
Docker 的详细介绍:请点这里
Docker 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-11/136699.htm