Docker修炼之旅(一)

Docker学习过程的一些记录

#前言
之前对Docker只停留在用的层面上,只会用docker-compose一键部署,偶尔也会对Dockerfile进行一些修改,但每次改都要查半天搜索引擎才会。所以决定系统学习下Docker,补充下自己的知识。
主要参考的是:《第一本Docker书》,当做学习笔记来写吧。


Docker容器概念

Docker容器(Container)类似于一个轻量级的沙箱子(因为Docker是基于Linux内核的虚拟技术,所以消耗资源十分少),Docker利用容器来运行和隔离应用。

容器是从镜像创建的应用运行实例,可以将其启动、开始、停止、删除,而这些容器都是相互隔离、互不可见的。

可以吧每个容器看作一个简易版的Linux系统环境(包括了root用户权限、进程空间、用户空间和网络空间),以及与运行在其中的应用程序打包而成的应用盒子。

镜像自身是只读的。容器从镜像启动的时候,Docker会在镜像的最上层创建一个可写层,镜像本身将保持不变。就像用ISO装系统之后,ISO并没有什么变化一样。

容器就相当于镜像的实例化,我们可以认为,镜像是Docker生命周期的构建或打包阶段,而容器则是启动或执行阶段,具体关系如下图


创建第一个容器

安装启动好docker后,先可以通过docker info命令查看docker的一些配置信息,如所有容器和镜像的数量等

然后通过docker run命令创建容器,docker run命令提供了Docker容器的创建到启动过程。我们使用docker run -i -t ubuntu /bin/bash命令我们的第一个容器,这句命令的解释如下

首先告诉Docker执行docker run命令,并且指定了 -i -t两个参数。
-i保证容器中的STDIN是开启的,尽管我们没有附着(docker attach命令)到容器中。持久的标准输入是交互式shell的”半边天”,这里说下自己的理解,这个-i参数意思应该就是把STDIN开起来,然后我们就可以通过可以与容器交互,输入命令执行。
-t参数告诉Docker为要创建的容器分配一个伪tty终端,这样,新创建的容器才能提供一个交互式shell。
若要在命令行下创建一个我们能与之进行交互的容器,这两个参数算是最基本的参数了。
接下来,我们告诉Docker基于什么镜像来创建容器,这里使用的是ubuntu,这是一个基础镜像,保存在Docker Hub Registry上,这里指定镜像后,Docker会先检查本地有没有该镜像,没有的话就连接到官方维护的Docker Hub Registry上查找,找到后下载至本地。然后Docker在文件系统内部用这个镜像创建一个新容器,该容器有自己的网络、IP地址,以及一个用来和宿主机进行通信的桥接案例接口
最后的/bin/bash告诉Docker在新容器中要运行什么命令,这里的/bin/bash命令是启动了一个Bash shell


使用容器

上一步,我们利用ubuntu镜像创建并打开了一个容器,我们可以在里面执行命令,使用下我们的容器。

不仅能执行本地命令,需要网络连接的命令也能执行。我们可以使用apt-get命令,安装下vim apt-get update && apt-get install vim


给容器命名

我们可以通过键入exit来退出当前容器,然后用docker ps命令查看本地的容器。

docker ps列出正在运行的容器
docker ps -a列出所有的容器
docker ps -l列出最后一次运行的容器,包括正在运行的或已经的停止的。
docker ps -n x x是数字,表示列出最新几次运行的容器

这里我们用docker ps -l命令列出刚刚退出的容器,如下图

从上面图片可以看到,容器的名称是一个随机的名称,这是由于我们之前创建容器的时候没有指定名称,所以Docker给容器自动生成一个随机名称。按理说名称指不指定不怎么重要,因为可以通过容器ID进行指定。不过实际使用中,肯定是用名称比较方便。所以我们这里介绍下怎么在创建的时候指定名称。我们可以在docker run命令中用--name标志指定
docker run --name Docker_study -i -t ubuntu /bin/bash


重新启动停止的容器

