什么是容器

容器(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. MySQL系列--4.使用Python3访问数据库

    1.安装MySQL驱动 pip install mysql-connector 安装完成后进入命令行模式,导入驱动,如果不报错,说明安装成功 Python 3.6.7 (default, Oct 22 ...

  2. 使用 ASP.NET Core MVC 创建 Web API(四)

    使用 ASP.NET Core MVC 创建 Web API 使用 ASP.NET Core MVC 创建 Web API(一) 使用 ASP.NET Core MVC 创建 Web API(二) 使 ...

  3. Windows系统pip安装whl包

    1.确保PIP的存在 2.CMD命令进入C:\Python34\Scripts里面后再执行PIP命令安装pip install wheel     # D:   和cd  地址 3.把文件最好放在\S ...

  4. 自定义Visual Studio.net Extensions 开发符合ABP vnext框架代码生成插件[附源码]

    介绍 我很早之前一直在做mvc5 scaffolder的开发功能做的已经非常完善,使用代码对mvc5的项目开发效率确实能成倍的提高,就算是刚进团队的新成员也能很快上手,如果你感兴趣 可以参考 http ...

  5. DevOps概述

    Devops概念 转载自 devops实践-开篇感想 DevOps(英文Development和Operations的组合)是一组过程.方法与系统的统称,用于促进开发(应用程序/软件工程).技术运营和 ...

  6. nginx系列8:反向代理和负载均衡原理

    反向代理是nginx的一个非常重要的功能. 反向代理 nginx支持四层反向代理和七层反向代理,如下图. 负载均衡 负载均衡是实现服务高性能和高可用的重要手段,而nginx是实现负载均衡的重要工具.

  7. matlab中的实时音频

    音频系统工具箱™针对实时音频处理进行了优化.audioDeviceReader, audioDeviceWriter, audioPlayerRecorder, dsp.AudioFileReader ...

  8. 解决Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile

    原因: 由于项目所需jdk版本和你当前使用的jdk版本不一致导致的,因为我项目的pom.xml中定义了java版本为1.8,但是我实际idea中run这个项目却是1.7 解决方案: 更换当前jdk版本 ...

  9. js 判断元素(例如div)里的数据显示不全(数据长度大于元素长度)

    //判断div里元素是否超出长度,true 超出,false 没有 dom=document.getElementById('id');function isEllipsis(dom) {    va ...

  10. spring boot跨域问题

    跨域是指不同域名之间相互访问.跨域,指的是浏览器不能执行其他网站的脚本.它是浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制.也就是如果在A网站中,我们希望使用Ajax来获得B网站 ...