Docker 基础
1.概述
Docker 是一款轻量级的应用打包和运行工具,核心作用就是把程序和它运行所需要的所有环境(比如依赖的软件、配置文件、系统库)打包在一起,形成一个独立的 “容器”。这个容器就像一个密封的 “程序盒子”,不管放到哪台支持 Docker 的机器上(Windows、Linux、macOS),都能直接运行,而且运行效果完全一样。
2. Docker 服务架构
Docker 是一个客户端-服务器(C/S)架构程序。Docker 客户端只需要向 Docker 服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。

3. Docker 与传统的虚拟机的比较
|
对比维度 |
Docker 容器 |
传统虚拟机 |
|---|---|---|
|
虚拟化层级 |
基于操作系统层面,直接共享宿主机内核,没有独立内核 |
基于硬件层面,需要给每个 VM 装独立的操作系统内核 |
|
资源占用 |
轻量级,只占用应用运行所需的资源,无额外系统开销 |
重量级,每个 VM 都要分配独立的 CPU、内存、磁盘,还要跑完整 OS,资源浪费多 |
|
启动速度 |
秒级 / 毫秒级启动,直接运行应用进程 |
分钟级启动,需要先加载完整操作系统 |
|
镜像 / 镜像体积 |
镜像体积小(几十 MB~ 几百 MB),分层存储可复用 |
镜像体积大(几 GB~ 几十 GB),包含完整 OS,不可复用 |
|
隔离性 |
进程级隔离,隔离性中等,适合应用级隔离 |
完全隔离,隔离性强,适合系统级隔离(比如不同系统版本) |
|
移植性 |
一次打包,到处运行,不受底层主机 OS 限制(只要内核兼容) |
移植性差,VM 镜像和宿主机虚拟化技术(如 VMware、KVM)强绑定 |
|
管理难度 |
操作简单,命令行 / API 容易自动化,适合 CI/CD |
管理复杂,需要专门的虚拟化平台,自动化成本高 |
|
适用场景 |
微服务、持续部署、应用快速迭代、开发测试环境 |
运行不同操作系统、需要强隔离的场景(如多租户服务器) |
4. 关键概念
镜像(Image):一个只读的、打包好的程序运行环境模板,包含了应用程序、依赖的库、配置文件、系统工具等所有运行需要的东西。
容器(Container):是基于镜像创建的、可读写的运行实例,是 Docker 真正跑应用的地方。
仓库(Registry):用来集中存储和分发镜像的地方,相当于镜像的 “云端货架”。
Docker 客户端(Client):Docker 客户端通过命令行或者其他工具使用 Docker API 与 Docker 的守护进程通信。
Docker 主机(Host):一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
Docker 守护进程:Docker 服务器端进程,负责支撑 Docker 容器的运行以及镜像的管理。
Docker 数据卷:数据卷是 Docker 专为容器数据持久化、共享设计的独立存储目录 / 文件,它与容器生命周期解耦,独立于容器存在,本质是宿主机上的一个真实目录 / 文件,专门用来存放容器产生 / 需要持久化的数据,避免数据随容器删除而丢失。
Dockerfile:是一个文本文件,在这个文本文件中可以使用 Docker 所提供的一些指令来指定构建镜像的细节,后期就可以使用这个 Dockerfile 文件来构建自定义的镜像。
Docker Compose:是用于定义和运行多容器应用程序的工具。通过 yml 文件定义多容器的 Docker 应用,再通过一条命令根据 yml 文件的定义去创建或管理多容器。
5. Dcoker 命令
5.1 服务类命令
|
操作描述 |
对应命令 |
|---|---|
|
查看 docker 版本 |
docker version 或 docker -v |
|
查看 docker 状态 |
systemctl status docker |
|
启动 docker 服务 |
systemctl start docker |
|
开机启动 docker 服务 |
systemctl enable docker |
|
关闭 docker 服务 |
systemctl stop docker |
|
开机禁用 docker 服务 |
systemctl disable docker |
|
重启 docker 服务 |
systemctl restart docker 或 systemctl stop docker && systemctl start docker |
|
查看 docker 帮助 |
docker --help或docker [子命令] --help(如 docker run --help) |
|
查看 docker 日志 |
journalctl -u docker或journalctl -u docker -f |
5.2 镜像命令
| 核心功能 | 标准格式 | 关键说明 |
|---|---|---|
|
从 Docker Hub 搜索镜像 |
docker search [选项] <镜像名> |
--limit 限制返回结果数量;优先选 OFFICIAL 官方镜像 |
|
拉取远程镜像到本地 |
docker pull [选项] <镜像名:标签> |
标签指定版本,无标签默认 latest;可拉取私有仓库镜像(需先登录) |
|
列出本地所有镜像 |
docker images [选项] [镜像名] |
-q 输出镜像 ID,常用于批量操作;-a 显示所有镜像(含中间层) |
|
基于 Dockerfile 构建镜像 |
docker build -t <镜像名:标签> <构建上下文路径> |
-t 指定镜像标签;-f 指定非默认 Dockerfile 路径;. 为构建上下文 |
|
从运行 / 停止的容器创建镜像 |
docker commit [选项] <容器ID/名称> <镜像名:标签> |
-a 作者信息;-m 提交说明;适合保存容器当前状态为镜像 |
|
删除本地镜像 |
docker rmi [选项] <镜像名:标签/镜像ID> |
需先删除依赖该镜像的容器;-f 强制删除(慎用,可能导致依赖异常) |
|
导出镜像为 tar 包(保留分层和元数据) |
docker save -o <归档文件.tar> <镜像名:标签> |
支持批量导出多个镜像;导出文件需用 docker load 导入 |
|
导入 docker save 导出的镜像包 |
docker load -i <归档文件.tar> |
保留镜像完整分层、标签和元数据;无法修改镜像标签; -q 静默模式,不显示日志 |
|
导出容器文件系统为 tar 包(单层快照) |
docker export -o <归档文件.tar> <容器ID/名称> |
仅导出容器当前文件系统,丢失镜像分层和元数据 |
|
导入 docker export 包为新镜像 |
docker import <归档文件.tar> <镜像名:标签> |
生成无分层历史的新镜像;需手动指定标签 |
|
为镜像添加新标签(重命名) |
docker tag <镜像ID> <新镜像名:标签> docker tag <原镜像名:标签> |
常用于镜像版本管理或推送私有仓库前重命名 |
|
查看镜像的分层构建历史 |
docker history <镜像名:标签> |
显示每一层的构建命令和大小;可排查镜像体积过大原因 |
|
查看镜像的详细元数据 |
docker inspect <镜像名:标签/镜像ID> |
输出 JSON 格式数据,包含镜像架构、创建时间、环境变量等 |
5.3 容器类命令
| 操作场景 | 核心命令 | 核心说明 |
|---|---|---|
|
查看容器 |
docker ps / docker container ls |
列出运行中的容器;-a 显示所有容器(含已停止);-q 仅输出容器 ID |
|
创建容器(不启动) |
docker create <镜像名> |
基于镜像创建容器但不启动,返回容器 ID(后续用start启动) |
|
启动容器 |
docker start <容器ID/名称> |
启动已创建 / 停止的容器;-i 以交互模式启动 |
|
创建并启动容器 |
docker run <参数> <镜像名> |
-d 后台运行,-it 交互模式,-p 端口映射(可以使用多组映射),-P 随机端口,-h 容器所在主机名字 --name 容器的名字 |
|
端口映射启动 |
docker run -d -p <主机端口>:<容器端口> <镜像名> |
后台启动容器并映射端口,外界可通过主机端口访问容器服务; -e 配置环境变量
|
|
进入运行中容器 |
docker exec -it <容器ID/名称> <终端> |
生产环境首选:进入容器终端且不影响容器运行;退出用exit/Ctrl+P+Q |
|
停止容器 |
docker stop <容器ID/名称> |
优雅停止容器(等待 10 秒保存数据);-t 自定义等待时间(如-t 20) |
|
强制终止容器 |
docker kill <容器ID/名称> |
立即终止容器(发送 SIGKILL 信号),容器无响应 / 卡死时使用 |
|
重启容器 |
docker restart <容器ID/名称> |
相当于 “stop+start”,重启运行中的容器(配置修改后生效) |
|
删除容器 |
docker rm <容器ID/名称> |
删除已停止的容器;-f 强制删除运行中的容器(谨慎) |
|
批量删除容器 |
docker rm -f $(docker ps -aq) |
强制删除所有容器(测试环境清理用,生产环境禁止) |
|
查看容器详情 |
docker inspect <容器ID/名称> |
查看容器完整配置(网络、挂载、环境变量等) |
|
查看容器日志 |
docker logs <容器ID/名称> |
查看容器运行日志;-f 实时跟踪日志,--tail 100 查看最后 100 行 |
|
复制文件到容器 |
docker cp <主机文件> <容器ID>:<容器路径> |
主机文件复制到容器内(自定义页面 / 配置常用) |
|
复制文件出容器 |
docker cp <容器ID>:<容器文件> <主机路径> |
容器文件复制到主机(备份 / 查看配置常用) |
5.4 Docker 常用的命令
5.4.1 查看 Docker 日志
# 查看最近100行 Docker 日志
journalctl -u docker -n 100
# 查看指定时间段的 Docker 日志(示例:2026-09-13 到 2026-09-15)
journalctl -u docker --since="2026-09-13 00:00:00" --until="2026-09-15 23:59:59"
# -f 参数表示实时跟踪日志
journalctl -u docker -f
5.4.2 进入容器操作
# 进入到容器中同时打开一个shell窗口


