从零开始掌握 Docker:核心命令与实践指南

摘要: 本文系统整理了 Docker 的核心概念与常用命令,涵盖镜像管理、容器操作、数据存储、网络配置、Compose 编排以及 Dockerfile 构建等内容。通过清晰的命令示例和实用说明,帮助开发者快速上手 Docker 容器化技术,提升开发与部署效率。

关键词: Docker, 容器化, 镜像, 容器, Docker Compose, Dockerfile, 命令手册


一、 Docker 镜像管理

镜像是 Docker 容器运行的基础模板。

1. 搜索镜像

在 Docker Hub 或其他注册中心查找镜像。

docker search nginx

2. 拉取镜像

下载镜像到本地仓库。推荐指定标签(如 :latest, :alpine)。

docker pull nginx          # 拉取最新版 (latest)
docker pull nginx:latest   # 显式指定最新版
docker pull nginx:alpine   # 拉取 Alpine Linux 精简版

3. 查看本地镜像

列出所有已下载的镜像。

docker images
docker image ls  # 等效命令

4. 删除镜像

移除不再需要的本地镜像。注意: 依赖该镜像的容器必须先删除或停止。

docker rmi nginx:latest    # 通过仓库名:标签删除
docker rmi <镜像ID>         # 通过唯一镜像 ID 删除 (更精确)

二、 Docker 容器操作

容器是镜像的运行实例。

1. 运行容器

启动一个新的容器实例。

docker run nginx                      # 前台运行 (会占用终端)
docker run -d --name mynginx nginx    # 后台运行 (-d) 并命名容器 (--name)
docker run -d --name myweb -p 8080:80 nginx  # 后台运行,并将容器 80 端口映射到宿主机 8080 端口 (-p)
# 常用选项:
#   -d: 后台运行 (detached mode)
#   --name: 为容器指定一个易记的名称
#   -p <主机端口>:<容器端口>: 端口映射
#   -it: 交互模式运行 (通常与 /bin/bash 结合进入容器)
#   -e: 设置环境变量
#   --restart=always: 容器退出时自动重启

2. 查看容器状态

docker ps          # 查看正在运行的容器
docker ps -a       # 查看所有容器 (包括已停止的)
docker ps -aq      # 查看所有容器的 ID (只显示 ID, 常用于批量操作)

3. 启动/停止/重启容器

docker start <容器名称|容器ID>    # 启动已停止的容器
docker stop <容器名称|容器ID>     # 优雅停止运行中的容器 (发送 SIGTERM)
docker restart <容器名称|容器ID>  # 重启容器

4. 查看容器资源使用与日志

docker stats <容器名称|容器ID>      # 实时查看容器的 CPU、内存、网络、磁盘等资源使用情况
docker logs <容器名称|容器ID>       # 查看容器日志 (默认显示已产生的日志)
docker logs -f <容器名称|容器ID>    # 持续跟踪 (follow) 容器日志输出 (类似 tail -f)

5. 进入运行中的容器

在运行的容器内启动一个交互式 Shell(通常是 /bin/bash/bin/sh)。

docker exec -it mynginx /bin/bash
# -i: 保持 STDIN 打开
# -t: 分配一个伪终端 (TTY)

6. 删除容器

移除不再需要的容器。注意: 正在运行的容器需要先停止或使用 -f 强制删除。

docker rm <容器名称|容器ID>        # 删除已停止的容器
docker rm -f <容器名称|容器ID>     # 强制删除运行中的容器
docker rm $(docker ps -aq)       # 批量删除所有已停止的容器 (危险操作!)

三、 构建与分享自定义镜像

1. 提交容器更改创建新镜像

基于一个运行中的容器的当前状态创建新的镜像层。

docker commit -m "update index.html" mynginx mynginx:v1.0
# -m: 提交信息
# mynginx: 源容器名称
# mynginx:v1.0: 新镜像名称:标签

2. 保存镜像为文件

将镜像导出为 .tar 文件,方便离线传输或备份。

docker save -o mynginx.tar mynginx:v1.0
# -o: 指定输出文件名

3. 从文件加载镜像

.tar 文件恢复镜像到本地仓库。

docker load -i mynginx.tar
# -i: 指定输入文件

