Docker 进阶指南:常用命令、最佳实践与资源管理
Docker 进阶指南:常用命令、最佳实践与资源管理
Docker 作为一种轻量级的容器化技术,已经成为现代软件开发和部署不可或缺的工具。本文将为您深入介绍 Docker 的常用命令、最佳实践以及如何有效管理容器资源,帮助您更好地在 Ubuntu 22.04 或其他类似环境中使用 Docker。
一、Docker 常用命令操作示例
1. 安装与配置
首先,让我们从 Docker 的安装和基本配置开始:
# 更新包索引
sudo apt update# 安装 Docker
sudo apt install docker.io# 启动 Docker 服务
sudo systemctl start docker# 设置 Docker 开机自启
sudo systemctl enable docker# 将当前用户添加到 docker 组(免 sudo 运行 docker 命令)
sudo usermod -aG docker $USER# 应用组变更(需要重新登录才能生效)
newgrp docker
2. 镜像管理
Docker 镜像是容器的基础,以下是一些常用的镜像管理命令:
# 搜索镜像
docker search ubuntu# 拉取镜像
docker pull ubuntu:22.04# 列出本地镜像
docker images# 删除镜像
docker rmi ubuntu:22.04# 构建自定义镜像
docker build -t myapp:v1 .# 推送镜像到 Docker Hub
docker push username/myapp:v1# 保存镜像到文件
docker save -o myimage.tar myimage:latest# 从文件加载镜像
docker load -i myimage.tar
3. 容器操作
容器是 Docker 的核心概念,以下是一些常用的容器操作命令:
# 创建并运行容器
docker run -it --name mycontainer ubuntu:22.04 /bin/bash# 列出运行中的容器
docker ps# 列出所有容器(包括已停止的)
docker ps -a # 启动/停止/重启容器
docker start mycontainer
docker stop mycontainer
docker restart mycontainer# 进入运行中的容器
docker exec -it mycontainer /bin/bash# 删除容器
docker rm mycontainer# 查看容器日志
docker logs mycontainer# 查看容器资源使用情况
docker stats mycontainer# 将容器保存为新镜像
docker commit mycontainer mynewimage:v1
4. 网络管理
Docker 网络允许容器之间以及容器与外部世界进行通信:
# 创建自定义网络
docker network create mynetwork# 列出所有网络
docker network ls# 将容器连接到网络
docker network connect mynetwork mycontainer# 断开容器与网络的连接
docker network disconnect mynetwork mycontainer# 检查网络
docker network inspect mynetwork
5. 数据卷管理
数据卷用于持久化数据和在容器间共享数据:
# 创建数据卷
docker volume create myvolume# 列出所有数据卷
docker volume ls# 检查数据卷
docker volume inspect myvolume# 删除数据卷
docker volume rm myvolume# 使用数据卷运行容器
docker run -v myvolume:/data myimage
二、Docker 最佳实践
遵循以下最佳实践可以帮助您更有效地使用 Docker:
1. 镜像构建最佳实践
- 使用官方基础镜像:优先选择官方维护的基础镜像,如 Alpine 或 Ubuntu。
- 指定具体的镜像版本:避免使用
latest标签,而是使用特定的版本标签。 - 使用多阶段构建:减小最终镜像大小,提高构建效率。
- 合理使用 .dockerignore 文件:排除不必要的文件,加快构建过程。
- 最小化镜像层数:合并 RUN 命令,减少镜像层数。
示例 Dockerfile:
# 使用多阶段构建
FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run buildFROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
2. 容器运行最佳实践
- 一个容器一个进程:每个容器应该只运行一个主要进程。
- 使用非 root 用户:出于安全考虑,应该使用非 root 用户运行容器进程。
- 设置资源限制:为容器设置适当的 CPU 和内存限制。
- 使用健康检查:通过 HEALTHCHECK 指令确保容器中的应用正常运行。
- 正确处理信号:确保容器中的应用能够正确处理 SIGTERM 信号。
3. 安全最佳实践
- 定期更新基础镜像:及时更新基础镜像以修复已知漏洞。
- 扫描镜像漏洞:使用工具如 Trivy 或 Clair 定期扫描镜像漏洞。
- 不在镜像中存储敏感信息:使用环境变量或 Docker secrets 管理敏感信息。
- 限制容器的系统调用:使用 seccomp 或 AppArmor 限制容器的系统调用。
- 使用只读文件系统:尽可能使用只读文件系统运行容器。
4. 网络和存储最佳实践
- 使用用户定义的桥接网络:为容器间通信创建自定义网络。
- 使用命名卷:使用命名卷而不是绑定挂载来持久化数据。
- 合理使用端口映射:只暴露必要的端口,使用内部网络进行容器间通信。
5. 日志和监控最佳实践
- 集中化日志管理:使用日志驱动将容器日志发送到集中日志系统。
- 实施监控:使用 Prometheus 等工具监控容器的资源使用情况。
- 使用标签:合理使用标签来组织和管理容器。
三、Docker 容器资源限制
合理限制容器资源使用对于维护系统稳定性和优化性能至关重要。
1. 内存限制
-
设置内存硬限制:
docker run -m 512m myimage -
设置内存软限制:
docker run -m 1g --memory-reservation=512m myimage -
限制 Swap 使用:
docker run -m 512m --memory-swap 1g myimage
2. CPU 限制
-
设置 CPU 份额:
docker run --cpu-shares 512 myimage -
限制 CPU 核心数:
docker run --cpus 2 myimage -
指定 CPU 核心:
docker run --cpuset-cpus 0,1 myimage
3. I/O 限制
- 限制读写速度:
docker run --device-read-bps /dev/sda:1mb --device-write-bps /dev/sda:1mb myimage
4. 使用 Docker Compose 管理资源限制
在 docker-compose.yml 文件中可以更系统地管理资源限制:
version: '3'
services:web:image: nginxdeploy:resources:limits:cpus: '0.5'memory: 512Mreservations:cpus: '0.25'memory: 256M
5. 监控和调整资源使用
- 使用
docker stats命令实时监控容器资源使用情况。 - 利用监控工具如 Prometheus 和 Grafana 进行更详细的资源监控。
- 根据监控结果定期调整资源限制,确保资源被有效利用。
6. 资源限制最佳实践
- 了解应用需求:在设置限制前,充分了解应用的资源需求。
- 留有余地:设置限制时留有一定余地,避免因资源不足导致应用崩溃。
- 考虑峰值:资源限制应考虑应用可能的峰值使用情况。
- 定期审核:随着应用的发展,定期审核和调整资源限制。
- 使用编排工具:对于复杂的多容器应用,考虑使用 Kubernetes 等容器编排平台进行更精细的资源管理。
通过合理设置这些资源限制,您可以有效防止单个容器过度消耗系统资源,提高整体系统的稳定性和性能。结合前面介绍的常用命令和最佳实践,您将能够更加高效和安全地使用 Docker 进行开发和部署。
相关文章:
Docker 进阶指南:常用命令、最佳实践与资源管理
Docker 进阶指南:常用命令、最佳实践与资源管理 Docker 作为一种轻量级的容器化技术,已经成为现代软件开发和部署不可或缺的工具。本文将为您深入介绍 Docker 的常用命令、最佳实践以及如何有效管理容器资源,帮助您更好地在 Ubuntu 22.04 或…...
【前端】特殊案例分析深入理解 JavaScript 中的词法作用域
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 💯前言💯案例代码💯词法作用域(Lexical Scope)与静态作用域什么是词法作用域?代码执行的详细分析 💯函数定义与调用的…...
Jmeter进阶篇(29)AI+性能测试领域场景落地
🏝️关于我:我是綦枫。一个顺手写写代码的音乐制作人。 前言 随着2022年GPT3.5的问世,我们的社会已经进入了AI时代,这是一个全新的风口,也会迎来全新的挑战和机遇。如果能抓住新时代的风口,你将会在进步的路上越走越快。今天让我们来一起探究一下,在软件性能测试领域,…...
理解和应用 Python Requests 库中的 .json() 方法:详细解析与示例
理解和应用 Python Requests 库中的 .json() 方法:详细解析与示例 在使用 Python 的 requests 库进行网络请求时,.json() 方法是一种非常实用的功能,用于将从 API 获取的 JSON 格式的字符串响应转换为 Python 可操作的字典或列表。这一功能的…...
docker 运行my-redis命令
CREATE TABLE orders ( order_id bigint NOT NULL COMMENT "订单ID", dt date NOT NULL COMMENT "日期", merchant_id int NOT NULL COMMENT "商家ID", user_id int NOT NULL COMMENT "用户ID", good_id int NOT NULL COMMENT "商…...
cloudstack概要及单节点安装部署
概要 Apache CloudStack 是一个开源的云计算管理平台,用于管理和部署大规模的虚拟化环境,支持 IaaS(基础设施即服务)模型。它广泛应用于私有云、公共云和混合云场景。 核心功能 多租户支持 提供隔离的虚拟网络、计算资源和存储资…...
Android Gradle 相关
JDK环境配置: 1、Gradle运行时的JDK,即Gradle需要用到的JDK,配置如下: 如需修改现有项目的 Gradle JDK 配置,请依次点击 File(或者 macOS 上的 Android Studio)> Settings > Build, Exe…...
SpringMVC:入门案例
从此开始,我们步入SpringMVC的学习。 SpringMVC是一种基于Java实现MVC模型的轻量级Web框架 先来看一下web程序是如何工作的: 因为是异步调用,所以后端不需要返回view视图,将其去除前端如果通过异步调用的方式进行交互࿰…...
LuaForWindows_v5.1.5-52.exe
Releases rjpcomputing/luaforwindows GitHub #lua C:\Users\Administrator\Desktop\test.lua print("Hello lua!") print("ZengWenFeng 13805029595")...
密码学实验工具--Cryptool2
一、 Cryptool2的下载与安装 请参考我的另一篇笔记 二、 Caesar密码 2.1 Caesar密码加解密 1. 在Starcenter中直接搜索caesar的模板。 2. 打开caesar Cipher的模板后,工作区上面已经有了输入框,密钥框,输出框 输入框:要加密…...
量化交易系统开发-实时行情自动化交易-8.1.TradingView平台
19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来会对于TradingView平台介绍。 T…...
Vue2 常见知识点(二)
使用简单的代码逻辑,理一理实现逻辑 为了方便理解,案例中,没有使用虚拟dom和抽象语法树,是通过直接操作dom来实现的 1.模板语法 先看一个简单的实现: this.compile( this.$el ); 执行模板编译,如果是文本…...
SAP-ABAP开发-第二代增强示例
CUSTOMER EXIT 以VA01为例 目录 一、查找出口 二、出口对象 三、销售订单的增强 一、查找出口 ①查找事务代码的主程序 ②搜索CALL CUSTOMER-FUNCTION SE37下查看函数 函数名称命名规则:EXIT_<程序名>_<序号> ③使用函数查找:MODX_FU…...
UDP 协议与端口绑定行为解析:理解 IP 地址和端口的绑定规则
UDP 协议与端口绑定行为解析:理解 IP 地址和端口的绑定规则 1. UDP 协议与端口绑定基础2. UDP 端口绑定行为与示例3. 关键结论:占有权与消息接收权4. 异常现象:多个程序绑定 0.0.0.0:80805. 端口共享与操作系统的行为差异6. 实践建议与最佳实践7. 总结在网络通信中,UDP(用…...
【Vue3】【Naive UI】<n-message>标签
【Vue3】【Naive UI】标签 content (String | VNode) 【VUE3】【Naive UI】<NCard> 标签 【VUE3】【Naive UI】<n-button> 标签 【VUE3】【Naive UI】<a> 标签 【VUE3】【Naive UI】<NDropdown&…...
C++ 变量和常量:开启程序构建之门的关键锁钥与永恒灯塔
目录 一、变量 1.1 变量的创建 1.2 变量的初始化 1.3 变量的分类 1.4 变量的初始化 二、常量 2.1 字面常量 2.2 #define定义常量 2.3 const 定义常量 一、变量 1.1 变量的创建 data_type name; | | | | 数据类型 变量名 ------------- int age; //整型变量 char ch; …...
Linux部分实用操作
目录 1、快捷键 2、软件安装 3、systemctl 4、ln命令创建软连接 5、IP地址 6、主机名 7、域名解析 8、网络传输 ping wget curl命令 9、端口 10、进程 11、主机状态 查看系统资源占用--top 磁盘信息监控--df--iostat 网络状态监控--sar -n DEV 12、环境…...
Linux笔记---进程:进程地址空间
1. 地址空间 程序地址空间是指程序在执行期间可以访问的内存范围。它由操作系统为每个进程分配,以确保进程之间不会相互干扰。地址空间包含了程序所需的所有内存区域,包括代码、已初始化和未初始化的数据、堆(heap)、栈ÿ…...
flutter in_app_purchase google支付 PG-GEMF-01错误
问题:PG-GEMF-01错误 flutter 使用in_app_purchase插件升降级订阅时报错PG-GEMF-01。 解决方案: 升降级订阅时,确保不调用 MethodCallHandlerImpl.java文件中的 setObfuscatedAccountId()方法、setObfuscatedProfileId()方法 原因…...
“精神内耗”的神经影像学证据:担忧和反刍会引发相似的神经表征
摘要 重复性消极思维(RNT)包括面向未来的担忧和面向过去的反刍,两者在认知和情感上具有相似的特征。这些不同但相关的过程在大多程度上会激活重叠的神经结构尚不确定,因为大多数神经科学研究只单独研究担忧或反刍。为了解决这个问题,本研究使…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...
对象回调初步研究
_OBJECT_TYPE结构分析 在介绍什么是对象回调前,首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例,用_OBJECT_TYPE这个结构来解析它,0x80处就是今天要介绍的回调链表,但是先不着急,先把目光…...
Mysql故障排插与环境优化
前置知识点 最上层是一些客户端和连接服务,包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念,为通过安全认证接入的客户端提供线程。同样在该层上可…...
js 设置3秒后执行
如何在JavaScript中延迟3秒执行操作 在JavaScript中,要设置一个操作在指定延迟后(例如3秒)执行,可以使用 setTimeout 函数。setTimeout 是JavaScript的核心计时器方法,它接受两个参数: 要执行的函数&…...
