文章目录
容器化相关的 Linux 技术
Namespace
Linux Namespace 是 Linux 提供的一种内核级别环境隔离的方法。主要用于提供容器之间的文件系统、进程、网络等隔离
隔离类型 | 功能 | 系统调用参数 | 开始支持的内核版本 |
---|---|---|---|
MNT Namespace (mount) | 提供磁盘挂载点和文件系统的隔离能力 | CLONE_NEWNS | 2.4.19 + |
IPC Namespace (Inter-Process Communication) | 提供进程间通信的隔离能力,包括信号量、消息队列和共享内存 | CLONE_NEWIPC | 2.6.19 + |
UTS Namespace (UNIX Timesharing System) | 提供内核、主机名、域名隔离能力 | CLONE_NEWUTS | 2.6.19 + |
PID Namespace (Process Identification) | 提供进程隔离能力 | CLONE_NEWPID | 2.6.24 + |
Net Namespace(network) | 提供网络隔离能力,包括网络设备、网络栈、端口等 | CLONE_NEWNET | 2.6.29 + |
User Namespace(user) | 提供用户隔离能力,包括用户和组 | CLONE_NEWUSER | 3.8 + |
Control Groups
Linux Control Groups,即 cgroup,其最主要的作用就是限制一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带宽等等。此外,还能够对进程进行优先级设置,资源的计量以及资源的控制(比如将进程挂起和恢复等操作)
cgroup 具体实现
- blkio:块设备 IO 限制
- cpu:使用调度程序为 cgroup 任务提供 cpu 的访问
- cpuacct:产生 cgroup 任务的 cpu 资源报告
- cpuset:如果是多核心的 cpu,这个子系统会为 cgroup 任务分配单独的 cpu 和内存
- devices:允许或拒绝 cgroup 任务对设备的访问
- freezer:暂停和恢复 cgroup 任务
- memory:设置每个 cgroup 的内存限制以及产生内存资源报告
- net_cls:标记每个网络包以供 cgroup 方便使用
- ns:命名空间子系统
- perf_ event:增加了对每 group 的监测跟踪的能力,可以监测属于某个特定的 group 的所有线程以及运行在特定 cpu 上的线程
示例-查看系统的 cgroups
[root@luna ~]# ll /sys/fs/cgroup/
total 0
drwxr-xr-x 5 root root 0 Nov 14 09:00 blkio
lrwxrwxrwx 1 root root 11 Nov 14 09:00 cpu -> cpu,cpuacct
lrwxrwxrwx 1 root root 11 Nov 14 09:00 cpuacct -> cpu,cpuacct
drwxr-xr-x 6 root root 0 Nov 14 09:00 cpu,cpuacct
drwxr-xr-x 3 root root 0 Nov 14 09:00 cpuset
drwxr-xr-x 5 root root 0 Nov 14 09:00 devices
drwxr-xr-x 3 root root 0 Nov 14 09:00 freezer
drwxr-xr-x 3 root root 0 Nov 14 09:00 hugetlb
drwxr-xr-x 6 root root 0 Nov 14 09:00 memory
lrwxrwxrwx 1 root root 16 Nov 14 09:00 net_cls -> net_cls,net_prio
drwxr-xr-x 3 root root 0 Nov 14 09:00 net_cls,net_prio
lrwxrwxrwx 1 root root 16 Nov 14 09:00 net_prio -> net_cls,net_prio
drwxr-xr-x 3 root root 0 Nov 14 09:00 perf_event
drwxr-xr-x 5 root root 0 Nov 14 09:00 pids
drwxr-xr-x 5 root root 0 Nov 14 09:00 systemd
编排工具及其依赖技术
编排工具
当多个容器在多个主机运行的时候,单独管理容器是相当复杂而且很容易出错。而且也无法实现某一台主机宕机后,容器自动迁移到其他主机,从而实现高可用的目的,也无法实现动态伸缩的功能,因此需要有一种工具可以实现统一管理、动态伸缩、故障自愈、批量执行等功能,这就是容器编排引擎
容器编排通常包括容器管理、调度、集群定义和服务发现等功能
常用的编排工具
- Docker compose:Docker 官方的单机容器编排工具
- Docker swarm:Docker 官方的容器编排引擎
- Kubernetes:容器编排工具的事实标准
Docker 依赖技术
容器网络
docker 服务自带的网络 docker network 仅支持管理单机的容器网络,当多主机运行的时候需要使用第三方开源网络,例如: calico、 flannel、cilium 等
服务发现
容器的动态扩容特性决定了容器IP会随之变化,因此需要有一种机制开源自动识別并将用户请求动态转发到新创建的容器上, kubernetes 自带服务发现功能,需要结合 coredns (早期为 kube-dns)服务解析内部域名
容器监控
可以通过原生命令 docker ps|top|stats
查看容器运行状态,另外也可以使用 Prometheus、heapster 等第三方监控工具监控容器的运行状态
数据管理
容器的动态迁移会导致其在不同的 host 之间迁移,因此需要保证与容器相关的数据也能随之迁移或随时访问,可以使用逻辑卷存储挂载等方式解决
日志收集
docker 服务自带日志查看工具 docker logs
,但是容器内部的日志需要通过 ELK 等专门的日志收集分析和展示工具处理
Dockerfile 制作 Nginx 镜像
编写 Dokcerfile
FROM centos:7.9.2009
MAINTAINER nemo "sky.nemo@outlook.com"
# 设置时区
ENV TZ Asia/Shanghai
RUN ln -fs /usr/share/zoneinfo/${TZ} /etc/localtime \
&& echo ${TZ} > /etc/timezone
# 安装
RUN yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel && \
curl -O https://nginx.org/download/nginx-1.22.1.tar.gz && \
groupadd -r nginx && \
useradd -g nginx -r nginx && \
tar -xf nginx-1.22.1.tar.gz && \
cd nginx-1.22.1 && \
./configure \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib64/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module && \
make && \
make install && \
cd .. && \
rm -rf nginx-1.22.1.tar.gz && \
rm -rf nginx-1.22.1
VOLUME ['/etc/nginx/nginx.conf','/etc/nginx/conf.d','/usr/local/nginx/html']
EXPOSE 80 443
ENTRYPOINT ["/bin/bash","-c","/usr/sbin/nginx","-g","daemon off;"]
制作镜像
docker build -t mynginx:v1.0 .
测试启动容器
创建目录
# 创建存储数据的目录结构如下,运行时挂载到容器中
[root@localhost nginx]# tree /data/nginx/
/data/nginx/
├── config
│ ├── conf.d
│ └── nginx.conf
└── html
├── 50x.html
└── index.html
4 directories, 3 files
启动容器
# 启动容器,挂载目录,映射端口
docker run -d -p 80:80 -p 443:443 -v "/data/nginx/config/nginx.conf":"/etc/nginx/nginx.conf" -v "/data/nginx/config/conf.d":"/etc/nginx/conf.d" -v "/data/nginx/html":"/usr/local/nginx/html" --name mynginx mynginx:v1.0
检查
# 检查容器允许状态
[root@localhost nginx]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f07a4d944d5e mynginx:v1.0 "/usr/sbin/nginx -g …" 5 seconds ago Up 4 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp mynginx
# 访问
[root@localhost nginx]# curl localhost:80
<!DOCTYPE html>
<html>
<head>
<title>MY Nginx!</title>
</head>
<body>
<h1> MY Nginx!</h1>
</body>
</html>
制作镜像总结
-
镜像制作步骤
- 选择基础镜像
- 编写 Dockerfile
- 构建镜像
- 运行容器并检查
-
默认官方镜像地址下载较慢,可以设置阿里云代理
vim /etc/docker/daemon.json { "registry-mirrors": ["https://********.mirror.aliyuncs.com"] }
-
复杂镜像可以用分层构建,分层构建目录清晰,管理更方便