目录
1. Namespace、Cgroups在容器中的作用
- Namespace
namespace 是Linux系统的底层概念,在内核层实现,各个docker容器运行在宿主机的用户空间,每个容器都要有类似于虚拟机的一样的相互隔离的运行空间,目前主要通过以下技术实现 容器运行空间的相互隔离:
| 隔离类型 | 功能 |
|---|---|
| MNT Namespace | 提供磁盘挂载点和文件系统的隔离能力 |
| IPC Namespace | 提供进程间通信的隔离能力 |
| UTS Namespace | 提供主机名隔离能力 |
| PID Namespace | 提供进程隔离能力 |
| Net Namespace | 提供网络隔离能力 |
| User Namespace | 提供用户隔离能力 |
MNT Namesapce
每个容器都要有 独立的根文件系统 有 独立的用户空间,以实现在容器里面启动服务并且使用容器的运行环境,即一个 ubuntu环境 宿主机可以创建一个 centos环境 容器并运行 nginx服务。
在容器里面是不能访问宿主机的资源,宿主机是使用了 chroot 技术把容器锁定到一个指定的运行目录中
IPC Namespace
一个容器内的进程间通信,允许一个容器内的不同进程的(内存、缓存等)数据访问,但是 不能跨容器 访问其他容器的数据。
UTS Namespace
包含 hostname 和 域名domainname,它使得一个容器拥有属于自己 hostname 标识,这个主机名标识独立于宿主机系统和其上的其他容器。
PID Namespace
在每个容器内有一个父进程来管理其下属的子进程,那么多个容器的进程通过 PID namespace 进程隔离(比如 PID 编号重复、容器内主进程生成与回收子进程等)。
Net Namespace
每一个容器都类似于虚拟机一样有自己的网卡、监听端口、TCP/IP 协议栈等。
Docker 使用 network namespace 启动一个 vethX 接口,这样你的容器将拥有它自己的桥接 ip 地址,通常是 docker0,而 docker0 实质就是 Linux 的虚拟网桥(网桥是在 OSI 七层模型的数据链路层的网络设备,通过 mac 地址对网络进行划分,并且在不同网络之间传递数据。)

