Docker 容器

type
Post
status
Published
date
Feb 24, 2026
slug
summary
tags
运维
开发
docker
category
技术分享
icon
password

1 概览:什么是容器?为什么用容器

  • 容器 = 轻量级的操作系统级虚拟化
    • 与传统虚拟机对比:启动快(秒级)、无需完整虚拟硬件、共享宿主机内核、I/O 更接近裸机性能。
    • 典型应用场景:快速构建业务环境、便于迁移(减少“在我机子能跑”的兼容问题)、微服务部署等。

2 容器的“三要素”与核心技术

  • 三要素:容器(Container)镜像(Image)仓库/Registry(Repository)
      1. 镜像(Image):用于创建 Docker 容器的模板,相当于一个 root 文件系统。镜像内部是一个精简的操作系统和应用运行所需要的文件以及所有依赖(镜像不包含内核,容器都是共享所在Docker主机的内核),比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
      1. 容器(Container):容器是镜像的运行时实例,可以从单个镜像启动一个或多个容器。
      1. 仓库(Repository):用于存放镜像,可以理解为代码控制中的代码仓库。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。
      notion image
  • 核心技术:
    • Namespaces(命名空间):隔离进程可见的资源集合(例如 PID、NET、MNT、UTS、IPC、USER),实现进程、网络、文件系统等隔离。
      • 示例:一个容器的 PID namespace 隔离后看不到宿主机或其他容器的进程。
    • cgroups(控制组):限制/计量/隔离进程组的资源使用(CPU、内存、IO 等),可以为容器设置最大内存、CPU 权重等。
  • Docker核心架构
    • 1. Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
      2. Docker 容器通过 Docker 镜像来创建。

3 常见容器管理工具/软件

  • Docker(docker-ce / docker-ee)
  • podman(红帽官方)
  • containerd

4 在 CentOS7 上安装 Docker

