什么是容器

容器(Container)

  容器是一种轻量级、可移植、并将应用程序进行的打包的技术,使应用程序可以在几乎任何地方以相同的方式运行 Docker将镜像文件运行起来后,产生的对象就是容器。容器相当于是镜像运行起来的一个实例。

容器具备一定的生命周期。

另外,可以借助docker ps命令查看运行的容器,如同在linux上利用ps命令查看运行着的进程那样。

通俗的讲 docker 运行一个镜像,这个镜像就会生成一个进程,这个进程就被成为容器。(进程就是资源管理的集合)

容器和虚拟机对比

Docker 容器与虚拟机相同点

  • 容器和虚拟机一样,都会对物理硬件资源进行共享使用。
  • 容器和虚拟机的生命周期比较相似(创建、运行、暂停、关闭等等)。
  • 容器中或虚拟机中都可以安装各种应用,如redis、mysql、nginx等。
  • 也就是说,在容器中的操作,如同在一个虚拟机(操作系统)中操作一样。
  • 同虚拟机一样,容器创建后,会存储在宿主机上:linux上位于/var/lib/docker/containers

运行一个镜像

docker run --rm -dti ubuntu:16.04

cd /var/lib/docker/containers

docker ps

  

Docker 容器与虚拟机不同点

注意:容器并不是虚拟机,但它们有很多相似的地方

  • 虚拟机的创建、启动和关闭都是基于一个完整的操作系统。一个虚拟机就是一个完整的操作系统。而容器直接运行在宿主机的内核上,其本质上以一系列进程的结合。
  • 容器是轻量级的,虚拟机是重量级的。首先容器不需要额外的资源来管理(不需要Hypervisor、Guest OS),虚拟机额外更多的性能消耗;其次创建、启动或关闭容器,如同创建、启动或者关闭进程那么轻松,而创建、启动、关闭一个操作系统就没那么方便了。
  • 也因此,意味着在给定的硬件上能运行更多数量的容器,甚至可以直接把Docker运行在虚拟机上。

 

                   

    docker                                                          虚拟机

虚拟机和 docker 容器的生命周期

                      虚拟机的生命周期

                      docker 容器的生命周期

容器创建 – docker create

作用:

  • 利用镜像创建出一个Created 状态的待启动容器

命令格式:

docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

命令参数(OPTIONS): 

  • -t, --tty 分配一个伪TTY,也就是分配虚拟终端
  • -i, --interactive 即使没有连接,也要保持STDIN打开
  • --name 为容器起名,如果没有指定将会随机产生一个名称

查看更多

https://docs.docker.com/engine/reference/commandline/create/#options

命令参数(COMMAND\ARG):

  • COMMAND 表示容器启动后,需要在容器中执行的命令,如ps、ls 等命令 ARG 表示执行 COMMAND 时需要提供的一些参数,如ps 命令的 aux、ls命令的-a等等

查看使用帮助

docker create --help

可以看到必填的参数是 IMAGE ,假如 创建一个 centos 的容器 docker create centos

如果我们不指定参数, 他就会使用 centos 默认的参数, 具体查看如下

docker inspect centos

创建一个 centos 的镜像

docker create centos ls -a
docker ps -a

容器删除 – docker container rm

查看使用帮助

docker rm -h

查看正在运行的容器

docker ps -a

