使用docker搭建LNMP开发环境

这篇具有很好参考价值的文章主要介绍了使用docker搭建LNMP开发环境。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

宿主机环境

系统:ubuntu 18.04
docker版本:18.03.1-ce

docker的安装请自行参考官方文档。

前言

这篇文章用于介绍如何使用docker在ubuntu系统上搭建一个LNMP开发环境,下面我们将会编写Dockerfile,基于官方docker hub镜像,分别构建我们自己的镜像,然后运行。要构建的镜像有:

  • PHP-FPM 7.4
  • Nginx 1.19
  • MySQL 5.7
  • Redis 6.2

为什么不直接使用官方镜像,而是自己再构建一个?
因为官方镜像一般安装的东西都很少,例如PHP-FPM的官方镜像,像redis、mysqli、pdo等等这些常用的扩展都是没有的,还有一些常用的系统命令也没有安装,例如ping、netstat、ps等等。

目录结构

我的项目路径是/home/rockyliang/mydocker,目录结构如下:
使用docker搭建LNMP开发环境

html目录用于存放网页文件和PHP文件,这个目录后面会通过挂载的方式,挂载到 PHP-FPM容器 和 nginx容器 里面去,以便它们可以访问这些文件。

redis目录下有一个redis.conf文件,这是从网上下载的redis配置文件,因为官方的redis镜像默认是没有配置文件的,后面构建redis镜像时,我们会把这个下载的配置文件复制进去。这个文件的下载地址是:
https://raw.githubusercontent.com/antirez/redis/6.2/redis.conf

注意URL里的版本号,因为我们要构建的redis镜像版本是6.2,因此配置文件版本也要用6.2的。

创建网络

因为各个容器之间需要通信,例如PHP-FPM容器需要跟MySQL、Redis容器连通,这样PHP才能查询数据库数据,因此我们先创建一个名为mynet的网络:

sudo docker network create mynet

创建好网络后,后续把各个容器加入到这个网络里面来就可以。

构建PHP-FPM镜像

Dockerfile文件
# 从官方基础版本构建
FROM php:7.4-fpm-buster

# 镜像信息
LABEL maintainer="ljfrocky" \
    version="2020.03.30" \
    description="PHP-FPM 7.4"

# 安装install-php-extensions
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/

# 设置系统时区
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 安装常用命令工具包,根据自己的实际需要情况进行安装
# vim: vi、vim
# procps: ps
# iputils-ping: ping
# less: less
# net-tools: netstat
# iproute2: ss
RUN apt-get update && apt-get install -y --no-install-recommends vim procps iputils-ping less net-tools iproute2

# 安装mysqli、pdo等PHP扩展
# 如果需要安装特定版本的扩展,可以在扩展名后加版本号,例如:redis-5.1.1
RUN chmod +x /usr/local/bin/install-php-extensions \
    && install-php-extensions redis mysqli pdo_mysql pcntl gd mcrypt bcmath sockets zip

# 使用线上环境的php.ini配置文件
RUN cp "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
开始构建

执行docker build命令构建FPM镜像,镜像名字设置为img-php-fpm,标签(TAG)设置为7.4

cd /home/rockyliang/mydocker/php-fpm
sudo docker build -t img-php-fpm:7.4 .

因为国内访问github不太稳定,构建过程可能会在“安装install-php-extensions”这一步骤发生错误,一般重试构建多几次就可以解决。

构建完成后,执行docker images命令,已经能看到新的镜像:

sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
img-php-fpm         7.4                 d511ba9f4c3d        2 minutes ago       456MB
php                 7.4-fpm-buster      c1bb99843706        3 days ago          389MB

执行docker run命令运行新镜像,容器名字设置为DOCKER_FPM,为了让容器能访问到宿主机的html目录,还需要把宿主机的html目录挂载到容器里的/var/www/html目录:

sudo docker run --name DOCKER_FPM \
-p 9000:9000 \
--network mynet \
-v /home/rockyliang/mydocker/html:/var/www/html:ro \
-d img-php-fpm:7.4

构建nginx镜像

Dockerfile文件
# 从官方基础版本构建
FROM nginx:1.19

# 镜像信息
LABEL maintainer="ljfrocky" \
    version="2020.03.30" \
    description="Nginx 1.19"

# 设置系统时区
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 安装常用命令工具包,根据自己的实际需要情况进行安装
# vim: vi、vim
# procps: ps
# iputils-ping: ping
# less: less
# net-tools: netstat
# iproute2: ss
RUN apt-get update && apt-get install -y --no-install-recommends vim procps iputils-ping less net-tools iproute2
开始构建

执行docker build命令构建nginx镜像,镜像名字设置为img-nginx,标签(TAG)设置为1.19

cd /home/rockyliang/mydocker/nginx
sudo docker build -t img-nginx:1.19 .

