Docker容器内手动部署web项目php环境常见问题

Docker部署Web项目
本文介绍如何使用Docker部署Web项目,包括nginx、php和mysql三个主要组件的配置过程及常见问题解决办法。

docker部署web项目需要用到的服务:nginx,php,mysql

一、部署nginx

1、下载nginx镜像:

docker pull nginx

 2、run一个nginx容器:

docker run --name runoob-php-nginx -p 8083:80 -d \
    -v ~/nginx/www:/usr/share/nginx/html:ro \
    -v ~/nginx/conf/conf.d:/etc/nginx/conf.d:ro \
    --link myphp-fpm:php \
    nginx

参数说明:

  • -p 8083:80: 端口映射,把 nginx 中的 80 映射到本地的 8083 端口。
  • ~/nginx/www: 是本地 html 文件的存储目录,/usr/share/nginx/html 是容器内 html 文件的存储目录。
  • ~/nginx/conf/conf.d: 是本地 nginx 配置文件的存储目录,/etc/nginx/conf.d 是容器内 nginx 配置文件的存储目录。
  • --link myphp-fpm:php: 把 myphp-fpm 的网络并入 nginx,并通过修改 nginx 的 /etc/hosts,把域名 php 映射成 127.0.0.1,让 nginx 通过 php:9000 访问 php-fpm。

 

二、部署php

 1、下载php镜像,版本:5.6(最新版也可以):

docker pull php:5.6-fpm

 2、run一个php容器:

docker run --name  myphp-fpm -v ~/nginx/www:/www  -d php:5.6-fpm

参数说明

        1、--name myphp-fpm : 将容器命名为 myphp-fpm。

        2、-v ~/nginx/www:/www: 将主机中目录 ~/nginx/www 挂载到容器的 /www

3、在主机家目录下创建 ~/nginx/conf/conf.d目录,新建runoob-test-php.conf 文件: 

mkdir -vp ~/nginx/conf/conf.d
cd ~/nginx/conf/conf.d/
vi runoob-test-php.conf

4、添加以下内容到runoob-test-php.conf文件: 

server {
    listen       80;
    server_name  localhost;
 
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm index.php;
    }
 
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
 
    location ~ \.php$ {
        fastcgi_pass   php:9000;  # php-fpm 服务的 URL
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /www/$fastcgi_script_name;  # myphp-fpm 中 php 文件的存储路径,映射到本地的 ~/nginx/www 目录
        include        fastcgi_params;
    }
}

5、在主机家目录下创建 ~/nginx/www 目录,新建index.php文件: 

mkdir -vp ~/nginx/www
cd ~/nginx/www
vi index.php

6、添加以下内容到index.php文件: 

<?php
echo phpinfo();
?>

7、浏览器输入主机ip:8083或直接在主机内curl localhost:8083查看php环境页面,能打开表示php部署成功。

 

三、部署mysql

1、下载mysql镜像:

docker pull mysql

2、run一个mysql容器

docker run -itd --name mysql-test \
 --link myphp-fpm:phpfpm \
 --link runoob-php-nginx:nginx \
 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql

参数说明:

  • –link phpfpm:phpfpm   # 将此容器与phpfpm通过网络连接起来,这样在nginx容器里就可以访问到phpfpm容器里提供的phpfpm服务。
  • –link runoob-php-nginx:nginx   # 将此容器与nginx容器通过网络连接起来,在nginx容器以后即可以通过主机名访问到mysql容器进行链接数据库操作。
  • -e MYSQL_ROOT_PASSWORD=123456  # 设置mysql的root用户密码为123456
  • -p 3306:3306  # 映射容器端口

3、登录mysql进行测试:

mysql -u root -p

回车输入密码123456  看到以下内容表示mysql运行正常:


Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.27 MySQL Community Server - GPL

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

4、复制项目内容到~/nginx/www 目录下

 5、部署完成,浏览器输入主机ip:8083访问主页

常见问题:

1、浏览器访问网站提示缓存目录写入权限不足、**目录创建失败、**文件写入失败:

修改主机及nginx容器 www 目录权限:

chmod -R 777 www

2、访问数据库出错:

为php容器安装拓展(如果之前启用了gd,需要先在php.ini文件中注释掉extension=gd.so并重启容器后再执行以下步骤):

docker exec -it myphp-fpm /bin/bash

cd /usr/local/bin

docker-php-ext-install pdo_mysql

执行完毕退出容器,并重启php容器。

3、缺少扩展gd库:

# 进入php容器
docker exec -it myphp-fpm /bin/bash

# 更新软件源
apt update

# 安装库
apt install -y libwebp-dev libjpeg-dev libpng-dev libfreetype6-dev

# 解压源码
docker-php-source extract

