概述
如果大家对devops有研究的话,第一个肯定要研究docker,Docker为基于Linux容器的开源项目,其利用Linux内核中的各项功能——例如命名空间与控制组——以在操作系统之上创建容器。
下面讲一下启动容器、让容器长期运行、终止容器、进入容器、导出和导入容器、删除容器几个方面,内容有点多,希望大家可以耐心看完。
启动容器
启动容器有两种方式,一种是基于镜像新建一个容器并启动, 另外一个是将在终止状态( stopped)的容器重新启动。
新建并启动容器
所需要的命令主要为 dockerrun。
-t选项让Docker分配一个伪终端( pseudo-tty)并绑定到容器的标准输入上, -i则让容器的标准输入保持打开。
在交互模式下,用户可以通过所创建的终端来输入命令
当利用 docker run 来创建容器时, Docker 在后台运行的标准操作包括:
1、检查本地是否存在指定的镜像,不存在就从公有仓库下载
2、利用镜像创建并启动一个容器
3、分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
4、从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
5、从地址池配置一个ip地址给容器
6、执行用户指定的应用程序
7、执行完毕后容器被终止
启动已终止容器
可以利用 dockerstart命令,直接将一个已经终止的容器启动运行。
容器的核心为所执行的应用程序,所需要的资源都是应用程序运行所必需的。除此之外,并没有其它的资源。可以在伪终端中利用 ps或 top来查看进程信息。
执行 docker ps 或 docker container ls 可以查看 Docker host 中当前运行的容器:
容器中仅运行了指定的bash应用。 这种特点使得Docker对资源的利用率极高,是货真价实的轻量级虚拟化。
让容器长期运行
因为容器的生命周期依赖于启动时执行的命令,只要该命令不结束,容器也就不会退出。理解了这个原理,我们就可以通过执行一个长期运行的命令来保持容器的运行状态。
while 语句让 bash 不会退出。我们可以打开另一个终端查看容器的状态:
可见容器仍处于运行状态。不过这种方法有个缺点:它占用了一个终端。 我们可以加上参数 -d 以后台方式启动容器。
容器启动后回到了 docker host 的终端。这里看到 docker 返回了一串字符,这是容器的 ID。
终止容器
可以使用 dockerstop来终止一个运行中的容器。
此外,当Docker容器中指定的应用终结时,容器也自动终止。 例如对于上一章节中只启动了一个终端的容器,用户通过 exit命令或 Ctrl+d来退出终端时,所创建的容器立刻终止。
终止状态的容器可以用 dockerps-a命令看到。例如
处于终止状态的容器,可以通过 dockerstart命令来重新启动。
此外, dockerrestart命令会将一个运行态的容器终止,然后再重新启动它。
进入容器
在使用 -d参数时,容器启动后会进入后台。 某些时候需要进入容器进行操作,有很多种方法,包括使用dockerattach命令或 nsenter工具等。
为了连接到容器,需要找到容器的第一个进程的PID,可以通过下面的命令获取。
PID=$(docker inspect --format "{{ .State.Pid }}" <container>)
通过这个PID,就可以连接到这个容器:
$ nsenter --target $PID --mount --uts --ipc --net --pid
下面给出一个完整的例子。
$ sudo docker run -idt ubuntu 243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550 $ sudo docker ps CONTAINER ID IMAGE COMMAND 243c32535da7 ubuntu:latest "/bin/bash" $ PID=$(docker-pid 243c32535da7) 10981 $ sudo nsenter --target 10981 --mount --uts --ipc --net --pid root@243c32535da7:/#
导出和导入容器
如果要导出本地某个容器,可以使用 dockerexport命令。
$ sudo docker ps -a CONTAINER ID IMAGE COMMAND 7691a814370e ubuntu:14.04 "/bin/bash" $ sudo docker export 7691a814370e > ubuntu.tar
这样将导出容器快照到本地文件。
可以使用 dockerimport从容器快照文件中再导入为镜像,例如
$ cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0 $ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZ test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB
此外,也可以通过指定URL或者某个目录来导入,例如
$sudo docker import http://example.com/exampleimage.tgz example/imagerepo
*注:用户既可以使用 dockerload来导入镜像存储文件到本地镜像库,也可以使用 dockerimport来导入一个容器快照到本地镜像库。 这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
删除容器
可以使用 dockerrm来删除一个处于终止状态的容器。 例如
$sudo docker rm trusting_newton trusting_newton
如果要删除一个运行中的容器,可以添加 -f参数。 Docker会发送 SIGKILL信号给容器。
docker容器管理是学习docker的第一步,容器是在docker镜像的上一层,每次重启容器实际上都是镜像的初始化,数据都要重头来过,这个时候就有数据的持久化问题。
篇幅有限,后续会再分享一下数据持久化怎么做,docker又怎么去做监控,dockerfile一键部署等等,大家有兴趣可以动动手指关注哦~