Docker 讲解(CentOS 8 版)

一、容器生态系统(Docker 所处完整技术圈)

容器生态分为核心技术、平台技术、支持技术三层,Docker 是生态基石,完善生态决定容器技术健康发展。

1. 容器核心技术(单主机运行容器的基础)

作用:让容器能在单台宿主机操作系统上正常运行。

  • 容器规范(OCI) 全称:Open Container Initiative(开放容器倡议),由 Docker、CoreOS、Google 等公司联合成立。 核心规范:Runtime Spec(运行时规范)Image Format Spec(镜像格式规范)。 意义:保障不同容器(Docker、rkt 等)、不同 runtime 兼容,实现跨平台可移植

  • 容器 Runtime(运行时) 容器真正运行的“环境”,类比 Java 的 JVM,主流 3 种:

Runtime特点关系
runcDocker 自研,默认 runtime,100% 符合 OCIDocker 现在默认使用
lxcLinux 老牌容器 runtime,轻量Docker 早期用,现已替换
rktCoreOS 开发,符合 OCI,兼容 Docker 镜像独立容器 runtime
  • 容器管理工具 对接 runtime,给用户提供 CLI/API,实现容器启停、管理:

    • lxd:lxc 配套管理工具

    • Docker Engine:Docker 管理工具(含 daemon 后台服务 + docker 客户端)

    • rkt cli:rkt 配套管理工具

  • 容器定义工具 定义容器内容、属性,用于构建镜像:

    • Dockerfile:文本文件,记录镜像构建指令

    • Docker 镜像:容器运行的只读模板

    • ACI:rkt 容器镜像格式(类比 Docker 镜像)

  • Registry(镜像仓库) 统一存放镜像的仓库,分公共/私有:

    • Docker Hub:Docker 官方公共仓库

    • 阿里云 ACR、华为云 SWR:国内公共镜像仓库

    • 企业私有仓库:自建,存放内部镜像

  • 容器 OS 专为容器定制的极简操作系统,体积小、启动快、效率高

    • CoreOS、Atomic、Ubuntu Core

2. 容器平台技术(容器集群化、分布式管理)

作用:让容器从“单主机”升级为集群/分布式环境运行。

  • 容器编排引擎:核心,管理大规模容器集群(调度、扩容、服务发现)

    • Kubernetes(K8s):Google 主导,行业标准

    • Docker Swarm:Docker 原生编排,轻量

    • Mesos+Marathon:通用集群调度平台

  • 容器管理平台:基于编排引擎,提供可视化/简化管理

    • Rancher、ContainerShip

  • 基于容器的 PaaS:面向开发者,屏蔽底层,专注应用开发

    • Deis、Flynn、Dokku

3. 容器支持技术(容器运维必备配套)

作用:保障容器稳定、安全、高效运行。

  • 容器网络:docker network、flannel、weave、calico

  • 服务发现:etcd、consul、zookeeper

  • 监控:docker ps/top/stats、sysdig、cAdvisor/Heapster、Weave Scope

  • 数据管理:Flocker(容器数据持久化/迁移)

  • 日志管理:docker logs、logspout

  • 安全性:OpenSCAP(镜像漏洞扫描)

二、Docker 基础认知(What/Why/How)

1. 容器发展史(时间线)

  • 1979:Unix V7 引入 Chroot Jail(最早容器化雏形)

  • 2000:FreeBSD Jail(增强隔离)

  • 2008:LXC(Linux Containers),首个完整容器管理器

  • 2013:Docker 首次发布,基于 LXC,简化容器使用

  • 2014:Docker 自研 libcontainer,替换 LXC;Google 推出 LMCTFY

  • 2014.12:CoreOS 发布 rkt

2. What:什么是容器?

容器是轻量级、可移植、自包含的软件打包技术

  • 打包内容:应用程序 + 所有依赖(库、配置、运行时)

  • 核心特性:共享宿主机内核、进程级隔离、秒级启动、低资源消耗

  • 类比:现实中的集装箱,标准化、可跨环境运输

