docker-学习-2

news2024/12/26 23:28:49

docker学习第二天

  • docker学习第二天
    • 1.docker和虚拟机的区别
    • 2.docker的底层隔离机制
      • 2.1 Namespaces(命名空间)
        • 2.1.1 什么是命名空间
      • 2.2 Cgroups
      • 2.3 Union file systems
      • 2.4 Container format
      • 2.5 docker在底层如何做隔离的,如何进行资源限制的?
    • 3. docker命令
      • 3.1 启动MySQL 容量限制cpu使用率为50% 内存为2G,如何看是否启用了限制?
      • 3.2 docker top
      • 3.3 思考:如何限制容器使用网络带宽资源?
      • 3.4 细讲一下docker run
      • 3.5 docker rm
      • 3.6 docker rmi
      • 3.7 docker rm和rmi的区别
    • 4. 一些小知识点
      • 4.1 kernel的作用
      • 4.2 假如我们不使用容器进程,我们想限制一个Linux操作系统里的进程使用多少cpu和多少内存?
      • 4.3 docker容器的三种状态
      • 4.4 小结一下

docker学习第二天

1.docker和虚拟机的区别

image-20240130152846926

2.docker的底层隔离机制

2.1 Namespaces(命名空间)

2.1.1 什么是命名空间

简单来讲:命名空间就是在内存中存放数据的空间(存放变量,函数,库等)

就相当于一块地盘,梁山!梁山上的一草一木都是你命名的,这块地盘归你管理!

Namespaces是Linux内核的一个特性,它可以为进程提供一个隔离的环境,使得进程和其他进程运行在不同的“空间”中。Docker使用了以下几种namespaces来隔离容器的运行环境

  • **PID Namespace:**隔离进程ID,每个容器都有自己的进程ID空间。
  • **NET Namespace:**隔离网络接口,每个容器都有自己的网络空间。
  • **IPC Namespace:**隔离System V IPC和POSIX message queues,每个容器都有自己的IPC空间。
  • **MNT Namespace:**隔离文件系统挂载点,每个容器都有自己的文件系统。
  • **UTS Namespace:**隔离hostname和domainname,每个容器都有自己的hostname。
  • **user Namespace: ** 用户命名空间。

我们每起一个容器就是在内存中开辟一块空间

同样的每一个容器也代表着一个进程

2.2 Cgroups

Cgroups(control groups)是Linux内核的一个特性,它可以限制、记录和隔离进程组所使用的物理资源,包括CPU、内存、磁盘I/O等。Docker使用cgroups来限制和控制容器对物理资源的使用。

2.3 Union file systems

Union file systems,或者叫unionfs,是一种文件系统服务,它可以将多个不同位置的目录合并到一个虚拟的文件系统中。Docker使用unionfs来支持镜像的层次结构,每一层都可以添加、修改或删除文件,而不影响其他层。

2.4 Container format

Docker使用自己的容器格式来打包和运行容器。这个格式定义了容器的内容和运行时的参数,包括容器使用的镜像、网络配置、环境变量等。

2.5 docker在底层如何做隔离的,如何进行资源限制的?

Namespaces和Cgroups联系起来进行隔离和资源限制

隔离 - Namespaces

Namespaces是Linux内核的一个特性,它可以为进程提供一个隔离的环境,使得进程和其他进程运行在不同的“空间”中。Docker使用了以下几种namespaces来隔离容器的运行环境:

  • PID Namespace:隔离进程ID,每个容器都有自己的进程ID空间。–>进程命名空间
  • NET Namespace:隔离网络接口,每个容器都有自己的网络空间。–>网络命名空间
  • IPC Namespace:隔离System V IPC和POSIX message queues,每个容器都有自己的IPC空间。类似于管道的作用。
  • MNT Namespace:隔离文件系统挂载点,每个容器都有自己的文件系统。
  • UTS Namespace:隔离hostname和domainname,每个容器都有自己的hostname。和时间相关。
  • user Namespace: 用户命名空间。

资源限制 - Cgroups

