欢迎光临
我们一直在努力

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:镜像大小

[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

# 查看镜像,包括隐藏镜像
[root@hadoop108 ~]# docker images -a

# 查看指定镜像详细信息
[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

# docker search 镜像名
[root@hadoop108 ~]# docker search centos

3)拉取镜像

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

如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它

镜像较大时,可从本地加载:

docker load -i centos-7.5.1804.tar

完整格式示例

# 完整格式
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)

# docker pull 镜像
[root@hadoop108 ~]# docker pull centos:7.5.1804

4)删除镜像

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

  • 按标签删除

    # docker rmi 镜像标签
    [root@hadoop108 ~]# docker rmi registry:latest

  • 按ID删除

    # docker rmi 镜像ID
    [root@hadoop108 ~]# docker rmi 1de12428f6f4

  • 强制删除

    [root@hadoop108 ~]# docker rmi -f registry:latest
    [root@hadoop108 ~]# docker rmi -f 1de12428f6f4

  • 清理无用镜像

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

    • 没有标签的镜像(<none>:<none>)
    • 没有被任何容器引用的中间层镜像

    [root@hadoop108 ~]# docker image prune -f

5)将镜像保存为文件

# docker save 镜像 -o 文件名
[root@hadoop108 ~]# docker save -o centos:7.5.1804 save-centos-7.5-1804.tar

# 导出所有镜像
docker images | awk 'NR>1{print "docker save","-o","save_"$1"_"$2".tar",$1":"$2}' | 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)从文件加载镜像

# 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 是镜像的“友好名字”,通常用 仓库名:标签 的形式表示。

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

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

[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 选项会立即退出。

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

2)查看容器

参数说明:

  • 默认:查看运行中的容器
  • -a:查看所有状态的容器

[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

[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] 查看日志

# docker start 容器名/容器ID
[root@hadoop108 ~]# docker start centos-hadoop102

or

[root@hadoop108 ~]# docker start e1f59927b235

4)运行容器

创建一个新容器并启动它

说明

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

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

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

  • 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 容器

      [root@hadoop108 ~]# docker run -d -p 3306:3306 –name firstmysql -e MYSQL_ROOT_PASSWORD=000000 mysql:5.7

    • 运行 Nginx 容器

      [root@hadoop108 ~]# docker run -d –name nginx -P nginx:1.24

    • 运行 CentOS 容器

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

    5)停止容器

    • 停止指定容器

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

      [root@hadoop108 ~]# docker stop firstmysql

      or

      [root@hadoop108 ~]# docker stop 76f780

    • 停止所有容器

      [root@hadoop108 ~]# docker stop `docker ps -qa`

      or

      [root@hadoop108 ~]# docker stop $(docker ps -qa)

    6)重启容器

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

    [root@hadoop108 ~]# docker restart firstmysql

    7)进入容器

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

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

      [root@hadoop108 ~]# docker exec centos-hadoop102 hostname
      hadoop102

    • 进入容器

      参数说明:

      • -i:保持标准输入
      • -t:分配终端
      • /bin/bash:使用bash进程

      [root@hadoop108 ~]# docker exec -it centos-hadoop102 /bin/bash

    8)退出容器

    [root@bf2f501bb6e2 /]# exit
    exit
    [root@hadoop108 ~]#

    9)删除容器

    • 删除已经停止的容器

      [root@hadoop108 ~]# docker rm 1b29d1601792
      1b29d1601792

    • 删除运行状态的容器

      [root@hadoop108 ~]# docker stop bf2f501bb6e2
      [root@hadoop108 ~]# docker rm bf2f501bb6e2

    • 强制删除容器

      [root@hadoop108 ~]# docker rm -f bf2f501bb6e2

    • 容器运行完成后,自动删除

      [root@hadoop108 ~]# docker run –rm centos:7.5.1804 /bin/echo "hello world"

    • 删除所有容器

      [root@hadoop108 ~]# docker rm -f `docker ps -qa`

      or

      [root@hadoop108 ~]# docker ps -qa | xargs docker rm -f

    10)杀死容器

    docker stop 和 docker kill本质区别

    • docker stop 容器名

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

    • 直接发送 SIGKILL,不给任何清理机会,进程立刻消失

    真实运维对比示例(MySQL)

    • docker stop mysql
      • 正常关闭
      • 数据一致
      • 下次启动快
    • docker kill mysql
      • 正在写的数据直接中断
      • 可能触发 crash recovery
      • 启动变慢甚至损坏

    [root@hadoop108 ~]# docker kill bf2f501bb6e2


    三:容器类(进阶)

    1)导出容器

    导出后为镜像文件

    docker export -o xxx.tar 容器名 / docker export 容器名 > xxx.tar

    [root@hadoop108 ~]# docker export -o export-hadoop102.tar hadoop102

    2)导入容器

    [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、创建时间、路径、状态、镜像、配置等在内的各项信息

    [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 、 用户、时间、命令等。

    [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:禁用流统计,只提取第一个结果

    [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 容器名:容器路径 宿主机路径

    [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:实时显示日志

    [root@hadoop108 ~]# docker logs nginx

    8)获取容器 PID

    参数说明:

    • -f:format(格式化输出) 的意思,用来自定义 docker inspect 的输出,而不是输出整个 JSON。

    [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,方便你操作容器内部环境

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

    [root@hadoop108 ~]# nsenter -t 54261 -m -u -i -n -p /bin/bash
    [root@e368fb755e44 /]#

    [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)容器开机自启

    • 方式一

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

    • 获取容器 CONTAINER ID

      [root@hadoop108 ~]# docker container inspect -f "{{ .Id }}" nginx
      ccba48148195cd3087ea57a3fe17fd6b64b5be5f4fb3d13072ce0185e46daeb2

    • 修改容器配置文件

      # 获取 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

    • 方式二(推荐)

    • 创建容器的时候加上 –restart=always

      策略异常退出正常退出Docker 重启
      no
      on-failure
      always
      unless-stopped ❌(手动停过)

      [root@hadoop108 ~]# docker run -it -d -p 80:80 –name nginx –restart=always nginx:1.19 /bin/bash

    11)查看端口映射

    [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)(批量)

    赞(0)
    未经允许不得转载:171主机测评 » Docker基础操作——镜像与容器管理
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址