VPS上Docker从零开始:安装、常用命令和Nginx+MySQL+Redis一条龙

Docker安装、Compose编排Nginx+MySQL+Redis、常用命令和与宝塔面板的配合
发布于
1

Docker 把应用和环境打包成容器,你在自己电脑上跑通的东西搬到VPS上也不会有”我电脑上能跑、服务器上报错”的问题。本文从零开始在VPS上装Docker,然后用三个容器跑起Nginx、MySQL和Redis——覆盖建站最常用的三个服务。

第一步:安装Docker和Docker Compose

以下命令适用于Ubuntu/Debian系统:

# 卸载旧版本(如果有的话)
apt remove docker docker-engine docker.io containerd runc -y

# 安装依赖和Docker官方源
apt update && apt install ca-certificates curl -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list

# 安装
apt update && apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y

# 验证
docker --version
docker run hello-world

hello-world 跑成功就说明Docker装好了。不需要在VPS上装Nginx、MySQL、PHP——都用容器跑,卸载时删容器就行,不会在系统里留一堆散落的配置文件和依赖。

雨云KVM构架的VPS跑Docker兼容性很好,优惠码 admin01 首月五折,入门配置1核1G就能跑两三个轻量容器。如果跑MySQL这类吃内存的服务,建议2G内存起步。

第二步:Docker Compose 编排三个服务

Docker Compose 用一个YAML文件定义多个容器、网络和数据卷。创建一个 docker-compose.yml:

version: '3.8'

services:
  nginx:
    image: nginx:alpine          # alpine版体积小,只有几MB
    ports:
      - "80:80"                  # 宿主机80端口映射到容器80
      - "443:443"
    volumes:
      - ./nginx/html:/usr/share/nginx/html   # 网站文件
      - ./nginx/conf:/etc/nginx/conf.d       # Nginx配置
    depends_on:
      - php                          # 等PHP启动了再启动Nginx
    restart: unless-stopped

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: 换个强密码
      MYSQL_DATABASE: mydb
    ports:
      - "3306:3306"
    volumes:
      - ./mysql/data:/var/lib/mysql    # 数据持久化
    restart: unless-stopped

  redis:
    image: redis:alpine
    ports:
      - "6379:6379"
    volumes:
      - ./redis/data:/data
    restart: unless-stopped

关键理解volumes的作用:容器的文件系统是临时的——容器删了里面的数据就没了。volumes把容器里的目录映射到宿主机上的真实目录,数据不会丢。

启动全部服务:

docker compose up -d
# -d 表示后台运行
# 查看运行状态
docker compose ps

第三步:常用管理命令

# 查看所有运行中的容器
docker ps

# 查看某个容器的日志(实时)
docker logs -f 容器名

# 进入容器内部调试
docker exec -it 容器名 sh

# 重启单个容器
docker restart 容器名

# 更新镜像并重建容器
docker compose pull    # 拉最新镜像
docker compose up -d   # 重建

日常运维就这几个命令够用:ps看状态、logs查问题、restart重启、exec进去调试。

第四步:Nginx 反向代理到 PHP 容器

如果要跑PHP网站(WordPress等),加一个PHP容器:

# 在docker-compose.yml的services里加
php:
  image: php:8.2-fpm-alpine
  volumes:
    - ./nginx/html:/var/www/html
  restart: unless-stopped

Nginx 的配置文件里把PHP请求转发给PHP容器:

# nginx/conf/default.conf
server {
    listen 80;
    server_name _;
    root /usr/share/nginx/html;
    index index.php index.html;

    location ~ .php$ {
        fastcgi_pass php:9000;    # php是docker-compose里定义的服务名
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
        include fastcgi_params;
    }
}

Docker Compose 的网络里,每个服务名自动就是一个可解析的主机名——Nginx 容器里写 fastcgi_pass php:9000,Docker 内部的DNS会自动解析到PHP容器的IP。不用记IP地址。

Docker和宝塔面板的区别

宝塔面板适合不想碰命令行的场景,一键装环境、可视化操作。Docker 适合想把环境配置写成文件、可复现的场景——换一台服务器,docker compose up -d 一条命令恢复整个环境。

推荐搭配:用宝塔管理服务器基础设置(防火墙、文件管理、定时任务),用Docker跑具体的服务(Nginx/MySQL/Redis/应用),两者不冲突。

常见问题

容器里的MySQL数据怎么备份?

两种方式:直接用宿主机的mysqldump连容器里的MySQL(docker exec mysql mysqldump -u root -p 数据库名 > backup.sql);或者定时把volumes目录(./mysql/data)打包。前者生成的SQL文件更通用。

Docker会不会很吃内存?

Docker本身开销很小(几十MB)。吃内存的是你跑的容器——MySQL默认会吃掉宿主机一半内存作为缓冲池,需要限制:在docker-compose.yml的MySQL服务下加 deploy.resources.limits.memory: 512M。

容器自动重启失败怎么办?

docker logs 查容器启动日志,99%的情况是配置错误(端口冲突、挂载路径不存在、环境变量没设)。修好配置后 docker compose down && docker compose up -d 重建。

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

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

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

在命令行里敲SQL管理数据库是技术人的浪漫,但偶尔想可视化看看数据、导出一份CSV、或者快速改一行记录——phpMyAdmin是标配。装在VPS上通过浏览器访问,比本地装MySQL客户端方便。 Docker部署phpMyAdmin dock