博主大二计科学生一枚,刚刚学完Docker技术,结合自己的理解和ai辅助,写下了这篇笔记方便大家复习后端开发技术,祝大家都能拿高薪、进大厂!
1.引入
在公司中,有若干台服务器,其分配往往是这样的,a台服务器专门用于部署项目的后端,b台服务器专门用于部署项目的前端,c台服务器专门用作项目的数据库,d台服务器专门用作Redis等等,对于大多数企业来说一台服务器不可能只部署一个项目,往往是要部署多个项目的,但要部署多个项目问题就来了,不同项目的其环境的依赖的不同,一台服务器只能有一个环境,如何解决?
在Docker技术出来之前,我们采用安装虚拟机的方式,但是仅一台虚拟机能够正常运行就需要至少20GB的空间,更别说安装多台虚拟机,这将会十分浪费服务资源,于是Docker Inc公司开发出了Docker这一项目去解决这个问题。
Docker技术解决不同项目的其环境的依赖的不同的方法是将一台机器各个进程相互隔离,各个隔离的进程都是具有项目及其独立环境的精简型操作系统
2.Docker
2.1Docker基础概念及理解
-
定义:Docker 是一种容器化技术,可以将应用程序及其依赖环境(如代码、库、配置文件等)打包成一个轻量级、可移植的“容器”,让应用在任何地方都能快速运行。
-
这个轻量级、可移植的容器也可以理解为一个包含项目所有依赖环境及项目在内的一个操作系统,可以让应用在任何地方都能快速运行
-
-
核心思想:一次构建,处处运行(“Build once, run anywhere”)。
-
Docker 的通俗理解
-
传统方式: 安装应用需要手动配置环境(比如 Python 版本、数据库依赖),容易遇到“在我电脑上能跑,到你的电脑就报错”的问题。
-
Docker 方式: 把应用和它的环境一起打包成一个“集装箱”(容器),直接运到任何支持 Docker 的机器上,开箱即用。
-
类比:
-
虚拟机 = 租一整栋房子(占用资源多,启动慢)。
-
Docker 容器 = 租一个房间(轻量级,秒级启动)。
-
-
2.2Docker的核心组件
2.2.1Docker镜像
-
Docker镜像的定义:Docker 镜像是 一个轻量级、可执行的独立软件包,基于 分层文件系统(UnionFS) 构建,包含运行某个应用程序所需的 所有代码、运行时环境、系统工具、库和配置。
-
Docker镜像的组成(Docker镜像的构建原理)
-
Docker镜像基于分层文件系统构建,其一般可以分为基础镜像层与顶层
(顶层又称为可写层、容器层)
-
基础镜像层最底层有两个非常重要的镜像
bootfs
和rootfs
,其作用见讲义 -
我们每次构建新的镜像就是基于基础镜像层再添加一个可写层,我们在可写层中对基础镜像层做的任何修改都不会影响到基础镜像层
-
这就可以以ps中的图层知识理解,我们在上一层图层中对下层图层的任何修改涂画都不会影响到下层图层
-
由于可写层仅在容器运行时存在又叫做容器层
-
-
-
Docker镜像的特点
-
只读:基础镜像层时只读的,不可修改,构建成的新的Docker镜像也是只读的不可修改
-
镜像是 Docker 容器运行的静态模板
-
2.2.2Docker容器
-
Docker容器的定义:Docker 容器是 Docker 镜像的运行实例,是一个轻量级、可移植的独立进程环境,基于 Linux 内核的隔离技术(如
cgroups
和namespaces
)实现资源隔离。容器与宿主机共享操作系统内核,但拥有独立的文件系统、网络和进程空间。 -
定义理解
-
容器理解:镜像运行时会产生一个可写层,这个可写层就像容器一样装着基础镜像层
-
动态实例:容器是镜像的运行时表现,相当于“启动了的镜像”
-
隔离环境:每个容器拥有独立的文件系统、网络、进程树和资源限制(CPU/内存)。
-
轻量级:容器直接运行在宿主机的内核上,无需虚拟化硬件,启动速度极快(毫秒级)。
-
临时性:默认情况下,容器停止后其可写层的数据会丢失(除非使用数据卷或持久化存储)
-
2.2.3Dockerfile
-
引入:
-
在实际开发中,往往会遇到公司硬件更新,需要将一个项目从一台旧服务器迁徙的到新服务器中的场景,当是位于宿主机中的容器是不可迁移的,如果我们只迁移项目,那么在新服务器中这个项目所有环境依赖需要重新设置,部署项目过程中用到linux工具需要重新下载,端口相关需要重新设置,启动项目后默认进入目录需要重新设置、......十分麻烦,我们需要一个工具帮我们自动完成这些工作,这个工具便是Dockerfile组件
-
我们拉取并启动镜像文件后,为什么会直接进入某一特定工作目录?拉取镜像文件后它是如何在隔离的进程中配置置其对应版本的环境依赖,运行启动镜像命令后+/bin/bash为什么会直接进入容器内部?这些是如何设置的?——通过Dockerfile文件
-
-
Dockfile定义:Dockerfile 是一个文本文件,包含一系列指令,用于定义如何自动构建 Docker 镜像。它就像一份“菜谱”,告诉 Docker 如何一步步组装你的应用环境。
-
文件内容组成见讲义
-
2.2.4仓库
定义:存放镜像的地方(如 Docker Hub、阿里云镜像仓库)。类似于“应用商店”。
2.2.5核心组件小结
组件 | 作用 |
---|---|
镜像(Image) | 静态的模板,包含应用和运行环境(如 nginx:latest )。类似于“安装包”。 |
容器(Container) | 镜像的运行实例,是一个隔离的进程(可动态修改)。类似于“运行中的程序”。 |
仓库(Registry) | 存放镜像的地方(如 Docker Hub、阿里云镜像仓库)。类似于“应用商店”。 |
Dockerfile | 文本文件,定义如何构建镜像(比如安装什么软件、复制哪些文件)。类似于“菜谱”。 |
3.Dokcer补充知识点
多是相关知识对比、知识总结
3.1docker commit
与 Dockerfile
构建镜像的区别
1. docker commit
(手动提交容器为镜像)
原理
将正在运行的容器当前状态(包括所有文件修改、环境变量等)保存为一个新镜像。
使用场景
-
临时调试:快速保存容器的修改状态用于测试。
-
紧急修复:生产环境容器出现问题后,快速生成镜像备份。
命令示例
# 1. 启动一个基础容器 docker run -it --name mycontainer ubuntu:22.04 bash # 2. 在容器内修改(如安装软件) apt-get update && apt-get install -y curl # 3. 退出容器后提交为镜像 docker commit -m "Added curl" mycontainer my-ubuntu:v1
优点
-
简单快速:适合临时修改后保存。
缺点
-
不可重复:无法追溯镜像的构建过程(缺少版本控制)。
-
臃肿:容易包含无用文件(如临时下载的安装包)。
-
不透明:他人无法知道镜像是如何构建的。
2. Dockerfile
(声明式构建镜像)
原理
通过文本文件(Dockerfile
)定义镜像的构建步骤,由 Docker 引擎自动执行。
使用场景
-
标准化构建:适合开发、测试、生产环境的镜像交付。
-
版本控制:Dockerfile 可纳入 Git 管理,记录所有变更。
示例 Dockerfile
FROM ubuntu:22.04 RUN apt-get update && apt-get install -y curl
构建命令
docker build -t my-ubuntu:v1 .
优点
-
可重复:同一 Dockerfile 始终生成相同镜像。
-
透明性:构建过程清晰可见(如用了哪些依赖)。
-
自动化:适合 CI/CD 流水线集成。
-
分层优化:复用缓存层,加快构建速度。
缺点
-
学习成本:需掌握 Dockerfile 语法。
-
调试复杂:需通过
docker build
日志排查问题。
3. 核心对比
特性 | docker commit | Dockerfile |
---|---|---|
构建方式 | 手动修改容器后提交 | 声明式脚本自动构建 |
可重复性 | ❌ 依赖人工操作 | ✅ 完全可重复 |
版本控制 | ❌ 无法追溯修改 | ✅ Dockerfile 可纳入 Git |
镜像体积 | 可能包含无用文件(较大) | 仅包含必要步骤(更小) |
适用场景 | 临时调试、紧急备份 | 标准化交付、生产环境 |
维护成本 | 高(需手动记录操作) | 低(脚本化) |
4. 如何选择?
-
优先用
Dockerfile
: 任何需要长期维护、共享或部署的场景。 -
谨慎用
docker commit
: 仅限临时调试或无法用 Dockerfile 时的备用方案。
5. 示例:两种方式实现同一目标
目标:构建一个包含 curl
的 Ubuntu 镜像
方法 1:docker commit
(不推荐)
docker run -it --name temp ubuntu:22.04 bash # 在容器内手动安装 apt-get update && apt-get install -y curl exit docker commit temp ubuntu-with-curl:manual
方法 2:Dockerfile
(推荐)
# Dockerfile FROM ubuntu:22.04 RUN apt-get update && apt-get install -y curl
docker build -t ubuntu-with-curl:auto .
结果对比:
-
docker commit
生成的镜像无法知道curl
是如何安装的。 -
Dockerfile
生成的镜像可通过文件追溯所有步骤。
6. 迁移 docker commit
到 Dockerfile
如果已有 docker commit
的镜像,可逆向生成近似 Dockerfile:
-
检查镜像历史:
docker history ubuntu-with-curl:manual
-
根据输出手动编写 Dockerfile。
总结
-
docker commit
:像“拍照存档”,适合临时保存容器状态。 -
Dockerfile
:像“烹饪食谱”,适合标准化、自动化构建。
生产环境务必使用 Dockerfile
! 它保证了镜像的可审计性、可维护性和一致性。
3.2Docker常用命令汇总
Docker 常用命令速查手册
1. 镜像管理
命令 | 作用 | 示例 |
---|---|---|
docker images | 列出本地镜像 | docker images |
docker pull | 拉取镜像 | docker pull nginx:latest |
docker rmi | 删除镜像 | docker rmi nginx |
docker build | 构建镜像 | docker build -t myapp:v1 . |
docker tag | 打标签 | docker tag myapp:v1 myrepo/myapp:v1 |
docker push | 推送镜像 | docker push myrepo/myapp:v1 |
2. 容器生命周期
命令 | 作用 | 示例 |
---|---|---|
docker run | 创建并启动容器 | docker run -d -p 80:80 nginx |
docker start | 启动已停止的容器 | docker start mynginx |
docker stop | 停止容器 | docker stop mynginx |
docker restart | 重启容器 | docker restart mynginx |
docker rm | 删除容器 | docker rm mynginx |
docker pause/unpause | 暂停/恢复容器 | docker pause mynginx |
3. 容器运维
命令 | 作用 | 示例 |
---|---|---|
docker ps | 查看运行中的容器 | docker ps -a (含停止的容器) |
docker logs | 查看容器日志 | docker logs -f mynginx |
docker exec | 进入运行中的容器 | docker exec -it mynginx bash |
docker inspect | 查看容器详情 | docker inspect mynginx |
docker stats | 查看资源占用 | docker stats mynginx |
docker top | 查看容器进程 | docker top mynginx |
4. 网络管理
命令 | 作用 | 示例 |
---|---|---|
docker network ls | 列出网络 | docker network ls |
docker network create | 创建网络 | docker network create mynet |
docker network connect | 连接容器到网络 | docker network connect mynet mynginx |
5. 数据卷管理
命令 | 作用 | 示例 |
---|---|---|
docker volume ls | 列出数据卷 | docker volume ls |
docker volume create | 创建数据卷 | docker volume create myvol |
docker volume inspect | 查看数据卷详情 | docker volume inspect myvol |
6. 系统清理
命令 | 作用 | 示例 |
---|---|---|
docker system df | 查看磁盘使用 | docker system df |
docker system prune | 清理无用资源 | docker system prune -a (慎用) |
7. 其他实用命令
命令 | 作用 | 示例 |
---|---|---|
docker cp | 宿主机与容器间复制文件 | docker cp mynginx:/etc/nginx/nginx.conf ./ |
docker diff | 查看容器文件变化 | docker diff mynginx |
docker port | 查看端口映射 | docker port mynginx |
常用组合命令
-
删除所有停止的容器
docker container prune
-
删除所有未被使用的镜像
docker image prune -a
-
一键停止并删除所有容器
docker rm -f $(docker ps -aq)
-
进入容器并启动交互式Shell
docker exec -it mynginx /bin/bash
命令参数速记
参数 | 说明 |
---|---|
-d | 后台运行(detach模式) |
-it | 交互式终端(通常与 /bin/bash 配合) |
-p | 端口映射(宿主机端口:容器端口 ) |
-v | 数据卷挂载(宿主机路径:容器路径 ) |
--name | 指定容器名称 |
--rm | 容器退出后自动删除 |
总结
-
镜像管理:
pull
/build
/push
-
容器操作:
run
/exec
/logs
-
资源查看:
ps
/inspect
/stats
-
数据持久化:
volume
/-v
-
网络配置:
network
掌握这些命令,即可应对 90% 的 Docker 日常操作! 🐳