Cgroups(control groups)是Linux内核的一个特性,它可以限制、记录和隔离进程组所使用的物理资源,包括CPU、内存、磁盘I/O等。Docker使用cgroups来限制和控制容器对物理资源的使用。

例如,你可以设置一个容器只能使用1GB的内存和50%的CPU。当容器试图使用更多的资源时,cgroups会阻止它并可能杀死一些进程来保持资源使用在限制之内。

举个例子

image-20240130160518610

悟空,八戒,嫦娥是不同的容器

👆图说明:不同的容器之间可以使用相同的命名空间

image-20240130161532511

3. docker命令

3.1 启动MySQL 容量限制cpu使用率为50% 内存为2G,如何看是否启用了限制?

docker run -d --name sc-mysql-2 -p 3307:3306\
    --cpus=".5" \
    --memory="2g" \
    -e MYSQL_ROOT_PASSWORD='sc123456' \
    mysql:5.7.43
[root@docker-1 ~] docker stats
CONTAINER ID   NAME         CPU %     MEM USAGE / LIMIT     MEM %     NET I/O       BLOCK I/O         PIDS
168628a39c9b   sc-mysql-2   0.35%     205.2MiB / 2GiB       10.02%    656B / 0B     1.81MB / 583MB    27

该命令在Docker中启动了一个名为sc-mysql-2的MySQL容器实例,并设置了相关参数来控制资源和配置,具体的参数解释如下:

  • docker run: Docker的命令,用于创建并启动一个新的容器。

  • -d: 表示容器将在后台运行(detached mode),即容器启动后不会占用当前的命令行界面。

  • --name sc-mysql-2: 设置容器的名称为sc-mysql-2,方便后续的管理操作,如停止和删除容器。

  • -p 3307:3306: 端口映射参数。将容器内部的3306端口(MySQL默认端口)映射到宿主机的3307端口。这样,宿主机上的应用程序可以通过访问localhost:3307来与容器内的MySQL服务器通信。

  • --cpus=".5": 限制容器的CPU使用率。在这里,设置为0.5意味着容器最多可以使用50%的CPU资源。如果是多核CPU,这表示容器可以使用半核的CPU时间。

  • --memory="2g": 限制容器可以使用的最大内存量为2GB。如果容器试图使用超过这个限制的内存,可能会触发OOM(Out of Memory)管理机制,导致容器内的进程被终止。

  • -e MYSQL_ROOT_PASSWORD='sc123456': 通过环境变量设置MySQL的root用户密码。MYSQL_ROOT_PASSWORD是MySQL容器初次启动时必须设置的环境变量,用于定义root用户的密码。在这个例子中,密码被设置为sc123456

  • mysql:5.7.43: 指定使用的Docker镜像,这里使用的是MySQL的官方Docker镜像,版本是5.7.43

综上所述,这个命令将会在Docker中创建一个新的MySQL容器,该容器在后台运行,拥有2GB的内存限制和50%的CPU使用限制,其root用户的密码设置为sc123456。外部可以通过宿主机的3307端口与容器内的MySQL服务进行通信。

另一种方式

[root@docker-1 ~] docker run -d --name sc-mysql-3 -p 3308:3306 --cpu-shares 500 --cpus 2 --cpuset-cpus 0,1 -m 2000000000 --device-write-bps /dev/sda:20MB  -e MYSQL_ROOT_PASSWORD='sc123456'     mysql:5.7.43
938d53c057a172472fdde927f25d89c709e467d19eceebe2923d31f2e2907627