3. Why:为什么用容器?(解决核心痛点)

传统开发/部署痛点:环境不一致、依赖冲突、迁移难、部署慢

  • 容器优势:

    1. Build Once, Run Anywhere:一次打包,到处运行(开发/测试/生产环境一致)

    2. 轻量高效:共享内核,秒级启动,一台服务器跑上千容器

    3. 隔离安全:进程级隔离,容器间互不干扰

    4. 快速部署/扩容:镜像复用,一键启停

    5. 微服务适配:天然适配微服务架构

4. 容器 vs 虚拟机(核心区别·超详细)

对比维度容器虚拟机(VMware/KVM)
内核共享宿主机内核独立内核(每个 VM 一个)
隔离级别进程级隔离(资源/网络隔离)系统级隔离(完整操作系统隔离)
启动速度秒级/毫秒级分钟级
镜像大小MB 级(几十~几百)GB 级(几十)
资源消耗极低(仅占用进程资源)高(完整系统开销)
运行密度单主机可跑 1000+ 容器单主机一般几十台 VM
性能接近原生弱(虚拟化损耗)
适用场景微服务、DevOps、云原生传统应用、操作系统级隔离

5. Docker 架构(C/S 架构·核心)

Docker 采用客户端-服务器(C/S)架构,客户端与服务端可同机/跨机通信。

  • 客户端(Docker Client) 工具:docker 命令(CLI) 作用:用户交互入口,发送请求(build/pull/run)给 Docker Daemon。

  • 服务端(Docker Daemon/dockerd) 后台进程,Docker 核心,管理:镜像、容器、网络、数据卷。

  • 镜像(Image) 只读模板,创建容器的基础,包含应用+依赖+配置。

  • 容器(Container) 镜像的可运行实例,唯一可写层,隔离运行应用。

  • Registry(镜像仓库) 存储/分发镜像,Docker Hub 是默认公共仓库。

6. Docker 三大核心概念(必记)

  • 镜像(Image):只读、分层、可共享、不可修改

  • 容器(Container):镜像运行实例、可读写、独立进程、可启停

  • 仓库(Repository):镜像存储中心,分公共/私有

三、Docker 安装与配置(CentOS Stream 8)

1. 环境准备(虚拟机配置)

  1. 基于 CentOS Stream 8 模板克隆虚拟机,命名 docker

  2. 配置静态 IP192\.168\.108\.30,网关 192\.168\.2,DNS 192\.168\.2

  3. 修改主机名:

 hostnamectl set-hostname docker
  1. 重启网卡生效:

 nmcli connection modify ens160 ipv4.method manual ipv4.addresses 192.168.30/24 ipv4.gateway 192.168.2 ipv4.dns 192.168.2 autoconnect yes
 nmcli con up ens160

2. 安装 Docker CE(社区版)

步骤1:卸载旧版本(可选)
 yum remove docker-ce
步骤2:安装依赖+配置阿里云 Docker 源
 # 安装依赖
 yum install -y yum-utils device-mapper-persistent-data lvm2 vim
 ​
 # 添加阿里云 Docker 仓库
 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
 ​
 # 刷新缓存
 yum makecache
步骤3:安装 Docker CE
 yum install -y docker-ce
步骤4:启动+开机自启
 systemctl enable docker --now
步骤5:验证安装
 # 查看版本
 docker --version
 # 查看运行状态
 systemctl status docker

3. 配置镜像加速器(必做·加速拉取镜像)

默认 Docker Hub 国内慢,配置阿里云/华为云加速器

阿里云加速器配置
 # 1. 创建配置目录
 mkdir -p /etc/docker
 ​
 # 2. 写入加速器配置(替换为自己的阿里云加速器地址)
 tee /etc/docker/daemon.json <<-'EOF'
 {
   "registry-mirrors": ["https://spcqvmfn.mirror.aliyuncs.com"]
 }
 EOF
 ​
 # 3. 生效配置
 systemctl daemon-reload
 systemctl restart docker
 ​
 # 4. 验证(查看 Registry Mirrors)
 docker info
