k8s-demo集群搭建详细步骤01:Docker容器到底是个什么东东?

698 阅读11分钟

Kubernetes实践杂谈k8s-01:Docker容器到底是个什么东东?

本文已参与「新人创作礼」活动,一起开启掘金创作之路

学习k8s,首先搞清楚几个基本概念,例如容器,Pod,Service Volume Node 命名空间等,本文介绍容器是个什么东东

一、通俗的容器解释

  • 现实生活中的容器是用来装东西的,方便管理和运输,软件领域借鉴了这个思想
  • 先介绍一个大家熟悉的场景,一台PC上安装了Win10,管理员创建了两个账号,A和B,用户A登录后,看到的是自己的桌面,自己的文件以及自己安装的应用程序Word,B登录后,看到的桌面、文件和应用程序则不同,B安装了WPS而不是Word,这就类似两个Win10容器,它们分别“装”了属于两个用户的办公环境,两个人共享Win10操作系统
  • 下面介绍的容器(Linux Container简称LXC)类似这个办公场景,不同的是LXC“装”的是应用程序所依赖的运行环境,它是一种轻量级的操作系统层虚拟化技术,目的是隔离应用程序的运行环境,从而保证了软件交付过程中开发、测试、生产环境的强一致性
  • 容器技术基于Namespace和Cgroup两大机制来实现,Namespace负责隔离,Cgroup(Linux Control Group)负责限制。
  • 那容器镜像又是什么?你可以认为容器镜像是存储在U盘或光盘上的Win10操作系统
  • 容器是运行态(动态),容器镜像是存储文件(静态),一个容器镜像可以多次运行,从而创建多个容器
  • 容器镜像有版本控制,即tag,类似Win7,Win8,Win10
  • 虽然现在大家习惯了先交付容器镜像,然后再运行它创建容器,但是历史上是先有容器技术,容器镜像得益于dotCloud公司的创新,即大家熟悉的Docker。

二、容器和虚拟机比较

  • 容器具有敏捷和高性能的优点,在运行Win10的电脑上切换一个账号比启动Win10耗时要少的多
  • 但容器的缺点是隔离不彻底,试想在容器中执行top命令,会看到什么?如果容器A中的应用程序修改了系统时间或者优化了内核参数,那容器B中的应用程序会怎样?如果容器A中的应用程序需要运行在Linux4.x内核上,而容器B中的应用程序兼容Linux内核3.x以下版本,那HostOS又该如何处理?
  • 虚拟机具有完全隔离的优势,拥有独立的操作系统,但是在网络性能等方面又会带来15%左右的损耗。
  • 图1中右半边部分和你在其它地方看到的图略微有一点区别,原因是容器的运行并不依赖DockerEngine,容器是直接运行在HostOS上的
  • DockerEngine提供的是容器操作和管理界面,帮助用户启动和管理容器;容器的本质是进程,只不过DockerEngine在创建容器进程的时候,会添加了一些命名空间(Namespace)参数。

image.png

三、通过linux命令近距离观察容器

1、docker

