Docker

  1. 什么是 Docker?
  2. 什么要在项目中用到 Docker?
  3. 以及你在项目中是如何使用 Docker 的?

什么是 Docker?

Docker 是一个开源平台,用于开发、交付和运行应用程序。它将应用程序与底层基础设施隔离,从而加速软件交付。Docker 允许以管理应用程序的方式管理基础设施,通过其运送、测试和部署代码的方法,可以显著缩短从编写代码到生产环境中运行的时间。Docker 提供打包和运行应用程序的能力,这些应用程序运行在称为容器的松散隔离环境中。容器轻量级,包含运行应用程序所需的一切,不依赖主机上已安装的内容。Docker 还提供工具和平台来管理容器的生命周期,包括开发、分发、测试和部署。

为什么使用 Docker?

使用 Docker 的主要好处包括:

  • 快速、一致的应用程序交付:Docker 通过本地容器提供标准化环境,简化开发生命周期,适合连续集成和连续交付(CI/CD)工作流程。开发人员可以使用 Docker 容器在本地编写代码、分享工作、推送应用程序到测试环境进行自动化和手动测试,修复后快速部署到生产环境。
  • 响应式部署和扩展:Docker 的容器化平台支持高度可移植的工作负载,可在开发者的本地笔记本电脑、数据中心物理或虚拟机、云提供商或混合环境中运行。其轻量级特性便于动态管理工作负载,根据业务需求即时扩展或缩减应用程序和服务。
  • 在相同硬件上运行更多工作负载:Docker 轻量且快速,提供比基于超管理程序的虚拟机更具成本效益的替代方案,从而更充分利用服务器容量,适合高密度环境和中小型部署,在有限资源下实现更多目标。

Docker 在项目中使用大致流程

  1. 准备项目:创建项目目录,添加源代码、依赖文件(如 requirements.txtpackage.json),并编写 Dockerfile(定义基础镜像、复制文件、安装依赖、暴露端口、运行命令)。

  2. 构建镜像:在项目根目录运行 docker build -t 项目名 . 生成容器镜像。

  3. 运行容器:执行 docker run -p 主机端口:容器端口 项目名 启动容器,访问本地端口测试应用。

  4. 多服务编排(可选):使用 docker-compose.yml 定义服务(如应用+数据库),运行 docker-compose up --build 启动整体环境。

  5. 管理与部署:用 docker ps 查看容器、docker stop/rm 管理;推送镜像至仓库(如 Docker Hub)用于 CI/CD 部署。

提示:开发时挂载卷(-v .:/app)实时同步代码;生产环境优化多阶段构建减小镜像大小。

如何保证 Docker 代码沙箱执行程序时的安全性的?

保证 Docker 代码沙箱执行程序安全性的方法

在 Docker 用于代码沙箱(如执行不受信任代码)时,默认隔离有限,需要多层防护。以下是关键流程和最佳实践,基于官方和专家指南:

  1. 使用非 root 用户运行容器:避免以 root 身份执行,映射容器内 root 到主机非特权用户,减少逃逸风险。
    示例:在 Dockerfile 中添加 USER 1000;运行时用 --user 1000:1000

  2. 启用 Rootless Docker:守护进程和容器以非 root 模式运行,限制特权提升。
    示例:安装 rootless 模式后,设置环境变量 DOCKER_HOST=unix:///run/user/$(id -u)/docker.sock

  3. 限制资源和超时:设置 CPU/内存限额、执行超时,防止资源耗尽或无限循环。
    示例:docker run --cpus=0.5 --memory=512m --ulimit cpu=10 my-image

  4. 网络和文件系统隔离:禁用互联网访问、隐藏主机文件系统、使用只读卷。
    示例:docker run --network none --read-only -v /tmp:/app:ro my-image;每个会话启动独立容器。

  5. 最小化镜像和多阶段构建:使用 slim 基础镜像,排除不必要组件,扫描漏洞。
    示例 Dockerfile:

   FROM python:3.10-slim
   RUN apt-get update && apt-get install -y --no-install-recommends build-essential && rm -rf /var/lib/apt/lists/*
   COPY requirements.txt .
   RUN pip install --no-cache-dir -r requirements.txt
   COPY . .
   USER 1000
   CMD ["python", "app.py"]

构建:docker build --no-cache -t secure-sandbox .

  1. 增强内核隔离:限制系统调用(seccomp)、能力(capabilities)、启用 AppArmor/SELinux。
    示例:docker run --security-opt apparmor=docker-default --cap-drop=ALL --cap-add=NET_BIND_SERVICE my-image

  2. 启用内容信任和扫描:仅运行签名镜像,预扫描漏洞。
    示例:export DOCKER_CONTENT_TRUST=1;用 Trivy 或 Clair 扫描:trivy image my-image

  3. 运行时监控和清理:监控系统调用、自动清理会话,集成 CI/CD QA。
    对于 AI/动态代码,使用 Jupyter 内核管理会话。

这些措施结合使用,可显著降低风险,但非绝对安全(如内核漏洞)。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