Docker 部署实战:从安装到容器化部署网站一次讲清


很多站长把网站部署在 VPS 上,最怕的就是"环境串台":换台机器要重装一遍环境,想跑第二个站点又怕污染第一个,某天手滑删了个依赖,整个网站直接挂掉。Docker 把应用和它依赖的运行环境打包成一个个"集装箱",互相隔离、随拿随用、搬家秒迁。本文按真实操作顺序,把 Docker 从安装、核心概念到用 Compose 编排 LNMP 环境一次讲清楚,所有命令都在 Ubuntu 22.04 上验证过,照着敲就能用。

一、先搞明白:Docker 到底解决了什么?

传统部署是把软件直接装进系统里,和系统环境紧紧耦合:A 网站要 PHP 7.4,B 网站要 PHP 8.2,一装就冲突。Docker 的思路是"容器化"——把每个应用连同运行环境、配置文件、依赖库一起打包成镜像,运行时隔离成独立容器,互不干扰。带来的好处主要有三点:

1. 环境隔离:多个站点、多种语言版本共存不打架;

2. 一键复现:一条 docker run 就能在任何机器上还原同样的环境;

3. 迁移方便:镜像打包带走,换服务器不用重装环境。

二、安装 Docker:两分钟搞定

Ubuntu / Debian 用官方源一条命令装好:

apt update
apt install -y docker.io
systemctl enable --now docker
docker --version

CentOS / Rocky 用 Docker 官方仓库安装:

yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
systemctl enable --now docker

装完先确认服务在跑,docker info 能正常输出即可。国内服务器拉镜像慢的,可以配置国内镜像加速器,阿里云容器镜像服务控制台会提供专属加速地址。

三、核心概念:镜像、容器、仓库

先把三个词分清,后面就不会晕:

镜像(Image):只读模板,相当于"安装包",里面包含完整的运行环境;

容器(Container):镜像跑起来的实例,相当于"装好的系统",可读写、可启停;

仓库(Registry):存放镜像的地方,默认是 Docker Hub。

几个最常用的命令:

docker search nginx            # 搜索镜像
docker pull nginx             # 拉取镜像
docker images                 # 查看本地镜像
docker ps                     # 查看运行中的容器
docker ps -a                  # 查看所有容器(含已停止)

四、跑第一个容器:一个 Nginx 站点

docker run -d --name web -p 8080:80 -v /www/html:/usr/share/nginx/html nginx

参数拆开看:-d 后台运行;--name web 给容器起名;-p 8080:80 把宿主机的 8080 端口映射到容器内的 80 端口;-v 把宿主机的 /www/html 目录挂载进容器,网站文件放在宿主机,改文件不用进容器。启动后浏览器访问 http://服务器IP:8080 就能看到默认页面,把网站文件丢进 /www/html 就完成部署了。

常用容器操作:

docker start web / docker stop web        # 启停
docker restart web                        # 重启
docker logs -f web                        # 查看日志
docker exec -it web bash                  # 进入容器
docker rm -f web                          # 删除容器

五、用 Docker Compose 编排 LNMP 环境

一个站点往往要 Nginx + PHP + MySQL 三个服务一起跑,逐个 docker run 太繁琐,用 Compose 写一个配置文件,一键启动整套环境。新建 docker-compose.yml:

version: '3'
services:
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - php
  php:
    image: php:8.2-fpm
    volumes:
      - ./html:/var/www/html
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: 换成强密码
      MYSQL_DATABASE: myblog
    volumes:
      - mysql_data:/var/lib/mysql
volumes:
  mysql_data:

然后一条命令启动整套环境:

docker compose up -d        # 后台启动整套环境
docker compose ps           # 查看服务状态
docker compose logs -f      # 查看日志
docker compose down         # 停止并移除

以后换机器,把这个目录连同 docker-compose.yml 一起拷走,docker compose up -d 就直接还原整套环境,再也不用记一堆安装步骤。

六、数据持久化:别把数据留在容器里

容器删除后,里面写的数据会一起消失。所以数据库、网站文件这类重要数据必须用卷(Volume)持久化:-v mysql_data:/var/lib/mysql 这种命名卷,或者 -v /www/html:/usr/share/nginx/html 这种目录挂载。原则就一条:容器可以随时重建,但数据必须落在宿主机上。备份时直接备份宿主机挂载目录,和普通文件备份完全一样。

七、资源限制与安全

容器虽然是隔离的,但不设上限时可能抢占整台机器资源,给容器加上资源限制:

docker run -d --memory="512m" --cpus="1" --name web nginx

再配合几点安全习惯:一是非必要不给容器 --privileged 权限;二是容器内别用 root 跑业务进程,镜像里用 USER 指令降权;三是 MySQL、Redis 这类服务的端口不要直接映射到公网,必须通过防火墙或安全组限定来源 IP。

八、日常运维命令速查

docker stats                        # 实时查看容器资源占用
docker logs --tail 100 web          # 查看最近 100 行日志
docker exec -it web bash            # 进入容器排障
docker inspect web                  # 查看容器详细信息
docker system prune -f              # 清理停止的容器和悬空镜像

网站出问题时,第一反应就是 docker logs 和 docker stats:日志能看到应用报错,stats 能看到是不是容器把 CPU 或内存吃满了。

九、结语

Docker 的学习曲线并不陡,掌握安装、镜像与容器、端口映射、数据卷、Compose 这五件事,就足够把绝大多数网站和应用容器化跑起来。它带来的环境隔离和迁移便利,长期看能帮你省下大量重复配置的时间。遇到问题优先看官方文档和 docker logs,多数坑都能自己排查出来。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

VPS 安全加固实战:从 SSH 防爆破到防火墙配置一次讲清

Nginx 从入门到实战:反向代理、HTTPS 与性能优化一次讲清

评 论