# 进入gd源码文件夹
cd /usr/src/php/ext/gd

# 准备编译
docker-php-ext-configure gd --with-webp-dir=/usr/include/webp --with-jpeg-dir=/usr/include --with-png-dir=/usr/include --with-freetype-dir=/usr/include/freetype2

# 编译安装 
docker-php-ext-install gd

# 检查扩展是否安装成功
php -m | grep gd

# 退出php容器
exit

# 重启php容器

4、网站图形验证码显示不出来:

报错:Fatal error: Call to undefined function core\extend\code\imagettftext()

解决方案:

docker-php-ext-configure gd --enable-gd-native-ttf --with-freetype-dir=/usr/include/freetype2 --with-png-dir=/usr/include

# 重新编译:
docker-php-ext-install gd

报错:configure: error: freetype-config not found.

解决方案:

apt install libfreetype6-dev

docker-php-ext-configure gd --enable-gd-native-ttf --with-freetype-dir=/usr/include/freetype2 --with-png-dir=/usr/include

# 重新编译:
docker-php-ext-install gd

在Windows系统上使用Docker部署ThinkPHP 8项目可以通过组合使用Docker Compose、Nginx、MySQL以及PHP-FPM等组件来实现。以下是一个完整的部署流程,涵盖环境准备、配置文件编写以及运行容器的步骤。 ### 3.1 环境准备 确保你的Windows系统已经安装了以下工具: - **Docker Desktop for Windows**:支持运行Docker容器,并提供图形界面管理功能。 - **WSL2(Windows Subsystem for Linux 2)**:Docker Desktop在Windows上依赖WSL2来运行Linux容器- **Docker Compose**:用于定义和运行多容器Docker应用。 安装完成后,建议将开发目录挂载为Docker卷,以便于代码的热更新与调试。 --- ### 3.2 项目结构规划 一个典型的ThinkPHP 8项目Docker部署时,通常需要如下目录结构: ``` tp8-docker/ │ ├── docker-compose.yml ├── nginx/ │ └── default.conf ├── mysql/ │ └── init.sql (可选) ├── php/ │ └── Dockerfile (可选自定义PHP配置) └── app/ └── (ThinkPHP 8项目源码) ``` 其中: - `nginx/default.conf` 是Nginx的配置文件,用于设置入口和转发规则。 - `app/` 是项目的源码目录,将挂载到容器中。 --- ### 3.3 编写 `docker-compose.yml` 以下是一个适用于ThinkPHP 8的 `docker-compose.yml` 示例: ```yaml version: '3' services: nginx: image: nginx:latest ports: - "80:80" volumes: - ./app:/var/www/html - ./nginx/default.conf:/etc/nginx/conf.d/default.conf depends_on: - php - mysql php: image: php:8.1-fpm volumes: - ./app:/var/www/html environment: - PHP_ALLOW_URL_FOPEN=1 - PHP_ALLOW_URL_INCLUDE=1 mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: tp8_db ports: - "3306:3306" volumes: - ./mysql/data:/var/lib/mysql - ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql ``` --- ### 3.4 配置 Nginx 创建 `nginx/default.conf` 文件内容如下: ```nginx server { listen 80; server_name localhost; root /var/www/html/public; index index.php index.html index.htm; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } ``` 此配置将Nginx指向ThinkPHP 8的 `public` 目录,并正确处理PHP请求。 --- ### 3.5 初始化数据库(可选) 如果项目依赖数据库,可以在 `mysql/init.sql` 中编写初始化脚本,例如: ```sql CREATE DATABASE IF NOT EXISTS tp8_db; USE tp8_db; -- 添加你的建表语句或初始数据 ``` --- ### 3.6 启动服务 在项目根目录下运行以下命令启动服务: ```bash docker-compose up -d ``` 这将启动Nginx、PHP-FPM和MySQL三个容器,并挂载相应的配置和代码目录。 --- ### 3.7 验证部署 打开浏览器访问 `http://localhost`,你应该能看到ThinkPHP 8的欢迎页面或你的项目首页,表示部署成功。 --- ### 3.8 常见问题与优化建议 - **目录权限问题**:确保 `app/` 目录在容器中有读写权限,必要时可在Dockerfile中设置用户权限。 - **数据库连接问题**:检查 `.env` 文件中的数据库配置是否正确,特别是 `DB_HOST=mysql`。 - **自定义PHP扩展**:如需安装 `pdo_mysql`、`opcache` 等扩展,可基于 `php:8.1-fpm` 构建自定义镜像并在 `Dockerfile` 中添加安装命令。 - **性能优化**:可考虑使用 `redis` 或 `memcached` 容器作为缓存服务,并在 `docker-compose.yml` 中添加对应服务。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值