Docker培训

news2024/11/15 15:44:14

基本概念

容器是一种轻量级、可移植、自包含的软件打包技术,由两部分组成:应用程序、依赖环境。通过标准格式打包应用的所有代码和依赖关系,确保应用能够快速、可靠地在计算环境下运行。
在这里插入图片描述
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,之下的都叫“镜像层”。所有对容器的改动,无论添加、删除、修改文件都只会发生在容器层中。只有容器层是可写的,镜像层都是只读的。

实现原理

namespace

通过kernel的命名空间,将各个容器的挂载点MNT、进程间通信IPC、内核、进程号PID、网络Net、用户User与宿主机隔离。

在这里插入图片描述
宿主机使用chroot技术将一个指定的运行目录作为容器的根运行环境;
在这里插入图片描述
同一个IPC namespace共享内存资源,不同IPC namespce隔离进程间通信资源;
在这里插入图片描述
UNIX Timesharing System包含了运行内核的名称、版本、底层体系结构类型等用于系统标识的信息,使hostname、domainname、内核相对独立;
在这里插入图片描述
进程隔离对不同容器的进程PID进行重新标号。内核为所有的PID namespace维护了一个树状结构,最顶层的是系统初始时创建的,被称为root namespace,比如每个容器下的第一个进程PID 1,拥有特权;而新创建的子进程在child namespace下。子进程看不到父进程,而父进程可以通过signal方式对子节点中的进程产生影响。
在这里插入图片描述
每一个容器都有自己的网卡、监听端口、TCP/IP协议栈等,docker使用 network namespace启动一个vethX接口,通常是docker0,使各个容器拥有独立的桥接IP。而docker0本质就是Linux的虚拟网桥,工作在数据链路层,通过mac地址对网络进行划分,并且在不同网络直接传递数据。
在这里插入图片描述
各个容器可以有相同的用户名称和ID的账户,但是此用户的有效范围仅是当前容器内。

cgroups

作用是限制一个进程组能够使用的资源上限,比如CPU,内存,磁盘,网络带宽等;
在这里插入图片描述
在每一个 cgroups 层级结构中,每一个节点(cgroup 结构体)可以设置对资源不同的限制权重。比如上图中 cgrp1 组中的进程可以使用60%的 cpu 时间片,而 cgrp2 组中的进程可以使用20%的 cpu 时间片。

整体架构

在这里插入图片描述
dockerd:常驻后台的进程,监听客户端,实际调用containerd的api接口;

Containerd:容器生命周期管理、日志管理、镜像管理、存储管理、容器网络接口及网络管理;

Containerd-shim:每启动一个容器都会起一个新的containerd-shim进程,作为容器运行载体。确保runc退出之后,容器正常运行;

Runc:容器运行时,创建和启停容器等;

安装配置

docker社区版安装:https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.666e1b113IQQe1

mkdr -p /etc/docker
vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://<your-mirror-id>.mirror.aliyuncs.com"]
}
systemctl daemon-reload
systemctl restart docker

定位占用文件系统过大的容器

docker volume ls -q | xargs -I {} sh -c 'echo "查看卷: {}"; mountpoint=$(docker volume inspect --format "{{ .Mountpoint }}" {}); du -sh $mountpoint; echo "----------------------"'

在这里插入图片描述

关于容器、镜像、数据卷的常用命令

systemctl start docker           #启动docker
systemctl stop docker            #关闭docker
systemctl restart docker         #重启docker
systemctl enable docker          #设置开机自启动
systemctl status docker          #查看docker运行状态
systemctl status docker.service     #查询Docker服务状态
docker version                   #查看docker版本号信息
docker info                      #查看docker相关信息
docker stats                     #检查docker守护进程是否在运行

docker run:
-it  输出容器命令行的内容 即容器的自身的程序输出在控制台 有点类似前台运行
-d  和it相反  隐藏后台运行
-p  端口映射 9000::9000 外部(宿主机)端口:镜像里面运行的端口 将宿主机9000端口映射到镜像里面的9000端口
--restart  重启方式:--restart=always 表示该容器跟随docker自启
--name  启动后的容器名称
-v  挂载容器数据卷
--network  连接到某个网络(例如:--network test_net)
--network-alias  容器的网络名称(例如:--network-alias portainer)