这条命令在Docker中启动了一个名为sc-mysql-3的MySQL容器实例,并配置了多个资源限制参数和环境变量。以下是该命令各个参数的详细解释:

  • docker run: Docker的命令,用于创建并启动一个新的容器实例。

  • -d: 表示容器将在后台运行(detached mode),即容器启动后不会占用当前的命令行界面。

  • --name sc-mysql-3: 指定了新容器的名称为sc-mysql-3

  • -p 3308:3306: 将容器内部的3306端口(MySQL默认端口)映射到宿主机的3308端口。这样,宿主机上的应用程序可以通过访问localhost:3308来与容器内的MySQL服务器通信。

  • --cpu-shares 500: 设置容器的CPU共享权重为500。在同一宿主机上,CPU资源将按照容器的权重被分配,权重越高的容器在CPU资源紧张时获得的份额越多。

  • --cpus 2: 限制容器可以使用的CPU核心数为2。这意味着容器可以使用两个CPU核心的全部性能。

  • --cpuset-cpus 0,1: 绑定容器到特定的CPU核心,只允许容器在CPU 0和CPU 1上运行。

  • -m 2000000000: 限制容器可以使用的内存为2GB。这里使用字节作为单位,2000000000字节等于大约2GB。

  • --device-write-bps /dev/sda:20MB: 限制容器对/dev/sda设备(通常是宿主机的硬盘)的写速度为每秒20MB。这可以防止容器占用过多的磁盘I/O资源。

  • -e MYSQL_ROOT_PASSWORD='sc123456': 通过环境变量设置MySQL的root用户密码。MYSQL_ROOT_PASSWORD是MySQL容器初次启动时必须设置的环境变量,用于定义root用户的密码。在这个例子中,密码被设置为sc123456

  • mysql:5.7.43: 指定使用的Docker镜像,这里使用的是MySQL的官方Docker镜像,版本是5.7.43

综上所述,这个命令将会在Docker中创建一个新的MySQL容器,该容器在后台运行,配置了CPU和内存的资源限制,并将容器的MySQL服务端口映射到宿主机的3308端口上。同时,还限制了容器对宿主机硬盘的写速度。

[root@docker-1 ~] docker stats
CONTAINER ID   NAME         CPU %     MEM USAGE / LIMIT     MEM %     NET I/O       BLOCK I/O         PIDS
938d53c057a1   sc-mysql-3   0.03%     205.2MiB / 1.863GiB   10.76%    656B / 0B     2.88MB / 583MB    27

3.2 docker top

查看容器内部的进程

[root@docker-1 ~] docker top sc-mysql-3
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
polkitd             5529                5509                0                   18:10               ?                   00:00:00            mysqld
[root@docker-1 ~]# 

一般容器里边只跑一个进程

3.3 思考:如何限制容器使用网络带宽资源?

Docker本身并没有直接提供限制容器网络带宽的选项,但是可以通过一些间接的方式来实现。其中一种常见的方法是使用tc(Traffic Control)工具,它是Linux内核的一部分,可以用来控制网络带宽。

然而,tc命令需要在容器启动后执行,而不能直接在docker run命令中设置。因此,你可能需要创建一个脚本来启动容器并设置网络带宽限制。

以下是一个简单的示例,首先启动容器,然后使用tc命令限制容器的出口带宽为1mbit/s:

# 启动容器
docker run -d --name sc-mysql-3 -p 3308:3306 --cpu-shares 500 --cpus 2 --cpuset-cpus 0,1 -m 2000000000 --device-write-bps /dev/sda:20MB  -e MYSQL_ROOT_PASSWORD='sc123456' mysql:5.7.43

# 获取容器的网络设备名
CONTAINER_PID=$(docker inspect -f '{{.State.Pid}}' sc-mysql-3)
NETWORK_INTERFACE=$(nsenter -t $CONTAINER_PID -n ip link | grep eth0 | awk '{print $2}' | tr -d ":")

# 限制容器的出口带宽为1mbit/s
tc qdisc add dev $NETWORK_INTERFACE root tbf rate 1mbit burst 32kbit latency 400ms

这个脚本首先启动了一个名为sc-mysql-3的MySQL容器,然后获取了容器的网络设备名,最后使用tc命令限制了容器的出口带宽为1mbit/s。

需要注意的是,这只是一个基本的示例,实际使用时可能需要根据你的具体需求进行调整。另外,tc命令的使用可能需要一定的网络知识,如果你不熟悉这个工具,可能需要花一些时间来学习。

3.4 细讲一下docker run

docker run的流程 👇

  1. 检查启动容器使用的镜像是否存在,如果不存在就先去pull镜像到本机,如果存在就创建容器
    docker pull 去拉mysql:5.7.43

  2. docker create ------>创建容器

  3. docker start ------>启动容器

