新闻详情

新闻详情

首页 / 资讯中心 / 详情

Docker新手入门实战:从环境搭建到MySQL/Redis容器化避坑指南

发布时间:2026/10/2 10:42:07来源:尧图网络
Docker新手入门实战:从环境搭建到MySQL/Redis容器化避坑指南
简介这份《Docker 新手入门指南从零开始掌握容器化技术》面向缺乏容器化经验的新手开发者与运维人员帮助读者从概念认知到动手实践系统建立 Docker 知识体系。内容涵盖容器与虚拟机的差异对比、Ubuntu 环境下的安装与用户组配置、镜像与容器生命周期管理、调试与日志查看并以部署 WordPress 为实战案例讲解 docker-compose.yml 编写、数据卷与绑定挂载的持久化方案以及容器安全最佳实践和学习路径推荐。资源为单个 PDF 文件压缩包约 760KB篇幅精炼、结构清晰配有具体命令与示例代码适合跟随动手操作。目前已有 1057 人学习可作为入门阶段快速上手、边学边练的参考读物。1. Docker 新手入门为什么你装完 Docker Desktop 却跑不起第一个容器很多人第一次接触容器化技术是从下载一份《Docker 新手入门指南从零开始掌握容器化技术.pdf》开始的。PDF 翻完概念都懂——镜像、容器、仓库可一上手就卡住Windows 上装完 Docker Desktop双击图标转圈半天弹出一句virtualization support not detected或者命令行敲docker run hello-world等来的却是failed to connect to the Docker API at npipe:////./pipe/dockerdesktoplinuxengine。这不是你笨是 Docker 的入门门槛从来不在概念而在环境打通。这篇笔记不重复 PDF 里那些定义而是把「从零开始」拆成能照着敲的路径Windows、Ubuntu、CentOS 三种常见环境怎么装、装完怎么验证、镜像拉不动怎么换源、容器网络不通怎么查、MySQL 和 Redis 怎么用 Docker 跑起来。适合刚接触容器化技术、被环境问题卡住的开发者和运维新手也适合想把本地服务迁进容器的熟手快速对照参数。读完你应该能独立跑通第一个自定义容器并知道每一步翻车时该看哪里。2. 装 Docker 之前先分清 Docker Desktop 和 Docker Engine2.1 两种安装形态选错了后面全是坑Docker 在桌面和服务器上是两套东西。Docker Desktop 是给 Windows 和 macOS 用的图形化套件自带虚拟机Windows 用 WSL2 或 Hyper-VmacOS 用虚拟化框架来跑 Linux 容器Docker Engine 是纯命令行守护进程直接装在 Linux 上没有图形界面。热搜里docker desktop安装教程和ubuntu安装docker教程是两条完全不同的路混着看必然出错。判断标准很简单你的机器是 Windows 或 macOS日常开发用选 Docker Desktop你的机器是 Ubuntu、CentOS 等 Linux 服务器选 Docker Engine。Windows 上也能装 Docker Engine但需要 WSL2 手动配置新手不建议。反过来Linux 桌面版硬装 Docker Desktop 也能跑但多一层虚拟机性能白白损耗。提示Windows 家庭版没有 Hyper-VDocker Desktop 必须走 WSL2 后端。装之前先在「启用或关闭 Windows 功能」里勾上「适用于 Linux 的 Windows 子系统」和「虚拟机平台」否则装完必报virtualization support not detected。2.2 Windows 装 Docker Desktop 的最小步骤先确认 BIOS 里虚拟化Intel VT-x 或 AMD-V已开启这是硬门槛软件层绕不过去。然后去 Docker 官网下安装包双击一路下一步。安装完重启首次启动会提示登录或跳过跳过不影响本地使用。装完打开 PowerShell验证# 查看 Docker 客户端和服务端版本能同时输出 Client 和 Server 才算通 docker version # 跑官方测试镜像看到 Hello from Docker! 说明容器能正常创建和运行 docker run hello-worlddocker version如果只显示 Client 不显示 Server说明守护进程没起来多半是 WSL2 没装好或虚拟化没开。docker run hello-world第一次会去拉镜像如果卡在Pulling不动是镜像源问题下一节讲。2.3 Ubuntu 装 Docker Engine 的最小步骤Ubuntu 上用官方脚本最省事但生产环境建议走 apt 仓库方便版本管理。先卸掉可能存在的旧版本再装依赖、加仓库、装引擎# 卸载旧版本避免冲突 sudo apt remove docker docker-engine docker.io containerd runc # 装依赖ca 证书、curl、gnupg sudo apt update sudo apt install -y ca-certificates curl gnupg # 添加 Docker 官方 GPG 密钥 sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod ar /etc/apt/keyrings/docker.gpg # 添加 apt 仓库 echo deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release echo $VERSION_CODENAME) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null # 安装引擎和 compose 插件 sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin装完把当前用户加进 docker 组否则每条命令都要 sudo# 加入 docker 组之后重新登录生效 sudo usermod -aG docker $USER # 启动并设置开机自启 sudo systemctl enable --now docker # 验证 docker run hello-worldusermod那条执行完必须退出终端重新登录组权限才生效这是新手最常忽略的一步。CentOS 7 的流程类似只是包管理器换成 yum且 CentOS 7 默认内核较老建议先yum update再装否则可能遇到存储驱动不兼容。3. 镜像拉不动、容器起不来网络与镜像源排查3.1 镜像下载慢的根因和换源方法docker pull卡住或超时九成是默认连的 Docker Hub 在国内访问不稳定。解决办法是配置镜像加速器。Docker Desktop 在 Settings → Docker Engine 里改 JSONLinux 改/etc/docker/daemon.json。{ registry-mirrors: [ https://docker.m.daocloud.io, https://dockerproxy.com ], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 } }registry-mirrors是加速地址列表按顺序尝试log-driver和log-opts限制单个容器日志大小防止日志把磁盘写满这是生产环境必配项。改完重启 Docker# Linux 重启守护进程 sudo systemctl restart docker # 验证配置是否生效 docker info | grep -A 5 Registry Mirrors注意镜像加速器地址会失效用之前先确认当前可用。配置多个比配一个稳某个挂了会自动试下一个。3.2 容器网络不通的三层排查法docker网络不通是高频问题排查要分层。第一层看容器本身有没有 IPdocker inspect 容器名 | grep IPAddress。第二层看容器能不能通宿主机docker exec -it 容器名 ping 宿主机IP。第三层看端口映射对不对docker port 容器名。最常见的翻车是端口映射写反。-p 8080:80意思是宿主机 8080 映射到容器 80前者是宿主机端口后者是容器端口写反了外面就连不上。另一个坑是容器内服务只监听127.0.0.1这样即使端口映射对了外部也访问不到服务必须监听0.0.0.0。# 查看容器端口映射详情 docker port my-container # 进容器内部测试服务是否在监听 docker exec -it my-container sh # 容器内执行看 80 端口是否 LISTEN netstat -tlnp | grep 80如果容器间要互相访问别用 IP用自定义网络加容器名。默认 bridge 网络不支持名字解析这是很多人踩的坑# 创建自定义网络 docker network create mynet # 两个容器都接入同一网络就能用容器名互访 docker run -d --name redis --network mynet redis:7 docker run -it --network mynet alpine ping redis3.3 权限错误的定位与解决docker权限错误怎么解决通常有两种。一种是普通用户执行 docker 命令报permission denied原因是没加 docker 组回到 2.3 的usermod步骤即可。另一种是容器内进程写挂载目录报Permission denied原因是容器内用户 UID 和宿主机目录属主不匹配。第二种的解法是启动时指定用户 UID或者提前把宿主机目录权限放开# 查看当前用户 UID id -u # 以指定 UID 运行容器让容器内进程和宿主机目录属主一致 docker run -d --user $(id -u):$(id -g) -v /data/app:/app my-image--user参数让容器内进程以宿主机当前用户身份运行挂载目录的读写权限就对齐了。生产环境更推荐在 Dockerfile 里用USER指令固定非 root 用户而不是运行时临时指定。4. 用 Docker 跑 MySQL 和 Redis参数怎么设才不翻车4.1 MySQL 8.0 容器化的必调参数docker安装mysql8.0并使用看着简单直接docker run mysql也能起来但数据不持久、字符集乱码、远程连不上三个坑等着你。正确的启动命令要把数据目录、配置、端口、密码都定死docker run -d \ --name mysql8 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORDYourStrongPass123 \ -e MYSQL_DATABASEappdb \ -e TZAsia/Shanghai \ -v /data/mysql/conf:/etc/mysql/conf.d \ -v /data/mysql/data:/var/lib/mysql \ --restart unless-stopped \ mysql:8.0 \ --character-set-serverutf8mb4 \ --collation-serverutf8mb4_unicode_ci逐项说明-e MYSQL_ROOT_PASSWORD必填不填容器直接退出MYSQL_DATABASE会在初始化时建库-v /data/mysql/data把数据落到宿主机容器删了数据还在这是持久化的关键--restart unless-stopped让容器随 Docker 启动末尾两个参数设字符集避免中文乱码。TZ设时区否则容器内时间是 UTC和业务对不上。docker安装mysql失败最常见的原因是挂载目录权限不对MySQL 容器内以 mysql 用户运行宿主机目录如果属主是 root 且权限 700初始化就会失败。启动前先chown -R 999:999 /data/mysql/data999 是 mysql 镜像内用户 UID或者干脆先不挂载让容器自己建目录再拷出来。4.2 Redis 主从用 Docker 怎么搭docker安装redis主从的核心是让从节点能连上主节点。用自定义网络加容器名解析比配 IP 稳得多# 创建专用网络 docker network create redis-net # 启动主节点 docker run -d --name redis-master --network redis-net \ -p 6379:6379 \ -v /data/redis/master:/data \ redis:7 redis-server --appendonly yes # 启动从节点指向主节点容器名 docker run -d --name redis-slave --network redis-net \ -p 6380:6379 \ -v /data/redis/slave:/data \ redis:7 redis-server --appendonly yes --replicaof redis-master 6379--appendonly yes开 AOF 持久化重启不丢数据--replicaof redis-master 6379指定主节点这里用容器名而非 IP因为容器重启 IP 会变名字不变。验证主从是否同步# 在主节点写一个 key docker exec -it redis-master redis-cli set testkey hello # 在从节点读能读到说明同步正常 docker exec -it redis-slave redis-cli get testkey # 查看主从状态role 应为 slavemaster_link_status 应为 up docker exec -it redis-slave redis-cli info replication如果master_link_status是 down先确认两个容器在同一网络再确认主节点没设密码或从节点配了对应密码。主节点设了requirepass而从节点没配masterauth是主从连不上的头号原因。4.3 数据持久化和备份的实操容器化最大的误解是「容器删了数据就没了」。数据在不在取决于你有没有挂载卷。用-v挂宿主机目录或者用docker volume命名卷数据都在容器生命周期之外。# 查看所有命名卷 docker volume ls # 备份 MySQL从容器里导出到宿主机 docker exec mysql8 sh -c exec mysqldump -uroot -p$MYSQL_ROOT_PASSWORD appdb /data/backup/appdb_$(date %F).sql # 恢复 docker exec -i mysql8 sh -c exec mysql -uroot -p$MYSQL_ROOT_PASSWORD appdb /data/backup/appdb_2024-01-01.sql备份命令里用sh -c包一层是为了让容器内的环境变量MYSQL_ROOT_PASSWORD能展开直接写密码在命令行会留历史记录也不安全。定时备份用宿主机的 cron 调这条命令即可不用在容器里装 cron。5. 避坑清单新手最容易翻车的五个场景5.1 现象Docker Desktop 启动卡在 starting原因WSL2 后端没就绪或虚拟化被其他软件占用如 VMware、Hyper-V 冲突。解决先在 PowerShell 跑wsl --update更新 WSL 内核再wsl --shutdown重启子系统然后重启 Docker Desktop。如果还不行检查 BIOS 虚拟化是否开启以及是否同时装了 VMware 导致 Hyper-V 冲突。5.2 现象docker pull 报 no space left on device原因Docker 默认数据目录在系统盘镜像和日志把盘写满了。解决先docker system prune -a清理无用镜像和停止的容器再把数据目录迁到大盘。Linux 改/etc/docker/daemon.json的>services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: devpass MYSQL_DATABASE: appdb ports: - 3306:3306 volumes: - mysql-data:/var/lib/mysql healthcheck: test: [CMD, mysqladmin, ping, -h, localhost] interval: 10s retries: 5 redis: image: redis:7 ports: - 6379:6379 volumes: - redis-data:/data volumes: mysql-data: redis-data:healthcheck让 compose 知道服务真正就绪了再启动依赖它的服务避免应用启动时数据库还没初始化完。volumes声明命名卷数据持久化且不污染项目目录。这套编排适合本地开发生产环境把密码换成环境变量注入端口不对外暴露。验证一个镜像值不值得用我一般看三点镜像大小docker images看 SIZE动辄上 G 的要警惕、层数docker history 镜像看有没有把密钥写进层里、基础镜像是不是 alpine 或 slim还是完整发行版。这三点决定了部署速度和攻击面。最后说个血泪经验别在容器里存任何你认为「删了也没事」的数据。容器的设计哲学就是无状态、可替换所有需要留存的东西——数据库文件、日志、上传的附件——统统挂出来。我见过太多人因为没挂卷一次docker rm把测试数据全清了没有后悔药。把持久化当成默认动作而不是想起来才做Docker 才真正帮你省事而不是添乱。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