docker ps      #显示正在运行的容器
docker ps -a   #-a,--all  显示全部容器,包括已停止的(默认只显示运行中的容器)


docker run --name containerName -p 80:80 -d nginx  

docker pause 容器名/容器ID    #让一个运行的容器暂停
docker unpause name  #让一个容器从暂停状态恢复运行
docker stop name     #停止一个或多个运行的容器(杀死进程、回收内存,仅剩文件系统)
docker start name    #让一个停止的容器再次运行
docker start mysql redis rabbitmq nginx   #启动多个容器
docker restart name  #重启一个或多个容器
#docker stop与docker kill的区别:都可以终止运行中的docker容器。类似于linux中的kill和kill -9这两个命令,docker stop与kill相似,docker kill与kill -9类似
docker kill 容器名    #杀掉一个或多个运行中的容器
docker rename 容器名 新容器名  #更换容器名

#删除容器
docker rm 容器名/容器ID            #删除容器  
docker rm -f CONTAINER           #强制删除
docker rm -f 容器名 容器名 容器名   #删除多个容器 空格隔开要删除的容器名或容器ID
docker rm -f $(docker ps -aq)    #删除全部容器

docker inspect 容器名         #获取容器更多信息 
docker ps -l                 #最后一次运行的容器
docker port 容器名/容器ID     #查看端口的映射情况
docker logs 容器名           #查看容器运行日志         
docker logs -f 容器名        #持续跟踪日志
docker logs -f --tail=20 容器名  #查看末尾多少行
docker diff 容器名        #查看容器的改动

#进入容器执行命令,两种方式 docker exec 和 docker attach,推荐docker exec
docker exec -it 容器名/容器ID bash
docker attach 容器名/容器ID

#从容器退到自己服务器中(不能用ctrl+C)
exit      #直接退出:未添加-d(持久化运行容器)时,执行此参数 容器会被关闭
ctrl+p+q  #优雅退出:无论是否添加-d参数,执行此命令容器都不会被关闭

#设置容器开机自启动
#法一 创建容器、使用docker run命令时,添加参数--restart=always,表示该容器随docker服务启动而自动启动
docker run --name mysqlLatest -p 3307:3306 --restart=always -d mysql

#若容器已启动,希望设置开机自启动
docker update 容器名/容器ID --restart=always

在这里插入图片描述

docker images  #查看镜像
#拉取镜像
docker pull 镜像名       #拉取最新版本的镜像
docker pull 镜像名:tag   #拉取镜像,指定版本
#推送镜像到服务
docker push 镜像名
docker push 镜像名:tag

docker save -o 保存的目标文件名称 镜像名 #保存镜像为一个压缩包
docker load -i 文件名    #加载压缩包为镜像

#搜索镜像
docker search [options] TERM      

#删除镜像。当前镜像没有被任何容器使用 才可以删除
docker rmi 镜像名/镜像ID     #删除镜像 
docker rmi -f 镜像名/镜像ID  #强制删除
docker rmi -f 镜像名 镜像名 镜像名     #删除多个 其镜像ID或镜像用用空格隔开即可 
docker rmi -f $(docker images -aq)  #删除全部镜像,-a 意思为显示全部, -q 意思为只显示ID

docker image rm 镜像名称/镜像ID  #强制删除镜像
#给镜像打标签
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

在这里插入图片描述

# 挂载数据卷
docker run --name mn -v html:/root/html -p 8080:80 nginx
数据卷操作:
docker volume create volumeName  #创建数据卷
docker volume ls  #查看所有数据卷
docker volume inspect volumeName   #查看数据卷详细信息,包括关联的宿主机目录位置
docker volume rm volumeName    #删除指定数据卷
docker volume prune  #删除所有未使用的数据卷

docker run的命令中通过 -v 参数挂载文件或目录到容器中:
-v volume名称:容器内目录
-v 宿主机文件:容器内文件
-v 宿主机目录:容器内目录

Docker下容器间通信

