Y73day1学习心得

Y73day1学习心得.md

Y73day1学习心得

一、namespace、cgroup在容器中的作用

1.namespace

Linux namespace是在当前运行的系统环境中创建(隔离)另一个进程的运行环境出来,并在此运行环境中将一些必要的系统全局资源进行【虚拟化】。进程可以运行在指定的namespace中,因此,namespace中的每个进程都认为自己拥有所有这些虚拟化的全局资源。通过以下技术来实现容器间的隔离

fig:

1.1 MNT Namespace

每个容器都要有独立的根文件系统。实现容器里面启服务,并且使用容器运行环境,宿主机主要使用chroot技术把容器锁定到一个指定的运行目录里面。

1.2 IPC Namespace

一个容器内的进程间通信,允许一个容器内的不同进程的(内存、缓存等)数据访问,但是不能跨容器访问其他容器的数据

1.3 UTS Namespace

UNIX Timesharing System包含了运行内核、版本、底层体系结构类型等信息)用于系统标识,其中包含了hostname和域名domainname,它使得一个容器拥有属于自己标识的hostname,独立于宿主机和其他容器

1.4 PIDNamespace

在linux系统中,有一个PID为1的进程(init/systemd)是其他所有进程的父进程,在每个容器内也有一个父进程管理下面的子进程,PID Namespace就是用于隔离不同容器间的进程(PID),容器内的主进程生成与回收子进程等。

1.5 Net Namespace

每个容器都有自己的网卡,监听端口,协议,Net namespace为docker启动了一个vethx接口,docker0,通过mac地址在在网络中进行划分询址。

通过iptables规则去定义容器到外部,外部到容器之间的转发策略。

1.6 User Namespace

用于隔离各容器内重启的用记和用户组名称,或者UID和GID,比如每个容器都有root用户,他们之间是不可以互相访问的。

2.Linux control groups

用于宿主机对容器进行资源分配限制,比如CPU、内存等,Linux Cgroups的全称为Linux Control Groups,它最主要的作用,就是限制一个进程组能够使用的资源上限,包括CPU、内存、磁盘、网络带等,还能够对进程进行优先级设置,以及进程挂起和恢复等操作

2.1 验证系统cgroups

2.2 cgoups中内存模块

2.3cgoups具体实现

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上的线属

2.4 查看系统cgroups

chroot,namespace,cgroups是基础容器运行的必备条件。

二、编排工具及依赖技术总结

1.编排工具

当多个容顺在多个主机运行的时候,单独管理容器是相当复杂而且容易出错,也无法实现某一台主机宕机后容器自动迁移到其他主机从而实现高可用的目的,也不能实现动态伸缩的功能,因此需要有一种可以实现统一管理、动态伸缩、故障自愈、批量执行等功能,这就是容器编制工具

容器编制通常包括

  • docker-compose使容器的操作能够批量的,可视的执行,是一个管理多个容器的工具,比如可以解决容器之间的依赖关系
  • docker swarm docker开发的容器编制引擎
  • kubernetes google领导开发的容器编制引擎,内部项目为Borg,同时支持docker,coreos
  • mesos+marathon 通用的集群组员调度平台,mesos(资源分配)与marathon(容器编制平台)一起提供容器编制引擎功能

2.docker的依赖技术

2.1 容器网络

docker自带的网络docker network仅支持管理单机上的容器网络,当多主机运行的时候,需要使用第三方开源网络,如calico,flannel

2.2 服务发现

容器的动态扩容特性决定了容器IP也会随之变化,需要一种机制可以动态的发现新创建的容器,并将流量动态转发。kubernetes自带服务发现功能,需要结何coredns服务解析内部域名

2.3 容器监控

可以通过原生命令docker ps/top/stats查看容器运行状态,也可以通过第三方工具heapster/prometheus等第三方监控工具监控容器的运行状态。

2.4 数据管理

容器间的动态迁移会导致其在不同的Host之间迁移,需要保证数据也可以正常迁移,可以使用逻辑卷/存储挂载等方式解决

2.5 日志收集

原生docker可以通过docker logs查看日志,内部日志需要通过ELK等专门的日志收集分析和展示工具进行处理

三、基于dockerfile制作容器nginx容器镜像

1.下载基础镜像centos.7.16.1810

2.准备dockerfile,安装相关依赖包

先跑一下依赖步骤,看一下有没有报错

From centos:7.6.1810
MAINTAINER jack wwj11998@163.com
RUN rpm install -y epel-release && yum install -y vim wget tree lrzsz gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel openssl openssl-devel iproute net-tools
iotop

可以临时登陆可看一下命令安装情况

3.将nginx源码放入容器进行编译

 

From centos:7.6.1810
MAINTAINER jack wwj11998@163.com
RUN rpm install -y epel-release && 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.18.0.tar.gz /usr/local/src/
RUN cd /usr/local/src/nginx-1.18.0 && ./configure --prefix=/usr/local/nginx --with-http_sub_module && make && make install

 

登陆验证是否编译成功

4.配置文件修改及创建非root用户

将容器内配置文件拷出

docker cp bfdf80159ae3:/usr/local/nginx/conf/nginx.conf .

 


修改配置文件用户
user nginx;

重新编辑dockerfile文件增加拷入配置文件及创建用户操作,同时加入启动nginx命令,完成镜像制作

From centos:7.6.1810
MAINTAINER jack wwj11998@163.com
RUN yum install -y epel-release && 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.18.0.tar.gz /usr/local/src/
RUN cd /usr/local/src/nginx-1.18.0 && ./configure --prefix=/usr/local/nginx --with-http_sub_module && make && make install
ADD nginx.conf //usr/local/nginx/conf/nginx.conf
RUN useradd nginx -s /sbin/nologin
RUN ln -sv /usr/local/nginx/sbin/nginx /usr/sbin/nginx
RUN echo "test nginx page1" > /usr/local/nginx/html/index.html
EXPOSE 80 443
CMD ["nginx","-g","daemon off;"]

 

5.后台运行nginx镜像进行测试

页面测试

5 Dockerfile文件详解

#用来定义基础镜像

From centos:7.6.1810
#镜像维护者的信息
MAINTAINER jack wwj11998@163.com
#指定该容器运行时的用户名和UID,后续的RUN命令也会使用这个用户执行
#USER
#WORKDIR /a
#WORKDIR b #指定工作目录,最终为/a/b
#VOLUME["/dir_1","dir_2"..]设置容器挂载主机目录
#ENV name jack #设置容器变量,常用于想容器内传递用户密码等
#执行命令,将编译安装nginx的步骤执行一遍
RUN yum install -y epel-release && 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.18.0.tar.gz /usr/local/src/
RUN cd /usr/local/src/nginx-1.18.0 && ./configure --prefix=/usr/local/nginx --with-http_sub_module && make && make install
ADD nginx.conf //usr/local/nginx/conf/nginx.conf
RUN useradd nginx -s /sbin/nologin
RUN ln -sv /usr/local/nginx/sbin/nginx /usr/sbin/nginx
RUN echo "test nginx page1" > /usr/local/nginx/html/index.html
EXPOSE 80 443 #向外开放的端口,主要是用于声明
CMD ["nginx","-g","daemon off;"] #运行的命令,每个Dockerfile只能有一条,如果有多条则只有最后一条被执行

 

posted @ 2022-11-18 14:57  老男人学IT  阅读(46)  评论(0)    收藏  举报