云原生技术系列 ---- 容器与镜像

136 阅读4分钟

操作系统如何管理进程?

  1. 进程之间的关系

    • 互相可见并且可以通信
    • 使用同一个文件系统,可对同一文件进行读写操作
    • 使用相同的系统资源
  2. 问题

    • 安全问题:高级权限进程可能攻击其他进程
    • 文件系统问题:数据冲突、数据污染、依赖冲突
    • 资源抢占问题:资源争用导致其他应用无法正常提供服务

如何为进程提供独立运行环境?

chroot

  • 改变进程的根目录,实现文件系统视图隔离

Namespace

  • 实现资源视图上的隔离,使进程相互不可见,保证独立运行环境

Cgroup

  • 限制进程的资源使用率,如 CPU 和内存,实现资源控制

定义容器

  • 容器是具有以下特征的进程集合:
    • 视图隔离:只能看到部分进程,具有独立的主机名等
    • 独立的文件系统:仅包含容器运行所需的文件集合(如二进制文件、配置文件和依赖),不需要内核相关代码或工具
    • 资源限制:控制内存大小、CPU 使用个数等

容器提供了一个独立的运行环境,使得应用程序可以在不同的环境之间一致地运行。

容器的优势

  • 隔离性:保证进程之间互不影响,提高系统安全性和稳定性
  • 资源控制:防止资源抢占,提高资源利用率
  • 轻量级:只包含运行所需的必要文件,启动快速,占用空间较小

通过上述技术,容器为每个进程提供了一个独立、受控的运行环境,从而解决了操作系统进程管理中的安全、文件系统冲突和资源争用等问题。

Clipboard_Screenshot_1739861228.png

什么是镜像?

在容器化技术中,镜像(Image)是一个包含应用程序及其所有依赖项的只读模板,用于创建容器。镜像定义了容器所需的一切内容,包括操作系统组件、应用程序文件、库和配置文件等。

Docker 镜像的特性

  1. 分层结构

    • Docker 镜像由多个只读层组成,每一层表示镜像的一个版本变化。分层结构允许镜像的各个部分复用,从而节省存储空间和加快下载速度。
  2. 不可变性

    • 一旦创建,镜像是不可变的。无法直接修改镜像,所有的改动必须通过创建一个新层来完成。这保证了镜像的一致性和稳定性。
  3. 便携性

    • 镜像可以通过 Docker Hub 或其他镜像仓库分发和共享,这使得应用程序和其环境能够在不同的系统和平台之间一致地运行。

镜像的基本概念

  1. 基础镜像(Base Image)

    • 基础镜像是没有其他依赖的镜像,通常包括基础操作系统例如 ubuntu, alpinecentos
  2. 父镜像(Parent Image)

    • 每个镜像都有一个父镜像,构成镜像的层次结构。例如,一个 Node.js 应用的镜像可能以 node 镜像为父镜像。
  3. 子镜像(Child Image)

    • 在基础镜像的基础上添加一些自定义层就形成了子镜像。每次对基础镜像进行修改或扩展,会形成一个新的子镜像。

构建镜像

  1. 创建 Dockerfile

首先,在项目根目录下创建一个名为 Dockerfile 的文件。

# 使用官方 Node.js 运行时镜像作为基础镜像
FROM node:18

# 设置工作目录
WORKDIR /app

# 将 package.json 和 package-lock.json 复制到工作目录
COPY package*.json ./

# 安装依赖包
RUN npm install

# 将应用源代码复制到容器
COPY . .

# 暴露应用程序监听的端口
EXPOSE 3000

# 定义容器启动时的命令
CMD ["node", "app.js"]
  1. 创建 .dockerignore 文件

为了避免将不必要的文件复制进镜像,可以创建 .dockerignore 文件,内容如下:

node_modules
npm-debug.log
  1. 构建 Docker 镜像

在项目根目录下打开终端,运行以下命令构建 Docker 镜像:

docker build -t my-node-app .

上述命令中,-t my-node-app 指定了镜像的名称为 my-node-app ,点号 . 表示 Dockerfile 所在的当前目录。

  1. 运行 Docker 容器

在终端中运行以下命令,以基于刚刚构建的镜像启动 Docker 容器:

docker run -p 3000:3000 my-node-app

上述命令中, -p 3000:3000 将容器中的端口 3000 映射到本地主机的端口 3000。

至此,你已经成功将本地的 Node.js Web 服务器生成 Docker 镜像并启动了容器。你应该可以通过在浏览器访问 http://localhost:3000 来查看你的 Web 应用程序。

除了自己构建镜像之外,常常从 docker register 下载镜像

docker pull ubuntu:latest