构建完成后,执行docker run命令运行新镜像,容器名字设置为DOCKER_NGINX,为了让容器能访问到宿主机的html目录,还需要把宿主机的html目录挂载到容器里的/usr/share/nginx/html目录:

sudo docker run --name DOCKER_NGINX \
-p 80:80 \
--network mynet \
-v /home/rockyliang/mydocker/html:/usr/share/nginx/html:ro \
-d img-nginx:1.19

容器运行起来后,进入容器修改nginx的配置文件,让nginx可以转发PHP请求:

sudo docker exec -it DOCKER_NGINX bash
vim /etc/nginx/conf.d/default.conf

将配置文件里的这一段
使用docker搭建LNMP开发环境
去除前面的注释,内容替换成:
使用docker搭建LNMP开发环境

在容器里重启nginx:nginx -s reload

测试

至此,nginx和PHP容器都搭建好了,测试一下看nginx能不能处理PHP请求,在宿主机的html目录里新建一个phpinfo.php文件:

<?php
phpinfo();

在浏览器访问一下http://localhost/phpinfo.php,内容显示正常:
使用docker搭建LNMP开发环境

构建MySQL镜像

Dockerfile文件
# 从官方基础版本构建
FROM mysql:5.7

# 镜像信息
LABEL maintainer="ljfrocky" \
    version="2020.03.31" \
    description="MySQL 5.7"

# 设置系统时区
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 安装常用命令工具包,根据自己的实际需要情况进行安装
# vim: vi、vim
# procps: ps
# iputils-ping: ping
# less: less
# net-tools: netstat
# iproute2: ss
RUN apt-get update && apt-get install -y --no-install-recommends vim procps iputils-ping less net-tools iproute2
开始构建

执行docker build命令构建MySQL镜像,镜像名字设置为img-mysql,标签(TAG)设置为5.7

cd /home/rockyliang/mydocker/mysql
sudo docker build -t img-mysql:5.7 .

构建完成后,执行docker run命令运行新镜像,容器名字设置为DOCKER_MYSQL,root账号密码设置为123456

sudo docker run --name DOCKER_MYSQL \
-p 3306:3306 \
--network mynet \
-e MYSQL_ROOT_PASSWORD=123456 \
-d img-mysql:5.7

构建Redis镜像

Dockerfile文件
# 从官方基础版本构建
FROM redis:6.2-buster

# 镜像信息
LABEL maintainer="ljfrocky" \
    version="2020.03.31" \
    description="Redis 6.2"

# 官方镜像默认是没有redis.conf配置文件的,如果需要配置文件,需要自己编写或者到网络上下载
# 6.2版本配置文件下载地址:https://raw.githubusercontent.com/antirez/redis/6.2/redis.conf
# 把宿主机上已下载好的配置文件复制到容器里去
COPY ./etc/redis.conf /usr/local/etc/redis/redis.conf

# 设置系统时区
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 安装常用命令工具包,根据自己的实际需要情况进行安装
# vim: vi、vim
# procps: ps
# iputils-ping: ping
# less: less
# net-tools: netstat
# iproute2: ss
RUN apt-get update && apt-get install -y --no-install-recommends vim procps iputils-ping less net-tools iproute2

# 以指定配置文件的方式启动redis
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
开始构建

执行docker build命令构建Redis镜像,镜像名字设置为img-redis,标签(TAG)设置为6.2

cd /home/rockyliang/mydocker/redis
sudo docker build -t img-redis:6.2 .

构建完成后,执行docker run命令运行新镜像,容器名字设置为DOCKER_REDIS

sudo docker run --name DOCKER_REDIS \
-p 6379:6379 \
--network mynet \
-d img-redis:6.2

容器运行起来后,进入容器修改redis配置文件:

sudo docker exec -it DOCKER_REDIS bash
vim /usr/local/etc/redis/redis.conf

bind 127.0.0.1 -::1这一行改为bind *,保存,退出容器,然后重启容器:

sudo docker restart DOCKER_REDIS

测试

在宿主机的html目录里新建一个test.php文件,用于测试PHP是否能查询MySQL和redis:

<?php

function display($msg) {
    echo "{$msg}<br>";
}

/*
 * 测试连接MySQL
 */
$mysqlConn = new mysqli();
$ok = $mysqlConn->real_connect('DOCKER_MYSQL', 'root', '123456');
if (!$ok) {
    exit("MySQL connect failed:" . $mysqlConn->connect_error);
}
$mysqlConn->close();
display("测试MySQL连接:OK");

/*
 * 测试连接redis
 */
$redis = new Redis();
try {
    $redis->connect('DOCKER_REDIS', 6379, 2);
} catch (Throwable $e) {
    exit("Redis connect failed:" . $e->getMessage());
}
$redis->close();
display("测试Redis连接:OK");

