一、容器技术概述:为什么需要容器?

📦 容器 vs 虚拟机(VM)

特性虚拟机(VM)容器(Container)
架构Hypervisor + Guest OS共享 Host OS 内核
启动速度秒级 ~ 分钟级毫秒级
资源开销高(每个 VM 占用完整 OS 内存/CPU)极低(仅应用进程)
隔离性强(硬件级)中(Namespace + Cgroups)
典型工具VMware, KVMDocker, containerd

✅ 核心价值:环境一致性 + 快速交付 + 资源高效利用

🔑 容器核心技术

  • Namespaces:实现进程、网络、用户等资源的隔离
  • Cgroups:限制 CPU、内存、IO 等资源使用
  • UnionFS(如 overlay2):实现镜像分层与写时复制(Copy-on-Write)

二、容器管理命令(Docker CLI)

前提:已安装 Docker(sudo yum install -y docker-ce 并启动)

1. 启动/停止容器

# 后台运行一个 CentOS 容器
docker run -d --name myweb centos:7 /bin/bash

# 进入容器交互式终端
docker exec -it myweb /bin/bash

# 停止 & 启动
docker stop myweb
docker start myweb

# 查看运行中的容器
docker ps

# 查看所有容器(含已停止)
docker ps -a

2. 删除容器

# 删除已停止的容器
docker rm myweb

# 强制删除运行中的容器
docker rm -f myweb

# 清理所有已停止容器
docker container prune

3. 查看日志与资源

# 实时查看容器日志
docker logs -f myweb

# 查看容器资源使用
docker stats myweb

三、镜像管理命令

镜像是容器的“模板”,只读且分层存储。

1. 获取镜像

# 从 Docker Hub 拉取
docker pull nginx:alpine
docker pull mysql:8.0

# 搜索镜像
docker search redis

2. 查看与删除镜像

# 列出本地镜像
docker images

# 删除镜像(需先删除依赖容器)
docker rmi nginx:alpine

# 清理无用镜像(悬空镜像)
docker image prune

3. 导出/导入镜像(离线迁移)

# 导出为 tar 文件
docker save nginx:alpine > nginx-alpine.tar

# 从 tar 导入
docker load < nginx-alpine.tar

四、定制简单镜像:Dockerfile 入门

通过 Dockerfile 定义镜像构建步骤,实现可重复、版本化的镜像构建。

示例:构建一个带 vim 和 net-tools 的 CentOS 镜像

# Dockerfile
FROM centos:7

# 设置时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 安装基础工具
RUN yum install -y vim net-tools wget curl && \
    yum clean all

# 设置默认命令(避免容器启动后立即退出)
CMD ["/bin/bash"]

构建并运行

# 构建镜像(注意末尾的 .)
docker build -t my-centos:1.0 .

# 运行容器
docker run -it my-centos:1.0

💡 最佳实践:

  • 合并 RUN 命令减少镜像层数
  • 使用 .dockerignore 排除无关文件
  • 镜像标签语义化(如 v1.2.0)

五、为容器配置 Yum 仓库(解决网络问题)

在企业内网或离线环境中,容器可能无法访问公网 Yum 源。此时需挂载自建 Yum 仓库。

方法:通过 Volume 挂载宿主机 repo 文件

步骤 1:宿主机准备 Yum 源(假设已搭建 HTTP 仓库)
# 宿主机创建 repo 文件
cat > /etc/yum.repos.d/internal.repo <<EOF
[internal]
name=Internal Repo
baseurl=http://192.168.88.151/centos7
gpgcheck=0
enabled=1
EOF
步骤 2:运行容器时挂载 repo 目录
docker run -it \
  -v /etc/yum.repos.d:/etc/yum.repos.d:ro \
  centos:7 \
  /bin/bash

✅ 容器内即可使用内网 Yum 源安装软件:

yum install -y httpd

六、容器内安装部署服务:以 Apache 为例

目标:在容器中部署 Web 服务,并对外提供访问。

方案 A:临时容器(适合测试)

# 启动容器并安装 Apache
docker run -it centos:7 /bin/bash

# 容器内执行:
yum install -y httpd
echo "<h1>Hello from Container!</h1>" > /var/www/html/index.html
httpd -D FOREGROUND  # 前台运行(否则容器退出)

❌ 缺点:容器删除后配置丢失。


方案 B:构建专用镜像(推荐生产)

1. 编写 Dockerfile
# Dockerfile-apache
FROM centos:7

RUN yum install -y httpd && yum clean all
COPY index.html /var/www/html/

EXPOSE 80
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
2. 准备首页文件
echo "<h1>Welcome to My Apache in Docker!</h1>" > index.html
3. 构建并运行
# 构建
docker build -t my-apache:1.0 -f Dockerfile-apache .

# 运行并映射端口
docker run -d --name web -p 8080:80 my-apache:1.0
4. 验证
curl http://localhost:8080
# 输出:<h1>Welcome to My Apache in Docker!</h1>

✅ 优势:

  • 镜像可版本管理
  • 一键部署多实例
  • 与 CI/CD 流水线集成

七、进阶思考:容器不是虚拟机!

许多初学者会犯的错误:

  • 在容器中运行多个服务(如 SSH + Nginx + PHP)
  • 把容器当长期运行的服务器使用

✅ 正确姿势:

  • 一个容器 = 一个进程(单一职责)
  • 无状态设计:数据持久化用 Volume
  • 不可变基础设施:配置变更应重建镜像,而非修改运行中容器

更多推荐