4. 分享镜像到 Docker Hub (或其他注册中心)

  1. 登录:

    docker login  # 默认登录 Docker Hub, 提示输入用户名密码
    
  2. 标记镜像: 为本地镜像添加符合目标仓库规范的名称(通常是 <DockerHub用户名>/<仓库名>:<标签>)。

    docker tag mynginx:v1.0 <你的DockerHub用户名>/mynginx:v1.0
    
  3. 推送镜像:

    docker push <你的DockerHub用户名>/mynginx:v1.0
    

四、 Docker 数据管理 (存储卷 Volumes)

Docker 使用存储卷 (Volumes) 或绑定挂载 (Bind Mounts) 来持久化容器数据,避免容器删除后数据丢失。

1. 目录挂载 (Bind Mounts)

将宿主机上的一个具体目录直接挂载到容器内指定路径。文件存在于宿主机文件系统上。

docker run -d -p 80:80 -v /宿主机/绝对路径/nginxhtml:/usr/share/nginx/html --name myapp nginx
# -v /宿主机路径:/容器路径
  • 优点: 直观,方便在宿主机直接修改文件。
  • 缺点: 依赖宿主机特定目录结构,移植性稍差。

2. 卷挂载 (Volumes)

使用 Docker 管理的命名卷挂载到容器内路径。卷存储在 Docker 管理的区域 (/var/lib/docker/volumes/),与容器生命周期解耦。

docker run -d -p 80:80 -v mynginxconf:/etc/nginx -v mynginxhtml:/usr/share/nginx/html --name myapp nginx
# -v 卷名:/容器路径
  • 优点: 移植性好,由 Docker 管理生命周期,备份/恢复方便。
  • 缺点: 数据位置不如绑定挂载直观。

3. 卷管理命令

docker volume ls                 # 列出所有 Docker 管理的卷
docker volume create myvolume    # 创建一个新的命名卷
docker volume inspect myvolume   # 查看指定卷的详细信息 (包括其物理存储位置 Mountpoint)
docker volume rm myvolume        # 删除一个不再使用的卷
# 注意:删除容器时,使用 -v 选项可以同时删除关联的匿名卷 (未命名的卷)。命名卷需要显式删除。

五、 Docker 网络管理

Docker 容器默认通过 docker0 虚拟网桥连接并相互隔离。

1. 查看容器网络信息

docker container inspect <容器名称|容器ID>  # 查看容器详细信息,包括其 IP 地址、网关、网络配置等

2. 默认网络 (docker0) 的局限性

  • 容器 IP 地址在重启或重新创建后可能变化。
  • 默认网络不支持通过容器名称进行服务发现(只能通过易变的 IP 地址访问)。

3. 创建自定义网络

自定义网络解决了 docker0 的局限性:

  • 为容器提供稳定的、可预测的 IP 地址段。
  • 支持通过容器名称作为主机名进行服务发现(容器间可以直接用名字通信)。
docker network create mynet      # 创建一个名为 mynet 的自定义桥接网络
docker network ls               # 列出所有 Docker 网络

4. 将容器连接到自定义网络

docker run -d -p 8081:80 --name app1 --network mynet nginx
docker run -d -p 8082:80 --name app2 --network mynet nginx
  • 现在 app1 可以直接通过 ping app2http://app2 访问 app2 容器,反之亦然。
  • 使用 docker inspect app1 查看其网络配置,确认它连接到了 mynet 并获取了 IP。

5. 删除网络

注意: 只能删除没有容器连接的网络。

docker network rm mynet

六、 使用 Docker Compose 编排多容器应用

Docker Compose 使用 YAML 文件 (docker-compose.ymlcompose.yml) 定义和运行多容器 Docker 应用。

1. 上线应用 (启动服务)

在包含 compose.yaml 文件的目录下运行:

docker compose -f compose.yaml up -d
# -f: 指定 Compose 文件 (默认为 compose.yml 或 docker-compose.yml 时可省略)
# -d: 后台运行 (detached)
# up: 创建并启动所有定义的服务、网络、卷
  • Compose 只会重建或重启配置发生变化的容器(智能更新)。

2. 下线应用 (停止并清理)

docker compose -f compose.yaml down      # 停止并移除容器、网络 (默认保留卷和镜像)
docker compose -f compose.yaml down --rmi all -v  # 停止并移除容器、网络,同时删除所有相关镜像(--rmi all)和卷(-v)
# --rmi all: 删除 Compose 文件中定义的服务所使用的所有镜像
# -v: 删除 Compose 文件中定义的匿名卷和 compose 创建时指定的命名卷 (谨慎使用!)