AI大模型炒股项目在中国市场跑起来了:用TaoToken统一Key打通量化交易全链路 2026/10/2 12:30:00

AI大模型炒股项目在中国市场跑起来了:用TaoToken统一Key打通量化交易全链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
书生进阶4L2-InternVL 多模态模型部署微调实践:TaoToken 统一 Key 打通推理链路 2026/10/2 12:30:00

书生进阶4L2-InternVL 多模态模型部署微调实践:TaoToken 统一 Key 打通推理链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Unity3D仿星露谷物语开发37之浇水动画与TaoToken配置 2026/10/2 12:29:59

Unity3D仿星露谷物语开发37之浇水动画与TaoToken配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Stop Prompting. Design the Loop. | 用 TaoToken 统一 Key 搭建 AI 编程循环工程实战 2026/10/2 12:29:59

Stop Prompting. Design the Loop. | 用 TaoToken 统一 Key 搭建 AI 编程循环工程实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
AI代码安全新纪元:Claude Code Security深度解析与实战指南|TaoToken统一Key接入 2026/10/2 12:29:59

AI代码安全新纪元:Claude Code Security深度解析与实战指南|TaoToken统一Key接入

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Beckhoff EK1100 与 LabVIEW 集成:TwinCAT 配置与 ADS 通信实战指南 2026/10/2 12:29:52

Beckhoff EK1100 与 LabVIEW 集成:TwinCAT 配置与 ADS 通信实战指南

1. 为什么EK1100接LabVIEW这件事值得单独拿出来说Beckhoff EK1100这个耦合器模块,在EtherCAT圈子里算是入门级标配了。它本身不复杂,一头是EtherCAT输入,一头是E-bus输出,后面挂一堆EL系列的IO模块,24V供电&#xff0c…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