华为云加速器配置
 tee /etc/docker/daemon.json <<-'EOF'
 {
   "registry-mirrors": ["https://054b8ac70e80.mirror.swr.myhuaweicloud.com"]
 }
 EOF
 ​
 systemctl daemon-reload
 systemctl restart docker

4. Docker C/S 分离部署(跨机管理)

架构
  • Server:192.168.108.30(安装完整 Docker,开放 2375 端口)

  • Client:192.168.108.31(仅安装客户端,远程管理 Server)

Server 端配置
  1. 修改 Docker 服务,开放 2375 端口:

 vim /usr/lib/systemd/system/docker.service
 # 在 ExecStart 末尾添加:-H tcp://0.0.0.0:2375
 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd -H tcp://0.0.0.0:2375
  1. 生效配置+重启:

 systemctl daemon-reload
 systemctl restart docker
  1. 关闭防火墙:

 systemctl stop firewalld
  1. 验证端口监听:

 yum install lsof
 lsof -i :2375
Client 端配置

仅安装 Docker 客户端:

 yum install -y yum-utils
 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
 yum makecache
 yum install -y docker-ce-cli
Client 远程操作 Server
# 远程执行 docker run(Server 端创建容器)
docker -H 192.168.108.30 run hello-world

# 查看 Server 端镜像
docker -H 192.168.108.30 images

5. 运行第一个容器(hello-world)

 # 拉取+运行 hello-world 镜像
 docker run hello-world
 ​
 # 清空实验环境
 docker rm -f $(docker ps -aq)  # 删除所有容器
 docker rmi -f hello-world      # 删除镜像

6. 运行 Web 容器(httpd)

 # 后台运行,主机 80 端口映射容器 80 端口
 docker run -d -p 80:80 --name my-httpd httpd
 ​
 # 验证(浏览器/ curl 访问主机 IP)
 curl 192.168.108.30
 # 输出:It works!

四、Docker 镜像(核心·分层原理+构建)

1. 镜像本质(分层只读文件系统)

(1)内核与 rootfs
  • bootfs:系统启动文件,内核加载后卸载

  • rootfs:用户空间文件(/bin、/etc、/usr 等),镜像仅包含 rootfs,共享宿主机内核

(2)分层结构(核心优势)
  • 镜像由多层只读文件系统叠加而成,每一层对应一个构建指令

  • 共享特性:多个镜像共用基础层,节省磁盘/内存

  • 写时复制(Copy-on-Write):容器仅在最上层添加可写层,镜像层只读,修改仅在可写层生效,不影响原镜像

(3)镜像类型
  • 最小镜像(scratch):空镜像,如 hello-world(仅 13KB)

  • Base 镜像:无父镜像,精简系统镜像(CentOS、Ubuntu、Alpine)

2. 镜像构建(2 种方式)

方式1:docker commit(临时镜像·不推荐)

步骤:运行容器 → 修改容器 → 提交为新镜像

# 1. 启动 ubuntu 容器
docker run -it ubuntu

# 2. 容器内安装 vim
apt-get update
apt-get install -y vim

# 3. 退出容器,查看容器 ID
exit
docker ps -a

# 4. 提交为新镜像
docker commit 容器ID ubuntu-with-vim:1.0

# 查看新镜像
docker images

缺点:手动、不可复用、无版本、无法审计

方式2:Dockerfile(推荐·自动化+可复用)

Dockerfile:文本格式构建脚本,记录镜像所有构建指令

(1)Dockerfile 语法规则
  1. 指令大写,参数小写

  2. 指令从上到下顺序执行

  3. \# 表示注释

  4. 每条指令生成一个新镜像层