桥接网络bridge

在这里插入图片描述

Docker中的每个容器都会被分配一个IP地址,并且可以通过这个 IP 地址在同一个网络内的其他容器之间进行通信;

主机网络host

在这里插入图片描述

容器会使用宿主机的tcp/ip协议栈,共享网络命名空间,不安全;

无网络模式none

在这里插入图片描述
容器不配置任何网络接口,只能使用 lo 回环设备;

容器网络模式container

在这里插入图片描述

和已存在的一个容器共享IP、主机名和名称空间,但文件系统、进程列表、服务、端口等还是隔离的。处于这个模式下的容器会共享一个网络栈,这样两个容器之间可以高效通信;

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

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

相关文章

Day90 代码随想录打卡|贪心算法篇---合并区间

题目&#xff08;leecode T56&#xff09;&#xff1a; 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。…

中英翻译,就看这五款工具!

大家好&#xff0c;今天咱们来聊聊翻译工具。作为一个经常需要和英文打交道的小编&#xff0c;我可是试过不少翻译软件。今天就来跟大家聊聊5款工具在翻译英文上的表现&#xff0c;看看谁才是真正的翻译高手&#xff01; 一、福昕翻译在线 网址&#xff1a;https://fanyi.pdf3…

【物理教学】不准确温度计图像代码分享

这段Python代码用于绘制温度计校准的图像。它包括以下功能&#xff1a; 用户输入&#xff1a;允许用户输入温度计在冰水混合物和沸水中的读数&#xff0c;以及一个实际温度值。 计算校准因子&#xff1a;根据用户输入的冰水混合物和沸水的读数&#xff0c;计算温度计的校准因子…

企业级使用docker实现负载均衡

利用Docker容器编排完成haproxy和nginx负载均衡架构实施 利用 Docker 编排实现 HAProxy 和 Nginx 负载均衡架构的介绍&#xff1a; 首先&#xff0c;使用 Docker Compose 进行容器编排。创建一个 haproxy.yml 文件&#xff0c;定义 HAProxy 和 Nginx 服务。HAProxy 容器作为前…

线性回归算法详解

目录 线性回归算法 线性回归方程 误差项分析 似然函数求解 线性回归求解 梯度下降算法 下山方向选择 梯度下降优化 梯度下降策略对比 学习率对结果的影响 代码实现 线性回归算法 线性回归是回归算法中最简单、实用的算法之一&#xff0c;在机器学习中很多知识点都是…

深入探讨Java JSON解析与HTML标签清除:详解与实例

“在Java开发中&#xff0c;解析和处理JSON文件是一项常见任务&#xff0c;尤其是当数据中包含大量HTML标签时&#xff0c;去除这些标签又是一项挑战。本文将详细讲解如何在Java中解析JSON文件&#xff0c;创建对应的实体类&#xff0c;并介绍去除HTML标签的方法&#xff0c;最…

RK3588开发板利用udp发送和接收数据

目录 1 send.cpp 2 receive.cpp 3 编译运行 4 测试 1 send.cpp #include <iostream> #include <string> #include <cstring> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> //…

【网络安全】Instagram 和 Meta 2FA 绕过漏洞

未经许可,不得转载。 文章目录 漏洞概述技术细节Meta 2FA 绕过步骤Instagram 2FA 绕过步骤总结漏洞概述 该漏洞允许攻击者在具有受害者Facabook账户权限的情况下,绕过 Meta 的双重身份验证 (2FA) 机制,实现账户接管;并且也能够绕过 Instagram 的双重身份验证 (2FA) 机制,…

堆排序的例题

答案&#xff1a;D C 知识点&#xff1a; 堆排序是把数组排成大顶堆或者小顶堆&#xff0c;选择根结点的最大值或者最小值&#xff0c;因此它是选择排序的方法 堆排序的方法是&#xff1a; 先把数组所有数据组成一个二叉树&#xff0c;然后调整结点与左右孩子树之间的位置&…

【Hot100】LeetCode—35. 搜索插入位置

