<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Container :: Ay Docs</title>
    <link>https://ops.docs.72602.space/using/container/index.html</link>
    <description>Articles Build Smaller Image Network Mode Container Principle FQA Q1: difference between docker\podmn\buildah You can add standard markdown syntax:&#xA;multiple paragraphs bullet point lists emphasized, bold and even bold emphasized text links etc. ...and even source code the possibilities are endless (almost - including other shortcodes may or may not work)</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Thu, 07 Mar 2024 15:00:59 +0800</lastBuildDate>
    <atom:link href="https://ops.docs.72602.space/using/container/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Build Smaller Image</title>
      <link>https://ops.docs.72602.space/using/container/build_smaller_image/index.html</link>
      <pubDate>Thu, 07 Mar 2024 15:00:59 +0800</pubDate>
      <guid>https://ops.docs.72602.space/using/container/build_smaller_image/index.html</guid>
      <description>减小 Dockerfile 生成镜像体积的方法 1. 选择更小的基础镜像 # ❌ 避免使用完整版本 FROM ubuntu:latest # ✅ 使用精简版本 FROM alpine:3.18 FROM python:3.11-slim FROM node:18-alpine 2. 使用多阶段构建 (Multi-stage Build) 这是最有效的方法之一:&#xA;# 构建阶段 FROM golang:1.21 AS builder WORKDIR /app COPY . . RUN go build -o myapp # 运行阶段 - 只复制必要文件 FROM alpine:3.18 WORKDIR /app COPY --from=builder /app/myapp . CMD [&#34;./myapp&#34;] 3. 合并 RUN 指令 每个 RUN 命令都会创建一个新层:&#xA;# ❌ 多层,体积大 RUN apt-get update RUN apt-get install -y package1 RUN apt-get install -y package2 # ✅ 单层,并清理缓存 RUN apt-get update &amp;&amp; \ apt-get install -y package1 package2 &amp;&amp; \ apt-get clean &amp;&amp; \ rm -rf /var/lib/apt/lists/* 4. 清理不必要的文件 RUN apt-get update &amp;&amp; \ apt-get install -y build-essential &amp;&amp; \ # 构建操作... &amp;&amp; \ apt-get purge -y build-essential &amp;&amp; \ apt-get autoremove -y &amp;&amp; \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* 5. 使用 .dockerignore 文件 # .dockerignore node_modules .git *.md .env test/ 6. 只复制必要的文件 # ❌ 复制所有内容 COPY . . # ✅ 只复制需要的文件 COPY package.json package-lock.json ./ RUN npm ci --only=production COPY src/ ./src/ 7. 移除调试工具和文档 RUN apk add --no-cache python3 &amp;&amp; \ rm -rf /usr/share/doc /usr/share/man 8. 压缩和优化层 # 在单个 RUN 中完成所有操作 RUN set -ex &amp;&amp; \ apk add --no-cache --virtual .build-deps gcc musl-dev &amp;&amp; \ pip install --no-cache-dir -r requirements.txt &amp;&amp; \ apk del .build-deps 9. 使用专门的工具 dive: 分析镜像层 dive your-image:tag docker-slim: 自动精简镜像 docker-slim build your-image:tag 实际案例对比 优化前 (1.2GB): FROM ubuntu:20.04 RUN apt-get update RUN apt-get install -y python3 python3-pip COPY . /app WORKDIR /app RUN pip3 install -r requirements.txt CMD [&#34;python3&#34;, &#34;app.py&#34;] 优化后 (50MB): FROM python:3.11-alpine AS builder WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir --user -r requirements.txt FROM python:3.11-alpine WORKDIR /app COPY --from=builder /root/.local /root/.local COPY app.py . ENV PATH=/root/.local/bin:$PATH CMD [&#34;python&#34;, &#34;app.py&#34;] 关键要点总结 ✅ 使用 Alpine 或 slim 镜像&#xA;✅ 采用多阶段构建&#xA;✅ 合并命令并清理缓存&#xA;✅ 配置 .dockerignore&#xA;✅ 只安装生产环境依赖&#xA;✅ 删除构建工具和临时文件</description>
    </item>
    <item>
      <title>Network Mode</title>
      <link>https://ops.docs.72602.space/using/container/docker_network/index.html</link>
      <pubDate>Thu, 07 Mar 2024 15:00:59 +0800</pubDate>
      <guid>https://ops.docs.72602.space/using/container/docker_network/index.html</guid>
      <description>Docker的网络模式决定了容器如何与宿主机、其他容器以及外部网络进行通信。&#xA;Docker主要提供了以下五种网络模式，默认创建的是 bridge 模式。&#xA;1. Bridge 模式 这是 默认 的网络模式。当你创建一个容器而不指定网络时，它就会连接到这个默认的 bridge 网络（名为 bridge）。&#xA;工作原理：Docker守护进程会创建一个名为 docker0 的虚拟网桥，它相当于一个虚拟交换机。所有使用该模式的容器都会通过一个虚拟网卡（veth pair）连接到这个网桥上。Docker会为每个容器分配一个IP地址，并配置其网关为 docker0 的地址。 通信方式： 容器间通信：在同一个自定义桥接网络下的容器，可以通过容器名（Container Name）直接通信（Docker内嵌了DNS）。但在默认的 bridge 网络下，容器只能通过IP地址通信。 访问外部网络：容器数据包通过 docker0 网桥，再经过宿主机的IPtables进行NAT转换，使用宿主机的IP访问外网。 从外部访问容器：需要做端口映射，例如 -p 8080:80，将宿主机的8080端口映射到容器的80端口。 优劣分析 优点： 隔离性：容器拥有独立的网络命名空间，与宿主机和其他网络隔离，安全性较好。 端口管理灵活：通过端口映射，可以灵活地管理哪些宿主机端口暴露给外部。 通用性：是最常用、最通用的模式，适合大多数应用场景。 缺点： 性能开销：相比 host 模式，多了一层网络桥接和NAT，性能有轻微损失。 复杂度：在默认桥接网络中，容器间通信需要使用IP，不如自定义网络方便。 使用场景：绝大多数需要网络隔离的独立应用，例如Web后端服务、数据库等。&#xA;命令示例：&#xA;# 使用默认bridge网络（不推荐用于多容器应用） docker run -d --name my-app -p 8080:80 nginx # 创建自定义bridge网络（推荐） docker network create my-network docker run -d --name app1 --network my-network my-app docker run -d --name app2 --network my-network another-app # 现在 app1 和 app2 可以通过容器名直接互相访问 2. Host 模式 在这种模式下，容器不会虚拟出自己的网卡，也不会分配独立的IP，而是直接使用宿主机的IP和端口。</description>
    </item>
    <item>
      <title>Container Principle</title>
      <link>https://ops.docs.72602.space/using/container/principle/index.html</link>
      <pubDate>Thu, 07 Mar 2024 15:00:59 +0800</pubDate>
      <guid>https://ops.docs.72602.space/using/container/principle/index.html</guid>
      <description>Linux 容器技术的基础原理 容器技术是现代云原生架构的基石。让我深入讲解 Linux 容器的核心原理。&#xA;🎯 容器的本质 容器 = 特殊的进程&#xA;容器不是虚拟机,它本质上是宿主机上的一个受限进程,通过 Linux 内核的三大核心技术实现隔离和资源限制:&#xA;┌─────────────────────────────────────────┐ │ Linux 容器三大支柱 │ ├─────────────────────────────────────────┤ │ 1. Namespace (命名空间) - 隔离 │ │ 2. Cgroups (控制组) - 资源限制 │ │ 3. Union FS (联合文件系统) - 镜像分层 │ └─────────────────────────────────────────┘ 🔒 Namespace (命名空间) - 视图隔离 Namespace 是 Linux 内核提供的一种资源隔离机制,让进程只能看到属于自己的资源。&#xA;七种 Namespace Namespace 隔离内容 内核版本 示例 PID 进程 ID 2.6.24 容器内 PID 1 = 宿主机 PID 12345 Network 网络栈 2.6.29 独立的 IP、端口、路由表 Mount 文件系统挂载点 2.4.19 独立的根目录 UTS 主机名和域名 2.6.19 容器有自己的 hostname IPC 进程间通信 2.6.19 消息队列、信号量、共享内存 User 用户和组 ID 3.8 容器内 root ≠ 宿主机 root Cgroup Cgroup 根目录 4.6 隔离 cgroup 视图 1️⃣ PID Namespace (进程隔离) 原理 每个容器有独立的进程树,容器内看不到宿主机或其他容器的进程。</description>
    </item>
  </channel>
</rss>