
前置知识(以Linux Centos7为例):Docker 本质上是 Linux 容器技术的封装,在学习Docker之前需要知道下面基本操作:文件和目录操作:ls, cd, pwd, cp, mv, rm, mkdir查看文件操作:cat, less, head, tail权限处理操作:chmod, chown(Docker 里经常涉及 socket 和 volume 权限)文本处理操作:grep, awk, cut, sort(用来解析docker ps或kubectl get pod的输出非常有用)环境变量:export, echo $VAR以下三个命令十分重要:1.查看进程ps2.进入/查看命名空间。因为Docker 容器的隔离主要是靠 Linux 命名空间技术nsenter3.改变一个进程的根目录。chroot此外还需要了解一些计网相关的知识:IP 地址:什么是127.0.0.1,什么是0.0.0.0,什么是192.168.x.x。端口:知道-p 8080:80的含义(把宿主机 8080 端口映射到容器内 80 端口)。HTTP 基础:GET / POST的区别,http与tcp的关系(到学习 K8s 的 Ingress 时需要)。DNS 基础:知道为什么在 K8s 里可以用服务名redis-service来连接 Redis Pod。Docker的本质Docker容器从内核视角看,就是一个普通的Linux进程,只不过这个进程拥有自己独立的"视图"。因为容器共享宿主机内核,所以不可能在Linux宿主机上运行一个Windows容器,这是本质限制。Docker容器能实现"看起来像独立机器"的效果,依赖两个Linux内核功能:Namespace(命名空间):实现"隔离"Namespace让一个进程"看不到"宿主机上的其他资源,只看到自己被隔离出来的那一份。Namespace类型隔离的资源效果PID进程ID容器内看到PID=1的进程,看不到宿主机其他进程NET网络设备、栈、端口容器有自己独立的eth0、IP、端口表MNT文件系统挂载点容器有自己的/目录树UTS主机名和域名hostname在容器内可以独立设置IPC进程间通信资源信号量、消息队列隔离USER用户ID容器内的root可以映射为宿主机的普通用户示例:# 查看宿主机的PID namespacels -l /proc/$$/ns/pid# 运行一个容器docker run -d alpine sleep 3600# 查看容器的PID namespace(会发现inode号不同)