作者介绍:简历上没有一个精通的运维工程师。下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
我们在上一章,讲了虚拟化,虚拟化是把硬件虚拟化,然后创建出来的虚拟机完全隔离,而Docker则是软件(内核)虚拟化,他的隔离性会低于虚拟机。我们将通过3-4周来讲解Docker相关内容,由于涉及到内容较多,就不一一列出来具体的细节,主要从以下几个方面来讲解:
Docker基本情况(本小节属于)
Docker基本命令
Dockerfile
Docker镜像
Docker仓库
Docker原理
Docker网络&存储&日志
Docker-Compose
Docker番外篇
为什么把这个小节放到比较靠后来讲解呢,主要是因为我们需要对docker有一定理解,才能更好的理解这个信息。在讲Docker-镜像操作&容器操作命令讲过一个参数inspect,它可以显示某个容器的详细信息,今天我们就来讲解下这个命令执行以后显示的内容。
运行一个容器
#尽量使用多的参数
docker run -d \
--name my_centos_container \
--hostname my_container_hostname \
--privileged \
-m 512m \
--cpu-shares 512 \
--cpus 2 \
-p 8080:80 \
-v /data/host:/data/container1 \
-v my_named_volume:/data/container2 \
--network bridge \
-e "MY_VARIABLE=value" \
--restart always \
192.168.31.43:5000/centos:7
解析这个容器
# 除去大括号实际里面就是一个json
[
{
"Id": "d60b8f0ef35ed89bff1ba45283e8240ef4d6abac7f6618da178ed1eee03ce98f",
"Created": "2024-12-12T16:00:45.206440876Z",
"Path": "/docker-entrypoint.sh",
"Args": [
"nginx",
"-g",
"daemon off;"
],
#以上部分是基本信息,包括容器id,创建时间,启动命令,和参数
#其中path就是ENTRYPOINT
#args 就是CMD
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 938,
"ExitCode": 0,
"Error": "",
"StartedAt": "2024-12-12T16:00:45.348834106Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
#以上部分就是状态信息,包括容器状态,pid和上次退出的状态码和启动时间
#ExitCode是上一次退出状态码,可以用来分析历史问题
#Pid 用于使用nsenter命令进入不同的ns空间
#OOMKilled是否因为oom被kill
"Image": "sha256:3b25b682ea82b2db3cc4fd48db818be788ee3f902ac7378090cf2624ec2442df",
"ResolvConfPath": "/mnt/containers/d60b8f0ef35ed89bff1ba45283e8240ef4d6abac7f6618da178ed1eee03ce98f/resolv.conf",
"HostnamePath": "/mnt/containers/d60b8f0ef35ed89bff1ba45283e8240ef4d6abac7f6618da178ed1eee03ce98f/hostname",
"HostsPath": "/mnt/containers/d60b8f0ef35ed89bff1ba45283e8240ef4d6abac7f6618da178ed1eee03ce98f/hosts",
"LogPath": "/mnt/containers/d60b8f0ef35ed89bff1ba45283e8240ef4d6abac7f6618da178ed1eee03ce98f/d60b8f0ef35ed89bff1ba45283e8240ef4d6abac7f6618da178ed1eee03ce98f-json.log",
"Name": "/my_centos_container",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
#以上部分是包括写配置文件,4个特殊文件路径,容器名字,重启次数
#4个路径分别是dns,主机名,hosts,日志路径
#Name则是容器名字
"HostConfig": {
"Binds": [
"/data/host:/data/container1",
"my_named_volume:/data/container2"
],
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "bridge",
"PortBindings": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "8080"
}
]
},
"RestartPolicy": {
"Name": "always",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"ConsoleSize": [
26,
142
],
"CapAdd": null,
"CapDrop": null,
"CgroupnsMode": "host",
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": true,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": [
"label=disable"
],
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"Isolation": "",
"CpuShares": 512,
"Memory": 536870912,
"NanoCpus": 1000000000,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": [],
"BlkioDeviceWriteBps": [],
"BlkioDeviceReadIOps": [],
"BlkioDeviceWriteIOps": [],
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"MemoryReservation": 0,
"MemorySwap": 1073741824,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": [],
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": null,
"ReadonlyPaths": null
},
#以上是主机部分,包括磁盘挂载,端口映射,重启方式,资源限制,日志格式
#Binds是磁盘挂载,这里有2种,直接端口映射和使用volume
#LogConfig是日志格式,容器可以单独注入日志格式可以和其他容器不一样
#RestartPolicy配置重启方式,包括最大重启次数
"GraphDriver": {
"Data": {
"LowerDir": "/mnt/overlay2/4f2f7474fefe170661331a0744e58a761fb1bfcaba0a24e54965da0386eb174c-init/diff:/mnt/overlay2/606dc92a91914337d5c1fcd6ae3678e81994291cb92ea15eb4139445af98199f/diff:/mnt/overlay2/e2c5910fbd71a9ab11770ba645d6fbfca42510ec05e334773b5dd6148d8587e7/diff:/mnt/overlay2/2006c249381840034b2deefcd93dba27899c8cb34cda2423f720f28420c89299/diff:/mnt/overlay2/c46904127f2107e4bbbb0283048f321e0a35e8ec844b181748f97529c4f780b3/diff:/mnt/overlay2/a5a40868f2ccecb37f62eec6de0b8fd09519c8486e4c018045828949c173d0ab/diff:/mnt/overlay2/364a52d437e1764d9d6c8034ee0da528816c3e320b9f5a9f44238251fd796a3f/diff:/mnt/overlay2/df7a3537996d5e39519acee5e029c43e91c10003eb7d4a5c2feca0d7c8348755/diff",
"MergedDir": "/mnt/overlay2/4f2f7474fefe170661331a0744e58a761fb1bfcaba0a24e54965da0386eb174c/merged",
"UpperDir": "/mnt/overlay2/4f2f7474fefe170661331a0744e58a761fb1bfcaba0a24e54965da0386eb174c/diff",
"WorkDir": "/mnt/overlay2/4f2f7474fefe170661331a0744e58a761fb1bfcaba0a24e54965da0386eb174c/work"
},
"Name": "overlay2"
},
#上面就是联合文件系统的几个层
#LowerDir只读层
#MergedDir就是展示层(只读+读写+上面那3个特殊文件)
#UpperDir就是读写层
"Mounts": [
{
"Type": "bind",
"Source": "/data/host",
"Destination": "/data/container1",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
{
"Type": "volume",
"Name": "my_named_volume",
"Source": "/mnt/volumes/my_named_volume/_data",
"Destination": "/data/container2",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
#磁盘挂载详细信息
#Type挂载类型,包括直接挂载bind,volume映射
#RW 是否读写模式,挂载可以只读挂载
"Config": {
"Hostname": "my_container_hostname",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"MY_VARIABLE=value",
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NGINX_VERSION=1.27.2",
"NJS_VERSION=0.8.6",
"NJS_RELEASE=1~bookworm",
"PKG_RELEASE=1~bookworm",
"DYNPKG_RELEASE=1~bookworm"
],
"Cmd": [
"nginx",
"-g",
"daemon off;"
],
"Image": "192.168.31.43:5000/centos:7",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": [
"/docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": {
"maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
},
"StopSignal": "SIGQUIT"
},
#上面是一个主机名,环境变量,镜像名字,cmd等详细信息
"NetworkSettings": {
"Bridge": "",
"SandboxID": "fee38d8b900be4e8653918b7cab63a7f4acb395cfbfab8ebaad688fa084529bb",
"SandboxKey": "/var/run/docker/netns/fee38d8b900b",
"Ports": {
"80/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "8080"
},
{
"HostIp": "::",
"HostPort": "8080"
}
]
},
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "be69dcf061e8f5b926d4d8adf8a529bf18ac0ad8c33418161aacde339f3045b8",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:03",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"MacAddress": "02:42:ac:11:00:03",
"NetworkID": "a3fc72b15a533a1b0b52dcc30f0a6e77c0170d9221ac84b4c1e69b6e21149e6e",
"EndpointID": "be69dcf061e8f5b926d4d8adf8a529bf18ac0ad8c33418161aacde339f3045b8",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"DriverOpts": null,
"DNSNames": null
}
}
}
}
#上面是一些网络相关信息,比如IP,网关,mac和端口映射
#在宿主机外面看不到ip地址,我最常用用它看ip地址
]
能阅读和理解这个文件,其实你对docker的运行情况就会比较了解,就可以基本还原出来这个容器的运行参数,因为如果你接受了别人交接给你的容器平台,如果需要删除容器重建,可以通过这个方式还原出来对应的参数。
当然你也可以用第三方开源的工具去还原:比如runlike,其实我也也用rust写了个类似的工具(全程gpt生成代码)。