Docker部署nginx+php+mysql项目

目录结构

your-project/
├── docker-compose.yml
├── nginx/
│   └── default.conf
├── php/
│   └── Dockerfile
└── www/
    └── index.php

1. 编写 docker-compose.yml

your-project/目录下新建docker-compose.yml

version: '3.7'

services:
  nginx:
    image: nginx:alpine
    container_name: nginx
    ports:
      - "8080:80"
      - "443:443"
      - "83:83"
      - "99:99"
      - "9090:9090"  
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
      - ./www:/var/www/html
    depends_on:
      - php
    networks:
      - app-network

  php:
    build: ./php
    container_name: php
    volumes:
      - ./www:/var/www/html
    networks:
      - app-network

  mysql:
    image: mysql:5.7
    container_name: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: sppe598  # 请设置安全密码
      MYSQL_DATABASE: mydb
      MYSQL_USER: myuser
      MYSQL_PASSWORD: mypassword
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - app-network

networks:
  app-network:

volumes:
  mysql_data:

2. 创建 PHP Dockerfile

php/目录下新建Dockerfile

FROM php:7.4-fpm

# 推荐安装mysqli等扩展
RUN apt-get update && \
    apt-get install -y libicu-dev && \
    docker-php-ext-install intl pdo_mysql mysqli

WORKDIR /var/www/html

3. Nginx 配置

nginx/目录下新建default.conf

server {
    listen 80;
    server_name localhost;

    root /var/www/html;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass php:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_index index.php;
    }
}

4. 示例 PHP 文件

www/目录下新建index.php

<?php
phpinfo();
?>

5. 启动服务

your-project/目录下,运行:

docker-compose up -d

常见问题:

1、phpmyadmin放在/var/www/html目录下提示:mysqli::real_connect(): (HY000/2002): No such file or directory

phpmyadmin 的 config.inc.php 里(如果没有则复制一个:cp config.sample.inc.php config.inc.php),数据库主机 必须写成服务名,例如:

$cfg[‘Servers’][$i][‘host’] = ‘mysql’;

⬆️ 不是 localhost,也不是 127.0.0.1,(如果找不到,直接新增这一行也可以——重要的是 host 必须是 mysql 服务名)

其它网站host也必须是 mysql 服务名


2、在 docker-compose.yml 里修改了 MYSQL_ROOT_PASSWORD

MYSQL_ROOT_PASSWORD 只在第次初始化容器、创建新volume时才会生效;即使你换了新密码,再启动也是用原来的密码,不会自动覆盖。

2.1. 删除旧数据卷后重建

如果你只是在开发或测试环境,需要用新的 root 密码,可以先删除原数据卷,再启动:

docker-compose down -v
docker-compose up -d

2.2. 不想丢数据,只想改密码

如果你的数据不能丢,只是想修改 root 密码,需要进入 MySQL 容器内部手动改密码:

docker exec -it [你的mysql服务名] mysql -u root -p

输入旧的 root 密码后,执行:

ALTER USER 'root'@'%' IDENTIFIED BY '新密码';
FLUSH PRIVILEGES;


项目迁移

1、在旧服务器上操作

1.1、生成镜像

docker commit [php容器名或ID] myphp:withcode
docker commit [nginx容器名或ID] mynginx:withcode

1.2、导出镜像文件

docker save -o myphp_withcode.tar myphp:withcode
docker save -o mynginx_withcode.tar mynginx:withcode

1.3、打包数据卷

1.3.1、检查卷是否已创建

#看看有没有 nginx-php-mysql_mysql_data
docker volume ls

#查看挂载点
docker volume inspect nginx-php-mysql_mysql_data

1.3.2、打包数据卷

docker run --rm -v nginx-php-mysql_mysql_data:/volume -v $(pwd):/backup alpine tar czvf /backup/mysql_data.tar.gz -C /volume . 

1.4、修改docker-compose.yml

修改nginx、php的image

version: '3.7'

services:
  nginx:
    image: mynginx:withcode
    container_name: nginx
    ports:
      - "8080:80"
      - "443:443"
      - "83:83"
      - "99:99"
      - "9090:9090"  
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
      - ./www:/var/www/html
    depends_on:
      - php
    networks:
      - app-network

  php:
    image: myphp:withcode
    container_name: php
    volumes:
      - ./www:/var/www/html
    networks:
      - app-network

  mysql:
    image: mysql:5.7
    container_name: mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: suze888  # 请设置安全密码
      MYSQL_DATABASE: mydb
      MYSQL_USER: myuser
      MYSQL_PASSWORD: mypassword
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - app-network

networks:
  app-network:

volumes:
  mysql_data:

1.5、打包docker-compose.yml所在文件夹,准备迁移

2、在新服务器上操作

2.1、加载镜像

docker load -i myphp_withcode.tar
docker load -i mynginx_withcode.tar

2.2、恢复数据到卷

# 查询卷的物理位置:(需要先docker-compose up -d才会有卷)
docker volume inspect nginx-php-mysql_mysql_data
# 你会看到类似:"Mountpoint": "/var/lib/docker/volumes/nginx-php-mysql_mysql_data/_data"
# 进入卷目录并还原数据
# 先进入卷目录并清空原有数据:
cd /var/lib/docker/volumes/nginx-php-mysql_mysql_data/_data
rm -rf ./*
# 然后将你的数据备份包解压进来:
tar xzvf /opt/nginx-php-mysql/mysql_data.tar.gz

2.3、启动服务

在 docker-compose.yml 所在目录执行:

docker-compose up -d

 

发表回复

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