当前位置: 首页 > news >正文

Docker 容器化工具及常用操作

Docker 是一款用于 “构建、发布、运行” 应用程序 的容器化工具,核心价值是通过 “容器” 实现应用的 跨环境一致性部署(解决 “开发环境能跑,生产环境跑不了” 的问题)。其底层依赖 Linux 内核的 Namespace(资源隔离)和 Cgroups(资源限制)技术,能在单一主机上虚拟出多个独立的 “轻量级虚拟机”,但比传统虚拟机更省资源、启动更快(秒级启动)。以下是其核心概念、常用操作、进阶技巧的详细解析:

一、核心概念(深度解析)

1. 镜像(Image)
  • 本质:一个分层的只读文件系统,包含运行应用所需的完整环境(操作系统内核除外,共享主机内核)。
*   例如:`nginx` 镜像包含 Linux 基础系统、Nginx 程序、配置文件等,拉取后可直接启动成 Web 服务器。
  • 分层结构:采用 UnionFS(联合文件系统),每一层对应 Dockerfile 中的一条指令(如 FROMRUN),分层设计的优势:
*   **复用性**:不同镜像可共享底层层(如多个镜像都基于 `ubuntu:20.04`,则共享该基础层),节省存储空间;*   **可追溯性**:每一层修改可单独记录,便于调试(如通过 `docker history 镜像名` 查看分层历史)。
  • 标签(Tag):用于区分同一镜像的不同版本(如 python:3.9python:3.10),默认标签为 latest(指向最新版本,但不建议生产环境使用,避免版本变更导致问题)。
2. 容器(Container)
  • 本质:镜像的可运行实例,在镜像只读层之上添加了一层 可写层(Container Layer),所有运行时修改(如新建文件、修改配置)都保存在这一层。
*   示例:启动 `ubuntu` 容器后,执行 `touch test.txt`,文件会保存在可写层;删除容器后,可写层被清理,文件消失(需通过数据卷持久化)。
  • 生命周期
*   **创建**:`docker create`(仅创建不启动)或 `docker run`(创建并启动);*   **运行**:`docker start` 启动处于停止状态的容器;*   **暂停**:`docker pause` 冻结容器进程(保留内存状态),`docker unpause` 恢复;*   **停止**:`docker stop` 发送 SIGTERM 信号,等待进程退出(默认等待 10 秒),`docker kill` 强制发送 SIGKILL 终止进程;*   **删除**:`docker rm` 删除容器(需先停止,或用 `-f` 强制删除运行中容器)。
3. 仓库(Repository)与 Registry
  • 仓库(Repository):存储同一镜像不同标签的集合(如 nginx 仓库包含 1.211.23 等标签的镜像)。
  • Registry:仓库的集合平台(如 Docker Hub 是公共 Registry,包含数百万镜像;企业可搭建私有 Registry,如 Harbor)。
  • 拉取 / 推送流程
*   拉取:`docker pull 仓库地址/镜像名:标签`(如 `docker pull ``mycompany.com/nginx:v1.0` 从私有仓库拉取);*   推送:需先登录 Registry(`docker login 仓库地址`),再执行 `docker push 仓库地址/镜像名:标签`。

二、常用命令(含细节与场景)

