docker-compose 搭建 Lnmp 环境(附 dockerfile 下载)

前言

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

作为一个 PHP 开发者,Lnmp 环境往往是我们进行工作、学习的地方。本博文就是讲诉怎么使用 docker-compose 搭建一个开发环境。

现在大多 docker 桌面版环境中都预装了 docker-compose ,所以不需要单独安装了。若不确定可以在你的终端输入 docker-compose --version。 如提示没有该命令,请自行安装。

本文实例环境中安装了PHP、mariadb、nginx、redis、composer、swoole等。

正文

构建目录树

其实建议大家把 Lnmp 环境统一到一个目录下,这样将来你需要移植到其他设备会方便一些。博主的目录树大致为下图所示,具体的目录含义大家结合名称大致是能明白的。
docker-compose 搭建 Lnmp 环境(附 dockerfile 下载)_第1张图片

编写 dockerfile

php dockerfile

本文仅使用 7.3 作为例子,若你需要其他版本或多版本请自行添加。本例子中也预安装了一些PHP扩展,若你需要其他的请自行填加。

# 镜像版本
ARG VERSION=7.3

# 基础镜像
FROM php:${VERSION}-fpm

# 给镜像添加一些元数据(metadata) 可省略
LABEL maintainer="ucwords" version=${VERSION}

# 配置文件 直接替换容器中默认文件,下面 CMD 就不需要指定了。
COPY ../../config/php/php.ini   /usr/local/etc/php/php.ini
COPY ../../config/php/www.conf  /usr/local/etc/php-fpm.d/www.conf

# 预装扩展包
COPY ../../src/composer.phar    /work/src/composer.phar
COPY ../../src/redis-5.1.0.tgz  /work/src/redis-5.1.0.tgz
COPY ../../src/swoole-4.6.0.tgz /work/src/swoole-4.6.0.tgz

# 更新、安装、配置环境 可以适当增删,看你的需求。
# deb http:*** 这些是为了加快数据改了镜像。若你的网络访问国外镜像OK。可以去掉哦。
RUN echo '' > /etc/apt/sources.list \
    && echo \
    deb http://mirrors.aliyun.com/debian/ buster main non-free contrib \
    deb http://mirrors.aliyun.com/debian-security buster/updates main \
    deb http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib \
    deb http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib \
    deb-src http://mirrors.aliyun.com/debian-security buster/updates main \
    deb-src http://mirrors.aliyun.com/debian/ buster main non-free contrib \
    deb-src http://mirrors.aliyun.com/debian/ buster-updates main non-free contrib \
    deb-src http://mirrors.aliyun.com/debian/ buster-backports main non-free contrib \
    > /etc/apt/sources.list \
    && apt-get update \
    && apt-get remove -y libssl1.1 \
    && apt-get install -y \
    wget zlib1g-dev libzip-dev htop vim less curl make gcc pkg-config inetutils-ping dnsutils git \
    openssl libssl-dev libmemcached-dev zlib1g-dev zlib1g ca-certificates \
    libwebp-dev libjpeg-dev libpng-dev libfreetype6-dev libxpm-dev \
    && docker-php-ext-configure gd --with-gd --with-webp-dir --with-jpeg-dir --with-png-dir --with-zlib-dir --with-xpm-dir --with-freetype-dir \
    && docker-php-ext-install zip pdo pdo_mysql mysqli opcache sockets bcmath gd \
# 更新pecl
    && pecl channel-update pecl.php.net \
# redis
    && pecl install /work/src/redis-5.1.0.tgz \
    && docker-php-ext-enable redis \
    && rm /work/src/redis-5.1.0.tgz \
# swoole
    && mkdir swoole \
    && tar -xzf /work/src/swoole-4.6.0.tgz -C swoole --strip-components=1 \
    && rm /work/src/swoole-4.6.0.tgz \
    && ( \
        cd swoole \
        && phpize \
        && ./configure --enable-mysqlnd --enable-sockets --enable-openssl --enable-http2 \
        && make -j$(nproc) \
        && make install \
    ) \
    && docker-php-ext-enable swoole \
    && rm -r swoole \
# composer
    && chmod u+x /work/src/composer.phar \
    && mv /work/src/composer.phar /usr/local/bin/composer \
    && composer config -g repo.packagist composer https://mirrors.aliyun.com/composer \
# 收尾清理
    && apt-get clean \
    && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \
    && ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone

# 指定工作目录
WORKDIR /work

# 声明端口
EXPOSE 9000

# 启动 php-fpm
CMD ["php-fpm", "-R"]

Mariadb dockerfile

这里使用的是 mariadb 而非 mysql, 请注意甄别,最好把配置文件和数据外挂出来。

