2026 年 Docker 入门到实战:IT 大叔的容器化部署完全指南
2026 年 Docker 入门到实战:IT…
2026 年 Docker 入门到实战:IT 大叔的容器化部署完全指南
大家好,我是 IT大叔。
先讲个真事。上个月一个朋友找我帮忙,说他的网站连续挂了三次,每次都是”环境冲突”——一个项目要 PHP 7.4,另一个要 PHP 8.3,他在同一台服务器上折腾了两天,最后把生产环境搞崩了。我花十分钟帮他搭了 Docker,从此再没出过问题。
这就是容器化最大的价值:隔离环境,杜绝”在我电脑上是好的”这种问题。
我自己的 vpnt.top 站点也是跑在 Docker 上的(Nginx + PHP-FPM + MariaDB 三容器架构),两年零故障迁移。今天这篇文章,不讲虚的概念,直接说清楚 Docker 到底是什么、怎么快速上手、生产环境怎么落地。
一、Docker 到底是什么?一句话说清楚
用大白话说,Docker 就是一个打包工具。
你把你的应用、依赖、配置文件、系统库全部打成一个”盒子”(镜像),然后扔到任何一台装了 Docker 的机器上,跑起来就是一个”容器”。这个容器和宿主机的其他程序完全隔离,互不影响。
核心概念只有三个:
别小看这三个概念,搞懂它们,Docker 你就通了 80%。
二、安装 Docker(两种方式,选一种就行)
方式一:一键脚本(推荐,省心)
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
newgrp docker
安装完跑一下验证:
docker --version
docker run hello-world
看到 Hello from Docker! 就说明装好了。
方式二:Ubuntu/Debian 手动安装
sudo apt update
sudo apt install docker.io docker-compose-v2 -y
sudo systemctl enable --now docker
避坑提示:国内服务器如果拉取镜像慢,一定先配镜像加速。后面会专门讲。
三、Docker 必会命令(十分钟上手)
你不需要背所有命令,但下面这几个必须记住:
镜像操作
# 搜索镜像
docker search nginx
# 拉取镜像(下载)
docker pull nginx:1.25
# 查看本地镜像
docker images
# 删除镜像
docker rmi nginx:1.25
容器操作
# 运行容器
docker run -d --name my-nginx -p 8080:80 nginx:1.25
# 查看运行中的容器
docker ps
# 查看所有容器(含已停止)
docker ps -a
# 停止容器
docker stop my-nginx
# 启动已停止的容器
docker start my-nginx
# 进入容器内部
docker exec -it my-nginx bash
# 查看容器日志
docker logs my-nginx
# 删除容器
docker rm my-nginx
关键参数说明:
–
-d:后台运行(detach)
–
-p 宿主机端口:容器端口:端口映射
–
--name:给容器起名字
–
-v 宿主机路径:容器路径:挂载数据卷
–
-e:设置环境变量
实践:跑一个真实的 Nginx 服务
# 在宿主机创建网站目录
mkdir -p ~/www && echo "<h1>Hello Docker!</h1>" > ~/www/index.html
# 启动 Nginx 并挂载目录
docker run -d \
--name my-site \
-p 80:80 \
-v ~/www:/usr/share/nginx/html:ro \
nginx:1.25
打开浏览器访问 http://你的服务器IP,就能看到你写的页面。这个容器的日志、配置、文件完全和你宿主机上的其他程序隔离。
四、Docker Compose:多容器编排的救星
跑单容器用 docker run 就够了。但实际项目中,很少只有一个服务。比如我的博客就是三个容器配合工作:
Nginx(反向代理)→ PHP-FPM(处理请求)→ MariaDB(存数据)
手动启动三个容器并配置网络是很痛苦的。Docker Compose 就是解决这个问题的——用一个 YAML 文件定义所有服务,一条命令全部启动。
实战:搭建 WordPress + MySQL(10分钟)
创建一个目录,新建 docker-compose.yml:
version: '3.8'
services:
db:
image: mariadb:10.11
volumes:
- db_data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: myrootpass
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: wppass
restart: always
wordpress:
image: wordpress:6.7-php8.3-fpm
volumes:
- wp_data:/var/www/html
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: wppass
WORDPRESS_DB_NAME: wordpress
depends_on:
- db
restart: always
nginx:
image: nginx:1.25
ports:
- "8080:80"
volumes:
- wp_data:/var/www/html
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
- wordpress
restart: always
volumes:
db_data:
wp_data:
启动:
docker compose up -d
一条命令,三个容器全部启动。 停止也是:
docker compose down
这就是 Compose 的价值:把基础设施当代码管理,换一台服务器,把
docker-compose.yml和配置目录拷过去,docker compose up -d就全跑起来了。
五、生产环境避坑指南(大叔的血泪经验)
坑 1:镜像拉取慢?配置加速器
编辑 /etc/docker/daemon.json:
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://dockerproxy.com"
]
}
重启生效:sudo systemctl restart docker
坑 2:容器重启策略必须配
不配重启策略,服务器重启后容器就全挂了。加一行就搞定:
restart: always
可选值:
no:不自动重启(默认)always:总是重启unless-stopped:除非手动停止,否则重启on-failure:5:退出码非0时重启,最多5次
生产环境推荐用 unless-stopped。
坑 3:数据持久化用 volumes,别用 bind mount
# ✅ 推荐:Docker 管理的卷
volumes:
- db_data:/var/lib/mysql
# ❌ 除非有特殊需求,别直接用宿主机路径
# - ./data:/var/lib/mysql
Volumes 由 Docker 管理,跨平台兼容性好,性能也更稳定。
坑 4:日志占满磁盘?
默认情况下,容器的日志会无限增长。限制日志大小:
services:
my-app:
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
坑 5:不要用 root 运行容器
安全最佳实践:指定非 root 用户运行:
FROM node:20-alpine
USER node # 使用 node 用户,而非 root
WORKDIR /app
COPY --chown=node:node . .
CMD ["node", "server.js"]
六、Dockerfile:把你的应用打包成镜像
前面讲的都是跑别人做好的镜像。如果你有自己的应用(比如一个 Python 爬虫、Node.js 接口),就需要写 Dockerfile 来打包。
示例:打包一个 Python Flask 应用
# 1. 选择基础镜像(越小越好)
FROM python:3.11-slim
# 2. 设置工作目录
WORKDIR /app
# 3. 先复制依赖文件(利用缓存)
COPY requirements.txt .
# 4. 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 5. 复制源码
COPY . .
# 6. 暴露端口
EXPOSE 5000
# 7. 启动命令
CMD ["python", "app.py"]
构建镜像:
docker build -t my-flask-app:v1 .
运行:
docker run -d -p 5000:5000 my-flask-app:v1
优化技巧:第3步和第5步分开写,是因为 Docker 构建有分层缓存机制。如果每次改代码都要重装依赖,构建会慢到怀疑人生。把 requirements.txt 单独复制,只有当依赖变了才会重新安装——大多数时候你只改了代码,构建只要几秒。
七、日常运维常用脚本
我整理了几个日常会用到的命令,建议存下来:
# 清理所有未使用的镜像、容器、网络
docker system prune -a
# 查看容器资源占用
docker stats
# 批量停止所有容器
docker stop $(docker ps -q)
# 批量删除所有停止的容器
docker container prune
# 查看容器的详细信息(含 IP、挂载卷等)
docker inspect 容器名
# 复制文件到容器
docker cp 本地文件 容器名:/容器路径
# 从容器复制文件到本地
docker cp 容器名:/容器路径 本地路径
八、总结:什么时候该用 Docker?
适合用 Docker 的场景:
- ✅ 跑 Web 应用(WordPress、Nginx、Node.js)
- ✅ 跑数据库(MySQL、PostgreSQL、Redis)
- ✅ 跑开发环境(本地环境尽量接近生产)
- ✅ 跑工具型服务(FreshRSS、MinIO、Portainer)
- ✅ CI/CD 流水线
不适合的场景:
- ❌ 需要高分发、低延迟的应用(高频交易、实时音频处理——裸机更优)
- ❌ 需要直接访问 GPU 的深度学习训练(虽然有 nvidia-docker,但坑不少)
- ❌ 单文件脚本跑一次就丢的(直接
python script.py更省事)
说到底,Docker 不是银弹。但如果你和我一样,同时维护多个服务、在不同服务器之间迁移、或者遇到过”环境冲突”的噩梦——Docker 就是你 2026 年最值得花时间掌握的基础技能。
下周我会再写一篇 Docker Compose 高级编排技巧,包括健康检查、网络策略、多阶段构建这些进阶内容。别走开。
以上就是我搭了两年 Docker 的真实经验。有疑问欢迎留言,我会回复每一条评论。
关注 IT大叔的工具箱,每周分享实用技术干货。
