(2)Docker 常用命令
文章目录
- Docker 服务器
- Docker 镜像
- Docker 容器
- 本地 Registry
- RUN vs CMD vs ENTRYPOINT
- RUN
- CMD
- ENTRYPOINT
- 限制容器对内存、CPU 和 IO 资源的使用
- 内存
- CPU
- Block IO
- 设置权重
- bps 和 iops
- cgroup 和 namespace
- cgroup
- namespac
- Mount namespace
- UTS namespace
- IPC namespace
- PID namespace
- Network namespace
- User namespace
Docker 服务器
- systemctl status docker.service:查看 Docker daemon 服务状态
- vim /etc/systemd/system/multi-user.target.wants/docker.service:修改 docker.service 配置
- systemctl daemon-reload:重新加载 Docker daemon 配置
- systemctl restart docker.service:重启 Docker daemon 服务
- docker -H 192.168.138.132 info:通过命令行与 Docker daemon 通信,查看 Docker 服务器的信息
Docker 镜像
- docker pull httpd:从 Registry 下载镜像
- docker inspect xxxxx:用于查看容器、镜像、网络或数据卷的详细信息
- dcoker run hello-world
- docker run -d -p 8080:80 httpd:先下载镜像(如果本地没有),然后再启动容器。
- docker run -it 镜像名:以交互模式进入容器,并打开终端
- docker images [centos][-a]:查看镜像,-a 会显示所有中间镜像
- Docker 容器的 ubuntu 镜像配置 apt 国内源
# 将文件中所有 archive.ubuntu.com 和 security.ubuntu.com 替换为 mirrors.aliyun.com。
sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
sed -i s@/security.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
# 清理 apt 包管理器的本地缓存(即 /var/cache/apt/archives 目录下的 .deb 文件)。避免旧版本的软件包占用磁盘空间。
apt-get clean
# 从新的软件源(阿里云镜像源)下载最新的软件包列表。
apt-get update
- apt-get install -y vim:安装 vim,并跳过安装提示
- docker commit wonderful_sa ubuntu_with_vi:将容器保存为镜像
- docker rmi [-f] 容器id:删除镜像(先停止容器才能删除)。如果一个镜像对应了多个 tag,只有当最后一个 tag 被删除时,镜像才被真正删除。
- touch Dockerfile:创建Dockerfile文件
- docker build -t ubuntu-with-vi-dockerfile . :运行 docker build 命令,-t 将新镜像命名为 ubuntu-with-vi-dockerfile,命令末尾的 . 指明 build context 为当前目录。Docker 默认会从 build context 中查找 Dockerfile 文件,我们也可以通过 -f 参数指定 Dockerfile 的位置。
- docker history ubuntu-with-vi-dockerfile:显示镜像的构建历史
- docker build -t --no-cache ubuntu-with-vi-dockerfile-2 . 根据当前目录下的 dockerfile 构建镜像,不使用缓存
- docker tag aaa:latest bbb:1:修改镜像的REPOSITORY和TAG
- docker search httpd:搜索 Docker Hub 中的镜像。
Docker 容器
- docker attach:进入容器的启动命令终端,不会启动新的进程。如果想直接在终端中查看启动命令的输出,用 attach;其他情况使用 exec。
- docker exec -it container bash :在容器中打开新的终端,并且可以启动新的进程。
- docker logs -f container:如果只是为了查看启动命令的输出,可以使用 docker logs 命令。-f 的作用与 tail -f 类似,能够持续打印输出。
- docker ps -a/ docker container ls -a:查看正在运行的容器,-a 会显示所有状态的容器。
- ctrl + p + q :退出容器
- docker run hello-world
- docker run -d -p 8080:80 httpd:先下载镜像(如果本地没有),然后再启动容器。服务类容器通过 -d 以后台方式启动是非常合适的。
- docker run -it 镜像名:以交互模式进入容器,并打开终端。退出 Shell(输入 exit 或 Ctrl+D):主进程(bash)终止 → 容器停止。若你不退出 Shell:容器会保持运行(因为主进程未终止)。工具类容器通常给能我们提供一个临时的工作环境,通常以 run -it 方式运行。工具类容器多使用基础镜像,例如 busybox、debian、ubuntu 等。
- docker run --name my_nginx_container nginx:–name 参数显示地为容器命名,如果不指定,docker 会自动为容器分配名字。
- docker run -d \
–name mysql-container \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
-p 3306:3306 \
-v /path/on/host:/var/lib/mysql \
mysql:latest - docker run -d --restart=always httpd:无论容器因何种原因退出(包括正常退出),就立即重启。 只有当容器的启动进程退出时,–restart 才生效。 如果容器是因为执行 docker stop 或docker kill 退出,则不会自动重启。
- docker stop/kill 镜像名:停止容器。kill 会快速停止容器。
- docker create mysql-container:创建的容器处于 Created 状态。docker run 命令实际上是 docker create 和 docker start 的组合。
- docker start/restart mysql-container:重新启动容器。
- docker pause/unpause mysql-container:暂停容器/恢复运行容器。
- docker rm container1 container2 container3:删除容器。
- docker rm -v $(docker ps -aq -f status=exited):批量删除所有已经退出的容器。
本地 Registry
- docker run -d -p 5000:5000 -v /myregistry:/var/lib/registry registry:2:-d 是后台启动容器。-p 将容器的 5000 端口映射到 Host 的 5000 端口。5000 是 registry 服务端口。-v 将容器 /var/lib/registry 目录映射到 Host 的 /myregistry,用于存放镜像数据。
- docker tag hanfei/httpd:1 ubuntu:5000/hanfei/httpd:1:repository 的完整格式为:[registry-host]:[port]/[username]/xxx。只有 Docker Hub 上的镜像可以省略 [registry-host]:[port] 。在 Docker 主机上,可以使用 hostname 命令查看主机的名称。
RUN vs CMD vs ENTRYPOINT
RUN
- RUN 指令通常用于安装应用和软件包,构建镜像。
- RUN 有两种格式:
(1)Shell 格式:
RUN ["apt-get", "install", "python3"]
(2)Exec 格式:
RUN apt-get install python3
RUN apt-get update && apt-get install -y \ bzr \cvs \git \mercurial \subversion
CMD
- CMD 指令通常用于设置容器启动后默认执行的命令及其参数。
- CMD 能够被 docker run 后面跟的命令行参数替换。如果 Dockerfile 中有多个 CMD 指令,只有最后一个 CMD 有效。
- 推荐使用 Exec 格式,因为指令可读性更强,更容易理解。
(1)Exec 格式:
CMD ["executable","param1","param2"]
(2)CMD ["param1","param2"] 为 ENTRYPOINT 提供额外的参数,此时 ENTRYPOINT 必须使用 Exec 格式。
CMD ["world"]
(3)Shell 格式(不推荐)
ENTRYPOINT
- ENTRYPOINT 配置容器启动时运行的命令。让容器以应用程序或者服务的形式运行。
- ENTRYPOINT 看上去与 CMD 很像,它们都可以指定要执行的命令及其参数。不同的地方在于 ENTRYPOINT 不会被忽略,一定会被执行,即使运行 docker run 时指定了其他命令。
- 推荐使用 Exec 格式,因为指令可读性更强,更容易理解。
(1)使用 Exec 格式的 ENTRYPOINT 指令。CMD 可为 ENTRYPOINT 提供额外的默认参数,同时可利用 docker run 命令行替换默认参数。
ENTRYPOINT ["/bin/echo", "Hello"]
CMD ["world"]
(2)Shell 格式(不推荐)
ENTRYPOINT 的 Shell 格式会忽略任何 CMD 或 docker run 提供的参数。
限制容器对内存、CPU 和 IO 资源的使用
内存
docker run -m 200M --memory-swap=300M ubuntu # 容器最多使用 200M 内存和 100M swap。默认情况下,上面两组参数为-1,即对内存和swap使用没有限制。如果只指定-m不指定--memory-swap,那么--memory-swap 默认为-m的两倍。
docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M # 使用progrium/stress模拟系统资源压力:启动 1 个内存工作线程,每个线程分配 280M 内存,正常工作。
CPU
- 通过 -c 或 --cpu-shares 设置容器使用 CPU 的权重。如果不指定,默认值为 1024。
- 通过 -c 设置的 cpu share 并不是 CPU 资源的绝对数量,而是一个相对的权重值。某个容器最终能分配到的 CPU 资源取决于它的 cpu share 占所有容器 cpu share 总和的比例。换句话说:通过 cpu share 可以设置容器使用 CPU 的优先级。
- 权重分配 CPU 只会发生在 CPU 资源紧张的情况下。如果 container_A 处于空闲状态,这时,为了充分利用 CPU 资源,container_B 也可以分配到全部可用的 CPU。
docker run --name "container_A" -c 1024 ubuntu
docker run --name "container_B" -c 512 ubuntu
Block IO
- Block IO 指的是磁盘的读写,docker 可通过设置权重、限制 bps 和 iops 的方式控制容器读写磁盘的带宽。目前 Block IO 限额只对 direct IO(不使用文件缓存)有效。
设置权重
- 默认情况下,所有容器能平等地读写磁盘,可以通过设置 --blkio-weight 参数来改变容器 block IO 的优先级,设置的是相对权重值,默认为 500。
docker run -it --name container_A --blkio-weight 600 ubuntu
docker run -it --name container_B --blkio-weight 300 ubuntu
bps 和 iops
- bps 是 byte per second,每秒读写的数据量。
iops 是 io per second,每秒 IO 的次数。- –device-read-bps,限制读某个设备的 bps。
- –device-write-bps,限制写某个设备的 bps。
- –device-read-iops,限制读某个设备的 iops。
- –device-write-iops,限制写某个设备的 iops。
# 限制容器写 /dev/sda 的速率为 30 MB/s
docker run -it --device-write-bps /dev/sda:30MB ubuntu
# 该命令通过直接I/O方式,使用dd工具从/dev/zero读取数据并生成一个800MB的文件(test.out),同时利用time命令测量整个过程的执行时间,以测试磁盘的写入性能。
time dd if=/dev/zero of=test.out bs=1M count=800 oflag=direct
cgroup 和 namespace
- cgroup 实现资源限额, namespace 实现资源隔离。
cgroup
- cgroup 全称 Control Group。Linux 操作系统通过 cgroup 可以设置进程使用 CPU、内存 和 IO 资源的限额。–cpu-shares、-m、–device-write-bps 实际上就是在配置 cgroup。
- /sys/fs/cgroup/cpu/docker/容器长ID:目录中包含所有与 cpu 相关的 cgroup 配置。
- /sys/fs/cgroup/memory/docker/容器长ID:目录中包含所有与 memory 相关的 cgroup 配置。
- /sys/fs/cgroup/blkio/docker/容器长ID:目录中包含所有与 blkio 相关的 cgroup 配置。
namespac
- 在每个容器中,我们都可以看到文件系统,网卡等资源,这些资源看上去是容器自己的。拿网卡来说,每个容器都会认为自己有一块独立的网卡,即使 host 上只有一块物理网卡。这种方式非常好,它使得容器更像一个独立的计算机。Linux 实现这种方式的技术是 namespace。namespace 管理着 host 中全局唯一的资源,并可以让每个容器都觉得只有自己在使用它。换句话说,namespace 实现了容器间资源的隔离。Linux 使用了六种 namespace,分别对应六种资源:Mount、UTS、IPC、PID、Network 和 User。
Mount namespace
- 容器有自己的 / 目录,可以执行 mount 和 umount 命令。当然我们知道这些操作只在当前容器中生效,不会影响到 host 和其他容器。
1.你插入了一个 U 盘,系统识别它为 /dev/sdb1。
2.你执行命令:
mount /dev/sdb1 /mnt
3.现在,你可以通过 /mnt 访问 U 盘里的文件了:
ls /mnt
4.当你用完 U 盘后,可以卸载它。这样,U 盘就“关门”了,/mnt 目录下不再显示 U 盘的内容:
umount /mnt
UTS namespace
- 让容器有自己的 hostname。
- UTS namespace 为每个Docker容器设置了一个独立的主机名和域名。这使得每个容器都能够被视为网络上的一个独立节点,从而简化了应用的访问和管理,并增强了应用之间的隔离性和安全性。
docker run -h/--hostname myhost -it ubuntu
IPC namespace
- IPC namespace 让容器拥有自己的共享内存和信号量(semaphore)来实现进程间通信,而不会与 host 和其他容器的 IPC 混在一起。
PID namespace
- 容器在 host 中以进程的形式运行。
- 容器中进程的 PID 不同于 host 中对应进程的 PID,容器中 PID=1 的进程当然也不是 host 的 init 进程。也就是说:容器拥有自己独立的一套 PID,这就是 PID namespace 提供的功能。
ps axf # 查看容器进程。所有容器的进程都挂在 dockerd 进程下,同时也可以看到容器自己的子进程。
docker exec -it container bash # 进入到某个容器,ps axf 查看自己的进程。
Network namespace
- 容器拥有自己独立的网卡、IP、路由等资源。
User namespace
- 让容器能够管理自己的用户,host 不能看到容器中创建的用户。
相关文章:
(2)Docker 常用命令
文章目录 Docker 服务器Docker 镜像Docker 容器本地 RegistryRUN vs CMD vs ENTRYPOINTRUNCMDENTRYPOINT 限制容器对内存、CPU 和 IO 资源的使用内存CPUBlock IO设置权重bps 和 iops cgroup 和 namespacecgroupnamespacMount namespaceUTS namespaceIPC namespacePID namespace…...
虚拟列表技术深度解析:原理、实现与性能优化实战
虚拟列表技术深度解析:原理、实现与性能优化实战 引言 在当今数据驱动的互联网应用中,长列表渲染已成为前端开发的核心挑战。传统的一次性全量渲染方式在数据量超过千条时,往往导致页面卡顿、内存飙升等问题。虚拟列表(Virtual L…...
服务器简介(含硬件外观接口介绍)
服务器(Server)是指提供资源、服务、数据或应用程序的计算机系统或设备。它通常比普通的个人计算机更强大、更可靠,能够长时间无间断运行,支持多个用户或客户端的请求。简单来说,服务器就是专门用来存储、管理和提供数…...
c++下的onnx推理
参考代码:https://github.com/itsnine/yolov5-onnxruntime 参考链接:https://blog.csdn.net/magic_ll/article/details/125517798 1.下载onnx 官网:https://github.com/microsoft/onnxruntime/releases/tag/v1.21.0 2.下载代码 https://g…...
TCP三次握手与四次挥手面试回答版本
面试官:说一下TCP三次握手的过程 参考面试回答: 在第一次握手的时候、客户端会随机生成初始化序号、放到TCP报文头部的序号字段中、同时把SYN标志设置为1 这样就表示SYN报文(这里是请求报文)。客户端将报文放入 TCP 报文首部的序…...
Vue3 使用PrimeVue的面包屑组件Breadcrumb,使用JS滚动进行
做了一个自动添加的面包写导航栏,需要在添加之后自动滚动到最右边,发现常规的滚动方法不行,以下是源码,直接调用ScrollToRight方法就行,最主要的就是在value后面加一个$el: <Breadcrumb :home"hom…...
0101基础知识-区块链-web3
文章目录 1 web3学习路线2 区块链简史2.1 区块链2.2 公共账本2.3 区块链的设计哲学2.3.1 去中心化2.3.2 共识2.3.2.1 上链2.3.2.2 共识算法 3 web3面向资产的互联网3.1 安全性和去中心化的权衡 4 智能合约4.1 以太坊智能合约4.2 去中心化应用 5 小结结语 1 web3学习路线 参考下…...
工作纪实_63-Mac电脑使用brew安装软件
最近在接触kafka,想着在自己的电脑安装一套环境,docker也能行,但是还是想装一些原生的软件试试看,因此便想着整理一下brew的命令,这命令确实是方便,不需要下载tar包乱八七糟的东西,一键安装 bre…...
Cadence学习笔记之---库元件制作、元件放置
目录 01 | 引 言 02 | 环境描述 03 | 工具介绍 04 | 无源器件的制作 05 | IC芯片制作 06 | 放置元件 07 | 结 语 01 | 引 言 在上一篇小记中,讲述使用Cadence创建原理图工程和元件库; 本篇小记主要讲述如何制作常用的库元件,如电阻、…...
服务器如何修复SSL证书错误?
修复服务器上的SSL证书错误需要根据具体错误类型逐步排查和解决。以下是常见的步骤和解决方案: --- ### **1. 确认错误类型** 首先检查浏览器或工具(如OpenSSL)报错的具体信息,常见错误包括: - **证书过期**…...
图解Mysql原理:深入理解事务的特性以及它的实现机制
前言 大家好,我是程序蛇玩编程。 Mysql中事务大家不陌生吧,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。那它具有哪些特性,如何实现的呢?接着往下看。 正文 事务的特性: 事务的基本特性主要为四种…...
《前端面试题之 Vue 篇(第四集)》
目录 1、Vue 中实现强制刷新2、Vue3 和 Vue2 的区别解析3、 Vue3 性能优于 Vue2 的原因解析4、Vue3 使用 Proxy5、首屏优化6、组件的理解7、vue项目中合理规划文件目录8、Nuxt.js 简单了解9、单页应用10、 SEO 优化 1、Vue 中实现强制刷新 在 Vue 中实现强制刷新的分析如下&am…...
C++ 模块化编程(Modules)在大规模系统中的实践难点
随着项目规模的不断扩大和代码复杂性的提升,传统的 C++ 开发模式逐渐暴露出一些根深蒂固的问题,尤其是头文件和预处理器机制所带来的编译效率低下、依赖管理混乱以及代码复用性差等痛点。C++20 标准引入的模块化编程(Modules)特性,正是为了解决这些问题而设计的一项革命性…...
DasViewer主要功能流程介绍
摘要:本文主要介绍DasViewer软件本地数据、云端数据以及在线3DTiles服务模型浏览功能。 本地数据浏览功能 打开 DasViewer 浏览器;打开本地数据,包括如下几种方式: 选择工程文件(.dav、.dvp)、模型文件(…...
提交bug单时,应该说明哪些信息?
在提交 Bug 单时,为了让开发人员能够快速定位和解决问题,需要详细说明以下几方面信息: Bug 的基本信息 标题:简洁明了地概括 Bug 的主要问题,例如 “登录页面输入错误密码后提示信息不准确”。Bug 类型:明确…...
Linux[指令与权限]
Linux指令与权限 Linux环境中,打包文件有多种 tar (打包/解包) 指令 tar -czvf 文件要打包到的位置 文件(打包并压缩到) tar -xzvf 文件(在当前目录下解压) tar选项 -c创建压缩文件 -z使用gzip属性压缩 -v展现压缩过程 -f后面使用新建文档名 -x不要新建,解压 -C 文件…...
MySQL 的锁,表级锁是哪一层的锁?行锁是哪一层的锁?
MySQL 的锁层级与类型 在 MySQL 中,锁的层级和实现与存储引擎密切相关。 1. 表级锁(Table-Level Locks) (1)存储引擎层的表级锁 实现层级:存储引擎层(如 MyISAM、InnoDB)。特点&a…...
Flink介绍——实时计算核心论文之Dataflow论文总结
数据流处理的演变与 Dataflow 模型的革新 在大数据处理领域,流式数据处理系统的发展历程充满了创新与变革。从早期的 S4 到 Storm,再到 MillWheel,每一个系统都以其独特的方式推动了技术的进步。S4 以其无中心架构和 PE(Processi…...
Next.js 编译并运行
next build 是用于构建 Next.js 应用的命令,而运行构建后的应用则通过 next start。这里是一个简明的流程说明: ✅ 构建 Next.js 应用 next build这个命令会: 编译项目中的 TypeScript 和 JavaScript 代码;优化静态资源…...
星火燎原:Spark技术如何重塑大数据处理格局
在数字化浪潮席卷全球的今天,数据已成为企业发展与社会进步的核心驱动力。面对海量且复杂的数据,传统的数据处理技术逐渐显得力不从心。而Apache Spark作为大数据领域的明星框架,凭借其卓越的性能与强大的功能,如同一束璀璨的星火…...
LeetCode 2563.统计公平数对的数目:排序 + 二分查找
【LetMeFly】2563.统计公平数对的数目:排序 二分查找 力扣题目链接:https://leetcode.cn/problems/count-the-number-of-fair-pairs/ 给你一个下标从 0 开始、长度为 n 的整数数组 nums ,和两个整数 lower 和 upper ,返回 公平…...
2025深圳中兴通讯安卓开发社招面经
2月27号 中兴通讯一面 30多分钟 自我介绍 聊项目 我的优缺点,跟同事相比,有什么突出的地方 Handler机制,如何判断是哪个消息比较耗时 设计模式:模板模式 线程的状态 线程的开启方式 线程池原理 活动的启动模式 Service和Activity…...
【Redis】redis主从哨兵
Redis 主从复制 在访问量极高的场景下,单台 Redis 已难以承载所有请求,且单点故障风险高。通过主从复制,可以实现读写分离、数据备份与高可用。 概念 主节点(Master):负责写操作,将数据变更同…...
windows docker desktop 无法访问容器端口映射
为什么使用docker desktop访问映射的端口失败,而其端口对应的服务是正常的? 常见问题,容器的防火墙没有关闭!!! 以centos7为例,默认情况下防火墙处于开启状态: 这下访问就OK了...
OpenRAN 6G网络:架构、用例和开放问题
英文标题: Open RAN for 6G Networks: Architecture, Use Cases and Open Issues 作者信息 Bharat Agarwal:2016年毕业于Galgotias University,获得电气与电子工程学士学位;2023年在爱尔兰都柏林城市大学获得电子工程博士学位。2…...
《TCP/IP详解 卷1:协议》之第四、五章:ARP RARP
目录 一、ARP && RARP 报文结构 1、ARP请求报文示例 2、ARP响应报文示例 3、RARP请求报文示例 4、RARP响应报文示例 5、关于 padding 6、免费ARP 二、tcpdump 的使用 1、基本语法 2、常用选项 3、常用过滤条件 三、arp 命令的使用 1、基本语法 2、常用选…...
ttsfrd的使用
ttsfrd的作用: 文本标准化,将数字转成大写等预处理,例:数字处理123 → 一百二十三, 日期处理2023-12-25 → 2023年12月25日,特殊符号 40¥→40元。从而适合TTS朗读。 SDK模型下载 from modelsc…...
实战华为1:1方式1 to 1 VLAN映射
本文摘自笔者于2024年出版,并得到广泛读者认可,已多次重印的《华为HCIP-Datacom路由交换学习指南》。 华为设备的1 to 1 VLAN映射有1:1和N :1两种方式。1:1方式是将指定的一个用户私网VLAN标签映射为一个公网VLAN标签,是一种一对一的映射关系…...
NLP 梳理03 — 停用词删除和规范化
一、说明 前文我们介绍了标点符号删除、文本的大小写统一,本文介绍英文文章的另一些删除内容,停用词删除。还有规范化处理。 二、什么是停用词,为什么删除它们? 2.1 停用词的定义 停用词是语言中的常用词,通常语义…...
使用若依二次开发商城系统-1:搭建若依运行环境
前言 若依框架有很多版本,这里使用的是springboot3vue3这样的一个前后端分离的版本。 一.操作步骤 1 下载springboot3版本的后端代码 后端springboot3的代码路径,https://gitee.com/y_project/RuoYi-Vue 需要注意我们要的是springboot3分支。 先用g…...