# 指定版本
ARG VERSION=10.5

# 镜像
FROM mariadb:${VERSION}

# 给镜像添加一些元数据(metadata) 可省略
LABEL maintainer="ucwords" version="1.19.0"

# root default password
ENV MARIADB_ROOT_PASSWORD 你的密码

# 声明端口
EXPOSE 3306

# run
CMD ["mysqld"]

Nginx dockerfile

# 指定版本
ARG VERSION=1.19.0

# 镜像
FROM nginx:${VERSION}

# 给镜像添加一些元数据(metadata) 可省略
LABEL maintainer="ucwords" version="1.19.0"

# 配置文件
COPY ../../config/nginx/nginx.conf /etc/nginx/nginx.conf

# 声明端口
EXPOSE 80 443

# run
CMD ["nginx", "-g", "daemon off;"]

redis dockerfile

最好把配置文件和数据外挂出来,若想深究 redis 的源码可以看这系列文章《Redis 系列文章导航》。

# 镜像版本
ARG VERSION=6.2.0

# 基础镜像
FROM redis:${VERSION}

# 给镜像添加一些元数据(metadata) 可省略
LABEL maintainer="ucwords" version=${VERSION}

# 配置文件
COPY  ../../config/redis/redis.conf /etc/redis/redis.conf

# 声明端口
EXPOSE 6379

# 在docker run 时运行, 为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。
CMD ["/usr/local/bin/redis-server", "/etc/redis/redis.conf"]

编写 docker-compose YML

把上面的所有容器放到一个桥接的网路环境中(networks 部分指定),方便可以直接使用容器名称就可以进行通信。

version: '3'
services:
  nginx:
    build:
      context: .
      dockerfile: dockerfile/nginx/Dockerfile
    image: nginx:1.19.0
    restart: always
    container_name: lnmp_nginx
    volumes:
      - ./config/nginx/vhosts:/etc/nginx/conf.d:rw
      - ./work:/work:rw
    networks:
      - lnmp
    depends_on:
      - fpm_73
      - mariadb
    ports:
      - "80:80"
      - "443:443"
    ulimits:
      nproc: 65535
      nofile:
        soft: 20000
        hard: 40000
    tty: true
    #mem_limit: 512m #内存限制
  fpm_73:
    build:
      context: .
      dockerfile: dockerfile/php/Dockerfile_7.3
    image: php:7.3-fpm
    restart: always
    container_name: lnmp_fpm_73
    volumes:
      - ./work:/work:rw
    networks:
      - lnmp
    ports:
      - "9500:9500"
      - "9501:9501"
    tty: true
    #mem_limit: 512m #内存限制
  redis:
    build:
      context: .
      dockerfile: dockerfile/redis/Dockerfile
    image: redis:6.2.0
    restart: always
    container_name: lnmp_redis
    ports:
      - "6379:6379"
    volumes:
      - ./data/redis:/data:rw
    environment:
      # 设置环境变量 时区上海 编码UTF-8
      TZ: Asia/Shanghai
      LANG: en_US.UTF-8
    networks:
      - lnmp
    tty: true
    #mem_limit: 512m #内存限制
  mariadb:
    build:
      context: .
      dockerfile: dockerfile/mysql/Dockerfile
    image: mariadb:10.5
    restart: always
    container_name: lnmp_mariadb
    volumes:
      - ./data/mysql:/var/lib/mysql:rw
    networks:
      - lnmp
    ports:
      - "3306:3306"
    ulimits:
      nproc: 65535
      nofile:
        soft: 20000
        hard: 40000
    tty: true
    #mem_limit: 512m #内存限制
networks:
  lnmp:
    driver: bridge

启动

请先按照文章的目录树、docker-file、YML 文件进行编写,也可以直接下载本文实例中的资源(点我)。

然后在和 docker-compose.yml 同级的目录下执行 docker-compose up -d ,等待安装完成,你就可以拥有一个开箱即用的环境了。

总结

本文以图文、代码等角度进行了 Lnmp 环境的一键搭建教程的讲解,该环境有着很大的扩展性。该示例中请注意几个点。

  1. docker-compose.yml 的 context 是和该示例中的文件目录树有着依赖关系。若你不想用这个目录树,你需要进行一些修改。
  2. 为了方便移植或重建容器,redis、mysql 的数据、配置都是外挂到物理主机中。
  3. 请留意工作目录和配置文件中的目录是否一致。比如PHP是在 /work 下, 对应 www.conf中比如 slowlog 等配置就需要对应一样的工作目录。

你可能感兴趣的:(PHP,Docker,docker,docker-compose,lnmp)