Docker快速入门——第二章Docker基本概念

第一章传送:Docker快速入门------第一章Docker入门

Docker 镜像

1.什么是Docker镜像

Docker 镜像(Images) 是一个只读模板,用于创建Docker容器(Container)它包含了运行某一个应用程序所需的一切:

  • 操作系统基础(如Ubuntu、Alpine)
  • 运行时环境(如Python、Node.js、Java)
  • 应用代码
  • 依赖库、配置文件等

"📌类比理解:

镜像(Image) ≈ 类(Class)

容器(Container) ≈ 对象(Instance)
你可以用同一个镜像启动多个容器,就像用一个类创建多个对象。"


2.Docker镜像的核心特点

|-------------------------|-----------------------------------------------------|
| 只读性 | 镜像本身不可修改,确保一致性与可重现性 |
| 分层结构(Layered) | 镜像由多个只读层(layers)叠加而成,每一层代表一个文件系统变更 |
| 写时复制(Copy-on-Write) | 容器启动时,在镜像顶部添加一个可写层,只有修改文件时才复制到该层 |
| 轻量 & 高效 | 多个镜像可共享相同的基础层,节省磁盘和网络带宽 |
| 可移植 | 镜像可在任何安装了 Docker 的环境中运行("Build once, run anywhere") |


3.镜像的分层结构(Layering)

Docker 镜像不是单一的"大文件",而是由多个只读层(Layers) 按顺序叠加而成。

每一层代表文件系统的一次变更(change),比如安装一个软件、复制一个文件、设置环境变量等。每一层都是只读的,层与层之间是增量存储(只记录变化),多个镜像可以共享相同的底层(如基础操作系统层)

Docker 镜像 = 一个"透明的三明治"

假设你要做一个三明治:

最底层:一片面包(基础操作系统,比如 Ubuntu)

中间层:涂上花生酱(安装 Python)

再上一层:放上果酱(安装 Flask 框架)

最顶层:放上你的应用代码(app.py

这个三明治做好后,不能直接吃(因为它是"只读模板"),但你可以:

复制一份,然后在上面加生菜、番茄(这就是"容器")

别人也可以用同样的配方做一模一样的三明治

4.如何管理Docker镜像

常用命令

|---------------------------|---------------------------------------|
| docker images | 列出本地所有镜像 |
| docker pull <image> | 从 Registry 拉取镜像(如docker pull nginx) |
| docker build -t myapp . | 从 Dockerfile 构建镜像 |
| docker rmi <image> | 删除本地镜像 |
| docker inspect <image> | 查看镜像详细信息(包括层、配置等) |
| docker history <image> | 查看镜像的构建历史和各层大小 |

5.镜像的命名与标签

镜像名称格式:[registry-host/] [namespace/] repository[:tag]

例如:nginx:latest、library/ubuntu:22.04、myregistry.com/myapp:v1.0

latest 是默认标签,但不推荐在生产中使用,建议使用明确版本号(如 v1.2.3)以确保可重现性。

6.Dockerfile:构建镜像的"配方"

Docker镜像通常通过Dockerfile定义。这是一个文本文件,包含一系列指令:

复制代码
# 使用官方 Python 基础镜像
FROM python:3.11-slim

# 设置工作目录
WORKDIR /app

# 复制依赖文件并安装
COPY requirements.txt .
RUN pip install -r requirements.txt

# 复制应用代码
COPY . .

# 暴露端口
EXPOSE 5000

# 启动命令
CMD ["python", "app.py"]

运行:

复制代码
docker build -t my-python-app .

Docker 容器

1.什么是 Docker 容器?

Docker 容器是一个标准化的软件单元,它将应用程序及其所有依赖(如代码、运行时、系统工具、库和配置文件)打包在一起,确保应用在任何支持 Docker 的环境中都能一致地运行。

2.容器的核心特性

  • 隔离性:每个容器拥有独立的文件系统、网络、进程空间等(通过 Linux 的 namespaces 和 cgroups 实现)。
  • 轻量级:不包含完整操作系统,启动通常只需几毫秒到几秒。
  • 可移植性:一次构建,随处运行("Build Once, Run Anywhere")。
  • 版本控制:容器基于镜像(Image)创建,镜像可版本化、分层存储。
  • 可扩展性:支持快速复制多个相同容器实例,便于水平扩展。

3.容器的生命周期

Docker 容器有以下几种状态:

  • Created:已创建但未启动。
  • Running:正在运行。
  • Paused:暂停运行。
  • Stopped/Exited:已停止。
  • Dead:容器处于不可恢复状态。

常用命令管理容器生命周期:

bash 复制代码
# 启动容器
docker run -d --name myapp nginx

# 查看运行中的容器
docker ps

# 停止容器
docker stop myapp

# 启动已停止的容器
docker start myapp

# 删除容器
docker rm myapp

# 进入容器内部(交互式)
docker exec -it myapp /bin/bash

4.容器与镜像的关系

  • 镜像(Image) :只读模板,用于创建容器。例如 nginx:latest
  • 容器(Container):镜像的运行实例。容器在镜像之上添加一个可写层(称为容器层)。

"✅简单理解:把镜像类比于Java中的类(Class),容器是对象(Instance)"

镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层

容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。

按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume) 、或者 绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。