上一步中,为了查看docker ps -l命令,我们退出了容器,那么该怎么重新启动该容器呢。
我们使用docker start命令,docker start <容器名称> docker start <容器ID>都可以开启容器。
如我这里容器名称是Docker_study,于是用docker start Docker_study启动停止的容器。


附着到容器上

我们可以看到上一步的截图,使用docker start重新启动了容器后,容器成功运行,但是我们并没有进入到之前的交互式shell中。这时候我们就可以利用docker attach命令附着进入容器,这里我们的命令是docker attach Docker_study


创建守护式容器

上面创建的都是交互式容器,我们也可以创建长期运行的容器,名叫守护式容器,没有交互式会话,非常适合运行应用程序和服务,大多数时候我们都需要以守护式模式运行我们的容器,如之前我搭的CTF题目,都是基于守护式模式。下面我们就创建一个守护式容器。使用下面命令:
docker run --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

-d参数表示将容器放在后台运行
-c参数表示容器要执行的命令
这里执行的命令是每隔一秒循环输出hello world

执行完后,通过docker ps查看是否运行,可以看到运行成功


查看容器内部都在干什么——日志

我们上面创建了一个守护式容器,根据创建时的命令,容器会循环输出hello world,但我们怎么查看它是否执行呢。这时候就用到了docker logs命令
可以使用docker logs <容器名称或ID>查看容器日志,会返回最后几条日志。

我们还可以通过使用 -f 参数实施监控Docker日志,与tail -f命令类似

还可以加别的参数,使日志输出更加规范

–tail 10 获取日志最后10行
–tail 0 -f跟踪容器最新日志
-t 为每条日志加上时间戳,便于分析


查看容器的进程

使用docker top命令,可以查看到容器内部运行的进程。


在容器内部运行进程

在Docker 1.3之后,可以通过docker exec命令在容器内部额外启动新进程。可以通过追加-d或-t -i参数指定启动的进程类型是后台任务还是交互式任务。
如我们用docker exec -d daemon_save touch miracle778.txt,新建一个文件
然后用docker exec -i -t daemon_save /bin/bash打开一个交互式shell

可以看到, 在新打开的shell里面输入ls命令,找到了新建的miracle778.txt文件


容器的停止、重启

可以使用docker start|stop|restart <容器名或ID>启动|停止|重启容器。
另外,可以在创建容器的时候指定 –restart标志,使容器在因为错误情况退出的情况下,根据–restart标志指定的行为和容器错误代码判断是否重启容器。–restart标志取值说明如下

–restart=always 表示无论容器退出代码是什么,都自动重启容器
–restart=on-failure 这样的话,只有容器的退出代码非0时才会自动重启
此外on-failure还接受一个可选的重启次数
–restart=on-failure:7 表示,在容器的退出代码为非0时,自动重启容器,最多重启7次
–restart标志是docker1.2.0后引入的选项


深入容器

除了用docker ps获取容器的信息外,我们还可以使用docker inspect来获取容器的更多信息

docker inspect命令会对容器进行详细的检查,然后返回其配置信息,包括名称、命令、网络配置以及很多有用的数据。同时也可以指定-f或–format标志选定查看结果
这个命令我目前并没有怎么用到,不过还是记一下。


删除容器

当容器不用的时候,可以通过docker rm删除已经停止的容器。
另外提一下,现在没有办法一次删除所有容器,不过可以用另一种小技巧达到目的

docker rm `docekr ps -a -q`
这里把docker ps -a -q的结果传给docker rm命令
docker ps -a -q命令是列出所有容器的ID

总结

这一篇主要是对Docker容器的一些操作,用了一些docker的命令

1
2
docker run  | docker stop  | docker start  | docker restart | docker exec 
docker top | docker logs | docker attach | docker inspect | docker rm

其他的一些命令可以参考:简书:Docker命令
或者直接找官方文档:Docker官方文档

ヾノ≧∀≦)o 来呀!快活呀!~
-------- 本文结束 --------