根据 NAMES和 ID 进行删除 一个或多个 , 加上参数 -f 表示强制删除(针对正在运行的

docker rm zhang 0ac 1c1 ded

容器启动 – docker start

作用:

  • 将一个或多个处于创建状态或关闭状态的容器启动起来

命令格式:

  • docker start [OPTIONS] CONTAINER [CONTAINER...]

命令参数(OPTIONS):

  • -a, --attach 将当前shell的 STDOUT/STDERR连接到容器上
  • -i, --interactive 将当前shell的 STDIN连接到容器上

创建一个容器

docker create --name test-centos centos ls -a

docker ps -a

  

启动刚刚创建的容器

docker start 1dd

  

可以看到这时容器的状态是 Exited 并不是我们期望的 runing 状态 这时因为我们在创建容器的时候使用的命令参数是 ls -a ,这条命令是瞬间就执行完成,进程执行结束,所以容器退出了

但是并没有打印出 ls -a 的执行结果 ,查看 docker start 的用法

docker start -h

在上面我们可以看到 可选参数 -a 可以把 标准的输入和错误信息显示出来,再次启动一个容器

 docker start 1dd -a

 

 

创建一个容器执行 python 命令

docker create --name python centos python
docker start python -a

发现并没有向我们在终端上出现的如下交互

 出现以上的原因是我们在创建容器的时候,没有为其指定一个终端 -t 和 标准的输入 -i

docker create --name python_new -ti centos python

docker start python_new -ai

这时就可以输入和输出了

容器创建并启动 – docker run

作用:

  • 利用镜像创建并启动一个容器

命令格式:

  • docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

命令参数(OPTIONS):

  • -t, --tty 分配一个伪TTY,也就是分配虚拟终端
  • -i, --interactive 即使没有连接,也要保持STDIN打开
  • --name 为容器起名,如果没有指定将会随机产生一个名称
  • -d, --detach 在后台运行容器并打印出容器ID
  • --rm 当容器退出运行后,自动删除容器

查看更多

https://docs.docker.com/engine/reference/commandline/run/#options

命令参数(COMMAND\ARG):

  • COMMAND 表示容器启动后,需要在容器中执行的命令,如ps、ls 等命令
  • ARG 表示执行 COMMAND 时需要提供的一些参数,如ps 命令的 aux、ls命令的-a等等

运行一个容器

docker run centos ls -a

可以看到 docker run 等价于 docker create + docker start -a

  

需要提供终端和标准输入加上 -ti 参数即可

docker run -ti centos python

docker run 与 docker create + docker start

  • docker run 相当于 docker create + docker start –a 前台模式
  • docker run -d 相当于 docker create + docker start 后台模式
docker run -dti centos python

  

可以看到加上 -d 后这个容器是在后台挂起的

容器关闭 – docker stop

作用:

  • 关闭一个或多个处于暂停状态或者运行状态的容器

命令格式:

  • docker stop [OPTIONS] CONTAINER [CONTAINER...]

命令参数(OPTIONS):

  • -t, --time int 关闭前,等待的时间,单位秒(默认 10s)

 命令演示

docker stop -h

  

后台运行一个 centos 的镜像

docker run -dti centos python
docker ps -a

3s 后 关闭这个容器,不加 -t 参数默认是10 s

docker stop -t 3 342

容器终止 – docker kill

docker kill -h

作用:

  • 强制并立即关闭一个或多个处于暂停状态或者运行状态的容器

命令格式:

  • docker kill [OPTIONS] CONTAINER [CONTAINER...]

命令参数(OPTIONS):

  • -s, --signal string 指定发送给容器的关闭信号 (默认“KILL”信号)

命令演示

docker kill 342

  

                                                                                                         

                         docker stop和docker kill的区别

前提知识点:

Linux其中两种终止进程的信号是:SIGTERM和SIGKILL

SIGKILL信号:无条件终止进程信号。进程接收到该信号会立即终止,不进行清理和暂存工作。该信号不能被忽略、处理和阻塞,它向系统管理员提供了可以杀死任何进程的方法。

SIGTERM信号:程序终结信号,可以由kill命令产生。与SIGKILL不同的是,SIGTERM信号可以被阻塞和终止,以便程序在退出前可以保存工作或清理临时文件等。

docker stop 会先发出SIGTERM信号给进程,告诉进程即将会被关闭。在-t指定的等待时间过了之后,将会立即发出SIGKILL信号,直接关闭容器。

docker kill 直接发出SIGKILL信号关闭容器。但也可以通过-s参数修改发出的信号。

因此会发现在docker stop的等过过程中,如果终止docker stop的执行,容器最终没有被关闭。而docker kill几乎是立刻发生,无法撤销。

此外还有些异常原因也会导致容器被关闭,比如docker daemon重启、容器内部进程运行发生错误等等“异常原因”。

容器暂停 – docker pause 和 取消暂停 – docker unpause

docker pause -h

作用:

  • 暂停一个或多个处于运行状态的容器

命令格式:

  • docker pause CONTAINER [CONTAINER...]

命令参数(OPTIONS):

命令演示

docker pause 342

docker unpause -h

作用:

  • 取消一个或多个处于暂停状态的容器,恢复运行

命令格式:

  • docker unpause CONTAINER [CONTAINER...]

命令参数(OPTIONS):

命令演示

docker unpause 342

  

容器重启 – docker restart

docker restart -h

作用:

  • 重启一个或多个处于运行状态、暂停状态、关闭状态或者新建状态的容器,该命令相当于stop和start命令的结合

命令格式:

  • docker restart [OPTIONS] CONTAINER [CONTAINER...]

命令参数(OPTIONS):

  • -t, --time int 重启前,等待的时间,单位秒(默认 10s),实则是关闭前等待的时间

命令演示

docker restart -t 1 342

容器信息查看

docker container inspect -h

作用:

  • 查看本地一个或多个容器的详细信息

命令格式:

  • docker container inspect [OPTIONS] CONTAINER [CONTAINER...]
  • 或者 docker inspect [OPTIONS] CONTAINER [CONTAINER...]

命令参数(OPTIONS):

  • -f, --format string 利用特定Go语言的format格式输出结果
  • -s, --size 显示总大小

命令演示

docker container inspect -f "{{ json .NetworkSettings.Networks.bridge }}" 342

容器日志信息 – docker logs  

docker logs -h

  

作用:

  • 查看容器的日志信息

命令格式:

  • docker logs [OPTIONS] CONTAINER

命令参数(OPTIONS):

  • --details 显示日志的额外信息
  • -f, --follow 动态跟踪显示日志信息
  • --since string 只显示某事时间节点之后的
  • --tail string 显示倒数的行数(默认全部)
  • -t, --timestamps 显示timestamps时间
  • --until string 只显示某事时间节点之前的

注意:

  • 容器日志中记录的是容器主进程的输出STDOUT\STDERR

 docker logs 输出的是COMMAND 中命令的执行信息

命令演示

docker logs 342

容器重命名 – docker rename  

docker rename -h

作用:

  • 修改容器的名称

命令格式:

  • docker rename CONTAINER NEW_NAME

命令参数(OPTIONS):

docker rename 342 centos

容器运行时操作

容器连接 – docker attach

作用:

  • 将当前终端的STDIN、STDOUT、STDERR绑定到正在运行的容器的主进程上实现连接

命令格式:

  • docker attach [OPTIONS] CONTAINER

命令参数(OPTIONS):

  • --no-stdin 不绑定STDIN

退出后,当前的容器会变成 Exited 状态 

命令演示

docker attach d77

容器中执行新命令 – docker exec

docker exec -h

作用:

  • 在容器中运行一个命令

命令格式:

  • docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

命令参数(OPTIONS):

  • -d, --detach 后台运行命令
  • -i, --interactive 即使没连接容器,也将当前的STDIN绑定上
  • -t, --tty 分配一个虚拟终端
  • -w, --workdir string 指定在容器中的工作目录
  • -e, --env list 设置容器中运行时的环境变量

 绑定的是容器中的子进程,所以执行完退出的是容器中的子进程,当前的容器并不会退出,这也是和 attach 的最主要的区别

命令演示

在后台运行 一个命令,在把其给删除

docker exec -dti 342 bash
docker exec  342 kill -9 100

总结

Docker 核心技术之容器的更多相关文章

  1. Docker 核心技术之容器与镜像

    Docker容器与镜像的关系 容器提交 – docker commit docker commit -h 作用: 根据容器生成一个新的镜像 命令格式: docker commit [OPTIONS] ...

  2. 深入浅出Docker(一):Docker核心技术预览

    Docker是PaaS供应商dotCloud开源的一个基于LXC 的高级容器引擎,源代码托管在 GitHub 上, 基于Go语言开发并遵从Apache 2.0协议开源.Docker提供了一种在安全.可 ...

  3. Docker 核心技术与实现原理

    提到虚拟化技术,我们首先想到的一定是 Docker,经过四年的快速发展 Docker 已经成为了很多公司的标配,也不再是一个只能在开发阶段使用的玩具了.作为在生产环境中广泛应用的产品,Docker 有 ...

  4. Docker核心技术

    Docker核心技术 1.cgroup 即controller group,其重要概念是子系统,首先挂载子系统,然后才有control group.例如cpu子系统,挂载至系统之后,创建一个cgrou ...

  5. docker核心技术(2)

    鸟瞰容器生态系统 一谈到容器,大家都会想到 Docker. Docker 现在几乎是容器的代名词.确实,是 Docker 将容器技术发扬光大.同时,大家也需要知道围绕 Docker 还有一个生态系统. ...

  6. docker:从 tomcat 容器连接到 mysql 容器

    docker 中的容器互联是一个较为复杂的话题,详细内容将在后续章节中介绍. 续前 2 个章节的内容,我们创建了一个 mysql 容器和一个 tomcat 容器,可以使用 「docker ps」来查看 ...

  7. 阿里云部署Docker(7)----将容器连接起来

    路遥知马力.日久见人心.恩. 该坚持的还是要坚持. 今天看到一个迅雷的师弟去了阿里,祝福他,哎,尽管老是被人家捧着叫大牛.我说不定通过不了人家的面试呢.哎,心有惭愧. 本文为本人原创,转载请表明来源: ...

  8. Docker背后的容器管理——Libcontainer深度解析

    Libcontainer 是Docker中用于容器管理的包,它基于Go语言实现,通过管理namespaces.cgroups.capabilities以及文件系统来进行容器控制.你可以使用Libcon ...

  9. Windows10下的docker安装与入门 (二)使用docker引擎在容器中运行镜像

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...

随机推荐

  1. Windows7下安装pyspark

    安装需要如下东西: java jdk-8u181-windows-x64.exe spark spark-2.1.3-bin-hadoop2.7 hadoop(版本要与spark的一致,这里都是had ...

  2. docker 搭建私有仓库 harbor

    前提 已安装好 docker 和  docker-compose 环境:CentOS Linux release 7.5 docker 版本:18.09.05 1.安装harbor wget -P / ...

  3. ViewPagerWithViewDemo【ViewPager和View搭配以及演示获取里面的值和CheckBox单选效果】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 简单记录下ViewPager和自定义布局view的搭配使用以及布局文件中单选效果.获取viewpager布局内部值的功能. 效果图 ...

  4. Fescar(Seata)-Springcloud流程分析-2阶段

    上文我们分析了fescar的一阶段执行过程.在一阶段中,服务起始方发起全局事务并注册到TC.在调用协同服务时,协同服务的事务分支事务会先完成阶段一的事务提交或回滚,并生成事务回滚的undo_log日志 ...

  5. Python:黑板课爬虫闯关第五关

    第五关是最后一关了,至此之后黑板课就没有更新过关卡了. 第五关地址:http://www.heibanke.com/lesson/crawler_ex04/ 可以看到,是在第三关的基础上加了验证码. ...

  6. 制造业物料清单BOM、智能文档阅读、科学文献影响因子、"Celebrated Italian mathematician ZepartzatT Gozinto" 与 高津托图

    意大利数学家Z.高津托 意大利伟大数学家Sire Zepartzatt Gozinto的生卒年代是一个谜[1],但是他发明的 “高筋图” 在 制造资源管理.物料清单(BOM)管理.智能阅读.科学文献影 ...

  7. js事件循环机制辨析

     对于新接触js语言的人来说,最令人困惑的大概就是事件循环机制了.最开始这也困惑了我好久,花了我几个月时间通过书本,打代码,查阅资料不停地渐进地理解他.接下来我想要和大家分享一下,虽然可能有些许错误的 ...

  8. [Javascript] js的类和对象

    类 graph LR 类-->构造函数 类-->prototype对象 类-->instanceof运算符 类-->constructor属性 类-->isPrototy ...

  9. VsCode+Node的前端环境搭建及其理解并创建一个前端目录

    既然选择了远方,便只顾风雨兼程 __ HANS许 系列:零基础搭建前后端分离项目 系列:零基础搭建前后端分离项目 VsCode VsCode的安装 VSCode中文设置 VsCode 扩展 VsCod ...

  10. 重写Ext中的typeOf函数

    重写Ext中的typeOf函数来解决Ext JS中typeOf对字符串对象.元素节点.文本节点.空白文本节点判断并不准确的问题 重写的typeOf函数使用自己实现的TypeOf函数2中的代码 测试代码 ...