Docker 核心技术之容器
Posted crazymagic
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker 核心技术之容器相关的知识,希望对你有一定的参考价值。
什么是容器
容器(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
命令参数(COMMANDARG):
- 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
命令参数(COMMANDARG):
- 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 只显示某事时间节点之前的
注意:
- 容器日志中记录的是容器主进程的输出STDOUTSTDERR
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 核心技术之容器的主要内容,如果未能解决你的问题,请参考以下文章