[root@node1 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND     CREATED        STATUS        PORTS     NAMES
75f6881e9487   busybox   "/bin/sh"   1 hours ago   Up 1 hours             busybox-1
99986e1623a3   busybox   "/bin/sh"   1 hours ago   Up 1 hours             busybox-2
[root@node1 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
busybox      latest    b97242f89c8a   3 weeks ago   1.23MB
  • 上面运行了两个容器,使用的是同一个镜像busybox
  • 上面格式化的信息,是docker命令帮我们整理和翻译的,容器的本质是进程

2、ps

  • 通过容器ID,查找容器进程
[root@node1 ~]# ps -ef | grep 75f6881e9487   
root      11501      1  0 2月03 ?       00:00:04 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 75f6881e94874c19047166f39f5d1920423c17f9c927d0f21f00e0c1569f2396 -address /run/containerd/containerd.sock

3、find

  • 通过容器ID,查找容器关联的目录
[root@node1 ~]# find / -name "75f6881e94874c19047166f39f5d1920423c17f9c927d0f21f00e0c1569f2396"
/run/docker/runtime-runc/moby/75f6881e94874c19047166f39f5d1920423c17f9c927d0f21f00e0c1569f2396
/run/docker/containerd/75f6881e94874c19047166f39f5d1920423c17f9c927d0f21f00e0c1569f2396
/run/containerd/io.containerd.runtime.v2.task/moby/75f6881e94874c19047166f39f5d1920423c17f9c927d0f21f00e0c1569f2396
/sys/fs/cgroup/blkio/docker/75f6881e94874c19047166f39f5d1920423c17f9c927d0f21f00e0c1569f2396
/sys/fs/cgroup/net_cls,net_prio/docker/75f6881e94874c19047166f39f5d1920423c17f9c927d0f21f00e0c1569f2396
/sys/fs/cgroup/cpuset/docker/75f6881e94874c19047166f39f5d1920423c17f9c927d0f21f00e0c1569f2396
/sys/fs/cgroup/freezer/docker/75f6881e94874c19047166f39f5d1920423c17f9c927d0f21f00e0c1569f2396
/sys/fs/cgroup/hugetlb/docker/75f6881e94874c19047166f39f5d1920423c17f9c927d0f21f00e0c1569f2396
/sys/fs/cgroup/perf_event/docker/75f6881e94874c19047166f39f5d1920423c17f9c927d0f21f00e0c1569f2396
/sys/fs/cgroup/devices/docker/75f6881e94874c19047166f39f5d1920423c17f9c927d0f21f00e0c1569f2396
/sys/fs/cgroup/memory/docker/75f6881e94874c19047166f39f5d1920423c17f9c927d0f21f00e0c1569f2396
/sys/fs/cgroup/cpu,cpuacct/docker/75f6881e94874c19047166f39f5d1920423c17f9c927d0f21f00e0c1569f2396
/sys/fs/cgroup/pids/docker/75f6881e94874c19047166f39f5d1920423c17f9c927d0f21f00e0c1569f2396
/sys/fs/cgroup/systemd/docker/75f6881e94874c19047166f39f5d1920423c17f9c927d0f21f00e0c1569f2396
/var/lib/containerd/io.containerd.runtime.v2.task/moby/75f6881e94874c19047166f39f5d1920423c17f9c927d0f21f00e0c1569f2396
/var/lib/docker/containers/75f6881e94874c19047166f39f5d1920423c17f9c927d0f21f00e0c1569f2396
/var/lib/docker/image/overlay2/layerdb/mounts/75f6881e94874c19047166f39f5d1920423c17f9c927d0f21f00e0c1569f2396
  • 通过容器镜像ID,找到镜像的存储路径
[root@node4 ~]# find / -name "b97242f89c8a*"
/var/lib/docker/image/overlay2/imagedb/content/sha256/b97242f89c8a29d13aea12843a08441a4bbfc33528f55b60366c1d8f6923d0d4
  • overlay2:docker后端文件存储系统,在/etc/docker/daemon.json中配置storage-driver

4、cd

[root@node1 ~]# cd /var/lib/docker/containers/75f6881e94874c19047166f39f5d1920423c17f9c927d0f21f00e0c1569f2396
[root@node1 75f6881e94874c19047166f39f5d1920423c17f9c927d0f21f00e0c1569f2396]# ll
总用量 28
-rw-r----- 1 root root 1207 2月   4 15:44 75f6881e94874c19047166f39f5d1920423c17f9c927d0f21f00e0c1569f2396-json.log
drwx------ 2 root root    6 2月   3 22:02 checkpoints
-rw------- 1 root root 2551 2月   3 22:02 config.v2.json
-rw-r--r-- 1 root root 1472 2月   3 22:02 hostconfig.json
-rw-r--r-- 1 root root   13 2月   3 22:02 hostname
-rw-r--r-- 1 root root  174 2月   3 22:02 hosts
drwx------ 2 root root    6 2月   3 22:02 mounts
-rw-r--r-- 1 root root   54 2月   3 22:02 resolv.conf
-rw-r--r-- 1 root root   71 2月   3 22:02 resolv.conf.hash

5、touch

  • 在容器中创建一个文件 xxxxx.txt,它存在宿主机的那个目录下呢?
[root@node1 ~]# find / -name "xxxxx.txt"
/var/lib/docker/overlay2/d7f2174404cf7b5be5b49b2b96df8d0107c2e5cf45c4be0ac9a3a2413136f228/diff/home/xxxxx.txt
/var/lib/docker/overlay2/d7f2174404cf7b5be5b49b2b96df8d0107c2e5cf45c4be0ac9a3a2413136f228/merged/home/xxxxx.txt
  • 在宿主机上修改 /var/lib/docker/overlay2/d7f2174404cf7b5be5b49b2b96df8d0107c2e5cf45c4be0ac9a3a2413136f228/merged 目录里的文件,容器里面可以看到文件的修改

6、top

  • 在容器中执行top命令,宿主机上查看对应的进程
[root@node1 ~]# ps -ef |grep 11501
root      11501      1  0 2月03 ?       00:00:04 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 75f6881e94874c19047166f39f5d1920423c17f9c927d0f21f00e0c1569f2396 -address /run/containerd/containerd.sock
root      11522  11501  0 2月03 pts/0   00:00:00 /bin/sh
[root@node1 ~]# ps -ef |grep 11522
root      11522  11501  0 2月03 pts/0   00:00:00 /bin/sh
root      16970  11522  0 16:49 pts/0    00:00:00 top

四、重要文件路径

1、/var/lib/docker/image/overlay2/layerdb/mounts/容器ID

2、/var/lib/docker/overlay2/容器文件目录/merged

3、/var/lib/docker/containers/容器ID

4、/run/containerd/io.containerd.runtime.v2.task/moby/容器ID

5、/run/docker/runtime-runc/moby/容器ID

6、/run/docker/containerd/容器ID

五、实验环境

[root@node1 ~]# uname -a
Linux node1 4.4.248-1.el7.elrepo.x86_64 #1 SMP Thu Dec 10 18:28:07 EST 2020 x86_64 x86_64 x86_64 GNU/Linux
[root@node1 ~]# docker info
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Build with BuildKit (Docker Inc., v0.4.2-docker)

Server:
 Containers: 2
  Running: 2
  Paused: 0
  Stopped: 0
 Images: 1
 Server Version: 20.10.0
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 269548fa27e0089a8b8278fc4fc781d7f65a939b
 runc version: ff819c7e9184c13b7c2607fe6c30ae19403a7aff
 init version: de40ad0
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 4.4.248-1.el7.elrepo.x86_64
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 4
 Total Memory: 1.936GiB
 Name: node4
 ID: MXOR:KKPA:M6SX:QBR4:2SCC:RJFN:47ZW:VKHZ:LDWT:I6XX:5POT:WM2R
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  harbor.demo
  127.0.0.0/8
 Registry Mirrors:
  https://h7p1ls20.mirror.aliyuncs.com/
 Live Restore Enabled: false

  • 先用起来,通过操作实践认识kubernetes(k8s),积累多了自然就理解了
  • 把理解的知识分享出来,自造福田,自得福缘
  • 追求简单,容易使人理解,知识的上下文也是知识的一部分,例如版本,时间等
  • 欢迎留言交流,也可以提出问题,一般在周末回复和完善文档
  • Jason@vip.qq.com 2022-3-28