1. 镜像管理(含高级操作)
命令作用与细节
docker pull [镜像名:标签]- 从 Registry 拉取镜像,支持指定仓库地址(如 docker pull harbor.example.com/base/ubuntu:20.04);- 若标签不存在,默认拉取 latest(可能失败,建议显式指定标签)。
docker images- 列出本地镜像,包含仓库名、标签、ID、创建时间、大小;- 常用参数:-q 仅显示镜像 ID,--filter "dangling=true" 显示虚悬镜像(标签为 <none> 的废弃镜像)。
docker rmi [镜像ID/名称]- 删除镜像,需先删除依赖它的所有容器(可用 docker rm -f $(docker ps -aq --filter ancestor=镜像名) 批量删除关联容器);- 批量删除:docker rmi $(docker images -q --filter "dangling=true") 清理虚悬镜像。
docker build -t [镜像名:标签] .- 基于 Dockerfile 构建镜像,. 表示构建上下文(Docker 会将该目录下所有文件发送给 Docker 引擎);- 优化技巧: - 用 .dockerignore 文件排除无关文件(如 node_modules),减少上下文大小; - 合理排序指令(频繁修改的指令放后面),利用分层缓存加速构建。
docker tag [源镜像] [新镜像名:标签]- 为镜像添加新标签(如 docker tag nginx:latest mynginx:v1),用于推送至私有仓库前重命名。
docker save -o [文件] [镜像] / docker load -i [文件]- 导出镜像为本地文件(save),或从文件导入镜像(load),用于无网络环境迁移镜像(如 docker save -o nginx.tar nginx:latest)。
2. 容器管理(含参数详解)
命令作用与细节
docker run [参数] [镜像名] [命令]核心参数详解:- -d:后台运行(守护模式),容器启动后返回容器 ID;- -p 主机端口:容器端口:端口映射(如 -p 8080:80 允许外部通过主机 8080 端口访问容器 80 端口); - 进阶:-p 127.0.0.1:8080:80 仅允许本地访问,-p 80 随机映射主机端口(用 docker port 容器名 查看);- -v 主机目录:容器目录[:权限]:挂载数据卷(如 -v /data:/app/data:ro 只读挂载,容器内无法修改);- --name 容器名:指定名称(如 --name web-server),避免用默认随机名称;- --restart 策略:容器退出后的重启策略(always 总是重启,on-failure:3 失败时最多重启 3 次);- -e KEY=VALUE:设置环境变量(如 -e "TZ=Asia/Shanghai" 配置时区);- --network 网络名:指定容器所属网络(默认使用 bridge 网络);示例docker run -d --name mysql -p 3306:3306 -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --restart always mysql:8.0
docker ps- 列出运行中的容器,默认显示容器 ID、名称、镜像、状态、端口映射等;- 常用参数: - -a 显示所有容器(包括停止的); - -l 显示最近创建的容器; - --format "{{.ID}} {{.Names}} {{.Status}}" 自定义输出格式(如仅显示 ID、名称、状态)。
docker start/stop/restart [容器]- start:启动停止的容器(保留之前的可写层数据);- stop:优雅停止(发送 SIGTERM,等待 10 秒后强制终止);- restart:先停止再启动(常用于配置生效)。
docker exec -it [容器] [命令]- 进入运行中的容器执行命令,-it 组合用于交互式操作(如 bash 终端);- 示例:docker exec -it mysql mysql -uroot -p 直接在容器内启动 MySQL 客户端;- 非交互式执行:docker exec 容器名 ls /app 查看容器内文件。
docker logs [容器]- 查看容器日志(标准输出 stdout 和标准错误 stderr);- 常用参数: - -f 实时跟踪日志(类似 tail -f); - -t 显示时间戳; - --tail 100 仅显示最后 100 行; - --since 30m 显示 30 分钟内的日志。
docker rm [容器]- 删除容器,-f 强制删除运行中的容器(等价于先 stoprm);- 批量删除:docker rm $(docker ps -aq) 删除所有停止的容器。
3. 数据管理(数据卷与挂载)
  • 数据卷(Volume):Docker 管理的持久化存储,独立于容器生命周期,适合长期保存数据(如数据库文件)。
*   命令:
    *   创建卷:`docker volume create myvol`;*   查看卷:`docker volume ls`;*   挂载卷:`docker run -v myvol:/app/data ...`(卷名而非主机路径);*   查看卷详情:`docker volume inspect myvol`(可看到卷在主机的实际路径,如 `/var/lib/docker/volumes/myvol/_data`)。
  • 绑定挂载(Bind Mount):直接挂载主机目录到容器,适合开发时实时同步代码(如挂载本地代码目录到容器,修改本地文件后容器内立即生效)。
*   注意:主机目录路径必须绝对路径(如 `-v /home/code:/app`,Windows 下为 `-v C:\code:/app`);*   权限问题:容器内用户 ID 可能与主机不同,需通过 `-u` 参数指定用户(如 `docker run -u $(id -u):$(id -g) ...` 避免权限冲突)。
  • 临时文件系统(Tmpfs Mount):数据仅存于内存,容器停止后丢失,适合临时缓存(如 docker run --tmpfs /tmp ...)。
4. 网络管理(容器通信)
  • 默认网络模式
*   `bridge`:默认模式,容器通过虚拟网桥通信,可通过端口映射访问外部;*   `host`:容器共享主机网络(无端口映射,直接使用主机 IP 和端口,性能好但安全性低);*   `none`:禁用网络,适合无需联网的容器;*   `container:容器名`:共享指定容器的网络(如两个容器共用网络栈)。
  • 自定义网络:适合多容器通信(如前端容器访问后端容器),支持 DNS 解析(通过容器名访问)。
*   命令:
    *   创建网络:`docker network create mynet`(默认桥接模式);*   容器加入网络:`docker run --network mynet --name backend ...`;*   跨网络通信:`docker network connect mynet 容器名` 将运行中容器加入新网络。
5. 系统管理与优化
命令作用与细节
docker info查看 Docker 系统信息,包括:- 服务器版本、API 版本、操作系统;- 镜像数、容器数(运行 / 停止 / 总数);- 存储驱动(如 overlay2,推荐用于生产环境);- 网络驱动、数据卷驱动等。
docker system prune清理无用资源(未使用的镜像、容器、网络、卷),释放磁盘空间:- 基础用法:docker system prune 清理未使用的容器、网络;- 进阶:docker system prune -a 同时清理未被使用的镜像;docker system prune --volumes 清理未使用的卷(谨慎!可能删除重要数据)。
docker stats实时查看容器资源占用(CPU、内存、网络 IO、磁盘 IO),类似 top 命令;- 参数:--no-stream 只显示一次,--format 自定义输出。
docker inspect [对象]查看容器、镜像、网络、卷的详细元数据(JSON 格式):- 示例:docker inspect 容器名 可获取 IP 地址、挂载信息、环境变量等;- 过滤输出:docker inspect --format '{{.NetworkSettings.IPAddress}}' 容器名 仅显示 IP 地址。