数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。

Docker 仓库

Docker 仓库(Docker Registry)是用于存储、分发和管理 Docker 镜像(Images)的服务。它是 Docker 生态系统中不可或缺的一部分,使得开发者可以轻松地共享和部署容器化应用。

1. 什么是 Docker 仓库?

Docker 仓库是一个集中存放 Docker 镜像的地方。你可以把它理解为"镜像的代码仓库",类似于 Git 仓库之于源代码。

  • 镜像(Image):应用的打包模板。
  • 仓库(Repository):一组相关镜像的集合(通常是一个应用的不同版本)。
  • 注册表(Registry):托管多个仓库的服务。

2.Docker仓库的类型

1.公共仓库

  • 特点:任何人都可以拉取(pull)镜像,部分允许公开推送(push)。
  • 适用场景:开源项目、官方基础镜像分发。

公有仓库是允许用户免费上传、下载的公开镜像服务。比如官方的 Docker Hub ,也是默认的 Docker Repository,里面拥有着大量的高质量镜像。但是国内访问它可能比较慢,国内的云服务商提供了针对 Docker Hub 的镜像服务(Registry Mirror),这些镜像服务被称为镜像加速器。国内常见有阿里云加速器、网易加速器、DaoCloud 加速器等。

2.私有仓库

  • 特点:仅授权用户可拉取或推送镜像,保障安全。
  • 适用场景:企业内部应用、商业软件、敏感业务系统。

除了公有仓库外,用户还可以在本地搭建私有仓库。Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持 docker 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。除了官方的 Docker Registry 外,还有第三方软件实现了 Docker Registry API,甚至提供了用户界面以及一些高级功能。比如,Harbor 和 Sonatype Nexus。

相关推荐
启山智软5 小时前
【中大企业选择源码部署商城系统】
java·spring·商城开发
我真的是大笨蛋5 小时前
深度解析InnoDB如何保障Buffer与磁盘数据一致性
java·数据库·sql·mysql·性能优化
啦啦啦小石头5 小时前
Docker 换源
docker
怪兽源码5 小时前
基于SpringBoot的选课调查系统
java·spring boot·后端·选课调查系统
恒悦sunsite6 小时前
Redis之配置只读账号
java·redis·bootstrap
梦里小白龙6 小时前
java 通过Minio上传文件
java·开发语言
人道领域6 小时前
javaWeb从入门到进阶(SpringBoot事务管理及AOP)
java·数据库·mysql
sheji52616 小时前
JSP基于信息安全的读书网站79f9s--程序+源码+数据库+调试部署+开发环境
java·开发语言·数据库·算法
毕设源码-邱学长6 小时前
【开题答辩全过程】以 基于Java Web的电子商务网站的用户行为分析与个性化推荐系统为例,包含答辩的问题和答案
java·开发语言
摇滚侠6 小时前
Java项目教程《尚庭公寓》java项目从开发到部署,技术储备,MybatisPlus、MybatisX
java·开发语言