0
点赞
收藏
分享

微信扫一扫

docker细节上的一些验证

  • 命名空间
  • 网络命名空间
  • 文件相关
  • 容器网络

1 命名空间

docker ps
docker inspect 〈ID or NAME〉
docker inspect ivlan_test43

"Pid": 6338,

root@vm-133:~# ls -l /proc/6338/ns
total 0
lrwxrwxrwx 1 root root 0 Oct 13 15:49 cgroup -> 'cgroup:[4026532870]'
lrwxrwxrwx 1 root root 0 Oct 13 15:49 ipc -> 'ipc:[4026532810]'
lrwxrwxrwx 1 root root 0 Oct 13 15:49 mnt -> 'mnt:[4026532808]'
lrwxrwxrwx 1 root root 0 Oct 13 15:32 net -> 'net:[4026532813]'
lrwxrwxrwx 1 root root 0 Oct 13 15:49 pid -> 'pid:[4026532811]'
lrwxrwxrwx 1 root root 0 Oct 13 16:04 pid_for_children -> 'pid:[4026532811]'
lrwxrwxrwx 1 root root 0 Oct 13 15:49 time -> 'time:[4026531834]'
lrwxrwxrwx 1 root root 0 Oct 13 16:04 time_for_children -> 'time:[4026531834]'
lrwxrwxrwx 1 root root 0 Oct 13 15:49 user -> 'user:[4026531837]'
lrwxrwxrwx 1 root root 0 Oct 13 15:49 uts -> 'uts:[4026532809]'

docker细节上的一些验证_docker

docker细节上的一些验证_docker_02

2 网络命名空间

root@vm-133:~# docker inspect 8e70627e2871 | jq -r '.[] | {State: .State.Pid, NetworkSettings: {SandboxID: .NetworkSettings.SandboxID, SandboxKey: .NetworkSettings.SandboxKey, EndpointID: (.NetworkSettings.Networks | to_entries[0].value.EndpointID)}}'
{
  "State": 6338,
  "NetworkSettings": {
    "SandboxID": "fdfa3bb6c99124f08b6b49d9bf71ad32e50872604daa0e61f6edc335ef46bd23",
    "SandboxKey": "/var/run/docker/netns/fdfa3bb6c991",
    "EndpointID": "13c6db40e824e45fa568eea2b9fc05cae7bf840f7c24f6b7a52ede02a70de921"
  }
}

docker细节上的一些验证_网络接口_03

docker细节上的一些验证_Docker_04

3 文件

在 Docker 中,/var/lib/docker/containers 和 /var/lib/docker/overlay2 ,它们分别用来存储 Docker 容器的数据和 Docker 镜像的数据。

  • /var/lib/docker/containers:这个目录包含了所有的 Docker 容器的数据。每个容器都有一个对应的目录,目录的名称是容器的 ID。在每个容器的目录中,你可以找到一些文件和目录,包括容器的配置文件(config.v2.json)、容器的日志文件(<container-id>-json.log)、容器的运行时状态等。
  • /var/lib/docker/overlay2:这个目录则用来存储 Docker 镜像的数据。Docker 使用了 Union File System(联合文件系统)来存储镜像,其中的每一层都存储在一个单独的目录中。这些目录的名称是长的哈希值,这些哈希值对应于 Docker 镜像的每一层。在每个目录中,你可以找到 diff 目录,该目录包含了这一层中文件的实际内容;link 文件,该文件包含了这一层的短 ID;以及 lower 文件,该文件包含了这一层下面所有层的短 ID。

root@vm-133:~# docker ps
CONTAINER ID   IMAGE     COMMAND     CREATED          STATUS          PORTS     NAMES
36ff97d8b002   alpine    "/bin/sh"   48 minutes ago   Up 48 minutes             ivlan_test44
8e70627e2871   alpine    "/bin/sh"   2 hours ago      Up 2 hours                ivlan_test43
ce8444aaf7bb   alpine    "/bin/sh"   6 hours ago      Up 6 hours                ivlan_test5
556527deebaf   alpine    "/bin/sh"   6 hours ago      Up 6 hours                ivlan_test4
f53bc31a686c   alpine    "/bin/sh"   6 hours ago      Up 6 hours                ivlan_test3
root@vm-133:~# docker exec ivlan_test43 cat /etc/hostname
8e70627e2871
root@vm-133:~# docker exec 8e70627e2871 cat /etc/hostname
8e70627e2871
root@vm-133:~# cat /var/lib/docker/containers/8e70627e287189b505902d9a905df90b5e720acac0d2fb2277775fec8e9a0088/hostname
8e70627e2871

