容器基本概念

Posted 果子哥丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了容器基本概念相关的知识,希望对你有一定的参考价值。

1、容器基于进程

进程的特点

  • 进程之间是可以相互通信的:高级权限进程可以攻击其他进程
  • 共享同一份文件系统(对同样一份文件进行读写操作):对数据的增删差改,某些进程可以把其他进程需要的文件删除掉,进程各自所需要的依赖会相互冲突
  • 同样的一份系统资源:资源抢占问题,单一应用消耗很大的cpu和内存,使得某些进程资源不够,无法提供服务

容器基于进程,如何解决进程的这三个问题

  • namespace技术:资源视图的隔离
  • chroot:linux和unix可以通过chroot将子目录变成根目录
  • cgroup:限制资源使用率(docker要将systemd改成cgroup)

2、Dockerfile与docker基本操作

  • FROM 行表示以下的构建步骤基于什么镜像进行构建,正如前面所提到的,镜像是可以复用的;
  • WORKDIR 行表示会把接下来的构建步骤都在哪一个相应的具体目录下进行,其起到的作用类似于 Shell 里面的 cd;
  • COPY 行表示的是可以将宿主机上的文件拷贝到容器镜像内;
  • RUN 行表示在具体的文件系统内执行相应的动作。当我们运行完毕之后就可以得到一个应用了;
  • CMD 行表示使用镜像时的默认程序名字。

Alpine

直接通过 apk 命令直接查询和安装各种软件。

docker build  -t ImageName:TagName dir
-t 给镜像加一个Tag
ImageName 给镜像起的名称
TagName 给镜像的Tag名
Dir Dockerfile所在目录

docker pull/push
docker commit containerID  ones:v1 #将正在运行的容器提交成镜像
docker save imagesID > ones.tar #此处的imagesID为提交的镜像ID
docker stop containerID && tar zcf ones.tar.gz /var/lib/docker/volumes/ones-data #将环境停止并备份打包数据
docker load < ones.tar #将镜像导入到B环境中
docker run --name containerName -d imagesID --mount source=ones-data,target=/data -p 80:80 -p443:443 #此处的端口映射为默认值可自定义
docker tag imagesID ones:v1

3、容器的生命周期

容器运行时的生命周期

  • docker run:选择一个镜像来提供一个独立的文件系统,并指定相应的运行程序initial进程
  • initial进程启动退出,容器也启动退出
  • 容器内除了initial进程还有其他进程。
  • initial进程管理范围:initial进程产生其他子进程+docker exec产生的运维操作
  • initial进程退出,管理范围内的资源都会释放,以防止资源泄露。这波操作引发的问题:容器产生的数据会丢失(容器可能是有状态的,比如redis和mysql)。解决方案:重要数据持久化到指定目录(该目录称之为数据卷)

数据卷的管理方式

  • 通过bind,将宿主机的目录挂载在容器内。 docker run -v 宿主机目录:容器目录 …。缺点:需要对所有宿主机的目录进行统一管理
  • 将目录管理交给moby运行引擎(moby依赖的最重要的组件是containerd(容器运行时管理引擎,独立于moby daemon))
    • docker create volume xx,使用docker创建一个数据卷,docker管理它。docker run -v volume名称xx:容器目录

虚拟机

  • 安装虚拟机:使用hypervisor虚拟化技术来模拟CPU、内存等硬件资源,在宿主机上构建了一个Guest OS(独立的内核ubuntu、centos等)
  • 更好的隔离效果,但
    • 需要一部分的资源去运行Hypervisor
    • Guest OS占用大量的磁盘空间(windows10-30G,ubuntu5-6G)
    • 启动比较慢

容器

  • 独立的文件系统,需要提供镜像(所需的所有文件集合)
  • 进程级别的隔离,未来向着强隔离的方向发展(比如kata、gVisor等)
  • 启动时间快于vm,磁盘占用小于vm

4、课后习题

问题一:已运行 docker run -d -t —name demo ubuntu top 命令,以下哪个 docker 命令创建出的容器能看见 demo 容器进程 B
A.docker run --name demo-x --net container:demo ubuntu ps
B.docker run --name demo-x --pid container:demo ubuntu ps
C.docker run --name demo-x --ipc container:demo ubuntu ps

IPC(POSIX/SysV IPC)命名空间提供了相互隔离的命名共享内存、信号灯变量和消息队列。

问题二:以下哪个 docker 命令可以用来创建一个使用宿主机主机名的容器? A
A. docker run --uts=host ubuntu hostname
B. docker run ubuntu hostname
C. docker run --ipc host ubuntu ps

–uts=“” : Set the UTS namespace mode for the container,
‘host’: use the host’s UTS namespace inside the container
UTS命名空间用于设置主机名和对该命名空间中正在运行的进程可见的域。默认下,所有的容器,包括那么以–network=host运行的容器,有它们自己的UTS命名空间。设置UTS为host将使容器使用与主机相同的UTS命名空间。注意–hostname在host UTS模式是无效的。
当你想在主机更改hostname之后,同时也更改同样的hostname到容器,这就需要与主机共享UTS命名空间。一个更高级的用例是从容器更改主机的hostname。

问题三:已运行 docker run -d -t —name demo ubuntu top 命令, 在 demo 这个容器内看到 top 命令的 PID 是什么? B
A.随机数字
B. 1

-d是后台运行,-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上

问题四:如何快速判断 docker daemon 是否支持动态接管运行容器? AB
A. docker info | grep ‘Live Restore Enabled’
B. docker info -f ‘.LiveRestoreEnabled’
C. docker info -f “.Live_Restore_Enabled”

问题五:容器重启
创建容器时添加参数 --restart=always 后,当 docker 重启时,容器自动启动。
docker -d :后台运行容器,并返回容器ID;

问题六: docker inspect
显示一个容器的具体配置信息
docker inspect demo -f ‘.State.Pid’ demo启动进程的pid

问题七:docker run -d -t --name demo ubuntu top
docker exec -it demo kill -9 1强行给容器内一号进程发kill信号,容器是否会退出? 答案:否

问题八:已运行 docker run -d -t —name demo ubuntu top 和 docker run --name demo-x --pid container:demo ubuntu ps 命令,是否可以在 demo-x 容器内部停止容器? 答案:是

以上是关于容器基本概念的主要内容,如果未能解决你的问题,请参考以下文章

云原生之Docker容器安装以及入门Docker部署web应用&&云原生基石

[云原生]Docker

云原生丨Docker系列3Docker容器的基本操作方法

云原生安全 | docker容器逃逸

云原生 | Docker篇Docker架构 & 中央仓库 & 安装

云原生存储详解:容器存储与 K8s 存储卷