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)参数。
三、通过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
- 容器进程 11501,容器shell进程 11522,top命令进程 16970
- 为什么说容器是单进程模型?www.dockone.io/article/927…
四、重要文件路径
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