操作系统如何管理进程?
-
进程之间的关系:
- 互相可见并且可以通信
- 使用同一个文件系统,可对同一文件进行读写操作
- 使用相同的系统资源
-
问题:
- 安全问题:高级权限进程可能攻击其他进程
- 文件系统问题:数据冲突、数据污染、依赖冲突
- 资源抢占问题:资源争用导致其他应用无法正常提供服务
如何为进程提供独立运行环境?
chroot
- 改变进程的根目录,实现文件系统视图隔离
Namespace
- 实现资源视图上的隔离,使进程相互不可见,保证独立运行环境
Cgroup
- 限制进程的资源使用率,如 CPU 和内存,实现资源控制
定义容器
- 容器是具有以下特征的进程集合:
- 视图隔离:只能看到部分进程,具有独立的主机名等
- 独立的文件系统:仅包含容器运行所需的文件集合(如二进制文件、配置文件和依赖),不需要内核相关代码或工具
- 资源限制:控制内存大小、CPU 使用个数等
容器提供了一个独立的运行环境,使得应用程序可以在不同的环境之间一致地运行。
容器的优势
- 隔离性:保证进程之间互不影响,提高系统安全性和稳定性
- 资源控制:防止资源抢占,提高资源利用率
- 轻量级:只包含运行所需的必要文件,启动快速,占用空间较小
通过上述技术,容器为每个进程提供了一个独立、受控的运行环境,从而解决了操作系统进程管理中的安全、文件系统冲突和资源争用等问题。
什么是镜像?
在容器化技术中,镜像(Image)是一个包含应用程序及其所有依赖项的只读模板,用于创建容器。镜像定义了容器所需的一切内容,包括操作系统组件、应用程序文件、库和配置文件等。
Docker 镜像的特性
-
分层结构:
- Docker 镜像由多个只读层组成,每一层表示镜像的一个版本变化。分层结构允许镜像的各个部分复用,从而节省存储空间和加快下载速度。
-
不可变性:
- 一旦创建,镜像是不可变的。无法直接修改镜像,所有的改动必须通过创建一个新层来完成。这保证了镜像的一致性和稳定性。
-
便携性:
- 镜像可以通过 Docker Hub 或其他镜像仓库分发和共享,这使得应用程序和其环境能够在不同的系统和平台之间一致地运行。
镜像的基本概念
-
基础镜像(Base Image):
- 基础镜像是没有其他依赖的镜像,通常包括基础操作系统例如
ubuntu,alpine或centos。
- 基础镜像是没有其他依赖的镜像,通常包括基础操作系统例如
-
父镜像(Parent Image):
- 每个镜像都有一个父镜像,构成镜像的层次结构。例如,一个 Node.js 应用的镜像可能以
node镜像为父镜像。
- 每个镜像都有一个父镜像,构成镜像的层次结构。例如,一个 Node.js 应用的镜像可能以
-
子镜像(Child Image):
- 在基础镜像的基础上添加一些自定义层就形成了子镜像。每次对基础镜像进行修改或扩展,会形成一个新的子镜像。
构建镜像
- 创建 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"]
- 创建 .dockerignore 文件
为了避免将不必要的文件复制进镜像,可以创建 .dockerignore 文件,内容如下:
node_modules
npm-debug.log
- 构建 Docker 镜像
在项目根目录下打开终端,运行以下命令构建 Docker 镜像:
docker build -t my-node-app .
上述命令中,
-t my-node-app指定了镜像的名称为my-node-app,点号.表示 Dockerfile 所在的当前目录。
- 运行 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