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)包括面向未来的担忧和面向过去的反刍,两者在认知和情感上具有相似的特征。这些不同但相关的过程在大多程度上会激活重叠的神经结构尚不确定,因为大多数神经科学研究只单独研究担忧或反刍。为了解决这个问题,本研究使…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
云原生安全实战:API网关Envoy的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口,负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...
Python第七周作业
Python第七周作业 文章目录 Python第七周作业 1.使用open以只读模式打开文件data.txt,并逐行打印内容 2.使用pathlib模块获取当前脚本的绝对路径,并创建logs目录(若不存在) 3.递归遍历目录data,输出所有.csv文件的路径…...
【技巧】dify前端源代码修改第一弹-增加tab页
回到目录 【技巧】dify前端源代码修改第一弹-增加tab页 尝试修改dify的前端源代码,在知识库增加一个tab页"HELLO WORLD",完成后的效果如下 [gif01] 1. 前端代码进入调试模式 参考 【部署】win10的wsl环境下启动dify的web前端服务 启动调试…...
JUC并发编程(二)Monitor/自旋/轻量级/锁膨胀/wait/notify/锁消除
目录 一 基础 1 概念 2 卖票问题 3 转账问题 二 锁机制与优化策略 0 Monitor 1 轻量级锁 2 锁膨胀 3 自旋 4 偏向锁 5 锁消除 6 wait /notify 7 sleep与wait的对比 8 join原理 一 基础 1 概念 临界区 一段代码块内如果存在对共享资源的多线程读写操作…...
篇章一 论坛系统——前置知识
目录 1.软件开发 1.1 软件的生命周期 1.2 面向对象 1.3 CS、BS架构 1.CS架构编辑 2.BS架构 1.4 软件需求 1.需求分类 2.需求获取 1.5 需求分析 1. 工作内容 1.6 面向对象分析 1.OOA的任务 2.统一建模语言UML 3. 用例模型 3.1 用例图的元素 3.2 建立用例模型 …...
DOM(文档对象模型)深度解析
DOM(文档对象模型)深度解析 DOM 是 HTML/XML 文档的树形结构表示,提供了一套让 JavaScript 动态操作网页内容、结构和样式的接口。 一、DOM 核心概念 1. 节点(Node)类型 类型值说明示例ELEMENT_NODE1元素节点<div>, <p>TEXT_NODE3文本节点元素内的文字COMMEN…...