七、 使用 Dockerfile 构建镜像

Dockerfile 是一个文本文件,包含构建 Docker 镜像所需的一系列指令。

常用 Dockerfile 指令

指令说明示例
FROM指定基础镜像。 所有构建都以此为基础。FROM openjdk:11
LABEL添加元数据 (键值对)。 如作者、描述、版本等。LABEL maintainer="liuqi@example.com"
COPY复制文件/目录。 从构建上下文复制到镜像内。COPY ./app.jar /app/app.jar
ADD类似 COPY,但功能更多 (支持 URL、自动解压 tar)。通常优先用 COPY。ADD https://example.com/file.tar.gz /
WORKDIR设置工作目录。 后续指令 (RUN, CMD, ENTRYPOINT, COPY, ADD) 都在此目录下执行。WORKDIR /app
RUN执行命令。 在构建过程中运行命令并创建新的镜像层。常用于安装软件包。RUN apt-get update && apt-get install -y curl
EXPOSE声明运行时容器监听的端口。 只是一个文档说明,实际映射需用 -pEXPOSE 8080
ENV设置环境变量。 在构建阶段和运行阶段都可用。ENV JAVA_HOME=/usr/lib/jvm/java-11-openjdk
CMD指定容器启动时的默认命令。 可以被 docker run 的命令覆盖。CMD ["java", "-jar", "/app.jar"]
ENTRYPOINT指定容器启动时的主命令。 CMD 的内容通常作为其参数。更不易被覆盖。ENTRYPOINT ["java", "-jar"] CMD ["/app.jar"]

示例 Dockerfile (构建 Java 应用镜像)

# 使用 OpenJDK 11 官方镜像作为基础
FROM openjdk:11# 添加维护者信息 (元数据)
LABEL author="liuqi" version="1.0"# 将构建上下文中的 app.jar 复制到镜像根目录下
COPY app.jar /app.jar# 声明应用运行时监听的端口
EXPOSE 8081# 设置容器启动时执行的命令 (主进程)
ENTRYPOINT ["java", "-jar", "/app.jar"]

构建镜像

在包含 Dockerfileapp.jar 的目录下运行:

docker build -t myjavaapp:v1.0 .
# -t: 指定构建出的镜像名称和标签 (myjavaapp:v1.0)
# . : 指定构建上下文路径 (当前目录),Dockerfile 和 COPY 的文件都相对于此路径

八、 Docker 镜像分层存储机制

Docker 镜像采用分层存储 (Layer Storage) 机制,这是其高效性和轻量化的核心:

  1. Union File System (联合文件系统): 如 AUFS, Overlay2 等。这些文件系统允许将多个目录(称为“层”)挂载到同一个虚拟目录下。对用户呈现的是一个单一的文件系统视图。
  2. 只读层 (Read-Only Layers):
    • 镜像由一系列只读层叠加组成。
    • 每一层代表 Dockerfile 中的一条指令(如 FROM, RUN, COPY, ADD)所引入的文件系统变化。
    • 这些层是共享的。如果多个镜像基于同一个基础镜像(如 ubuntu:latest),那么它们共享基础镜像的所有只读层,节省磁盘空间。
  3. 容器层 (Container Layer / Read-Write Layer):
    • 当从镜像启动一个容器时,Docker 会在所有只读层之上添加一个薄薄的读写层(通常称为“容器层”或“可写层”)。
    • 容器运行时的所有文件写入操作(创建、修改、删除文件)都只发生在这个读写层中。
    • 容器删除时,这个读写层也会被丢弃(除非使用卷持久化数据)。
  4. 写时复制 (Copy-on-Write - CoW):
    • 如果一个容器需要修改只读层中的某个文件(例如修改配置文件),CoW 机制会触发:
      1. 该文件会从底层的只读层复制到容器的读写层。
      2. 后续所有对该文件的修改都只发生在读写层的这个副本上
    • 底层的只读文件保持不变。这保证了基础镜像的完整性和可共享性。
    • 只有首次修改时才复制,优化了性能和存储空间。

图解:

+---------------------------------------------------+
|                  Container (myapp)                |
| +-----------------------------------------------+ |
| |             Read-Write Layer (R/W)            | | (容器层 - 存储运行时修改)
| +-----------------------------------------------+ |
| +-----------------------------------------------+ |
| |               Read-Only Layer (n)             | | (镜像层 - 由 `RUN apt-get install` 添加)
| +-----------------------------------------------+ |
|                     ...                          |
| +-----------------------------------------------+ |
| |               Read-Only Layer (2)             | | (镜像层 - 由 `COPY app.jar` 添加)
| +-----------------------------------------------+ |
| +-----------------------------------------------+ |
| |               Read-Only Layer (1)             | | (镜像层 - 由 `FROM openjdk:11` 引入的基础层)
| +-----------------------------------------------+ |
+---------------------------------------------------+(Union Mount Point - 呈现为单一文件系统视图)

优势:

  • 高效构建: 构建镜像时,如果某层及其之上的层没有变化,Docker 会直接使用缓存中的层,极大加速构建过程。
  • 节省空间: 多个镜像和容器共享基础层。
  • 快速启动: 启动容器只需添加一个薄薄的读写层,无需复制整个文件系统。
  • 镜像复用: 公共基础层只需下载一次。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RDMA简介7之RoCE v2可靠传输

可靠传输技术旨在通过多种方法确保数据包在传输过程中不会丢失或损坏&#xff0c;同时保证数据包按发送顺序到达接收端&#xff0c;其要求在链路发生丢包或网络发生拥塞等情况下能够完全保证数据包的正确性同时尽可能地提高传输速率。RoCE v2协议实现可靠传输的技术手段共有三种…

java33

1.特殊文件 属性文件properties 配置文件xml 注意&#xff1a;XML文件可以直接在浏览器里面打开&#xff1a; 了解知识&#xff1a; 2.日志技术 3.单元测试 注意&#xff1a;点击方法内部再右键运行是测试改方法的&#xff0c;点击类名再右键运行才是测试整个测试类的&#xff…

OSI 七层网络模型

目录 OSI 七层网络模型七层模型1. 物理层&#xff08;Physical Layer&#xff09;2. 数据链路层&#xff08;Data Link Layer&#xff09;3. 网络层&#xff08;Network Layer&#xff09;4. 传输层&#xff08;Transport Layer&#xff09;5. 会话层&#xff08;Session Layer…

Spring Boot 4.0.0 新特性详解:深入解读 Spring Framework 7.0.0

你是否注意到创建新 Spring Boot 项目时出现的最新选项?Spring Boot 4.0.0 预览版现已发布,基于最新的 Spring Framework 7.0.0 🌱。这个版本引入了众多激动人心的新特性,不仅提升了开发效率,改善了空值安全性,还简化了 Web 应用程序的开发流程。本文将深入探讨这些重要…

从0到1构建高并发秒杀系统:实战 RocketMQ 异步削峰与Redis预减库存

&#x1f680;从0到1构建高并发秒杀系统&#xff1a;实战 RocketMQ 异步削峰与Redis预减库存 &#x1f4d6;一、 简介 在电商、抢票等高并发场景中&#xff0c;秒杀系统面临着“高并发、库存稀缺、易超卖、系统易崩”的严峻挑战。传统的同步处理架构难以支撑海量请求并发下的性…

OpenCV CUDA模块图像变形------对图像进行任意形式的重映射(Remapping)操作函数remap()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数根据给定的映射表 xmap 和 ymap 对图像进行 任意形式的重映射&#xff08;Remapping&#xff09;操作&#xff0c;是 GPU 加速版本的图像几…

PC 端常用 UI 组件库

一、前言 随着企业级应用、后台管理系统、数据平台等项目的不断发展&#xff0c;前端开发已经不再局限于移动端和响应式布局&#xff0c;而是越来越多地聚焦于 PC 端系统的构建。为了提升开发效率、统一设计风格并保障用户体验&#xff0c;使用成熟的 UI 组件库 成为了现代前端…

pikachu靶场通关笔记31 文件包含02之远程文件包含

目录 一、文件包含功能 二、文件包含Vulnerability 二、远程文件包含 三、环境配置 1、进入靶场 2、搭建环境 &#xff08;1&#xff09;定位php.ini文件 &#xff08;2&#xff09;修改php.ini文件 四、源码分析 五、渗透实战 1、选择科比 2、执行phpinfo &…

QT集成Boost库

在Windows平台上&#xff0c;使用Qt集成Boost库&#xff0c;并基于MSVC编译器在CMake文件中加载&#xff0c;可以按照以下步骤进行配置。 Boost库的编译 如果Boost库未预编译&#xff0c;需要手动编译&#xff0c;解压zip到D:\Library\boost_1_87_0&#xff0c;打开cmd命令行…