在浏览器访问一下http://localhost/test.php,连接数据库正常:
使用docker搭建LNMP开发环境

日志/数据/配置文件路径

在部署服务时,我们一般都会关注日志路径、数据存储路径、配置文件路径,下面列一下上面几个镜像的一些默认路径:

镜像 日志 配置文件 数据
php:7.4-fpm-buster 默认无日志文件,access log和error log都是输出到标准输出,需要使用docker logs命令查看,如果需要将日志记录到文件里,请参阅后面章节内容 /usr/local/etc
(php.ini和php-fpm.conf等配置文件都在这个路径里)
nginx:1.19 /var/log/nginx/access.log
/var/log/nginx/error.log
这两个文件都是软链接到标准输出的,无法查看里面的内容,只能通过docker logs命令查看。解决方法见后面章节内容
/etc/nginx /usr/share/nginx/html
mysql:5.7 /var/log/mysql /etc/mysql /var/lib/mysql
redis:6.2-buster 默认无日志文件,日志都是输出到标准输出,需要使用docker logs命令查看,如果需要将日志记录到文件里,请参阅后面章节内容 默认无配置文件,可以自己指定 /data
(rdb文件存放路径)

记录日志到文件

通过上一章节,我们知道PHP-FPM、nginx、redis的日志是不记录到实体文件里的,只能通过docker logs {容器名称或ID}命令来查看,那么,如果我们想把日志记录到实体文件里,可以怎么做呢?

PHP-FPM

进入PHP-FPM容器,修改/usr/local/etc/php-fpm.d/zz-docker.conf文件:
使用docker搭建LNMP开发环境
新增图中两行内容,保存并重启容器,这样PHP-FPM的 access log 和 error log 就会记录到我们指定的文件里了。

nginx

nginx容器里的日志文件是个软链接:

root@adb13aee521c:/var/log/nginx# ls -l
total 0
lrwxrwxrwx 1 root root 11 May 12  2021 access.log -> /dev/stdout
lrwxrwxrwx 1 root root 11 May 12  2021 error.log -> /dev/stderr

所以如果想把日志记录到文件里去,把软链接删除即可:

cd /var/log/nginx
unlink access.log
unlink error.log
nginx -s reload
redis

因为上面我们在构建redis镜像时,有通过COPY指令复制了一个redis.conf配置文件进去,我们通过修改配置文件来配置日志文件路径即可。

假设我们希望把日志文件保存在/var/log/redis目录里,首先我们要创建好这个目录,并确保redis用户对这个目录有写入的权限

mkdir /var/log/redis
chown redis:redis /var/log/redis/

修改/usr/local/etc/redis/redis.conf文件:
使用docker搭建LNMP开发环境
修改logfile参数,指定日志文件路径,保存退出,重启redis容器。

docker-compose

如果你觉得像上面那样一个一个的构建镜像和运行太麻烦,可以试下用docker-compose来减轻工作量,在项目根目录里编写一个docker-compose.yml,内容如下:

version: "3"
services:

  nginx:
    image: img-nginx:1.19
    build:
      context: ./nginx
      dockerfile: Dockerfile
    container_name: DOCKER_NGINX
    ports:
      - "80:80"
      - "443:443"
    networks:
      - lnmp-network
    volumes:
      - ./html:/usr/share/nginx/html:ro
    restart: always
    depends_on:
      - php-fpm

  php-fpm:
    image: img-php-fpm:7.4
    build:
      context: ./php-fpm
      dockerfile: Dockerfile
    container_name: DOCKER_FPM
    volumes:
      - ./html:/var/www/html
    networks:
      - lnmp-network
    restart: always
    depends_on:
      - mysql
      - redis

  mysql:
    image: img-mysql:5.7
    build:
      context: ./mysql
      dockerfile: Dockerfile
    container_name: DOCKER_MYSQL
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: '123456'
    command: mysqld  --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
    networks:
      - lnmp-network
    restart: always

  redis:
    image: img-redis:6.2
    build:
      context: ./redis
      dockerfile: Dockerfile
    container_name: DOCKER_REDIS
    ports:
      - "6379:6379"
    networks:
      - lnmp-network
    restart: always

networks:
  lnmp-network:
    driver: bridge
    ipam:
      config:
        - subnet: '172.31.0.0/16'

然后执行sudo docker-compose up -d命令,docker-compose就会一次性把所有镜像构建好,并且运行。

在搭建环境时遇到的一些坑

1.配置文件修改错了,导致容器启动不起来了

一般修改完配置文件,都需要重启容器来让新配置生效的,但如果不小心配置错了,导致容器起不来了就麻烦了,容器起不来,就无法进去重新修正配置文件。这时候可以通过docker cp命令,把有问题容器里的配置文件复制到宿主机上来,然后在宿主机上修改,修改完后,再docker cp回去容器里,这样就可以解决这个问题了。文章来源地址https://www.toymoban.com/news/detail-412296.html