三、Dockerfile 详解(构建自定义镜像)

Dockerfile 是构建镜像的 “脚本文件”,包含一系列指令,每条指令对应镜像的一层。以下是常用指令及最佳实践:

1. 基础指令
  • FROM [镜像]:指定基础镜像(如 FROM python:3.9-slim,推荐使用官方精简镜像 slim 版本减小体积);
  • WORKDIR /app:设置工作目录(后续命令默认在此目录执行,类似 cd);
  • COPY [源路径] [目标路径]:复制主机文件到镜像(如 COPY requirements.txt .);
  • ADD [源路径] [目标路径]:类似 COPY,但支持 URL 下载和自动解压压缩包(建议优先用 COPY,更明确);
  • RUN [命令]:执行命令并提交结果(如 RUN pip install -r requirements.txt);
*   技巧:多条命令用 `&&` 连接(如 `RUN apt update && apt install -y gcc && rm -rf /var/lib/apt/lists/*`),减少分层数量;
  • ENV KEY=VALUE:设置环境变量(如 ENV PYTHONDONTWRITEBYTECODE=1 禁止生成 .pyc 文件);
  • EXPOSE 80:声明容器监听的端口(仅为文档说明,实际需通过 -p 映射);
  • CMD ["命令", "参数"]:容器启动时执行的命令(若 docker run 后指定命令,会覆盖 CMD);
  • ENTRYPOINT ["命令"]:容器入口点(与 CMD 配合,CMD 作为参数,如 ENTRYPOINT ["python"]CMD ["``app.py``"],启动时执行 python ``app.py)。
2. 构建优化示例
# 基础镜像(精简版)FROM python:3.9-slim# 设置工作目录
WORKDIR /app
# 复制依赖文件并安装(利用缓存,修改代码不重新安装依赖)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 复制代码(最后复制,减少缓存失效)
COPY . .
# 声明端口
EXPOSE 8000
# 启动命令
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

四、Docker Compose(多容器管理)

当应用依赖多个服务(如 “Web 应用 + 数据库 + Redis”),手动管理容器网络、挂载、启动顺序繁琐,此时用 docker-compose 简化流程:

1. 核心配置文件 docker-compose.yml
version: '3.8'  # 兼容最新特性services:web:  # Web服务build: .  # 基于当前目录Dockerfile构建ports:- "8000:8000"depends_on:  # 依赖db和redis,启动时先启动依赖- db- redisenvironment:- DATABASE_URL=mysql://root:123456@db:3306/mydbrestart: alwaysdb:  # 数据库服务image: mysql:8.0volumes:- mysql-data:/var/lib/mysql  # 数据卷持久化environment:- MYSQL_ROOT_PASSWORD=123456- MYSQL_DATABASE=mydbrestart: alwaysredis:  # Redis服务image: redis:6-alpine  # 精简版镜像volumes:- redis-data:/datarestart: alwaysvolumes:  # 声明数据卷(自动创建)mysql-data:redis-data:
2. 常用命令
命令作用
docker-compose up -d后台启动所有服务(首次运行会构建镜像)
docker-compose down停止并删除所有服务、网络(保留数据卷)
http://www.dtcms.com/a/324693.html

相关文章:

  • Excel版经纬度和百分度互转v1.1
  • crc32算法php版----crc32.php
  • 【Spring IoC 核心实现类详解:DefaultListableBeanFactory】
  • Leetcode 3646. Next Special Palindrome Number
  • 分发糖果(贪心算法)
  • Vue.js设计于实现 - 响应式(三)
  • Spring Boot 全局异常处理与日志监控实战
  • OneCode 3.0 可视化功能全面分析:从开发者到用户的全场景解析
  • 一周学会Matplotlib3 Python 数据可视化-绘制条形图(Bar)
  • 论文复现与分析内容关于一种实用的车对车(V2V)可见光通信(VLC)传播模型
  • Z20K118库中寄存器及其库函数封装-REGFILE库
  • Windows执行kubectl提示拒绝访问【Windows安装k8s】
  • imx6ull-驱动开发篇17——linux原子操作实验
  • PXE自动化安装部署OpenEuler24.03LTS
  • MySQL中的in和exists的区别
  • mmdetection3d中centerpoint解析
  • FPGA常用资源之IO概述
  • Mybatis学习之动态SQL(八)
  • 使用GLib D-Bus 库创建dbus服务端
  • 安全运维的核心
  • 使用 iFLOW-CLI GitHub Action 和 Qwen3-Coder 给 GitHub 仓库生成幻灯片风格的文档站点
  • 一个基于 Next.js 和 Puppeteer 的 Markdown 转图片服务,支持 Docker 部署和 API 集成
  • AI绘画:生成唐初秦叔宝全身像提示词
  • reuse: for booting my spring project with mvn in Windows command line
  • 理清C语言中内存操作的函数
  • LeetCode_字符串
  • 《C语言》结构体和联合体练习题--1
  • ROS2 学习笔记
  • 基于百度地图API的社区地图展示技术实现
  • 初识STL