一、docker介绍
Docker 是基于 linux 内核实 现,Docker 最早采用 LXC 技术(LinuX Container 的简写,LXC 是 Linux 原生支持的 容器技术,可以提供轻量级的虚拟化, 可以说 docker 就是基于 LXC 发展起来 的,提供 LXC 的高级封装,发展标准的配置方法),而虚拟化技术 KVM(Kernelbased Virtual Machine) 基于模块实现, Docker 后改为自己研发并开源的 runc 技术运行容器 Docker 主机(Host):一个物理机或虚拟机,用于运行 Docker 服务进程和容器. Docker 服务端(Server):Docker 守护进程,运行 docker 容器. Docker 客户端(Client):客户端使用 docker 命令或其他工具调用 docker API. Docker 仓库(Registry): 保存镜像的仓库,类似于 git 或 svn 这样的版本控制系统 Docker 镜像(Images):镜像可以理解为创建实例使用的模板. Docker 容器(Container): 容器是从镜像生成对外提供服务的一个或一组服务.
二、.Docker对比虚拟机
资源利用率更高:一台物理机可以运行数百个容器,但是一般只能运行数十个 虚拟机.
开销更小:不需要启动单独的虚拟机占用硬件资源.
启动速度更快:可以在数秒内完成启动.
三、Linux Namespace 技术
当一个宿主机运行了 N 个容器,多个容器带来的以下问题怎么解决: 1.怎么样保证每个容器都有不同的文件系统并且能互不影响? 2.一个 docker 主进程内的各个容器都是其子进程,那么实现同一个主进程下不 同类型的子进程?各个进程间通信能相互访问(内存数据)吗? 3.每个容器怎么解决 IP 及端口分配的问题? 4.多个容器的主机名能一样吗? 5.每个容器都要不要有 root 用户?怎么解决账户重名问题? Linux Namespace 技术: namespace 是 Linux 系统的底层概念,在内核层实现,即有一些不同类型的命名 空间被部署在核内,各个 docker 容器运行在同一个 docker 主进程并且共用同一 个宿主机系统内核, 各 docker 容器运行在宿主机的用户空间,每个容器都要有 类似于虚拟机一样的相互隔离的运行空间,但是容器技术是在一个进程内实现 运行指定服务的运行环境, 并且还可以保护宿主机内核不受其他进程的干扰和 影响,如文件系统空间、网络空间、进程空间等,目前主要通过以下技术实现 容器运行空间的相互隔离: 隔离类型 功能 系统调用参数 内核版本 MNT Namespace(mount) 提供磁盘挂载点和文件系统的隔离能力 CLONE_NEWNS Linux 2.4.19 IPC Namespace(Inter-Process Communication) 提供进程间通信的隔离能力 CLONE_NEWIPC Linux 2.6.19 UTS Namespace(UNIX Timesharing System) 提供主机名隔离能力 CLONE_NEWUTS Linux 2.6.19 PID Namespace(Process Identification) 提供进程隔离能力 CLONE_NEWPID Linux 2.6.24 Net Namespace(network) 提供网络隔离能力 CLONE_NEWNET Linux 2.6.29 User Namespace(user) 提供用户隔离能力 CLONE_NEWUSER Linux 3.8
1.MNT Namespace
每个容器都要有独立的根文件系统有独立的用户空间,以实现在容器里面启动 服务并且使用容器的运行环境,即一个宿主机是 ubuntu 的服务器,
可以在里面 启动一个 centos 运行环境的容器并且在容器里面启动一个 Nginx 服务,此 Nginx 运行时使用的运行环境就是 centos 系统目录的运行环境,
但是在容器里面是不 能访问宿主机的资源,宿主机是使用了 chroot 技术把容器锁定到一个指定的运 行目录里面。
例如:/var/lib/containerd/容器 ID
[root@localhost7C ~]# docker info | grep "Docker Root Dir" WARNING: You're not using the default seccomp profile Docker Root Dir: /var/lib/docker [root@localhost7C ~]# docker run -d --name nginx2 -p 81:80 nginx [root@localhost7C ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5668e1f40b8e nginx "/docker-entrypoin..." 4 minutes ago Up 4 minutes 0.0.0.0:81->80/tcp nginx2 [root@localhost7C ~]# ll /var/lib/docker/containers 总用量 0 drwx------ 5 root root 168 10月 11 17:06 5668e1f40b8eea1ddc982a57b7f52069ba9d3e3dd1302856e3e14f4feb0d371d
[root@localhost7C ~]# docker exec -it nginx2 sh
# ls
bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
2。IPC Namespace:
一个容器内的进程间通信,允许一个容器内的不同进程的(内存、缓存等)数据访 问,但是不能夸容器访问其他容器的数据。
3。UTS Namespace: UTS namespace(UNIX Timesharing System 包含了运行内核的名称、版本、底层 体系结构类型等信息)用于系统标识,其中包含了 hostname 和域名 domainname ,
它使得一个容器拥有属于自己 hostname 标识,这个主机名标识 独立于宿主机系统和其上的其他容器。
[root@localhost7C ~]# docker exec -it nginx2 sh # cat /etc/issue Debian GNU/Linux 11 \n \l
# apt install procps (top 命令)
# apt install iputils-ping (ping 命令)
# apt install net-tools (网络工具)
# apt-get update Get:1 http://deb.debian.org/debian bullseye InRelease [116 kB] Get:2 http://deb.debian.org/debian-security bullseye-security InRelease [48.4 kB] Get:3 http://deb.debian.org/debian bullseye-updates InRelease [44.1 kB] Get:4 http://deb.debian.org/debian bullseye/main amd64 Packages [8184 kB] Get:5 http://deb.debian.org/debian-security bullseye-security/main amd64 Packages [189 kB] Get:6 http://deb.debian.org/debian bullseye-updates/main amd64 Packages [6344 B] Fetched 8587 kB in 2s (3687 kB/s) Reading package lists... Done # uname -a Linux 5668e1f40b8e 3.10.0-1062.el7.x86_64 #1 SMP Wed Aug 7 18:08:02 UTC 2019 x86_64 GNU/Linux
4。PID Namespace:
Linux 系统中,有一个 PID 为 1 的进程(init/systemd)是其他所有进程的父进程,那么在每个 容器内也要有一个父进程来管理其下属的子进程,
那么多个容器的进程通 PID namespace 进程 隔离(比如 PID 编号重复、器内的主进程生成与回收子进程等)。 例如:下图是在一个容器内使用 top 命令看到的 PID 为 1 的进程是 nginx::
标签:容器,Namespace,介绍,Linux,进程,docker,Docker From: https://www.cnblogs.com/Yuanbangchen/p/16780039.html