①Docker容器简介
容器是镜像的运行时实例,可以从单个镜像上启动一个或多个容器。虚拟机和容器的最大区别在于容器更快并且更轻量级---与虚拟机运行在完整的操作系统之上想比,容器会共享其所在主机的操作系统/内核。
②Docker容器---详解
(1)容器vs虚拟机
首先介绍一下虚拟机和容器的根本区别:
在虚拟机模式下,首先要开启物理机并启动Hypervisor引导程序,一旦Hypervisor启动,就会占有机器上的全部物理资源,Hypervisor接下来将这些物理资源划分为虚拟资源。然后Hypervisor会将这些资源打包进一个叫做细腻及(VM)的软件结构当中。
在容器模式下,服务启动后,所选择的操作系统会启动,与虚拟机模式相同,OS也占用了全部硬件资源,在OS层之上,需要安装容器引擎,容器引擎可以获取系统资源,接着将这些资源分割为安全的互相隔离的资源结构,成为容器。每个容器看起来就像一个真实的操作系统,在其内部可以运行应用。
从更高层面上来说,Hypervisor是硬件虚拟化---hypervisor将硬件物理资源划分为虚拟资源。容器是操作系统虚拟化---容器将系统资源划分为虚拟资源。
(2)虚拟机的额外开销
虚拟机模型将底层硬件资源划分到虚拟机当中,每个虚拟机都是包含了虚拟CPU,虚拟RAM,虚拟磁盘等资源的一种软件结构,因此,每个虚拟机都需要有自己的操作系统来声明,初始化并管理这些虚拟资源。然而,操作系统本身是有其开销的。
容器模型具有在宿主机操作系统中运行的单个内核,在一台主机上运行数十个甚至数百个容器都是有可能的---容器共享一个操作系统/内核,这意味着只有一个操作系统消耗CPU,RAM和储存资源。
(3)容器生命周期
可以根据需要多次停止,启动,暂停以及重启容器,并且这些操作执行得很快,但是容器及其数据是安全的,直至明确删除容器前,容器都不会丢弃其中的数据。就算容器被删除了,如果将容器数据存储在卷中,数据也是会保存下来的。
(4)利用重启策略进行容器的自我修复
通常建议在运行容器时配置好重启策略,这是容器的一种自我修复能力,可以在指定事件或者错误后重启来完成自我修复。重启策略应用于每个容器,可以作为参数被强制传入 docker container run命令当中,或者在Compose文件中声明。
目前容器支持的充气策略包括always,unless-stopped,on-failed。
(5)查看容器详情
docker image inspect "镜像名"
以上命令可以看到容器启动时将要运行的应用列表,结构如下,其中“CMD”对应的结构中代表了其应用列表
[
{
"Id": "sha256:0d120b6ccaa8c5e149176798b3501d4dd1885f961922497cd0abef155c869566",
"RepoTags": [
"centos:latest"
],
"RepoDigests": [
"centos@sha256:76d24f3ba3317fa945743bb3746fbaf3a0b752f10b10376960de01da70685fbd"
],
"Parent": "",
"Comment": "",
"Created": "2020-08-10T18:19:49.837885498Z",
"Container": "3b04ecd9fb2d3f921f12d858edf5f3a6aa7c36c8e1e6f74bd32555fd4d7f7da2",
"ContainerConfig": {
"Hostname": "3b04ecd9fb2d",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"/bin/bash\"]"
],
"ArgsEscaped": true,
"Image": "sha256:69587a438b2c9b803db8ed4f6e6b5abce25a6b8ec2583a394807cf82bfd23693",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20200809",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS"
}
},
"DockerVersion": "18.09.7",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash"
],
"ArgsEscaped": true,
"Image": "sha256:69587a438b2c9b803db8ed4f6e6b5abce25a6b8ec2583a394807cf82bfd23693",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20200809",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS"
}
},
"Architecture": "amd64",
"Os": "linux",
"Size": 215102299,
"VirtualSize": 215102299,
"GraphDriver": {
"Data": {
"MergedDir": "/var/lib/docker/overlay2/50c214042151353d7949ddb47ce7aa3844f37944a8e0f7537af196193819cec1/merged",
"UpperDir": "/var/lib/docker/overlay2/50c214042151353d7949ddb47ce7aa3844f37944a8e0f7537af196193819cec1/diff",
"WorkDir": "/var/lib/docker/overlay2/50c214042151353d7949ddb47ce7aa3844f37944a8e0f7537af196193819cec1/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:291f6e44771a7b4399b0c6fb40ab4fe0331ddf76eda11080f052b003d96c7726"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]
(6)快速清理
简单且快速清理Docker主机上全部运行容器的方法,但是,这种清理方式会强制删除所有容器,并且不会给容器完成清理的机会。所以,这种操作方式不能在生产环境系统或者运行着重要容器的系统上执行。
docker container rm $(docker container ls aq) -f