WSL2通过docker部署PHP环境

安装WSL2

安装WSL2及docker参照:http://www.884358.com/windows11-wsl2/

通过docker compose部署

目录结构

├── Dockerfile
├── conf
│   └── timezone.cnf
│   └── buffer.cnf
├── docker-compose.yml
├── dump
│   └── mydb.sql
└── www
    └── index.php

说明:conf、dump、www为文件夹。其中conf文件夹用于映射到/etc/mysql/conf.d/目录,该目录是是MySQL中用于存放额外配置文件的目录。它的主要作用是允许用户或管理员在不修改主配置文件(/etc/my.cnf)的情况下,添加自定义配置或覆盖默认配置。dump文件夹将映射到/docker-entrypoint-initdb.d目录,该目录是Docker官方MySQL镜像中用于初始化数据库的特殊目录。它的主要作用是在容器首次启动时,自动执行目录中的 SQL 脚本或 Shell 脚本,以完成数据库的初始化工作。www目录为网站根目录。

docker-compose.yml

version: "3.1"
services:
    www:
        build: .
        ports: 
            - "80:80"
        volumes:
            - ./www:/var/www/html/
        links:
            - db
        networks:
            - default
    db:
        image: dockerpull.cn/mysql:8.0
        ports: 
            - "3306:3306"
        command: --default-authentication-plugin=mysql_native_password
        environment:
            MYSQL_DATABASE: myDb
            MYSQL_USER: user
            MYSQL_PASSWORD: test
            MYSQL_ROOT_PASSWORD: root
        volumes:
            - ./dump:/docker-entrypoint-initdb.d
            - ./conf:/etc/mysql/conf.d
            - persistent:/var/lib/mysql
        networks:
            - default
#    phpmyadmin:
#        image: phpmyadmin/phpmyadmin
#        links: 
#            - db
#        ports:
#            - 8000:80
#        environment:
#            MYSQL_USER: user
#            MYSQL_PASSWORD: test
#            MYSQL_ROOT_PASSWORD: test
volumes:
    persistent:

Dockerfile

FROM dockerpull.cn/php:7.4-apache
# 修改源
RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN sed -i 's/security.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
# 打开rewrite
RUN a2enmod rewrite 
# 安装扩展
RUN docker-php-ext-install pdo pdo_mysql
RUN apt-get update \
    && apt-get install -y libzip-dev \
    && apt-get install -y zlib1g-dev \
    && rm -rf /var/lib/apt/lists/* \
    && docker-php-ext-install zip \
    && docker-php-ext-install mysqli

dump/mydb.sql

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;


CREATE TABLE `person` (
  `id` int(11) NOT NULL,
  `name` varchar(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


INSERT INTO `person` (`id`, `name`) VALUES
(1, 'William'),
(2, 'Marc'),
(3, 'John');

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

www/index.php

<html>
 <head>
  <title>Hello...</title>
  <meta charset="utf-8">
  <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
</head>
<body>
    <div class="container">
    <?php echo "<h1>Hello,docker!</h1>"; ?>
    <?php

    $conn = mysqli_connect('db', 'user', 'test', "mydb");

    $query = 'SELECT * From person';
    $result = mysqli_query($conn, $query);

    echo '<table class="table table-striped">';
    echo '<thead><tr><th></th><th>id</th><th>name</th></tr></thead>';
    while($value = $result->fetch_array(MYSQLI_ASSOC)){
        echo '<tr>';
        echo '<td><a href="#"><span class="glyphicon glyphicon-search"></span></a></td>';
        foreach($value as $element){
            echo '<td>' . $element . '</td>';
        }

        echo '</tr>';
    }
    echo '</table>';

    $result->close();

    mysqli_close($conn);

    ?>
    </div>
</body>
</html>

conf/timezone.cnf

调整时区

[mysqld]
default-time-zone = '+08:00'

conf/buffer.cnf

调整缓冲区大小

[mysqld]
innodb_buffer_pool_size = 1G

conf/charset.cnf

自定义字符集

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

开始构建

docker-compose up -d

访问

通过WSL的IP即可访问:

参考第三方开源库

https://github.com/jcavat/docker-lamp

发表评论

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