# 删除镜像
[root@localhost ~] docker rmi busybox
Untagged: busybox:latest
Untagged: busybox@sha256:5acba83a746c7608ed544dc1533b87c737a0b0fb730301639a0179f9344b1678
Deleted: sha256:beae173ccac6ad749f76713cf4440fe3d21d1043fe616dfbe30775815d1d0f6a
Deleted: sha256:01fd6df81c8ec7dd24bbbd72342671f41813f992999a3471b9d9cbc44ad88374

↑ 如果正在使用,就先停止那个容器,然后rm删除容器,再rmi删除镜像

所以说,不需要 pull 创建之类的

直接 用run

3.5 docker rm

rm 是删容器的

3.6 docker rmi

rmi是删除镜像

一般是停止运行之后,先通过rm删除容器,然后通过rmi删除镜像

3.7 docker rm和rmi的区别

docker rmdocker rmi 是Docker命令行工具中的两个不同命令,分别用于删除容器和镜像。

docker rm

docker rm 命令用于删除一个或多个容器。当一个容器不再需要时,你可以使用此命令来清除它。需要注意的是,只有停止状态的容器才可以被删除。如果要删除正在运行的容器,需要先停止容器(使用docker stop命令),或者在使用docker rm命令时加上-f(–force)参数来强制删除。

基本使用格式如下:

docker rm [OPTIONS] CONTAINER [CONTAINER...]

例如,删除名为my_container的容器:

docker rm my_container

如果想要强制删除一个正在运行的容器,可以使用:

docker rm -f my_container

docker rmi

docker rmi 命令用于删除一个或多个Docker镜像。当你不再需要某个镜像,或者需要清理磁盘空间时,你可以使用这个命令。在删除镜像之前,需要确保没有任何容器(无论是运行中的还是已停止的)正在使用这个镜像。

基本使用格式如下:

docker rmi [OPTIONS] IMAGE [IMAGE...]

例如,删除名为mysql的镜像:

docker rmi mysql

如果一个镜像有多个标签,你可能需要删除所有相关的标签才能完全删除该镜像。

需要注意的是,如果其它镜像依赖于要删除的镜像的层,那么这些层不会被删除。只有当没有任何镜像使用这些层时,这些层才会从Docker主机上删除。

无论是使用docker rm还是docker rmi,都应谨慎操作,确保不会误删正在使用或需要保留的容器或镜像。

4. 一些小知识点

4.1 kernel的作用

Linux内核的作用是提供系统的核心功能,包括:

  • **进程管理:**调度进程、管理进程生命周期和状态。
  • **内存管理:**分配和回收内存、虚拟内存和交换空间的管理。
  • **文件系统:**管理数据存储、文件的创建、删除、读取和写入。
  • **设备驱动:**提供与硬件设备通信的接口和控制。
  • **网络功能:**实现网络协议栈,处理网络通信。
  • **安全:**提供用户权限控制、访问权限和安全机制。
  • **系统调用和接口:**提供用户空间程序与内核交互的接口。

4.2 假如我们不使用容器进程,我们想限制一个Linux操作系统里的进程使用多少cpu和多少内存?

使用cgroups技术去控制

https://pythonjishu.com/emkqvgkuoaalfkc/

操作系统内核里有个软件: LXC linux container技术
docker只是调用了LXC的库,实现了容器的应用

4.3 docker容器的三种状态

Docker容器的状态通常是通过docker psdocker inspect命令查看的,并且确实有几种主要状态,包括"Up"、“Exited"和"Created”。下面是对这三种状态的详细解释:

  1. Up(运行中):当容器正在运行时,使用docker ps命令查看容器列表,会显示容器的状态为"Up"。这表示容器内的应用程序正在活动运行。"Up"状态后通常会跟随容器已运行的时间,例如"Up 2 hours"表示容器已经运行了两小时。

  2. Exited(已停止):当容器内的主进程已经终止时,容器的状态就变为"Exited"。这意味着容器已经停止运行,不再执行任何操作。"Exited"状态后通常会跟随一个退出代码,表示容器终止时的状态,例如"Exited (0) 5 minutes ago"表示容器在5分钟前正常退出,退出代码为0。

  3. Created(已创建):当使用docker create命令创建一个容器但尚未启动它时,容器的状态是"Created"。这意味着容器的配置已经完成,包括文件系统的初始化,但是容器内的应用程序还没有开始运行。"Created"状态的容器需要通过docker start命令来启动。