root@vm-133:~# tree /var/lib/docker/containers/8e70627e287189b505902d9a905df90b5e720acac0d2fb2277775fec8e9a0088
/var/lib/docker/containers/8e70627e287189b505902d9a905df90b5e720acac0d2fb2277775fec8e9a0088
├── 8e70627e287189b505902d9a905df90b5e720acac0d2fb2277775fec8e9a0088-json.log
├── checkpoints
├── config.v2.json
├── hostconfig.json
├── hostname
├── hosts
├── mounts
├── resolv.conf
└── resolv.conf.hash

2 directories, 7 files

docker细节上的一些验证_Docker_05

docker细节上的一些验证_网络接口_06

4 网络

在 Linux 系统中,/sys/class/net/<interface> 目录包含了关于网络接口的一些信息,其中 ifindex 和 iflink 是两个很重要的文件。

  • /sys/class/net/<interface>/ifindex:这个文件包含了网络接口的索引。这是一个在系统中唯一的整数,用来唯一标识一个网络接口。这个值是由内核分配的,每当创建一个新的网络接口时,内核都会分配一个新的 ifindex 值。
  • /sys/class/net/<interface>/iflink:这个文件包含了网络接口的链接索引。对于大多数网络接口来说,这个值和 ifindex 是相同的。但是对于一些特殊的网络接口,比如 veth 接口或 macvlan 接口,这个值表示的是对端接口的 ifindex 值

ip add show

20: veth1c15c3a@if19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
    link/ether ce:88:c5:fa:0d:56 brd ff:ff:ff:ff:ff:ff link-netnsid 7
    inet6 fe80::cc88:c5ff:fefa:d56/64 scope link
       valid_lft forever preferred_lft forever
root@vm-133:~# cat  /sys/class/net/veth1c15c3a/ifindex
20
root@vm-133:~# cat  /sys/class/net/veth1c15c3a/iflink
19

root@vm-133:~# docker exec -it ivlan_test45 sh
/ #  cat  /sys/class/net/eth0/ifindex
19
/ #  cat  /sys/class/net/eth0/iflink
20

也就是说 veth1c15c3a@if19  与容器中ifindex为20的是一对,bridge网络模式下每个容器的iflink号都是不一样的

而IPVlan模式下是一样的,因为工用一个mac地址

root@vm-133:~# docker network  ls
NETWORK ID     NAME        DRIVER    SCOPE
b3a3736da342   bridge      bridge    local
a0d241cafaa3   host        host      local
bc6a5d21f2a5   ipvlan30    ipvlan    local
76bbb910822f   ipvlan110   ipvlan    local
a7f59c059434   none        null      local
root@vm-133:~#  docker inspect ipvlan30 | jq -r '.[] | .Containers | to_entries[] | {Name: .value.Name, MacAddress: .value.MacAddress, IPv4Address: .value.IPv4Address, Options: .value.Options}'
{
  "Name": "ivlan_test4",
  "MacAddress": "",
  "IPv4Address": "192.168.30.3/24",
  "Options": null
}
{
  "Name": "ivlan_test3",
  "MacAddress": "",
  "IPv4Address": "192.168.30.2/24",
  "Options": null
}
root@vm-133:~#  docker inspect ipvlan110 | jq -r '.[] | .Containers | to_entries[] | {Name: .value.Name, MacAddress: .value.MacAddress, IPv4Address: .value.IPv4Address, Options: .value.Options}'
{
  "Name": "ivlan_test5",
  "MacAddress": "",
  "IPv4Address": "192.168.110.2/24",
  "Options": null
}
root@vm-133:~#  docker inspect bridge | jq -r '.[] | .Containers | to_entries[] | {Name: .value.Name, MacAddress: .value.MacAddress, IPv4Address: .value.IPv4Address, Options: .value.Options}'
{
  "Name": "ivlan_test44",
  "MacAddress": "02:42:ac:11:00:03",
  "IPv4Address": "172.17.0.3/16",
  "Options": null
}
{
  "Name": "ivlan_test45",
  "MacAddress": "02:42:ac:11:00:02",
  "IPv4Address": "172.17.0.2/16",
  "Options": null
}
root@vm-133:~# docker ps -qa |xargs -i docker exec {} cat  /sys/class/net/eth0/iflink
20
18
2
2
2
root@vm-133:~# docker ps -qa |xargs -i docker exec {} cat  /sys/class/net/eth0/ifindex
19
17
14
13
12


举报

相关推荐

0 条评论