(2)Dockerfile 常用指令(语法+示例)
指令作用示例
FROM指定基础镜像(第一条)FROM centos:8
MAINTAINER镜像作者MAINTAINER 张三
RUN构建时执行命令(生成新层)RUN yum install \-y vim
COPY复制本地文件到镜像COPY \./file\.txt /root/
ADD复制+自动解压压缩包ADD jdk\.tar\.gz /usr/local/
WORKDIR设置工作目录WORKDIR /app
ENV设置环境变量ENV JAVA\_HOME=/usr/local/jdk
EXPOSE声明容器端口EXPOSE 80
CMD容器启动默认命令(可覆盖)CMD \[\&\#34;nginx\&\#34;, \&\#34;\-g\&\#34;\]
ENTRYPOINT容器启动固定命令(不可覆盖)ENTRYPOINT \[\&\#34;/bin/bash\&\#34;\]
(3)RUN/CMD/ENTRYPOINT 核心区别
  • RUN构建镜像时执行(安装软件、配置环境),生成新镜像层

  • CMD容器启动默认命令docker run 镜像 命令 可覆盖

  • ENTRYPOINT容器启动必执行,CMD 仅作为参数传递

(4)构建命令
 # -t:镜像名:标签;.:构建上下文(当前目录)
 docker build -t my-centos:1.0 .
 ​
 # 构建+不使用缓存
 docker build -t my-centos:1.0 --no-cache .

3. 镜像缓存机制

Docker 会缓存已构建的镜像层

  • 指令不变:复用缓存,加速构建

  • 指令变更/顺序调整:缓存失效,重新构建

4. 镜像命名与标签(Tag)

(1)镜像格式

\[仓库地址/命名空间/\]镜像名:标签 示例:docker\.io/library/httpd:2\.4(Docker Hub 官方)、swr\.cn\-east\-3/gaoqiaodong/centos:1\.0(华为云)

(2)latest 标签

默认标签,不代表最新版本,生产环境必须指定具体标签

(3)标签最佳实践

版本迭代时,多标签映射:

  • 1.9.1:具体版本

  • 1.9:1.9.x 最新

  • 1:1.x 最新

  • latest:所有版本最新

 # 打标签
 docker tag myapp:1.9.1 myapp:1.9
 docker tag myapp:1.9.1 myapp:1
 docker tag myapp:1.9.1 myapp:latest

5. 镜像常用命令

 # 查看镜像列表
 docker images
 ​
 # 搜索镜像(Docker Hub)
 docker search nginx
 ​
 # 拉取镜像
 docker pull nginx:1.24
 ​
 # 删除镜像(-f 强制)
 docker rmi -f nginx:1.24
 ​
 # 查看镜像分层历史
 docker history nginx:1.24
 ​
 # 保存镜像为 tar
 docker save nginx:1.24 -o nginx.tar
 ​
 # 加载 tar 镜像
 docker load -i nginx.tar

五、Docker 容器(操作+数据卷+网络)

1. 容器生命周期

创建 → 启动 → 运行 → 暂停/停止 → 删除

2. 容器常用命令(高频)

 # 1. 启动容器
 # -d:后台运行;-p:端口映射;--name:命名
 docker run -d -p 80:80 --name my-nginx nginx
 ​
 # 2. 查看容器
 docker ps          # 运行中
 docker ps -a       # 所有(含停止)
 docker ps -q       # 仅显示容器 ID
 ​
 # 3. 进入容器
 # -it:交互模式+终端
 docker exec -it my-nginx bash
 ​
 # 4. 启停/重启容器
 docker start my-nginx
 docker stop my-nginx
 docker restart my-nginx
 ​
 # 5. 删除容器(-f 强制删除运行中)
 docker rm -f my-nginx
 docker rm -f $(docker ps -aq)  # 批量删除所有容器
 ​
 # 6. 查看容器日志
 docker logs my-nginx
 docker logs -f my-nginx  # 实时跟踪
 ​
 # 7. 查看容器资源
 docker stats my-nginx

3. 容器数据卷(数据持久化)

容器删除,默认数据丢失,数据卷实现持久化+宿主机共享

(1)数据卷挂载
 # 宿主机目录:容器目录
 docker run -d -p 80:80 -v /data/nginx:/usr/share/nginx/html my-nginx
(2)数据卷特点
  • 数据卷独立于容器,容器删除数据不丢

  • 宿主机与容器双向读写

  • 支持多个容器共享

4. 容器网络

Docker 内置网络驱动:

  • bridge:默认桥接网络

  • host:共享宿主机网络

  • none:无网络

  • overlay:跨主机网络(K8s)

六、Docker 仓库(公共+私有)

1. 公共仓库

(1)Docker Hub

官方公共仓库,注册账号后上传/下载镜像

 # 登录
 docker login
 ​
 # 打标签(账号/镜像名)
 docker tag myapp:1.0 用户名/myapp:1.0
 ​
 # 上传
 docker push 用户名/myapp:1.0
 ​
 # 下载
 docker pull 用户名/myapp:1.0
(2)华为云 SWR/阿里云 ACR

国内公共仓库,步骤同上,仅替换仓库地址

2. 私有仓库

(1)简易私有仓库(registry)
 # 启动私有仓库(端口 5000,挂载宿主机目录)
 docker run -d -p 5000:5000 -v /myregistry:/var/lib/registry registry:2
 ​
 # 打标签(仓库地址/镜像名)
 docker tag myapp:1.0 localhost:5000/myapp:1.0
 ​
 # 上传
 docker push localhost:5000/myapp:1.0
 ​
 # 下载
 docker pull localhost:5000/myapp:1.0
(2)企业级私有仓库(Harbor)

功能:Web UI、权限管理、镜像扫描、日志审计、多项目管理

(1)安装步骤
  1. 下载离线包:

 wget https://github.com/goharbor/harbor/releases/download/v2.9.1/harbor-offline-installer-v2.9.1.tgz
  1. 解压+移动:

 tar -xvf harbor-offline-installer-v2.9.1.tgz
 mv harbor /opt/
  1. 配置 Harbor:

 cd /opt/harbor
 cp harbor.yml.tmpl harbor.yml
 vim harbor.yml
 # 修改 hostname:192.168.108.30
 # 修改 harbor_admin_password:自定义密码
  1. 安装:

 ./prepare
 ./install.sh
  1. 访问:http://192\.168\.108\.30(账号 admin,密码自定义)

(2)Harbor 使用
  1. 创建用户/项目

  2. 配置 Docker 信任 Harbor:

 vim /etc/docker/daemon.json
 {
   "insecure-registries": ["192.168.108.30"]
 }
 systemctl daemon-reload
 systemctl restart docker
  1. 登录上传:

 docker login 192.168.108.30
 docker tag myapp:1.0 192.168.30/cloud/myapp:1.0
 docker push 192.168.30/cloud/myapp:1.0

七、Dockerfile 实操案例

案例1:自定义 CentOS+SSH 镜像

 FROM centos:8
 MAINTAINER test
 # 安装 ssh 服务
 RUN yum install -y openssh-server
 # 生成 ssh 密钥
 RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
 # 设置 root 密码为 123456
 RUN echo "root:123456" | chpasswd
 # 暴露 22 端口
 EXPOSE 22
 # 启动 ssh 服务
 CMD ["/usr/sbin/sshd", "-D"]

案例2:自定义 CentOS+Java8 镜像

 FROM centos:8
 MAINTAINER test
 # 设置工作目录
 WORKDIR /usr/local
 # 安装基础工具
 RUN yum install -y vim net-tools
 # 解压 jdk 压缩包(提前放在构建目录)
 ADD jdk-8u461-linux-x64.tar.gz /usr/local/
 # 配置环境变量
 ENV JAVA_HOME=/usr/local/jdk1.8.0_461
 ENV JRE_HOME=$JAVA_HOME/jre
 ENV PATH=$JAVA_HOME/bin:$PATH
 # 启动命令
 CMD ["/bin/bash"]

更多推荐