User Namespace
User Namespace 允许在各个宿主机的各个容器空间内创建相同的用户名以及相同的用户 UID 和 GID,只是会把用户的作用范围限制在每个容器内
- Cgroups(Linux control groups)
在一个容器,如果不对其做任何资源限制,则宿主机会允许其占用无限大的内存空间,有时候会因为代码 bug 程序会一直申请内存,直到把宿主机内存占完。为了避免此类的问题出现,宿主机有必要对容器进行资源分配限制,比如CPU、内存等
Linux Cgroups 的全称是 Linux Control Groups,它最主要的作用就是 限制一个进程组能够使用的资源上限 ,包括 CPU、内存、磁盘、网络带宽等等。此外,还能够对进程进行优先级设置,以及将进程挂起和恢复等操作。
注:k8s 1.24版本后 开始启用 systemd 替代 cgroup,于 /etc/docker/daemon.json 中改:“exec-opts”: [“native.cgroupdriver=systemd”]
2. 容器编排工具和容器依赖技术(docker)
- 编排工具
容器编排:通常包括容器管理、调度、集群定义和服务发现等功能。
容器编排引擎(工具):实现对容器的统一管理、动态伸缩、故障自愈、批量执行等功能。
现在主流的编排工具为:Kubernetes(k8s)、docker swam(不怎么用了)
- 依赖技术
容器网络
docker 自带的网络 docker network 仅支持管理单机上的容器网络,多主机运行时需要使用第三方开源网络,例如 calico、flannel 等。
服务发现
容器的动态扩容特性决定了容器 IP 也会随之变化,因此需要有一种机制开源自动识别并将用户请求动态转发到新创建的容器上,kubernetes 自带服务发现功能,需要结合 kube-dns 服务解析内部域名。
容器监控
可以通过原生命令 docker ps/top/stats 查看容器运行状态,另外也可以使用 heapster/ Prometheus 等第三方监控工具监控容器的运行状态。
数据管理
容器的动态迁移会导致其在不同的 Host 之间迁移,因此如何保证与容器相关的数据也能随之迁移或随时访问,可以使用 逻辑卷/存储挂载 等方式解决。
日志收集
docker 原生的日志查看工具 docker logs,但是容器内部的日志需要通过 ELK/EFK 等专门的日志收集分析和展示工具进行处理。
3. 基于Dockerfile制作的nginx镜像
背景:已安装harbor
1)centos基础镜像:安装基础环境和依赖包,确保时区正确
root@k8s-master:/opt/k8s_data/dockerfile/system/centos# ll
total 11644
drwxr-xr-x 2 root root 4096 Jul 11 02:35 ./
drwxr-xr-x 3 root root 4096 Jul 12 2022 ../
-rwxr-xr-x 1 root root 146 Jul 4 08:35 build-command.sh*
-rw-r--r-- 1 root root 602 Jul 4 08:32 Dockerfile
vim Dockerfile
#制作基础镜像,centos:v7.9是基于官方centos 7.9镜像更改tag并上传到Harbor服务器的最原始官方镜像
FROM 192.168.37.106/baseimages/centos:v7.9.2009
MAINTAINER www@hotmai.com
RUN yum install -y vim wget tree pcre pcre-devel gcc gcc-c++ zlib zlib-devel openssl openssl-devel net-tools iotop unzip zip iproute ntpdate nfs-utils tcpdump telnet traceroute
RUN rm -rf /etc/localtime && ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
执行镜像构建
vim build-command.sh
#!/bin/bash
docker build -t 192.168.37.106/baseimages/centos-base:v7.9.2009 .
sleep 1
docker push 192.168.37.106/baseimages/centos-base:v7.9.2009
root@k8s-master:/opt/k8s_data/dockerfile/system/centos# bash build-command.sh
2)nginx基础镜像
root@k8s-master:/opt/k8s_data/dockerfile/pub-images/nginx-base# ll
total 1008
drwxr-xr-x 2 root root 4096 Jul 11 02:36 ./
drwxr-xr-x 5 root root 4096 Jul 12 2022 ../
-rwxr-xr-x 1 root root 160 Jul 4 08:51 build-command.sh*
-rw-r--r-- 1 root root 475 Jul 4 08:42 Dockerfile
-rw-r--r-- 1 root root 1015384 Jul 12 2022 nginx-1.14.2.tar.gz
vim Dockerfile
#Nginx Base Image
FROM 192.168.37.106/baseimages/centos-base:v7.9.2009
MAINTAINER www@hotmail.com
RUN yum install -y vim wget tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools iotop
ADD nginx-1.14.2.tar.gz /usr/local/src/
RUN cd /usr/local/src/nginx-1.14.2 && ./configure && make && make install && ln -sv /usr/local/nginx/sbin/nginx /usr/sbin/nginx && useradd nginx -u 2001 &&rm -rf /usr/local/src/nginx-1.14.2.tar.gz
执行镜像构建
vim build-command.sh
#!/bin/bash
docker build -t 192.168.37.106/pub-images/nginx-base:v1.14.2 .
sleep 1
docker push 192.168.37.106/pub-images/nginx-base:v1.14.2
root@k8s-master:/opt/k8s_data/dockerfile/pub-images/nginx-base# bash build-command.sh
本文介绍了Docker的基础知识,包括Namespace的MNT、IPC、UTS、PID、Net和User等类型在容器中的作用,以及Cgroups用于限制容器资源的原理。此外,还探讨了容器编排工具如Kubernetes和Docker Swarm,以及容器依赖技术如网络、服务发现、监控和数据管理。最后,讲解了如何基于Dockerfile制作Nginx镜像。
2522

被折叠的 条评论
为什么被折叠?