# nsenter 进入容器

5.4.3 导入和导出容器
docker export 把一个运行中(或停止)的容器的文件系统打包成 tar 包,这个 tar 包里只有容器的文件、目录等数据,不包含任何镜像元数据(比如仓库名、标签、构建历史、环境变量、启动命令等)。
docker import 导入的(仅包含 Nginx 文件系统,无启动命令),所以启动时必须手动指定 Nginx 的启动命令,否则 Docker 不知道要运行 Nginx 服务。
5.4.4 查看容器统计信息
docker stats --no-stream ngnix90

5.5 查看端口信息
ss -lantp

docker port <容器ID/名称>
5.6 不进入容器,但是命令在容器内执行
docker exec 1e7429044e63 whoami
6. 容器开机自启
|
策略 |
正常退出(0) |
异常退出(非0) |
docker stop后 |
Docker 重启后 |
|---|---|---|---|---|
|
no |
不重启 |
不重启 |
不重启 |
不重启 |
|
on-failure[:N] |
不重启 |
重启(最多N次) |
不重启 |
不重启 |
|
always |
重启 |
重启 |
重启 |
重启 |
|
unless-stopped |
重启 |
重启 |
不重启 |
重启(若原在运行) |
6.1 方式一:设置容器开机启动
docker run -p 3306:3306 --name mysql1 -e MYSQL_ROOT_PASSWORD=000000 --restart=always -d mysql:5.7
6.2 方式二:docker update --restart=unless-stopped myapp
6.3 方式三:停止 docker 服务后,修改配置容器的 hostconfig.json,然后启动 docker 服务


7. 总结
Docker 是解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。
- 点赞
- 收藏
- 关注作者

评论(0)