目录 1- 思路二分 2- 实现⭐35. 搜索插入位置——题解思路 3- ACM 实现 题目连接&#xff1a;35. 搜索插入位置 1- 思路 二分 二分左区间的三种情况。由于目标值不一定在数组中&#xff0c;因此二分的过程中有三种情况判断 2- 实现 ⭐35. 搜索插入位置——题解思路 class So…

大模型参数高效微调技术原理综述(四)-Prompt Tuning

紧接着Stanford的Prefix Tuning论文&#xff0c;Google迅速发表了Prompt Tuning技术论文。Google声称该技术比Prefix Tuning更易上手且成本更低&#xff0c;因此该技术随后也成为了微调技术中的一个重要分支。 本文解读论文**《The Power of Scale for Parameter-Efficient Pr…

Java类加载器双亲委托模型概述

类加载器的双亲委派模型 模型图 加载原理 双亲委派模型的工作过程是&#xff1a;如果一个类加载器收到了类加载的请求&#xff0c;它首先不会自己去尝试加载这个类&#xff0c;而是把这个请求委派给父类加载器去完成&#xff0c;每一个层次的类加载器都是如此&#xff0c;因此所…

C/C++逆向:寻找mian函数(其他编译配置特征)

在上篇文章中写了在逆向中定位main函数几种方法&#xff0c;其中有一种方法是通过编译器特征定位 main 函数&#xff08;使用IDA分析简单demo程序获取特征&#xff0c;根据得到的特征可以定位相同编译器编译程序的main函数&#xff09;。在上一篇文章中我们提取了VS环境(VS2017…

【软件测试专栏】软件测试 — 概念篇

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;软件测试专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 软件测试 — 概念篇 关键词&#xff1a;软件需求、用户需求、开发…

从混乱到秩序:产品经理在需求变更中的关键角色

在软件开发过程中&#xff0c;需求是驱动整个项目的核心。需求的来源多种多样&#xff0c;包括客户、市场、领导等&#xff0c;产品经理的职责是将这些需求收集、整理并转化为可行的开发计划。本文将探讨需求的来源、产品经理的角色、软件开发中的挑战以及应对变化的策略。 需求…

Java小白一文讲清Java中集合相关的知识点(一)

集合 诞生缘由 数组 长度开始时必须指定&#xff0c;而且一旦指定&#xff0c;不能更改保存的必须为同一类型元素使用数组进行增/删元素所需要编写的代码–比较麻烦 Person[] pers new Person[1]; pers[0] new Person(); //此时增加新的Person对象呢&#xff1f; Person[…

【学习笔记】卫星通信NTN 3GPP标准化进展分析(一)-基本信息

一、引言&#xff1a; 本文来自3GPP Joern Krause, 3GPP MCC (May 14,2024) Non-Terrestrial Networks (NTN) (3gpp.org) 本文总结了NTN标准化进程以及后续的研究计划&#xff0c;是学习NTN协议的入门。 【学习笔记】卫星通信NTN 3GPP标准化进展分析&#xff08;一&#xf…

前端开发第二节课

HTML常用的标签 文本格式化标签 在网页中&#xff0c;有时需要为文字设置粗体、斜体或下划线等效果&#xff0c;这时就需要用到HTML中的文本格式化标签使文字以特殊的方式显示。 标签语义&#xff1a;突出重要性&#xff0c;比普通文字更重要。 加粗 <strong></st…

Spring框架;Spring中IOC简介及搭建;Spring中AOP简介;

一&#xff0c;Spring介绍 Spring 的全称&#xff1a; Spring Framework Spring是一个优秀的开源的轻量级的企业应用开发框架&#xff0c;是为了解决企业应用程序开发复杂性而创建的。它大大简化了java企业级开发的复杂性&#xff0c;提供了强大&#xff0c;稳定的功能&#xf…

XR-Frame 实现 始终朝向屏幕(相机)的面片与模型

wxml&#xff0c;xr-frame中plane平面默认是趴在场景中的&#xff0c;需要先绕x轴渲染90度&#xff0c; // 面片 <xr-node id"l" position"-3.0 0 0.0"><xr-mesh rotation"90 0 0" geometry"plane" uniforms"u_base…