下载本次记录所用到的全部软件和镜像
项目结构
lnmp/ ├── docker-compose.yml ├── nginx/ │ ├── conf.d/ │ │ └── default.conf ├── php/ │ └── Dockerfile
创建compose.yml文件
version: '3' services: # MySQL 服务 mysql: image: mysql:8.0 container_name: mysql restart: always environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: testdb MYSQL_USER: testuser MYSQL_PASSWORD: testpass volumes: - mysql-data:/var/lib/mysql ports: - "3306:3306" # PHP-FPM 服务 php: build: context: ./php dockerfile: Dockerfile container_name: php restart: always volumes: - ./www:/var/www/html depends_on: - mysql # Nginx 服务 nginx: image: nginx:latest container_name: nginx restart: always ports: - "80:80" volumes: - ./www:/var/www/html - ./nginx/conf.d:/etc/nginx/conf.d depends_on: - php # phpMyAdmin 服务 phpmyadmin: image: phpmyadmin/phpmyadmin container_name: phpmyadmin restart: always environment: PMA_HOST: mysql PMA_PORT: 3306 PMA_ARBITRARY: 1 ports: - "8080:80" depends_on: - mysql volumes: mysql-data:
创建nginx/conf.d/default.conf文件
server { listen 80; server_name _; root /var/www/html; index index.php index.html index.htm; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_pass php:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
创建php/Dockerfile文件
FROM php:8.1-fpm # 安装必要的扩展 RUN docker-php-ext-install pdo_mysql # 可选:安装其他扩展,如 mysqli、gd 等 # RUN apt-get update && apt-get install -y \ # libfreetype6-dev \ # libjpeg62-turbo-dev \ # libpng-dev \ # && docker-php-ext-configure gd --with-freetype --with-jpeg \ # && docker-php-ext-install -j$(nproc) gd # 创建项目目录 RUN mkdir -p /var/www/html # 设置工作目录 WORKDIR /var/www/html
启动容器
docker-compose up -d
关于在Docker中单独构建PHP镜像的部分
这里用的是直接使用 docker-compose 自动构建:
# PHP-FPM 服务 php: build: context: ./php dockerfile: Dockerfile
优点:
开发环境友好:修改 Dockerfile 后自动重建
配置简单:无需额外操作
版本同步:确保代码与镜像完全匹配
缺点:
重复构建:每次 docker-compose up 都会检查构建
缺乏版本控制:无法追溯历史镜像
分发不便:需要共享整个项目目录
可以预先构建镜像再使用
# PHP-FPM 服务 php: image: kysm/php81
验证部署
在 www 目录下创建一个 info.php 文件:
echo "" > www/info.php
打开浏览器,访问 http://localhost/info.php,如果能看到 PHP 信息页面,则说明部署成功。
访问 http://localhost:8080,使用之前配置的 MySQL 用户名和密码(如 root 和 root )登录 phpMyAdmin,若能成功登录,则 phpMyAdmin 服务正常运行。
注意事项
MySQL 配置:在 docker-compose.yml 中,MYSQL_ROOT_PASSWORD 是 MySQL 的 root 用户密码,你可以根据需要修改。
PHP 扩展:如果你的项目需要其他 PHP 扩展,可以在 php/Dockerfile 中添加相应的安装命令。
数据持久化:MySQL 数据存储在 mysql-data 卷中,即使容器被删除,数据也不会丢失。
端口冲突:如果 8080 端口已被占用,可在 docker-compose.yml 中修改 phpmyadmin 服务的端口映射。
安全设置:在生产环境中,建议对 phpMyAdmin 进行更严格的访问控制,例如使用防火墙限制访问 IP 等。
在已有的 Docker LNMP 环境基础上再建立一个新网站,可按以下步骤进行设置:
在 www 目录下为新网站创建一个独立的目录,例如 new_site,并将新网站的文件放置到该目录中。如果是全新的项目,可在该目录下进行开发。
cd lnmp/www mkdir new_site # 可以将新网站文件复制到 new_site 目录下,例如: # cp -r /path/to/your/new/site/files new_site
配置 Nginx
为新网站创建一个独立的 Nginx 配置文件,在 nginx/conf.d 目录下创建一个新的 .conf 文件,例如 new_site.conf。
touch nginx/conf.d/new_site.conf
server { listen 80; # 这里可以设置新网站的域名,如果没有域名,也可以使用 IP 地址 server_name new.site.com; root /var/www/html/new_site; index index.php index.html index.htm; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_pass php:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } location ~ /\.ht { deny all; } }
配置 hosts 文件(仅用于本地测试)
如果没有真实的域名,在本地测试时可以通过修改 hosts 文件来模拟域名访问。
Windows:在 C:\Windows\System32\drivers\etc\hosts 文件中添加以下内容
127.0.0.1 new.site.com
Linux 和 macOS:在 /etc/hosts 文件中添加以下内容:
127.0.0.1 new.site.com
创建新的数据库(如果需要)
如果新网站需要使用数据库,可以通过 phpMyAdmin 来创建新的数据库。
打开浏览器,访问 http://localhost:8080 登录 phpMyAdmin。
点击 “新建”,输入数据库名称(例如 new_site_db),然后点击 “创建”。
5. 配置新网站的数据库连接(如果需要)
如果新网站是基于数据库的应用,需要在网站的配置文件中设置数据库连接信息。以 PHP 项目为例,通常在配置文件中设置以下信息:
define('DB_NAME', 'new_site_db'); define('DB_USER', 'root'); define('DB_PASSWORD', 'root'); define('DB_HOST', 'mysql');
重启 Nginx 容器
配置完成后,需要重启 Nginx 容器使新的配置生效。
docker-compose restart nginx
7. 访问新网站
在浏览器中输入配置的域名(如 new.site.com),如果一切配置正确,就可以访问新网站了。
注意事项
端口冲突:确保新网站的配置不会与现有网站的端口设置冲突。
权限问题:确保新网站目录及其文件的权限设置正确,以便 PHP 进程可以正常读写文件。
域名解析:如果要在公网访问新网站,需要将域名解析到服务器的 IP 地址。
数据库主机:由于使用 Docker 部署,数据库主机名应设置为 mysql,这是 docker-compose.yml 中 MySQL 服务的名称。