3

Docker原理 - ChAnAn

 1 year ago
source link: https://www.cnblogs.com/sre-chan/p/17245729.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Docker原理

docker是什么:Docker 是完整的一套容器管理系统,所以想要搞懂 Docker 的概念,我们必须先从容器开始说起。

什么是容器?

- [x] 容器是用来装东西的,Linux 里面的容器是用来装应用的;

- [x] 容器就是将软件打包成标准化单元,以用于开发、交付和部署;

- [x] 容器技术已经成为应用程序封装和交付的核心技术;

容器原理:容器技术的核心,由以下几个内核技术组成:

- [x] Cgroups (Control Groups) — 资源管理

- [x] SELinux — 安全 (是针对于文件系统,文件的管理措施)

- [x] NameSpace — 命名空间

命名空间:

#是指可以对系统资源空间进行分割隔离的技术,例如:创建一个虚拟机,在虚拟机里的所有操作,都不会对真实机造成影响。

#命名空间分为六大类,可以从各个方面来对系统资源空间进行隔离;

Linux 的 NameSpace

- [x] UTS、NETWORK、MOUNT、USER、PID、IPC

#主机名命名空间,作用:分割主机名,即在容器内修改主机名,不会对宿主机的系统造成影响,实现主机名的隔离;

没有隔离前,修改主机名为zhangsan,重新打开一个终端,主机名也被修改为zhangsan


[root@localhost ~]# hostname zhangsan   #临时设置主机名

[root@localhost ~]# bash         #立刻生效

[root@zhangsan ~]#

使用unshare命令模拟主机名的命名空间,修改主机名为namespace,重新打开一个终端,主机名没有发生变化,还是zhangsan


[root@zhangsan ~]# unshare -u /bin/bash

[root@zhangsan ~]# hostname namespace   #临时设置主机名

[root@zhangsan ~]# bash           #立刻生效

[root@namespace ~]#

NETWORK:网络命名空间,作用:分割网络,即容器内的网络配置和宿主机相互之间不受干扰的;

​ #在真实机器上的网卡名为eth0,IP地址为192.168.1.10/24;

​ #而在容器内的网卡名可以为ens33,ip地址为10.10.10.10/24;

MOUNT:

#挂载命名空间,作用:隔离文件系统,在容器内挂载的光盘或nfs共享目录,宿主机是无法看到里面的内容的;

​ #在linux系统上,创建一个虚拟机,在真机的/var/lib/ftp中挂载了一个光盘文件,但是在虚拟机的/var/lib/ftp中是没有光盘内容的,这就是MOUNT隔离;

USER:

#用户命名空间,作用:隔离用户,即容器内创建的用户不能用于登录宿主机,真机机里创建的用户也不能作用于容器;

#进程命名空间,作用:为了防止容器和宿主机中的进程冲突;

​ #在真实机中,有一个服务: nfs,PID为2250;

​ #在容器内,也有一个服务: chrony,PID为2250;

​ #真实机中用户,杀死(kill) PID号为2250的进程时,并不会对容器内的进程2250产生影响;

​ #而容器内的用户,杀死(kill) PID号为2250的进程时,也并不会对真实机内的进程2250产生影响;

#信号向量命名空间,作用:通常和PID一起使用;

#用户杀死一个进程时,实际上是向进程发送一个信号(IPC),进程接收到这个信号后会执行对应的操作;

docker 的优缺点

- [x] 相比于传统的虚拟化技术,容器更加简洁高效

- [x] 传统虚拟机需要给每个 VM 安装操作系统

- [x] 容器使用的共享公共库和程序

- [x] 容器的隔离性没有虚拟机强

- [x] 共用Linux内核,安全性有先天缺陷

docker 与传统虚拟化的对比

2985955-20230322222830306-994408393.png

#例如:虚拟机的使用,每一个虚拟机都要安装独立的操作系统;

#不需要安装独立的操作系统,只有一个Docker进程,和宿主机共享操作系统;

#容器没有操作系统,启动容器就跟开启一个进程一样,简单高效;

容器的高效性:

#启动虚拟机中的应用程序,需要先启动虚拟机的操作系统,然后再启动应用程序;

#启动容器内的应用程序,直接启动应用程序即可;

2985955-20230322222509555-1376747681.png

卸载防火墙和selinux(以kube-node1为例,kube-node2类似操作)

[root@localhost ~]# yum  -y remove  firewalld-*

[root@localhost ~]# vim /etc/selinux/config

SELINUX=disabled

配置IP地址和主机名(以kube-node1为例,kube-node2类似操作)

[root@localhost ~]# echo kube-node1 > /etc/hostname 

使用nmcli命令配置IP地址,网关,dns(以kube-node1为例,kube-node2类似操作)

[root@kube-node1 ~]# nmcli connection modify ens33 ipv4.method manual ipv4.addresses 192.168.11.148/24 ipv4.gateway 192.168.11.254 ipv4.dns 114.114.114.114 connection.autoconnect yes

[root@kube-node1 ~]# nmcli connection up eth0

[root@kube-node1 ~]# reboot

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK