Docker基础操作——镜像与容器管理

Docker基础操作------镜像与容器管理

  • 一:镜像类
    • 1)查看镜像
    • 2)搜索镜像
    • 3)拉取镜像
    • 4)删除镜像
    • 5)将镜像保存为文件
    • 6)从文件加载镜像
    • 7)给镜像起别名
  • 二:容器类(基础)
    • 1)创建容器
    • 2)查看容器
    • 3)启动容器
    • 4)运行容器
    • 5)停止容器
    • 6)重启容器
    • 7)进入容器
    • 8)退出容器
    • 9)删除容器
    • 10)杀死容器
  • 三:容器类(进阶)
    • 1)导出容器
    • 2)导入容器
    • 3)查看容器详情
    • 4)查看容器内进程
    • 5)查看容器统计信息
    • 6)容器和主机之间复制文件
    • 7)查看容器访问日志
    • 8)获取容器 PID
    • 9)nsenter 方式进入容器
    • 10)容器开机自启
    • 11)查看端口映射
  • 总结

🎯 系列介绍

🔔 本文是 《Docker实战入门与部署指南:从核心概念到网络与数据管理》 系列的第三篇!

本系列将从零开始,带你系统性地学习 Docker 的核心概念、安装部署、容器管理、镜像制作、数据持久化与网络配置,最终具备构建和运维容器化应用的能力。

⚠️ 该系列所有涉及的配置脚本、Dockerfile示例和离线安装包都可以私信博主免费获取。


📚 系列篇章总览

  • 第一章:初识Docker------概念与优势
    核心: 理解Docker是什么,它与传统虚拟机的本质区别,以及为何要使用容器化技术。

  • 第二章:环境准备与Docker安装
    核心: 掌握在CentOS系统上搭建Docker运行环境,从操作系统准备到Docker CE的安装、配置与优化。

  • 第三章:Docker基础操作------镜像与容器管理
    核心: 理解Docker是什么,它与传统虚拟机的本质区别,以及为何要使用容器化技术。

  • 第四章:深入Docker架构------C/S模式解析
    核心: 理解Docker客户端与守护进程如何协同工作,这是掌握Docker运行原理和高级管理(如远程连接)的基础

  • 第五章:自定义镜像制作------从Dockerfile到镜像
    核心: 掌握制作自定义镜像的四种方式,重点学习使用Dockerfile进行标准化、可复用的镜像构建。

  • 第六章:数据持久化------Volume与Bind Mount
    核心:解决容器内数据易失性问题,学习如何通过Volume和绑定挂载实现数据的持久化存储与跨容器共享。

  • 第七章:容器网络配置------从互联到自定义桥接
    核心: 掌握容器间的通信方式,学习默认Bridge、Host网络,并最终通过自定义网络和Pipework实现容器与宿主机网络的无缝集成。


🚀 系列最终成果
当你完整学完并实操本系列,你将拥有:

✅ 扎实的Docker理论基础,清晰理解容器、镜像、仓库等核心概念。
✅ 独立部署Docker环境的能力,并完成常用配置优化(如镜像加速)。
✅ 熟练的容器与镜像管理技能,能够进行日常的运维操作。
✅ 制作自定义业务镜像的能力,为应用容器化打下基础。
✅ 解决数据持久化问题的方案,确保应用数据安全。
✅ 配置复杂容器网络的能力,实现容器内外的灵活通信。

真正实现: 概念理解 → 环境搭建 → 日常操作 → 镜像定制 → 数据管理 → 网络配置,一站式掌握Docker核心技能。


一:镜像类

镜像是 Docker 三大核心概念中最重要的,自 Docker 诞生之日起镜像就是相关社区最为热门的关键词。 Docker 运行容器前需要本地存在对应的镜像,如果镜像不存在Docker 会尝试先从默认镜像仓库下载,用户也可以通过配置, 使用自定义的镜像仓库

1)查看镜像

字段说明:

  • REPOSITORY:来源仓库
  • TAG:镜像标签,表示版本(仅标记,不代表内容)
  • IMAGE ID:唯一标识(如果两个镜像的 ID 相同, 说明它们实际上指向了同一 个镜像, 只是具有不同标签名称而已)
  • CREATED:最后更新时间(latest -> 最新的(在生产环境中建议使用指定具体的版本))
  • SIZE:镜像大小
bash 复制代码
[root@hadoop108 ~]# docker images
REPOSITORY       TAG           IMAGE ID       CREATED       SIZE
tomcat           9.0-jdk8      56d6933de864   2 years ago   285MB
nginx            1.24          b6c621311b44   2 years ago   142MB
mysql            5.7-debian    b5d7c63fe339   2 years ago   463MB
mysql            8.0-debian    5557a1823e30   2 years ago   602MB
bash 复制代码
# 查看镜像,包括隐藏镜像
[root@hadoop108 ~]# docker images -a
bash 复制代码
# 查看指定镜像详细信息
[root@hadoop108 ~]# docker image inspect nginx:1.19
...

[root@hadoop108 ~]# docker image inspect -f "{{ .Id }}" nginx:1.19
sha256:f6d0b4767a6c466c178bf718f99bea0d3742b26679081e52dbf8e0c7c4c42d74

2)搜索镜像

搜索来源为 Docker Hub:https://hub.docker.com

国内访问比较慢,可以配置镜像加速器 /etc/docker/daemon.json

bash 复制代码
# docker search 镜像名
[root@hadoop108 ~]# docker search centos

3)拉取镜像

当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。

如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它
镜像较大时,可从本地加载:

bash 复制代码
docker load -i centos-7.5.1804.tar

完整格式示例

bash 复制代码
# 完整格式
docker pull registry.example.com:5000/company/project/app:v1.2.3
# ↓↓↓ 分解 ↓↓↓
# registry.example.com:5000  - 仓库地址(可选,默认docker.io)
# company/                   - 用户名/组织名(可选,默认library)
# project/                   - 项目名(可选)
# app                        - 镜像名
# :v1.2.3                    - 标签(可选,默认:latest)
bash 复制代码
# docker pull 镜像
[root@hadoop108 ~]# docker pull centos:7.5.1804

4)删除镜像

如果删除的时候报错,很可能是有容器使用了该镜像, 则需要先删除使用该镜像的容器, 才能删除该镜像.

  • 按标签删除

    bash 复制代码
    # docker rmi 镜像标签
    [root@hadoop108 ~]# docker rmi registry:latest
  • 按ID删除

    bash 复制代码
    # docker rmi 镜像ID
    [root@hadoop108 ~]# docker rmi 1de12428f6f4
  • 强制删除

    bash 复制代码
    [root@hadoop108 ~]# docker rmi -f registry:latest
    [root@hadoop108 ~]# docker rmi -f 1de12428f6f4
  • 清理无用镜像

    这是最常见的"无用镜像",指:

    • 没有标签的镜像<none>:<none>
    • 没有被任何容器引用的中间层镜像
    bash 复制代码
    [root@hadoop108 ~]# docker image prune -f

5)将镜像保存为文件

bash 复制代码
# docker save 镜像 -o 文件名 
[root@hadoop108 ~]# docker save -o centos:7.5.1804 save-centos-7.5-1804.tar 
bash 复制代码
# 导出所有镜像
docker images | awk 'NR>1{print "docker save","-o","save_"$1"_"$2".tar",$1":"$2}' | bash
bash 复制代码
# 只导出特定镜像
docker images | awk 'NR>1 && $1=="centos"{print "docker save","-o","save_"$1"_"$2".tar",$1":"$2}' | bash

补充:

. 需要 bash 的情况

复制代码
echo "rm -rf file1 file2" | bash
  • 前面的命令只生成命令字符串
  • bash 负责解释和执行这些字符串

6)从文件加载镜像

bash 复制代码
# docker load -i/--input/< 镜像文件
[root@hadoop108 ~]# docker load -i save-centos-7.5-1804.tar

[root@hadoop108 ~]# docker load --input save-centos-7.5-1804.tar

[root@hadoop108 ~]# docker load < save-centos-7.5-1804.tar

7)给镜像起别名

每个 Docker 镜像都有一个唯一的 IMAGE ID,这是系统识别镜像的底层哈希值。

tag 是镜像的"友好名字",通常用 仓库名:标签 的形式表示。

bash 复制代码
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

docker tag 不会复制镜像,ID是一样的,只是给镜像增加一个新的"名字/标签"。

bash 复制代码
[root@hadoop108 ~]# docker tag lmc/volume:1.0 cjm/volume:1.0

[root@hadoop108 ~]# docker images
REPOSITORY       TAG           IMAGE ID       CREATED       SIZE
cjm/volume       1.0           7aaffcf51736   2 days ago    200MB
lmc/volume       1.0           7aaffcf51736   2 days ago    200MB

二:容器类(基础)

容器是 Docker 的另一个核心概念。简单来说,容器是镜像的一个运行实例。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层,同时,容器中的应用进程处于运行状态。

1)创建容器

参数说明:

  • --name:给容器命名
  • -h:指定主机名
  • -i:交互模式
  • -t:分配伪终端
  • /bin/bash:容器启动后的默认进程(需要进入容器里面操作的时候加上)

注意: -i-t 通常一起使用(-it),如果启动的是 /bin/bash 这样的交互式程序,没有 -i 选项会立即退出。

bash 复制代码
[root@hadoop108 ~]# docker create -it -h hadoop102 --name centos-hadoop102 centos:7.5.1804 /bin/bash

2)查看容器

参数说明:

  • 默认:查看运行中的容器
  • -a:查看所有状态的容器
bash 复制代码
[root@hadoop108 ~]# docker ps 
CONTAINER ID   IMAGE             COMMAND       CREATED              STATUS          PORTS     NAMES
f168dcc0ea50   centos:7.5.1804   "/bin/bash"   About a minute ago   Up 57 seconds             centos-hadoop102
bash 复制代码
[root@hadoop108 ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS                      PORTS     NAMES
65fa701a56ea   centos:7.5.1804   "ls"                     28 minutes ago   Exited (0) 28 minutes ago             elated_chatelet
9fe21f5f826c   centos:7.5.1804   "/bin/echo 'hello wo..."   29 minutes ago   Exited (0) 29 minutes ago             jovial_wiles

3)启动容器

将已有容器变为Running状态

默认为后台启动,可以通过 docker logs [NAMES] 查看日志

bash 复制代码
# docker start 容器名/容器ID
[root@hadoop108 ~]# docker start centos-hadoop102

or
 
[root@hadoop108 ~]# docker start e1f59927b235

4)运行容器

创建一个新容器并启动它
说明

  1. 检查本地是否存在指定的镜像,不存在就从公有仓库下载;

  2. 利用镜像创建一个容器,并启动该容器;

  3. 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层

    docker run = docker pull + docker create + docker start

参数说明:

  • -d:后台运行
  • --name:指定容器名称
  • -h:指定容器主机名
  • -p
    • -p 80:80:指定端口映射(宿主机端口 : 容器端口)
    • -p :80:随机映射,同 -P
    • -p 90-93:80-83:范围一对一映射
  • -P:随机端口映射
  • -v:目录挂载(宿主机目录 : 容器目录)
  • -e:设置环境变量
  • -it IMAGE /bin/bash:交互式运行(服务型容器则无需使用,如:nginx、mysql、redis...)
  • 运行 MySQL 容器

    bash 复制代码
    [root@hadoop108 ~]# docker run -d -p 3306:3306 --name firstmysql -e MYSQL_ROOT_PASSWORD=000000 mysql:5.7
  • 运行 Nginx 容器

    bash 复制代码
    [root@hadoop108 ~]# docker run -d --name nginx -P nginx:1.24
  • 运行 CentOS 容器

    bash 复制代码
    [root@hadoop108 ~]# docker run -it -h hadoop102 --name centos-hadoop102 -d centos:7.5.1804 /bin/bash

5)停止容器

  • 停止指定容器

    docker stop [容器名/容器ID前六位]

    bash 复制代码
    [root@hadoop108 ~]# docker stop firstmysql
    
    or
    
    [root@hadoop108 ~]# docker stop 76f780
  • 停止所有容器

    bash 复制代码
    [root@hadoop108 ~]# docker stop `docker ps -qa`
    
    or
    
    [root@hadoop108 ~]# docker stop $(docker ps -qa)

6)重启容器

docker restart [容器名/容器ID前六位]

bash 复制代码
[root@hadoop108 ~]# docker restart firstmysql

7)进入容器

已经运行的容器中,额外启动一个进程,执行指定命令或进入交互终端

  • 不进入容器,直接执行命令

    bash 复制代码
    [root@hadoop108 ~]# docker exec centos-hadoop102 hostname
    hadoop102
  • 进入容器

    参数说明:

    • -i:保持标准输入
    • -t:分配终端
    • /bin/bash:使用bash进程
    bash 复制代码
    [root@hadoop108 ~]# docker exec -it centos-hadoop102 /bin/bash

8)退出容器

bash 复制代码
[root@bf2f501bb6e2 /]# exit
exit
[root@hadoop108 ~]#

9)删除容器

  • 删除已经停止的容器

    bash 复制代码
    [root@hadoop108 ~]# docker rm 1b29d1601792
    1b29d1601792
  • 删除运行状态的容器

    bash 复制代码
    [root@hadoop108 ~]# docker stop bf2f501bb6e2
    [root@hadoop108 ~]# docker rm bf2f501bb6e2
  • 强制删除容器

    bash 复制代码
    [root@hadoop108 ~]# docker rm -f bf2f501bb6e2
  • 容器运行完成后,自动删除

    bash 复制代码
    [root@hadoop108 ~]# docker run --rm centos:7.5.1804 /bin/echo "hello world"
  • 删除所有容器

    bash 复制代码
    [root@hadoop108 ~]# docker rm -f `docker ps -qa`
    
    or
    
    [root@hadoop108 ~]# docker ps -qa | xargs docker rm -f

10)杀死容器

docker stopdocker kill本质区别

  • docker stop 容器名

    1. 向 PID 1 发送 SIGTERM
    2. 等待一段时间 (默认 10 秒,可通过 docker stop -t 秒数 容器名 调节)
    3. 如果进程还没退出
    4. 再发送 SIGKILL
  • docker kill 容器名

    1. 直接发送 SIGKILL不给任何清理机会,进程立刻消失
      真实运维对比示例(MySQL)
  • docker stop mysql

    • 正常关闭
    • 数据一致
    • 下次启动快
  • docker kill mysql

    • 正在写的数据直接中断
    • 可能触发 crash recovery
    • 启动变慢甚至损坏
bash 复制代码
[root@hadoop108 ~]# docker kill bf2f501bb6e2

三:容器类(进阶)

1)导出容器

导出后为镜像文件
docker export -o xxx.tar 容器名 / docker export 容器名 > xxx.tar

bash 复制代码
[root@hadoop108 ~]# docker export -o export-hadoop102.tar hadoop102

2)导入容器

bash 复制代码
[root@hadoop108 ~]# docker import export-hadoop102.tar export:hadoop102-1.0
sha256:f483ca3138e6d2ca21d39869b18ed63a2ef262d1689852c545e7439c634f2f20

[root@hadoop108 ~]# docker images
REPOSITORY       TAG             IMAGE ID       CREATED         SIZE
export           hadoop102-1.0   f483ca3138e6   4 seconds ago   200MB

3)查看容器详情

会以 json 格式返回包括容器 Id、创建时间、路径、状态、镜像、配置等在内的各项信息

bash 复制代码
[root@hadoop108 ~]# docker container inspect hadoop102
[
    {
        "Id": "e368fb755e44e9c84caac208e5ec943ea46decebe17e58583f8371cd7427f3b4",
        "Created": "2026-01-13T13:58:36.871131584Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "created",
            "Running": false,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 0,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "0001-01-01T00:00:00Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
...

4)查看容器内进程

容器必须是启动的状态,这个子命令类似于 Linux 系统中的 top 命令, 会打印出容器内的进程信息, 包括 PID 、 用户、时间、命令等。

bash 复制代码
[root@hadoop108 ~]# docker top hadoop102
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                42735               42715               0                   22:38               pts/0               00:00:00            /bin/bash

5)查看容器统计信息

显示 CPU 、内存、存储、网络等使用情况的统计信息。
参数说明:

  • --no-stream:禁用流统计,只提取第一个结果
bash 复制代码
[root@hadoop108 ~]# docker stats --no-stream hadoop102
CONTAINER ID   NAME        CPU %     MEM USAGE / LIMIT   MEM %     NET I/O       BLOCK I/O     PIDS
e368fb755e44   hadoop102   0.00%     380KiB / 972.4MiB   0.04%     5.28kB / 0B   2.52MB / 0B   1

6)容器和主机之间复制文件

容器不需要是 running,也可以复制
宿主机 → 容器docker cp 宿主机路径 容器名:容器路径
容器 → 宿主机docker cp 容器名:容器路径 宿主机路径

bash 复制代码
[root@hadoop108 ~]# vim /opt/module/test.txt
[root@hadoop108 ~]# docker cp /opt/module/test.txt hadoop102:/opt
[root@hadoop108 ~]# docker exec hadoop102 cat /opt/test.txt
test

7)查看容器访问日志

参数说明:

  • 默认:显示最新的日志

  • -f:实时显示日志

bash 复制代码
[root@hadoop108 ~]# docker logs nginx

8)获取容器 PID

参数说明:

  • -f:format(格式化输出) 的意思,用来自定义 docker inspect 的输出,而不是输出整个 JSON。
bash 复制代码
[root@hadoop108 ~]# docker container inspect -f "{{ .State.Pid }}" hadoop102
54261

9)nsenter 方式进入容器

nsenter = 直接进入另一个进程的命名空间,相当于"隐形进入容器内核视角"

docker exec 的区别:

  • docker exec 是 Docker 命令,启动一个新的进程在容器里

  • nsenter 是 Linux 命令,不依赖 Docker API,直接在宿主机通过 PID 进入容器命名空间
    参数说明:

  • -t:指定你要进入的进程 ID

  • -m:进入该进程的挂载命名空间,即文件系统视图和宿主机可能不同

  • -u:进入UTS 命名空间,隔离主机名和域名

  • -i:进入进程间通信命名空间,共享信号量、消息队列等

  • -n:进入该进程的网络命名空间,获取容器内网络环境

  • -p:进入该进程的进程号命名空间

  • /bin/bash:在目标命名空间中启动交互式 bash,方便你操作容器内部环境

bash 复制代码
[root@hadoop108 ~]# docker container inspect -f "{{ .State.Pid }}" hadoop102
54261

[root@hadoop108 ~]# nsenter -t 54261 -m -u -i -n -p /bin/bash
[root@e368fb755e44 /]# 
bash 复制代码
[root@hadoop108 ~]# touch docker_in.sh
[root@hadoop108 ~]# chmod 755 docker_in.sh
[root@hadoop108 ~]# vim docker_in.sh
#!/bin/bash
# Use nsenter to access docker
docker_in(){
   NAME_ID=$1
   PID=$(docker inspect -f "{{ .State.Pid }}" $NAME_ID)
   nsenter -t $PID -m -u -i -n -p /bin/bash
}

docker_in $1

[root@hadoop108 ~]# ./docker_in.sh mysql
root@9894fb3a1733:/#

10)容器开机自启

  • 方式一

    安全性较低,操作底层文件容易出错

    1. 获取容器 CONTAINER ID

      bash 复制代码
      [root@hadoop108 ~]# docker container inspect -f "{{ .Id }}" nginx
      ccba48148195cd3087ea57a3fe17fd6b64b5be5f4fb3d13072ce0185e46daeb2
    2. 修改容器配置文件

      bash 复制代码
      # 获取 data-root 路径(默认应该在 /var/lib/docker)
      [root@hadoop108 ~]# cat /etc/docker/daemon.json 
      {
          "registry-mirrors": [
              "https://uzidjh9f.mirror.aliyuncs.com",
              "https://registry.docker-cn.com",
              "https://docker.m.daocloud.io"
          ],
          "data-root": "/opt/module/data/docker",
          "exec-opts": ["native.cgroupdriver=systemd"]
      }
      
      [root@hadoop108 ~]# cd /opt/module/data/docker/containers/ccba48148195cd3087ea57a3fe17fd6b64b5be5f4fb3d13072ce0185e46daeb2
      
      [root@hadoop108 ccba48148195cd3087ea57a3fe17fd6b64b5be5f4fb3d13072ce0185e46daeb2]# vim hostconfig.json
  • 方式二(推荐)

    1. 创建容器的时候加上 --restart=always

      策略 异常退出 正常退出 Docker 重启
      no
      on-failure
      always
      unless-stopped ❌(手动停过)
      bash 复制代码
      [root@hadoop108 ~]# docker run -it -d -p 80:80 --name nginx --restart=always nginx:1.19 /bin/bash

11)查看端口映射

bash 复制代码
[root@hadoop108 ~]# docker port nginx

总结

镜像管理四大核心:

  • 查看镜像:docker images / docker image inspect

  • 获取镜像:docker search / docker pull / docker load

  • 删除镜像:docker rmi / docker image prune

  • 导出镜像:docker save / docker tag

容器生命周期管理:

  • 创建与启动:docker create → docker start 或直接 docker run

  • 状态控制:docker stop(优雅) / docker kill(强制)

  • 进入容器:docker exec -it(常用) / nsenter(备用)

  • 清理容器:docker rm -f $(docker ps -qa)(批量)

相关推荐
冗量2 小时前
Kubernetes (K8s) 基础知识、部署与运维指南
运维·容器·kubernetes
Jacob程序员2 小时前
达梦数据库私有服务配置指南
linux·服务器·数据库
fen_fen2 小时前
Docker MongoDB 配置 0.0.0.0 监听(外部可访问)操作文档
mongodb·docker·eureka
vx-bot5556662 小时前
企业微信接口在自动化运维与智能运维中的架构实践
运维·自动化·企业微信
BLUcoding2 小时前
Docker 离线安装和镜像源配置
java·docker·eureka
day day day ...2 小时前
easyExcel和poi分别处理不同标准的excel
java·服务器·excel
阿常呓语2 小时前
ls 命令详解
linux·运维·服务器·ls
桌面运维家2 小时前
vDisk一键部署怎么应用?自动化脚本使用指南
运维·自动化
倔强的石头1062 小时前
【Linux指南】基础IO系列(一)Linux 文件本质揭秘 —— 从 “磁盘文件” 到 “一切皆文件”
linux·运维·服务器