到了这里,关于使用docker搭建LNMP开发环境的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Docker搭建LNMP环境实战(06):Docker及Docker-compose常用命令

    此处列举了docker及docker-compose的常用命令,一方面可以做个了解,另一方面可以在需要的时候进行查阅。不一定要强行记忆,用多了就熟悉了。 1.1、镜像常用命令 1)列举镜像 2)删除镜像 3)使用repositories:tag进行删除 1.2、容器常用命令 1)列举所有容器 2)列举正在运行的容

    2024年03月27日
    浏览(47)
  • Docker搭建LNMP环境实战(08):安装php-fpm

    在文件夹:/mnt/hgfs/dockers/test_site/www目录下创建文件:test.php,内容为: 在文件夹:/mnt/hgfs/dockers/test_site/compose下创建文件:test_site_php.yml,内容如下: 注意:此文件中网络的名称和nginx配置文件中网络的名称是相同的,都是:test_site_network 注意:最后一段为新加的修改 图1 f

    2024年04月13日
    浏览(44)
  • Docker-compose 启动 lnmp 开发环境

    GitHub传送阵 docker-lnmp 项目帮助开发者快速构建本地开发环境,包括Nginx、PHP、MySQL、Redis 服务镜像,支持配置文件和日志文件映射,不限操作系统; 此项目适合个人开发者本机部署,可以快速切换服务版本满足学习服务新版本的需求; 也适合团队中统一开发环境,设定好配置

    2024年02月01日
    浏览(42)
  • 在CentOS 8系统下搭建LNMP环境

    操作场景:LNMP 环境是指在 Linux 系统下,由 Nginx + MySQL/MariaDB + PHP 组成的网站服务器架构。本文档介绍如何在腾讯云云服务器(CVM)上手动搭建 LNMP 环境。 进行手动搭建 LNMP 环境,您需要熟悉 Linux 命令,并对所安装软件的使用及版本兼容性比较了解。 本文搭建的 LNMP 环境软

    2024年02月13日
    浏览(39)
  • 使用docker搭建LNMP架构

    目录 环境准备 下载安装包 服务器环境 任务分析 nginx部分 建立工作目录 编写 Dockerfile 脚本 准备 nginx.conf 配置文件 生成镜像 创建自定义网络 启动镜像容器 验证nginx MySQL部分 建立工作目录 编写 Dockerfile 准备 my.cnf 配置文件 生成镜像 启动镜像容器 验证mysql PHP部分 建立工作目

    2024年01月18日
    浏览(39)
  • Docker实践:使用Docker搭建个人开发环境(极简版)

    本文是在服务器 已经配置好 Docker 相关环境的情况下, 简要介绍 了在服务器上如何构建 Docker 镜像来搭建个人开发环境,因此本文 不涉及 Docker 的安装、维护以及各种细节,若要 详细了解 ,请查看文章最后的 相关资料 一节。 以下所有操作均在同一文件夹(例如 /media/user

    2024年02月16日
    浏览(39)
  • 使用 Docker 高效搭建本地开发环境(详细教程)

    试错 对开发者而言,每天会催生出的各式各样的新技术都需要尝试,然而开发者却不太可能为他们一一搭建好环境并进行测试。时间非常宝贵,正是得益于  Docker ,让我们有可能在一条或者几条命令内就搭建完环境,而且这个环境大到一个特定版本的操作系统,小到一个软

    2024年02月08日
    浏览(57)
  • docker使用code-server搭建开发环境 v2.0

    docker安装 1、设置安装目录 2、安装nodejs16 3、安装rust 设置国内更新路径,放到 vim /etc/profile 安装rust 1、下载镜像 2、运行和挂载目录 说一下运行命令 3、配置容器内的环境变量 验证 ip:80 然后输入密码就行

    2024年02月12日
    浏览(47)
  • 使用code-server为Docker容器搭建在线开发环境

    Code-server是一个基于服务端的开源VSCode。只要服务器端配置好code-server,就可以在任何浏览器上使用VScode访问服务器的代码进行编程。(GitHub地址:https://github.com/cdr/code-server) Docker是一个开源的Linux容器引擎。我们在日常的开发任务中可以利用Docker容器快速地搭建实验环境或

    2023年04月08日
    浏览(44)
  • CentOS系统环境搭建(九)——centos系统下使用docker部署项目

    centos系统环境搭建专栏🔗点击跳转 关于Docker-compose安装请看CentOS系统环境搭建(三)——Centos7安装DockerDocker Compose,该文章同样收录于centos系统环境搭建专栏。 采用前后端分离的形式部署。 使用Docker运行项目。 使用Docker Compose创建项目容器。 使用git管理项目的更新。 安装

    2024年02月12日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包