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 的机器上,跑起来就是一个”容器”。这个容器和宿主机的其他程序完全隔离,互不影响。

核心概念只有三个:

概念 一句话理解 类比 镜像 (Image) 应用的只读模板 类似 ISO 安装盘 容器 (Container) 镜像运行后的实例 类似用 ISO 安装好的系统 仓库 (Registry) 存放镜像的地方 类似 GitHub,但存的是镜像

别小看这三个概念,搞懂它们,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大叔的工具箱,每周分享实用技术干货。

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注