Docker 从入门到实战

文章目录

  • [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 容器名
相关推荐
XIAOHEZIcode1 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220702 天前
如何搭建本地yum源(上)
运维
武子康2 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
大树885 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠5 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质5 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工5 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn865 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
酣大智5 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_5 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化