首页 > 其他分享 >docker和Namespace技术介绍

docker和Namespace技术介绍

时间:2022-10-11 17:57:45浏览次数:52  
标签:容器 Namespace 介绍 Linux 进程 docker Docker

一、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

相关文章

  • install docker
    title:installdockerHowtoinstalldockerbyyum.yuminstallyum-utils-yyum-config-manager--add-repohttps://download.docker.com/linux/centos/docker......
  • 2022-08-23-docker
    title:installdockerHowtoinstalldockerbyyum.yuminstallyum-utils-yyum-config-manager--add-repohttps://download.docker.com/linux/centos/docker......
  • 512多表关系介绍和513多表关系介绍一对多关系实现
    多表关系介绍1.一对一(了解):如:人和身份证。分析:一个人只有一个身份证,一个身份整只能对应一个人2.一对多(多对一):如部门员工。分析:一个部门有多个员工,一个员工只能,对应一个部......
  • Docker学习(四)
    容器卷记得加入参数:--privileged=trueDocker挂载主机目录访问如果出现cannotopendirectory.:Permissiondenied解决办法:在挂载目录后多加一个--privileged=true参数即......
  • docker简单运行centos7
    1.下载centos镜像dockerpullcentos:7.9.20092.后台启动容器dockerrun-d--name=centos7--privilegedcentos:7.9.2009/usr/sbin/init3.进入centos7容器中d......
  • java 中级进阶高级 java 23种设计模式 视频教程 详细介绍+代码详解 +应用场景分析+
    ​​​​java中级进阶高级23种设计模式详细介绍+代码详解2019-04-06日最新更新蒋浩宇技术总监/CTO/高级工程师/技术专家主要讲解关于java、python、c++、前段、html5、jq......
  • WSL 2 的安装过程(以及介绍)
    微信公众号:运维开发故事,作者:冬子先生1什么是WSL2WSL全称为WindowsSubsystemforLinux,官网译为:适用于Linux的Windows子系统(WSL)官方文档直达:适用于Linux的Wind......
  • containerd和docker命令对比
    命令dockercrictl(推荐)ctr查看容器列表dockerpscrictlpsctr-nk8s.iocls查看容器详情dockerinspectcrictlinspectctr-nk8s.iocinfo查看......
  • docker 部署 JAVA项目脚本
    echo'buildstart!'JENKINS_HOME=/var/jenkins_home/workspace/first-testcd$JENKINS_HOME/targetcp$JENKINS_HOME/Dockerfile$JENKINS_HOME/targetservice_name="firs......
  • docker方式实现postgres数据持久化离线安装
    保存镜像root@hello:~#dockerpullpostgresUsingdefaulttag:latestlatest:Pullingfromlibrary/postgresa2abf6c4d29d:Alreadyexistse1769f49f910:Pullcomple......