Docker学习笔记

博主大二计科学生一枚,刚刚学完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镜像基于分层文件系统构建,其一般可以分为基础镜像层顶层(顶层又称为可写层、容器层)

    • 基础镜像层最底层有两个非常重要的镜像bootfsrootfs,其作用见讲义

    • 我们每次构建新的镜像就是基于基础镜像层再添加一个可写层,我们在可写层中对基础镜像层做的任何修改都不会影响到基础镜像层

      • 这就可以以ps中的图层知识理解,我们在上一层图层中对下层图层的任何修改涂画都不会影响到下层图层

      • 由于可写层仅在容器运行时存在又叫做容器层

  • Docker镜像的特点

    • 只读:基础镜像层时只读的,不可修改,构建成的新的Docker镜像也是只读的不可修改

    • 镜像是 Docker 容器运行的静态模板

2.2.2Docker容器
  • Docker容器的定义:Docker 容器是 Docker 镜像的运行实例,是一个轻量级、可移植的独立进程环境,基于 Linux 内核的隔离技术(如 cgroupsnamespaces)实现资源隔离。容器与宿主机共享操作系统内核,但拥有独立的文件系统、网络和进程空间。

  • 定义理解

    • 容器理解:镜像运行时会产生一个可写层,这个可写层就像容器一样装着基础镜像层

    • 动态实例:容器是镜像的运行时表现,相当于“启动了的镜像”

    • 隔离环境:每个容器拥有独立的文件系统、网络、进程树和资源限制(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 commitDockerfile 构建镜像的区别


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 commitDockerfile
构建方式手动修改容器后提交声明式脚本自动构建
可重复性❌ 依赖人工操作✅ 完全可重复
版本控制❌ 无法追溯修改✅ 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 commitDockerfile

如果已有 docker commit 的镜像,可逆向生成近似 Dockerfile:

  1. 检查镜像历史:

    docker history ubuntu-with-curl:manual
  2. 根据输出手动编写 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

常用组合命令
  1. 删除所有停止的容器

    docker container prune
  2. 删除所有未被使用的镜像

    docker image prune -a
  3. 一键停止并删除所有容器

    docker rm -f $(docker ps -aq)
  4. 进入容器并启动交互式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 日常操作! 🐳

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值