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 容器名
相关推荐
天呐草莓2 小时前
企业微信运维手册
java·运维·网络·python·微信小程序·企业微信·微信开放平台
无法无天霸王龙2 小时前
云计算运维培训:线上课 vs 面授课,到底该怎么选?
运维·云计算
是阿威啊2 小时前
【第五站】集群组件一键启动/关闭脚本(Hadoop/YARN + Hive + Spark)
linux·运维·hive·hadoop·spark
黛玉晴雯子0012 小时前
Devops理念基础(持续更新)
运维·devops
howard20052 小时前
Docker实战:网络管理
docker·网络管理
apihz2 小时前
免费手机号归属地查询API接口详细教程
android·java·运维·服务器·开发语言
lvbinemail2 小时前
svn的web管理后台服务svnWebUI
运维·前端·svn·jar
宇钶宇夕2 小时前
跨协议冗余通信方案落地:EPN-330网关打通西门子S7-1517H与编码器的控制链路
运维·网络·自动化
txzz88882 小时前
CentOS-Stream-10 搭建FTP服务器之系统用户访问
linux·运维·服务器·centos·ftp服务器·ftp 系统用户访问