这些状态帮助用户了解容器的生命周期和当前运行情况。使用docker ps -a命令会列出所有容器,包括未运行的容器,而使用docker ps命令默认只列出处于"Up"状态的运行中容器。

4.4 小结一下

docker run = docker pull+ docker create + docker start

docker rmi

docker top 查看容器里运行的进程,单进程思想,一个容器只跑一个进程

docker stats 查看运行的状态

docker network 查看容器里的网络

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1430437.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ep-bg-purple-dark element-plus 不生效

element-plus 官网里面的 Layout 布局中的示例,官方文档中添加类名 class"grid-content ep-bg-purple-dark" 有相应的样式 import element-plus/theme-chalk/index.css //默认css样式 英文 import element-plus/dist/index.css 两…

【Leetcode】2670. 找出不同元素数目差数组

文章目录 题目思路代码结果 题目 题目链接 给你一个下标从 0 开始的数组 nums ,数组长度为 n 。 nums 的 不同元素数目差 数组可以用一个长度为 n 的数组 diff 表示,其中 diff[i] 等于前缀 nums[0, …, i] 中不同元素的数目 减去 后缀 nums[i 1, …, …

在jetbrains IDEA/Pycharm/Android Studio中安装官方rust插件,开始rust编程

在idea插件市场搜索rust:JetBrains Marketplace ,就可以找到rust插件: jetbrains官方rust插件地址:[Deprecated] Rust - IntelliJ IDEs Plugin | Marketplace 直接在idea中搜索rust好像是搜不到的: 需要在这个插件市场…

STL常用容器—list容器(链表)

STL常用容器—list容器(链表) 一、list容器基本概念二、list容器基本操作与常用方法1. list构造函数2. ☆list 插入和删除3. list 获取头尾数据4. list 大小操作5. list赋值和交换6. list 反转和排序 三、排序案例 参考博文1: <C>…

Cambalache in Ubuntu

文章目录 前言apt install flatpak这很ok后记 前言 gtkmm4相比gtkmm3有很多改革, 代码也干净了许多, 但在windows上开发 有ui设计器那自然方便很多, 但glade又不支持gtkmm4, windows上装Cambalache很是困难. 各种问题都找不到答案.于是 我用VMware虚拟机Ubuntu20.xx安装Cambal…

深度学习:数据驱动的人工智能革命

文章目录 每日一句正能量前言什么是深度学习推动AI发展不同阶段的“三大驱动 ”1、技术驱动:算法和计算力是主要驱动力2、计算力的三驾马车:芯片、超级计算机、云计算3、数据驱动:描绘个性化画像; 后记 每日一句正能量 一般青年的…

日志追踪-Tracing

1. 前言 分布式链路跟踪中有两个重要的概念:跟踪(trace)和 跨度( span)。trace 是请求在分布式系统中的整个链路视图,span 则代表整个链路中不同服务内部的视图,span 组合在一起就是整个 trace 的视图在整个…

BUUCTF-Real-[struts2]s2-013

struts2的标签中 <s:a> 和 <s:url> 都有一个 includeParams 属性&#xff0c;可以设置成如下值none - URL中不包含任何参数&#xff08;默认&#xff09; get - 仅包含URL中的GET参数 all - 在URL中包含GET和POST参数 当includeParamsall的时候&#xff0c;会将本次…

学术研究新突破:发现新型相变存储器

斯坦福大学的研究人员开发出了一种新型相变存储器&#xff0c;该存储器有望帮助计算机更快、更高效地处理大量数据。在最近发表于《自然通讯》的一篇论文中&#xff0c;研究人员详细介绍了这项技术&#xff0c;表明一种新材料可能会使基于电阻高低状态切换以创建计算机数据“0”…

2024美赛数学建模D题思路+代码

文章目录 1 赛题思路2 美赛比赛日期和时间3 赛题类型4 美赛常见数模问题5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 美赛比赛日期和时间 比赛开始时间&#xff1a;北京时间2024年2月2日&#xff08;周五&#xff…

Blender教程(基础)-面的尖分、三角化与融并-09

一.面的尖分 1.准备 新建如下图所示物体、切换到编辑模式下 2.右键尖分正方形面 在选择中的面上右键选择尖分面 效果如下所示 3.右键尖分圆形面 效果如下 可以自行调节参数 二.面的三角化 1、正方形 2、圆形 三.融并 1、尖分圆形面 2、尖分圆形面-融并 发现…

Unity Meta Quest MR 开发(三):Scene API 配置+实现虚拟与现实之间的碰撞

文章目录 &#x1f4d5;教程说明&#x1f4d5; Scene 配置⭐开启场景理解功能和应用访问空间数据的权限⭐OVRSceneManager⭐制作 Plane Prefab 和 Volume Prefab⭐运行场景⭐添加透视材质 &#x1f4d5;虚拟与现实物体的碰撞&#xff08;弹球 Demo&#xff09;&#x1f4d5;Mes…

两数之和 - 暴力枚举+哈希表

两数之和原题地址 方法一&#xff1a;暴力枚举 首先&#xff0c;我们需要枚举数组中所有可能的下标对组合&#xff0c;对于n个数的数组&#xff0c;从中选2个下标&#xff0c;有种可能。做法很简单&#xff0c;遍历数组中的所有元素&#xff0c;对于每一个元素&#xff0c;遍…

yo!这里是c++IO流相关介绍

目录 前言 C语言的输入输出 CIO流基本介绍 流的概念 IO流类库 iostream fstream stringstream 后记 前言 学过C语言的输入输出相关知识点的童鞋应该多多少少会觉得有些许麻烦&#xff0c;反正我就是这么觉得的&#xff0c;scanf、printf等函数不仅数量众多&#xff0c…

RNN实战具体跑的代码

一、首先先上代码&#xff1a;这个是接pytorch API的调用代码 import torch import torch.nn as nn bs, T 2,3#批次大小&#xff0c;输入序列长度 input_size,hidden_size2,3#输入特征大小&#xff0c;隐含层特征大小 input torch.randn(bs,T, input_size) h_prev torch.ze…

css新手教程

css新手教程 课程&#xff1a;14、盒子模型及边框使用_哔哩哔哩_bilibili 一.什么是CSS 1.什么是CSS Cascading Style Sheet 层叠样式表。 CSS&#xff1a;表现&#xff08;美化网页&#xff09; 字体&#xff0c;颜色&#xff0c;边距&#xff0c;高度&#xff0c;宽度&am…

用户体验优化:HubSpot的秘密武器

在当今数字化市场中&#xff0c;提升用户体验已经成为企业成功的关键因素之一。HubSpot&#xff0c;作为一款领先的营销自动化工具&#xff0c;不仅在推动销售业绩上表现出色&#xff0c;同时通过其独特的策略也致力于提升用户体验。运营坛将深入探讨HubSpot是如何通过个性化推…

Leetcode92:反转链表II(区间反转链表)

一、题目 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left 2, right 4 输出&#xff1a…

Redisson看门狗机制

一、背景 网上redis分布式锁的工具方法&#xff0c;大都满足互斥、防止死锁的特性&#xff0c;有些工具方法会满足可重入特性。如果只满足上述3种特性会有哪些隐患呢&#xff1f;redis分布式锁无法自动续期&#xff0c;比如&#xff0c;一个锁设置了1分钟超时释放&#xff0c;…

Servlet+Ajax实现对数据的列表展示(极简入门)

目录 1.准备工作 1.数据库源&#xff08;这里以Mysql为例&#xff09; 2.映射实体类 3.模拟三层架构&#xff08;Dao、Service、Controller&#xff09; Dao接口 Dao实现 Service实现&#xff08;这里省略Service接口&#xff09; Controller层&#xff08;或叫Servlet层…