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命令来下载它
镜像较大时,可从本地加载:
bashdocker 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是镜像的"友好名字",通常用仓库名:标签的形式表示。
bashdocker 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)运行容器
创建一个新容器并启动它
说明
检查本地是否存在指定的镜像,不存在就从公有仓库下载;
利用镜像创建一个容器,并启动该容器;
分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层
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 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
- 启动变慢甚至损坏
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)容器开机自启
-
方式一
安全性较低,操作底层文件容易出错
-
获取容器 CONTAINER ID
bash[root@hadoop108 ~]# docker container inspect -f "{{ .Id }}" nginx ccba48148195cd3087ea57a3fe17fd6b64b5be5f4fb3d13072ce0185e46daeb2 -
修改容器配置文件
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
-
-
方式二(推荐)
-
创建容器的时候加上
--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)(批量)