文章目录
- [Docker 从入门到实战](#Docker 从入门到实战)
-
- 引言
- [一、Docker 核心亮点](#一、Docker 核心亮点)
- [二、环境部署(CentOS Stream 8 实操)](#二、环境部署(CentOS Stream 8 实操))
-
- [1. 前置依赖](#1. 前置依赖)
- [2. 安装 Docker](#2. 安装 Docker)
- [3. 配置镜像加速器(关键优化)](#3. 配置镜像加速器(关键优化))
- 三、核心概念速通(必懂基础)
-
- [1. 三大核心组件](#1. 三大核心组件)
- [2. 关键原理](#2. 关键原理)
- 四、镜像核心操作(实操重点)
-
- [1. 镜像基础命令](#1. 镜像基础命令)
- [2. 构建自定义镜像(Dockerfile 详解)](#2. 构建自定义镜像(Dockerfile 详解))
-
- [(1)常用 Dockerfile 指令](#(1)常用 Dockerfile 指令)
- [(2)实战:构建带 SSH 的 CentOS 镜像](#(2)实战:构建带 SSH 的 CentOS 镜像)
- (3)构建镜像命令
- [3. 镜像仓库(公有 + 私有)](#3. 镜像仓库(公有 + 私有))
-
- [(1)公有仓库(Docker Hub)](#(1)公有仓库(Docker Hub))
- [(2)私有仓库(Harbor 简化部署)](#(2)私有仓库(Harbor 简化部署))
- 五、容器核心操作(高频实操)
-
- [1. 容器生命周期管理](#1. 容器生命周期管理)
- [2. 容器资源限制(避免资源抢占)](#2. 容器资源限制(避免资源抢占))
- [六、Docker 网络配置(核心难点)](#六、Docker 网络配置(核心难点))
- [七、Docker 存储持久化(避免数据丢失)](#七、Docker 存储持久化(避免数据丢失))
-
- [1. 两种数据卷类型](#1. 两种数据卷类型)
- [2. 实操案例(MySQL 数据持久化)](#2. 实操案例(MySQL 数据持久化))
- [3. 容器间数据共享](#3. 容器间数据共享)
- [八、Docker Compose 多容器编排](#八、Docker Compose 多容器编排)
-
- [1. 安装 Docker Compose](#1. 安装 Docker Compose)
- [2. 核心 yaml 文件(docker-compose.yml)](#2. 核心 yaml 文件(docker-compose.yml))
- [3. Compose 常用命令](#3. Compose 常用命令)
- 九、监控与日志(问题排查)
-
- [1. 容器监控](#1. 容器监控)
- [2. 日志排查](#2. 日志排查)
Docker 从入门到实战
引言
在软件开发和运维中,"环境不一致""部署繁琐""资源占用高" 是长期困扰开发者的痛点。Docker 作为开源容器化技术,通过 "打包镜像、隔离环境、快速部署" 的核心逻辑,完美解决了这些问题 ------ 开发人员构建一次镜像,即可在任意支持 Docker 的环境中无缝运行,运维人员无需重复配置依赖,大幅提升交付效率。
一、Docker 核心亮点
- 轻量级虚拟化:无需模拟完整操作系统,共享宿主机内核,启动速度秒级,资源占用仅为虚拟机的 1/10。
- 环境一致性:镜像包含应用及所有依赖,实现 "Build Once, Run Anywhere",彻底解决 "开发环境能跑,生产环境报错" 的问题。
- 无代理架构:通过 SSH 或本地套接字通信,无需在受控节点安装代理,部署简单安全。
- 可移植性强:支持 Linux、Windows、macOS 等主流系统,兼容公有云、私有云、物理机等多种环境。
- 弹性伸缩:结合 Docker Compose/K8s 可快速实现多容器编排,适配微服务架构的动态扩缩容需求。
二、环境部署(CentOS Stream 8 实操)
1. 前置依赖
bash
# 安装基础依赖
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 fast
2. 安装 Docker
bash
# 安装 Docker CE(社区版,免费)
yum install -y docker-ce
# 启动 Docker 并设置开机自启
systemctl enable docker --now
# 验证安装(显示版本即成功)
docker --version
3. 配置镜像加速器(关键优化)
国内访问 Docker Hub 速度慢,配置阿里云 / 华为云加速器:
bash
# 创建配置文件
mkdir -p /etc/docker
# 写入阿里云加速器(替换为自己的加速器地址,从阿里云容器镜像服务获取)
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]
}
EOF
# 重启 Docker 生效
systemctl daemon-reload && systemctl restart docker
# 验证配置(查看 Registry Mirrors 字段)
docker info
三、核心概念速通(必懂基础)
1. 三大核心组件
| 组件 | 核心角色 | 通俗理解 |
|---|---|---|
| 镜像(Image) | 容器的只读模板 | 类似虚拟机的镜像文件(含系统 + 应用) |
| 容器(Container) | 镜像的可运行实例 | 类似启动后的虚拟机(可读写,独立隔离) |
| 仓库(Registry) | 镜像的集中存储场所 | 类似代码仓库(Docker Hub 为公有仓库) |
2. 关键原理
- 镜像分层:镜像由多层只读文件系统叠加而成,复用底层镜像(如 CentOS 基础镜像),减少存储空间占用。
- Copy-on-Write(写时复制):容器启动时在镜像顶部添加可写层,修改文件时仅复制该文件到可写层,不改动原镜像,保证镜像可复用。
- 命名空间(Namespace):实现容器隔离(PID、网络、文件系统等),让容器误以为自己是独立主机。
- 控制组(Cgroup):限制容器的 CPU、内存、磁盘 IO 等资源,避免单容器占用过多资源。
四、镜像核心操作(实操重点)
1. 镜像基础命令
bash
# 搜索镜像(Docker Hub)
docker search nginx
# 拉取镜像(指定版本,默认 latest)
docker pull nginx:1.24
# 查看本地镜像
docker images
# 删除镜像(通过镜像名:标签或 ID)
docker rmi nginx:1.24 或 docker rmi 镜像ID
# 镜像导出(备份)
docker save -o nginx.tar nginx:1.24
# 镜像导入(恢复)
docker load -i nginx.tar
2. 构建自定义镜像(Dockerfile 详解)
Dockerfile 是镜像的 "构建说明书",通过指令定义镜像内容,以下是核心指令和实战案例:
(1)常用 Dockerfile 指令
| 指令 | 作用 | 示例 |
|---|---|---|
| FROM | 指定基础镜像(必须第一条) | FROM centos:8.4.2105 |
| RUN | 执行构建时命令(分层构建) | RUN yum install -y openssh-server |
| COPY | 复制本地文件到镜像(仅复制文件) | COPY index.html /var/www/html/ |
| ADD | 复制文件(支持解压归档文件) | ADD jdk.tar.gz /usr/local/java/ |
| ENV | 设置环境变量 | ENV JAVA_HOME /usr/local/java/jdk1.8 |
| EXPOSE | 声明容器暴露端口(仅文档说明) | EXPOSE 80/tcp |
| WORKDIR | 设置工作目录(后续指令的默认目录) | WORKDIR /usr/local |
| CMD | 容器启动时命令(可被覆盖) | CMD ["/usr/sbin/sshd", "-D"] |
| ENTRYPOINT | 容器启动时命令(不可覆盖,优先级高) | ENTRYPOINT ["/bin/echo", "Hello"] |
(2)实战:构建带 SSH 的 CentOS 镜像
dockerfile
# 文件名:Dockerfile
FROM centos:8.4.2105
# 配置阿里云 yum 源(解决 CentOS 8 源失效问题)
RUN minorver=8.4.2105 && \
sed -e "s|^mirrorlist=|#mirrorlist=|g" \
-e "s|^#baseurl=http://mirror.centos.org/\$contentdir/\$releasever|baseurl=https://mirrors.aliyun.com/centos-vault/$minorver|g" \
-i.bak /etc/yum.repos.d/CentOS-*.repo
# 安装 SSH 服务
RUN yum install -y openssh-server && yum clean all
# 生成 SSH 密钥对
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N '' && \
ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''
# 设置 root 密码(方便登录)
RUN echo "root:huawei" | chpasswd
# 暴露 22 端口
EXPOSE 22
# 启动 SSH 服务
CMD ["/usr/sbin/sshd", "-D"]
(3)构建镜像命令
bash
# -t 命名镜像(格式:仓库名:标签),. 表示构建上下文为当前目录
docker build -t centos:ssh -f Dockerfile .
# 运行镜像验证
docker run -d -p 2022:22 --name ssh-test centos:ssh
# SSH 登录测试(本地)
ssh root@localhost -p 2022 (密码:huawei)
3. 镜像仓库(公有 + 私有)
(1)公有仓库(Docker Hub)
bash
# 登录 Docker Hub(需先注册账号)
docker login -u 用户名 -p 密码
# 镜像命名(需与用户名一致,否则无法推送)
docker tag centos:ssh 用户名/centos:ssh
# 推送镜像到 Docker Hub
docker push 用户名/centos:ssh
# 其他机器拉取
docker pull 用户名/centos:ssh
(2)私有仓库(Harbor 简化部署)
企业内部常用 Harbor 搭建私有仓库,核心步骤:
bash
# 1. 安装 Docker Compose(Harbor 依赖)
yum install -y docker-compose-plugin
# 2. 下载 Harbor 安装包并解压
wget https://github.com/goharbor/harbor/releases/download/v2.9.1/harbor-offline-installer-v2.9.1.tgz
tar -xvf harbor-offline-installer-v2.9.1.tgz -C /opt
# 3. 配置 Harbor(修改 hostname 为服务器 IP)
cd /opt/harbor && cp harbor.yml.tmpl harbor.yml
vim harbor.yml
# 4. 安装并启动
./install.sh
# 5. 访问 Web 界面(默认账号 admin/Harbor12345)
http://服务器IP
五、容器核心操作(高频实操)
1. 容器生命周期管理
bash
# 1. 运行容器(后台+端口映射+命名)
# -d:后台运行 -p 宿主机端口:容器端口 --name:自定义名称
docker run -d -p 80:80 --name nginx-test nginx:1.24
# 2. 查看容器
docker ps # 运行中的容器
docker ps -a # 所有容器(含停止的)
# 3. 进入容器(两种方式)
# exec:推荐(不影响容器主进程)
docker exec -it nginx-test /bin/bash
# attach:进入容器主进程终端(退出会停止容器)
docker attach nginx-test
# 4. 容器生命周期控制
docker stop nginx-test # 停止容器
docker start nginx-test # 启动容器
docker restart nginx-test # 重启容器
docker rm nginx-test # 删除容器(需先停止)
docker rm -f $(docker ps -aq) # 强制删除所有容器
# 5. 容器日志查看(排查问题)
docker logs nginx-test # 查看日志
docker logs -f nginx-test # 实时跟踪日志
2. 容器资源限制(避免资源抢占)
bash
# 限制 CPU:--cpus 限制使用 1 核,--cpu-shares 权重(相对优先级)
docker run -d --cpus 1 --cpu-shares 1024 --name nginx-cpu nginx:1.24
# 限制内存:-m 限制 1G 内存,--memory-swap 内存+swap 总限制(0 表示无限制)
docker run -d -m 1G --memory-swap 2G --name nginx-mem nginx:1.24
# 限制磁盘 IO:--device-write-bps 限制写入速度(10MB/s)
docker run -d --device-write-bps /dev/sda:10MB --name nginx-io nginx:1.24
六、Docker 网络配置(核心难点)
1. 三种默认网络
| 网络类型 | 核心特点 | 适用场景 |
|---|---|---|
| bridge | 默认网络,容器通过网桥通信 | 单宿主机容器间通信 |
| host | 共享宿主机网络栈,无端口映射 | 对网络性能要求高的场景 |
| none | 仅回环地址,无外网访问 | 需完全隔离的安全场景 |
2. 关键网络操作
(1)容器间通信
- 同一 bridge 网络下,容器可通过「容器名」或「IP」通信(Docker 内置 DNS)。
- 自定义网络(推荐):隔离性更好,支持容器名解析:
bash
# 创建自定义桥接网络
docker network create --driver bridge my-net
# 运行容器时指定网络
docker run -d --name app1 --network my-net nginx:1.24
docker run -d --name app2 --network my-net nginx:1.24
# 容器 app1 中 ping app2(可通)
docker exec -it app1 ping app2
(2)容器访问外网
默认支持,通过宿主机的 NAT 转换实现,无需额外配置。
(3)外网访问容器
核心是「端口映射」,将宿主机端口映射到容器端口:
bash
# 映射单个端口
docker run -d -p 8080:80 nginx:1.24
# 映射多个端口
docker run -d -p 8080:80 -p 443:443 nginx:1.24
# 随机映射端口(宿主机随机分配端口)
docker run -d -P nginx:1.24
七、Docker 存储持久化(避免数据丢失)
容器默认存储在可写层,容器删除后数据丢失,需通过「数据卷」实现持久化。
1. 两种数据卷类型
| 类型 | 核心特点 | 适用场景 |
|---|---|---|
| Bind Mount(绑定挂载) | 宿主机目录直接挂载到容器 | 宿主机需直接访问数据的场景 |
| Docker Managed Volume(Docker 管理卷) | Docker 自动创建宿主机目录 | 容器间共享数据的场景 |
2. 实操案例(MySQL 数据持久化)
bash
# 1. 绑定挂载(推荐,数据位置可控)
mkdir -p /data/mysql/data /data/mysql/conf
# 复制 MySQL 配置文件到宿主机(可选)
docker cp mysql-test:/etc/mysql/my.cnf /data/mysql/conf/
# 运行 MySQL,挂载数据和配置目录
docker run -d -p 3306:3306 \
-v /data/mysql/data:/var/lib/mysql \
-v /data/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=huawei \
--name mysql-test \
mysql:5.7
# 2. Docker 管理卷
# 创建数据卷
docker volume create mysql-data
# 运行时挂载
docker run -d -p 3306:3306 \
-v mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=huawei \
--name mysql-test \
mysql:5.7
# 查看数据卷位置
docker volume inspect mysql-data
3. 容器间数据共享
bash
# 方式1:共享数据卷
docker run -d -v shared-data:/data --name app1 nginx:1.24
docker run -d -v shared-data:/data --name app2 nginx:1.24
# 方式2:使用数据卷容器(适合多容器共享)
docker create --name data-container -v shared-data:/data busybox
docker run -d --volumes-from data-container --name app1 nginx:1.24
docker run -d --volumes-from data-container --name app2 nginx:1.24
八、Docker Compose 多容器编排
当应用需要多个容器(如 Web + 数据库)时,Docker Compose 可通过 yaml 文件一键编排。
1. 安装 Docker Compose
bash
# 安装(CentOS)
yum install -y docker-compose-plugin
# 验证
docker compose version
2. 核心 yaml 文件(docker-compose.yml)
以 WordPress+MySQL 为例:
yaml
version: "3" # Compose 文件版本
services:
# MySQL 服务
db:
image: mysql:5.7
restart: always # 容器退出自动重启
environment:
MYSQL_ROOT_PASSWORD: huawei
MYSQL_DATABASE: wordpress
volumes:
- mysql-data:/var/lib/mysql # 数据持久化
# WordPress 服务
wordpress:
image: wordpress:latest
restart: always
ports:
- "80:80" # 端口映射
environment:
WORDPRESS_DB_HOST: db # 连接 MySQL 服务(容器名)
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: huawei
WORDPRESS_DB_NAME: wordpress
depends_on:
- db # 依赖 db 服务,先启动 db
# 定义数据卷
volumes:
mysql-data:
3. Compose 常用命令
bash
# 启动服务(后台运行)
docker compose up -d
# 查看服务状态
docker compose ps
# 查看日志
docker compose logs -f
# 停止并删除服务、容器、网络(保留数据卷)
docker compose down
# 停止并删除所有(含数据卷)
docker compose down -v
九、监控与日志(问题排查)
1. 容器监控
bash
# 实时查看容器资源占用
docker stats
# 查看容器进程
docker top 容器名/容器ID
# 可视化监控(Portainer)
docker run -d -p 9000:9000 \
-v /var/run/docker.sock:/var/run/docker.sock \
--name portainer \
portainer/portainer-ce:latest
# 访问 Web 界面:http://宿主机IP:9000(首次创建管理员账号)
2. 日志排查
bash
# 查看容器日志(最后 100 行)
docker logs --tail 100 容器名
# 实时跟踪日志
docker logs -f 容器名
# 查看日志时间戳
docker logs -t 容器名