MySQL从库复制延迟的监测

目录 ⏱️ 一、原生内置方法❤️ 二、心跳表工具&#xff08;如pt-heartbeat&#xff09;⚙️ 三、MySQL 8.0 增强方案&#x1f4ca; 四、各方案对比总结&#x1f48e; 五、选择建议 MySQL从库复制延迟的监测是保障数据一致性和读写分离可靠性的关键环节&#xff0c;以下是主流…

slam--最小二乘问题--凹凸函数

最小二乘问题 最小二乘问题标准公式 残差函数&#xff0c;线性和非线性最小二乘 最小二乘问题的两种写法&#xff1a; 目标 找到 x使得预测值 Ax与观测值 b 的残差平方和最小。 范数和范数平方 线性最小二乘 一般形式&#xff1a; 残差 rAx−b是x 的线性函数。 目标函数是…

crackme008

crackme008 名称值软件名称Andrnalin.1.exe加壳方式无保护方式serial编译语言Microsoft Visual Basic调试环境win10 64位使用工具x32dbg,PEid破解日期2025-06-10 脱壳 1. 先用PEid查壳 查到无壳 寻找Serial 寻找flag&#xff0c;用x32dbg打开程序&#xff0c;鼠标右键->…

【C语言】图书管理系统(文件存储版)丨源码+详解

一、系统介绍 这是一个基于C语言开发的终端图书管理系统&#xff0c;采用链表数据结构​​二进制文件存储技术实现。系统具有以下特点&#xff1a; ​双角色系统​&#xff1a;管理员&#xff08;管理图书&#xff09;和读者&#xff08;借阅/归还&#xff09;​完整功能​&a…

Java求职者面试题解析:Spring、Spring Boot、MyBatis框架与源码原理

Java求职者面试题解析&#xff1a;Spring、Spring Boot、MyBatis框架与源码原理 第一轮&#xff1a;基础概念问题 1. 请解释什么是Spring框架&#xff1f;它的核心特性有哪些&#xff1f; Spring是一个开源的Java/Java EE应用程序框架&#xff0c;用于简化企业级应用开发。其…

【Chipyard】修改Gemmini 中PE的数量

实战目标 PE数量扩大到原来4倍 原来配置 tileRows: Int 1,tileColumns: Int 1,meshRows: Int 16,meshColumns: Int 16, 改后配置 tileRows: Int 1,tileColumns: Int 1,meshRows: Int 32,meshColumns: Int 32, 修改配置 1. 修改gemmini的scala配置文件&#xff0c;用…

TCP客户端进程分割输入输出

创建TCP客户端&#xff0c;创建子进程分割TCP客户端的read功能和write功能&#xff0c;实现分割I/O的目的。加快客户端速率。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <signal.h> #include …

Wi-Fi 6 在 2.4GHz 频段的速率与优化分析

Wi-Fi 6&#xff08;802.11ax&#xff09;在 2.4GHz 和 5GHz 频段均可工作&#xff0c;理论最高速率可达 1200 Mbps&#xff08;5GHz&#xff0c;80MHz&#xff0c;22 MIMO&#xff09;。但在 2.4GHz 频段&#xff0c;速率受 信道宽度、MIMO、调制方式、干扰、协议开销 影响&am…

WPF--Application.Current.Dispatcher.BeginInvoke

1.代码示例 private void LogInfoList_CollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) {// 直接在这里修改集合会引发递归if (e.Action NotifyCollectionChangedAction.Add){if (logInfoList.Count > 200){logInfoList.RemoveAt(0); // 这里会…

ZooKeeper详解以及应用部署(AI)

ZooKeeper 是一个开源的分布式协调服务框架&#xff0c;旨在为分布式应用提供一致性保障和关键协调功能。其核心设计理念是将复杂的分布式一致性逻辑封装为简单可靠的接口&#xff0c;让开发者专注于业务逻辑而非底层协调难题。以下是其核心要点&#xff1a; &#x1f9e0; 一、…

将MySQL数据库中所有表和字段编码统一改为utf8mb4_unicode_ci

完整操作步骤 1. 首先修改数据库默认字符集 sql ALTER DATABASE 你的数据库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 2. 生成批量修改所有表的SQL语句 sql SELECT CONCAT(ALTER TABLE , table_schema, ., table_name, CONVERT TO CHARACTER SET utf8mb4 C…