k8s(六)Docker 容器分析

157 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情

容器

  1. GraphDriver

    同样可以使用docker inspect [容器 ID]来查看容器属性。

    .....
    "GraphDriver": {
                "Data": {
                    "LowerDir": "/var/lib/docker/overlay2/ea16bd86de8b3c254a2c1582f77ffd9910485422d837aaa445acba6f71192920-init/diff:/var/lib/docker/overlay2/d6f217c3a337c34b5189700a3f94e521b6bde6b0309119f62abe1b51efb024be/diff:/var/lib/docker/overlay2/990ec90661e0868c1fda29618916e4c5e3143a61394055de6e3f1333de9453fe/diff:/var/lib/docker/overlay2/69c24a49f77b361d64ddf7ce24051acee85d44cf27a62affee17203b9eb82d94/diff",
                    "MergedDir": "/var/lib/docker/overlay2/ea16bd86de8b3c254a2c1582f77ffd9910485422d837aaa445acba6f71192920/merged",
                    "UpperDir": "/var/lib/docker/overlay2/ea16bd86de8b3c254a2c1582f77ffd9910485422d837aaa445acba6f71192920/diff",
                    "WorkDir": "/var/lib/docker/overlay2/ea16bd86de8b3c254a2c1582f77ffd9910485422d837aaa445acba6f71192920/work"
                },
                "Name": "overlay2"
            },
    ......
    

    容器也和镜像一样存在LowerDir、MergedDir、UpperDir,并且这些目录能够在宿主机器上直接访问的。

    之前构建镜像的dockerfile文件,所做的就是将demo-gin存放在/app目录下,不出意外的话我们能够在MergedDir目录下看到这个文件。

    [root@master ~]# ls /var/lib/docker/overlay2/ea16bd86de8b3c254a2c1582f77ffd9910485422d837aaa445acba6f71192920/merged/app
    demo-gin
    

    接着我们进入容器,在容器内执行一些操作,例如在/app下创建一个文件。

    [root@master ~]# docker exec -it 4618b0cc2498 /bin/sh
    /app # ls
    demo-gin
    /app # mkdir lomtom
    /app # ls
    demo-gin  lomtom
    

    那么,此时容器内的/app下存在demo-gin lomtom。我们再在宿主机器上查看merged目录。

    [root@master ~]# ls /var/lib/docker/overlay2/ea16bd86de8b3c254a2c1582f77ffd9910485422d837aaa445acba6f71192920/merged/app
    demo-gin  lomtom
    
  2. Namespace 及 Cgroup

    之前已经对docker原理进行讲解,那么对于真实的容器,他的Namespace 及 Cgroup如何查看呢。

    首先,找到该容器的进程编号,因为一个容器就是一个进程。

    [root@master ~]# ps -aux| grep demo
    root     23213  0.0  0.0 112676   988 pts/0    S+   10:33   0:00 grep --color=auto demo
    root     25199  0.0  0.0 709460  9156 ?        Ssl  09:34   0:00 ./demo-gin
    

    那么25199就是该容器的进程编号。使用ls /proc/25199/即可查看该进程下的一些资源信息。

    [root@master ~]#  ls /proc/25199/
    attr       cgroup      comm             cwd      fd       io        map_files  mountinfo   net        oom_adj        pagemap      root       sessionid  stack  status   timers
    autogroup  clear_refs  coredump_filter  environ  fdinfo   limits    maps       mounts      ns         oom_score      personality  sched      setgroups  stat   syscall  uid_map
    auxv       cmdline     cpuset           exe      gid_map  loginuid  mem        mountstats  numa_maps  oom_score_adj  projid_map   schedstat  smaps      statm  task     wchan
    

    其中就包括Namespace即ns。

    [root@master ~]# ls /proc/25199/ns/ -l
    总用量 0
    lrwxrwxrwx. 1 root root 0 4月  21 09:36 ipc -> ipc:[4026532696]
    lrwxrwxrwx. 1 root root 0 4月  21 09:36 mnt -> mnt:[4026532694]
    lrwxrwxrwx. 1 root root 0 4月  21 09:34 net -> net:[4026532699]
    lrwxrwxrwx. 1 root root 0 4月  21 09:36 pid -> pid:[4026532697]
    lrwxrwxrwx. 1 root root 0 4月  21 10:30 user -> user:[4026531837]
    lrwxrwxrwx. 1 root root 0 4月  21 09:36 uts -> uts:[4026532695]
    

    以及文件资源,即root,是不是验证了与容器中的文件一致

    [root@master ~]#  ls /proc/25199/root/app/
    demo-gin  lomtom
    

    同样我们进入容器,在/app,新建一个文件config,并且写入hello world,同样在宿主机器上能够查看内容。

    /app # echo hello world > config
    /app # ls
    config    demo-gin  lomtom
    ​
    ​
    [root@master ~]# cat /proc/25199/root/app/config 
    hello world