1、运行一个镜像
# docker run -d centos/httpd:latest
解释:
run 表示启动一个容器
-d : daemon的首字母,表示后台运行
centos/httpd:latest : 表示具体启动哪个镜像,默认从dockerhub上下载
镜像就是一个特殊的文件系统,提供了容器中程序执行所需的所有文件
容器中包含应用程序启动需要三类文件:
1、相关的程序可执行文件
2、库文件
3、配置文件
容器运行的时候就不再依赖宿主机上的文件操作系统类型和配置了
2、dockerfile
#cat Dockerfile
FROM centos:8.1.1911
RUN yum install -y httpd
COPY file1 /var/www/html/
ADD file2.tar.gz /var/www/html/
CMD ["/sbin/httpd", "-D", "FOREGROUND"]
解释:
在一个centos基准镜像上安装好httpd的包,把文件拷贝到指定的目录里,最后容器启动后自动运行httpd服务
构建成镜像
# docker build -t registry/httpd:v1 -f ./Dockerfile
-t 指定生成后的镜像的名称
-f 指定dockerfile文件
查看镜像信息
# docker images
查看容器情况
# docker ps
执行命令,查看容器中的情况 c5a9ff78d9c1 是容器的id,是通过docker ps 查看出来的值
# docker exec c5a9ff78d9c1 ps -ef
# docker exec c5a9ff78d9c1 ls /var/www/html
和虚拟机相比,没有各种复杂的硬件虚拟层,没有独立的Linux内核。
容器所有的进程调度,内存访问,文件的读写都直接跑在宿主机的内核上。
3、容器是什么
容器:Namespace和Cgroups 可以让程序在一个资源可控的独立(隔离)环境中运行
4、Namespace 环境隔离
4.1、容器中和宿主机看到进程PID不同的原因
容器中启动httpd之后,分别在容器中和宿主机上执行 ps -ef 查看进程情况。
发现都有 5个 httpd的进程,最大的不同就是进程的的PID 不一样
Linux 在创建容器的时候,会建出一个 PID Namespace 。每建立出一个namespace 就会单独对进程进行编号,都是从 1 开始。
不同的Namespace 之间看不到对方的进程,是相互隔离的。
宿主机上的 Host PID Namespace ,是其他Namespace 的父亲。
可以看到宿主机上的所有进程,编号也是把宿主机上的所有进程放在一起进行编号的。
Namespace是一种隔离机制,主要目的是隔离运行在同一个宿主机上的容器,让容器不能彼此访问。
作用:
1、同一个宿主机上可以运行多个容器
2、安全,不同用户之间不能访问对方的资源
Mount Namespace 保证了每个容器都有自己独立的文件目录结构
还有很多其他的Namespace
cgroup、ipc、network、mount、pid、time、user、uts
Namespace 保障了容器之间的资源隔离,环境隔离。
是实现容器的两大技术之一。
5、Cgroups 资源隔离
支撑容器的第二大技术Cgroups(Control Groups):
对进程的资源进行限制,例如CPU、内存、IO
没有Cgroups 无法对进程的计算机资源消耗进行限制,不同容器之间的进程就会出现相互影响。
Cgroups 有很多个子系统,分别限制不同的资源。
限制方式是类似的:把相关的一组进程分配到一个控制组里,然后通过树状结构进行管理,每个控制组都设有自己的资源控制参数。
一组进程:可以理解为一个容器的所有进程
常见的Cgroups如下:
- cpu子系统:用来限制一个控制组可使用的最大的CPU
- memory子系统:用来限制一个控制组最大的内存使用量
- pids子系统:用来限制一个控制组里可以运行多个进程
- cpuset子系统:限制一个控制组里的进程可以在哪几个物理CPU上运行
memory子系统说明
每个启动的容器,都会在Cgroups子系统下建立一个目录,这个目录也被叫做控制组。
例如下图中的 <docker-id1> <docker-id2>
通过设置控制组里的cgroup.procs 参数,来限制容器的内存资源
举例:设置控制组的Memory 的最大用量为2GB
把 (210241024*1024=2147483648) 值写入容器控制组中的 memory.limit_in_bytes 里。
这样设置后 cgroup.procs 里面所有进程 Memory 使用量之和,最大也不会超出 2GB
cd /sys/fs/cgroup/memory/system.slice/docker-xxxxxxxxxxxxxxx.scope/
# 对应容器中的每个进程的ID
# cat cgroup.procs
20731
20787
20788
20789
# 容器的最大使用量
# cat memory.limit_in_bytes
2147483648
6、Cgroups的v1、v2版本
v1版本
各个子系统比较独立,每个进程在各个Cgroups子系统中独立配置,可以属于不同的group,比较灵活。
缺点:同一进程的资源协调困难(例如 memory Cgroup 与 blkio Cgroup 之间就不能协作)。主流生产环境中用的还是v1
v2版本
使各子系统可以协调统一的管理资源。
需要较新版本的Linux内核。
Namespace 环境隔离
Cgroups 资源隔离