Docker 配置LNMP开发环境

169 阅读3分钟

Docker 配置LNMP开发环境

以下是基于 Docker Compose 的一个示例配置文件,其中包括 PHP 7.1 和 7.2、MySQL 5.6、MongoDB 3.2 和 Nginx 1.10:

version: '3'

services:
  php71:
    build:
      context: .
      dockerfile: Dockerfile.php71
    volumes:
      - ./code:/var/www/html
    ports:
      - "9001:9000"

  php72:
    build:
      context: .
      dockerfile: Dockerfile.php72
    volumes:
      - ./code:/var/www/html
    ports:
      - "9002:9000"

  mysql:
    image: mysql:5.6
    volumes:
      - ./mysql:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: example

  mongodb:
    image: mongo:3.2
    volumes:
      - ./mongodb:/data/db

  nginx:
    image: nginx:1.10
    ports:
      - "80:80"
    volumes:
      - ./code:/var/www/html
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf

以上配置文件将使用 Dockerfile.php71 和 Dockerfile.php72 构建两个不同的 PHP 版本镜像,然后将当前目录下的 code 目录挂载到这两个容器中,同时将它们的 9000 端口映射到宿主机的 9001 和 9002 端口。

MySQL 和 MongoDB 容器分别使用官方镜像,并将它们的数据目录挂载到当前目录下的 mysql 和 mongodb 目录中。

Nginx 容器使用官方镜像,并将它的 80 端口映射到宿主机的 80 端口,同时将当前目录下的 nginx/default.conf 文件挂载到容器中作为 Nginx 的配置文件。

以下是针对 PHP 7.1 和 7.2 的 Dockerfile 示例,你可以将它们分别保存到 Dockerfile.php71 和 Dockerfile.php72 文件中。

Dockerfile.php71:

FROM php:7.1-fpm

RUN apt-get update && apt-get install -y \
    libzip-dev \
    zlib1g-dev \
    libpng-dev \
    libjpeg-dev \
    libfreetype6-dev \
    libssl-dev \
    libmcrypt-dev \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd mysqli pdo_mysql zip opcache

RUN pecl install mongodb-1.7.4 \
    && docker-php-ext-enable mongodb

RUN curl -sS <https://getcomposer.org/installer> | php \
    && mv composer.phar /usr/local/bin/composer

Dockerfile.php72:

FROM php:7.2-fpm

RUN apt-get update && apt-get install -y \
    libzip-dev \
    zlib1g-dev \
    libpng-dev \
    libjpeg-dev \
    libfreetype6-dev \
    libssl-dev \
    libmcrypt-dev \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd mysqli pdo_mysql zip opcache

RUN pecl install mongodb-1.7.4 \
    && docker-php-ext-enable mongodb

RUN curl -sS <https://getcomposer.org/installer> | php \
    && mv composer.phar /usr/local/bin/composer

以上示例 Dockerfile 安装了一些常用的 PHP 扩展和 MongoDB 扩展,以及 Composer 包管理工具。你可以根据自己的需要修改这些 Dockerfile。然后可以在 docker-compose.yml 文件中引用它们进行构建。

以下是针对 Nginx 的默认配置文件示例,你可以保存到 nginx/default.conf 文件中。

server {
    listen 80;
    server_name localhost;
    root /var/www/html;

    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

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

以上示例配置文件定义了两个 PHP-FPM 的上游服务器,分别为 php71 和 php72,然后在每个 location 中指定了相应的上游服务器。例如 /project1 的 location 中使用 PHP 7.1 的上游服务器 php71,而 /project2 的 location 中使用 PHP 7.2 的上游服务器 php72。

你可以根据实际需要修改以上配置文件,例如更改项目的目录、修改域名、添加 HTTPS 支持等。然后将其挂载到 Nginx 容器中作为配置文件。

整理文件结构

下面是一个可能的文件结构示例:

.
├── Dockerfile.php71
├── Dockerfile.php72
├── docker-compose.yml
├── nginx
│   └── default.conf
└── mysql
    └── data

其中,

  • Dockerfile.php71Dockerfile.php72 分别是 PHP 7.1 和 7.2 的 Dockerfile 文件;
  • docker-compose.yml 是 Docker Compose 配置文件,包括了 PHP、MySQL 和 Nginx 三个容器的定义;
  • nginx 目录下的 default.conf 文件是 Nginx 的默认配置文件,你可以根据实际需要进行修改;
  • mysql/data 目录是 MySQL 数据库的数据目录,用于持久化存储数据库数据。

你可以将以上文件结构保存到一个名为 my-project 的目录下,并在该目录中运行 docker-compose up 命令启动容器。如果一切正常,你应该可以在浏览器中访问 http://localhost 来访问 Nginx 服务器,并使用 PHP 和 MySQL 容器来运行你的项目。