- 命名空间
- 网络命名空间
- 文件相关
- 容器网络
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]'
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"
}
}
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
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