雨云Docker容器化部署实战:docker-compose一键编排Nginx+MySQL+PHP

docker-compose 编排 Nginx + MySQL + PHP,数据卷持久化,环境变成可复用的代码
发布于
5

在雨云云服务器上手把手装 LNMP 环境太累了——每次重装、每台机器都要走一遍 apt install、改配置、调版本冲突。Docker 把环境打包成镜像,docker-compose 把多个服务编排成一组,环境变成代码,换机器直接 git pull + docker-compose up 就跑起来。下面按能直接照做的步骤来。

一、安装 Docker 与 docker-compose

在雨云云服务器(Ubuntu 22.04)上一键装:

curl -fsSL https://get.docker.com | sh
usermod -aG docker $USER
systemctl enable docker
# docker-compose v2(已内置为 compose 子命令)
docker compose version

退出重新登录让用户组生效。Docker Compose V2 已经集成在 docker 里,不需要单独装 docker-compose 二进制。

二、一个标准的 docker-compose.yml

下面这个编排同时拉起 Nginx、MySQL 8.0 和 PHP 8.2-FPM,适合跑 WordPress 或一般 PHP 项目:

version: '3.8'
services:
  nginx:
    image: nginx:1.25
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./www:/var/www/html
    depends_on:
      - php
    restart: always

  php:
    image: php:8.2-fpm
    volumes:
      - ./www:/var/www/html
    restart: always

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS}
      MYSQL_DATABASE: wordpress
    volumes:
      - db_data:/var/lib/mysql
    ports:
      - "3306:3306"
    restart: always

volumes:
  db_data:

关键点:数据库密码用 .env 文件管,别写死在 yml 里;数据卷 db_data 是 Docker 管理的命名卷,删容器不丢数据。

三、数据卷与持久化

容器默认是无状态的——删了数据就没了。三种持久化方式:

  • 命名卷db_data:/var/lib/mysql,Docker 管,适合数据库;
  • bind mount./www:/var/www/html,直接挂宿主机目录,适合代码实时编辑;
  • tmpfs:内存临时文件,适合 PHP session 目录。

数据库和上传文件必用前两种,否则重装哭都来不及。

四、端口映射与网络隔离

docker-compose 默认创建一个项目级网络,服务之间用容器名直接通信(nginx 里写 fastcgi_pass php:9000 而不是 localhost)。对外只暴露 80/443,MySQL 3306 如果不需外部连接就别映射端口,安全还省资源。

五、雨云上的使用建议

雨云云服务器新购用优惠码 admin01 走专属入口 https://www.jiyueip.com/link/5617 能拿五折。2 核 4G 跑 LNMP 三容器绰绰有余。上了 Docker 后迁移极方便——把 docker-compose.yml 和代码目录打包,新机器上 docker compose up -d 就起,整个过程 10 分钟。

六、常用管理命令

命令 作用
docker compose up -d 后台启动所有服务
docker compose down 停止并删除容器(数据卷不删)
docker compose ps 查看运行状态
docker compose logs -f nginx 实时看某服务日志
docker compose exec php bash 进容器调试
docker compose pull 拉取最新镜像

七、几个容易踩的坑

  • bind mount 路径用相对路径(./xxx),切换目录执行会挂错——尽量用 ${PWD} 绝对路径;
  • MySQL 8.0 默认认证插件和旧客户端不兼容,老镜像升上来记得加 --default-authentication-plugin=mysql_native_password
  • 容器内 localhost 指向容器自身,跨容器访问必须用「服务名」;
  • 别用 :latest 标签上生产,版本漂移排查到怀疑人生,固定如 mysql:8.0.35

常见问题

关于在雨云服务器上用 Docker 部署的常见疑问,下面一并解答。

常见问题(FAQ)

Docker 和直接装 LNMP 环境有什么区别?
Docker 把环境打包成镜像和 compose 文件,换机器 git pull 加 docker compose up 就起,不用手动 apt install 一堆东西、改配置文件。迁移和复现成本极低。
数据卷和 bind mount 怎么选?
数据库用命名卷(Docker 管理,性能好),需要实时编辑代码的目录用 bind mount(挂宿主目录),临时缓存(PHP session)用 tmpfs。备份时命名卷的数据要用 docker cp 导出。
雨云 2 核 4G 跑 Docker 够不够?
跑 LNMP 三容器绰绰有余。Docker 本身几乎不占额外资源,容器共享宿主机内核,2G 内存分给 MySQL 512M、PHP 最多 1G,剩下给 Nginx 和系统,完全够。
容器 IP 变了怎么办?
docker-compose 默认创建项目级网络,容器之间用服务名(如 php、mysql)通信,DNS 由 Docker 内部解析,不依赖固定 IP。外部访问只用宿主机的固定 IP 做端口映射。

本文由作者原创/授权发布于极跃圈(jiyueip.com)未经许可,禁止转载。题图来自Unsplash,基于CC0协议。

声明:极跃圈(JIYUEIP.com)内网友所发表的所有内容及言论仅代表其本人,并不反映任何极跃圈(JIYUEIP.com)之意见及观点。

0 讨论
热门最新
总结
暂无总结
0 / 600