4.1 先检查系统版本与网络

  • 查看系统版本:
    • 测试网络连通性(例如 ping 公网):
      • 注意:生产环境中尽量不要依赖 ICMP,若公司网络屏蔽 ICMP,可使用 curl 测试 https 地址。

    4.2 配置软件仓库(示例:使用阿里镜像)

    • 将 CentOS 基础 repo 换为国内镜像:
      • 添加 Docker 仓库文件 /etc/yum.repos.d/docker-ce.repo
        • 注意/纠正:设置 gpgcheck=0 会跳过包签名校验,存在安全风险;生产环境建议保留 gpgcheck 并导入 Docker 官方 GPG key。

      4.3 安装并启动 docker

      • 安装:
        • 检查安装的包版本:
          • 启动并设置开机自启:
            • 说明:--now 会同时 start 和 enable。命令会在 /etc/systemd/system/multi-user.target.wants/ 创建指向 unit 的 symlink。

          4.4 配置国内镜像加速(daemon.json)

          • 编辑 /etc/docker/daemon.json
            • 重启 docker:
              • 注意:JSON 要语法合法(不要有尾随逗号)。其次,优先使用 https:// 的镜像源以避免中间人风险;http:// 的镜像源可能被注入风险。

            5 宿主机网络变化(Docker 启动后常见项)

            • Docker 通常会创建一个名为 docker0 的桥接网卡(默认网段通常为 172.17.0.1/16):
              • 内核路由转发(容器做 SNAT/转发时需开启):
                • 若为 0,可临时开启:
                  • 要持久化修改 /etc/sysctl.conf/etc/sysctl.d/*.conf
                • iptables:Docker 会在 nat 表中添加规则(如 MASQUERADE 用于 SNAT):
                  • 常见规则示例:对 172.17.0.0/16 的 POSTROUTING 做 MASQUERADE
                额外说明/注意事项:
                • 新版 Linux 发行版(或启用了 nftables 的系统)可能使用 nftables 而非传统 iptables,Docker 与防火墙/iptables 的交互需要注意(firewalld+Docker 的兼容性问题)。
                • 在有严格安全/网络策略的环境(如企业生产网)上,建议提前规划 Docker 网络(自定义 bridge、macvlan、overlay 等),不要盲目依赖默认 docker0。

                6 镜像基础操作

                • 列出镜像:
                  • 导入本地镜像(load):
                    • 输出会显示各 layer 的加载进度并最终 Loaded image: centos:7
                  • 导出镜像(save):
                    • 其他常用(补充):
                      • 拉取镜像:docker pull <image>:<tag>
                      • 删除镜像:docker rmi <IMAGE ID or NAME>
                      • 推送到仓库:docker push <registry>/<repo>:<tag>(需先 docker login

                    7 重要概念简短解释

                    • 镜像(Image):静态的只读模板(文件系统 + 元数据),可由 Dockerfile 构建。
                    • 容器(Container):镜像的运行实例(镜像 + 可写层 + 运行时状态)。
                    • 仓库/Registry:存放镜像的远程/本地仓库(例如 Docker Hub、私有 registry、镜像加速服务)。
                    • namespace:资源可见性隔离机制(让进程看到的是“自己的世界”)。
                    • cgroup:控制资源(限流与统计),避免单个容器无限占用宿主机资源。

                    8 常见错误与潜在误解

                    1. gpgcheck=0(在 repo 文件中)
                        • 问题:关闭 GPG 校验会跳过软件包签名验证,存在安全风险。
                        • 建议:下载并导入官方 GPG key,保持 gpgcheck=1
                    1. 使用 http:// 镜像源
                        • 问题:未加密的 HTTP 传输可能被篡改。
                        • 建议:优先使用 https://,若必须使用 http://,评估网络环境风险并限定使用范围(内网)。
                    1. 仅查看 ip_forward 而忽略持久化
                        • 问题:sysctl -w 只是临时生效,重启失效。
                        • 建议:将 net.ipv4.ip_forward=1 写入 /etc/sysctl.conf 或新建 /etc/sysctl.d/99-docker.confsysctl -p
                    1. iptables 与 NFT(nftables)冲突
                        • 说明:较新内核/发行版可能使用 nftables;直接用 iptables 查看/修改可能看不到 nft 表。
                        • 建议:确认系统用的是 iptables-legacy 还是 nftables,并采取对应工具(iptables, nftiptables-nft)。
                    1. docker0 默认网段冲突
                        • 问题:若宿主机已有相同网段或公司网络与 172.17.0.0/16 冲突,容器无法访问外网或路由异常。
                        • 建议:在 /etc/docker/daemon.json 中通过 bipdefault-address-pools 自定义网段(示例):

                      9 推荐的进阶学习路线(短)

                      1. 学会用 Dockerfile 构建自定义镜像(理解 layer 缓存机制)。
                      1. 学习 Docker 网络模式:bridge、host、macvlan、overlay(Docker Swarm/Kubernetes 下的 overlay)。
                      1. 资源限制和监控:熟悉 -memory-cpus、cgroup v2 的差异与监控工具(cadvisor、prometheus)。
                      1. 学习容器日志与持久化卷(volumes、bind mount)与备份策略。
                      1. 了解容器安全(名字空间脱离、capabilities、seccomp、SELinux/AppArmor)。

                      10 快速命令清单(备查)

                      • 系统检查:
                        • cat /etc/redhat-release
                        • ping -c3 baidu.com
                      • 配置 repo / 安装:
                        • wget -O /etc/yum.repos.d/CentOS-Base.repo <mirror-url>
                        • yum install -y docker-ce
                        • systemctl enable --now docker
                      • 配置 daemon.json:
                        • 编辑 /etc/docker/daemon.jsonsystemctl restart docker
                      • 网络检查:
                        • ip addr show docker0
                        • cat /proc/sys/net/ipv4/ip_forward
                        • iptables -t nat -nL
                      • 镜像操作:
                        • docker image ls
                        • docker load -i centos7.tar
                        • docker save -o tomcat.tar tomcat:latest
                      Loading...