file-type

使用Docker轻松搭建LNMP运行环境

ZIP文件

下载需积分: 48 | 33KB | 更新于2025-02-11 | 88 浏览量 | 22 下载量 举报 1 收藏
download 立即下载
Docker是一种开源的容器化平台,它允许开发者将应用程序及其依赖打包为一个轻量级、可移植、自给自足的容器,这些容器可以在任何支持Docker的机器上运行。LNMP是一种软件架构,代表了Linux、Nginx(一种高性能的HTTP和反向代理服务器)、MySQL(数据库管理系统)、PHP(一种开源的脚本语言)。这种架构广泛应用于Web开发中,特别是在搭建Web服务器时。 Docker可以用来搭建LNMP环境,通过创建一个容器化的服务,能够快速部署LNMP堆栈,这对于开发、测试和生产环境都非常有用。使用Docker搭建LNMP环境具有诸多优点,包括环境隔离、快速部署、一致性、轻量级资源占用和便于维护等。 在使用Docker搭建LNMP环境时,我们通常会用到docker-compose工具,这是一个用于定义和运行多容器Docker应用程序的工具。通过一个YAML文件来配置应用程序的服务,然后使用一个命令,就可以创建和启动所有服务。 现在,我们将详细介绍如何使用docker-compose.yml文件以及相关文件来搭建LNMP环境。 ### 1. docker-compose.yml文件 docker-compose.yml文件是一个YAML格式的文本文件,它定义了Docker容器应用的各个服务。在搭建LNMP环境时,docker-compose.yml文件中会定义三个服务:nginx、php以及mysql。 #### 示例内容: ```yaml version: '3.1' services: web: image: nginx:alpine ports: - "80:80" volumes: - ./html:/usr/share/nginx/html depends_on: - php - db php: build: context: . dockerfile: Dockerfile volumes: - ./html:/var/www/html db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: example volumes: - db_data:/var/lib/mysql volumes: db_data: ``` 在这个配置中,我们定义了三个服务:web(Nginx)、php以及db(MySQL)。web服务映射了宿主机的80端口到容器的80端口,并且将宿主机的html目录挂载到容器的/usr/share/nginx/html目录。php服务则是通过Dockerfile构建的,需要在当前目录下有一个Dockerfile文件来指定构建细节。db服务使用了官方的MySQL镜像,并设置了环境变量MYSQL_ROOT_PASSWORD为example,同时将MySQL数据保存到宿主机的db_data卷中。 ### 2. PHP 在docker-compose.yml文件中,我们引用了一个Dockerfile来构建PHP镜像。这个Dockerfile中会指明PHP的版本,并且安装额外需要的PHP扩展以及配置文件。 #### 示例内容: ```Dockerfile FROM php:7.4-fpm RUN apt-get update && apt-get install -y \ libpng-dev \ libonig-dev \ libxml2-dev \ zip \ curl \ zlib1g-dev \ unzip \ git \ libpq-dev \ libjpeg-dev \ libfreetype6-dev \ libmcrypt-dev RUN docker-php-ext-install pdo pdo_mysql mbstring exif pcntl bcmath gd mysqli opcache RUN pecl install xdebug && docker-php-ext-enable xdebug ``` 在这个Dockerfile中,我们基于php:7.4-fpm官方镜像,安装了一些必要的开发工具和库,并且安装了PHP的多个扩展,最后安装了xdebug扩展用于PHP的调试。 ### 3. MySQL mysql服务直接使用官方的MySQL镜像,并通过环境变量设置root用户的密码。这个服务负责提供数据库服务,我们的PHP应用程序将连接到这个数据库服务。 ### 搭建步骤 1. 创建一个项目文件夹,并在其中创建docker-compose.yml文件和Dockerfile文件。 2. 根据需要修改docker-compose.yml和Dockerfile文件,确保它们符合应用程序的具体要求。 3. 使用命令`docker-compose up -d`来启动所有的服务。这将在后台启动LNMP环境。 4. 如果需要进入php容器进行调试或修改,可以使用命令`docker-compose exec php bash`。 ### 验证搭建 搭建完成后,可以通过访问宿主机的IP地址来验证Nginx服务是否正常工作。若要测试PHP服务是否正确连接MySQL服务,可以在html目录下创建一个简单的PHP文件,比如info.php,里面写入`<?php phpinfo(); ?>`,然后通过浏览器访问这个文件,如果页面上显示了详细的PHP信息,并且能够连接到MySQL数据库,说明LNMP环境搭建成功。 通过以上步骤,你已经使用Docker搭建好了LNMP运行环境,并且可以根据需要对Dockerfile和docker-compose.yml进行调整,以满足项目的特定需求。使用Docker构建的LNMP环境具有可移植性和一致性,可以轻松地在不同的环境之间迁移。

相关推荐

filetype
# docker搭建lnmp环境 <!-- TOC --> - [docker搭建lnmp环境](#docker搭建lnmp环境) - [一、Dockerfile定制镜像](#一dockerfile定制镜像) - [二、docker-compose](#二docker-compose) - [三、docker-compose编排lnmp环境](#三docker-compose编排lnmp环境) - [1、mysql](#1mysql) - [2、redis](#2redis) - [3、mongo](#3mongo) - [4、nginx](#4nginx) - [5、php](#5php) - [6、完整版](#6完整版) - [四、参考](#四参考) <!-- /TOC --> 有收获的话请**加颗小星星**,没有收获的话可以 **反对** **没有帮助** **举报**三连 ## 一、Dockerfile定制镜像 ```bash # FROM 指定基础镜像 FROM 镜像 FROM php:7.2-fpm # RUN 执行 RUN or RUN ["可执行文件", "参数1", "参数2"] RUN echo 'Hello, Docker!' > /usr/share/nginx/html/index.html RUN ["php", "-S", "0.0.0.0:8080"] # COPY 复制文件 COPY ... COPY swoole-4.2.10.tgz /home COPY nginx.conf /etc/nginx/nginx.conf # ADD 复制文件或目录,如果是.tgz,会被解压缩 ADD ... ADD nginx.conf /etc/nginx/nginx.conf # CMD 容器启动 CMD echo $HOME => CMD [ "/bin/sh", "-c", "echo $HOME" ] CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ] # ENTRYPOINT 入口点 ENTRYPOINT ["docker-entrypoint.sh"] 存在 ENTRYPOINT 后,CMD 的内容将会作为参数传给 ENTRYPOINT # ENV 环境变量 ENV ENV MYSQL_ROOT_PASSWORD root # ARG与ENV差不多 ARG 所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的 ENV MYSQL_ROOT_PASSWORD root # VOLUME 匿名卷 VOLUME ["", ""...] VOLUME ["/data"] # EXPOSE 暴露端口 EXPOSE [...] EXPOSE 80 443 # WOEKDIR 指定工作目录,进入容器后的落地目录 WORKDIR WORKDIR /var/www # USER 指定当前用户 USER USER root ``` ## 二、docker-compose - 服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。 - 项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。 ## 三、docker-compose编排lnmp环境 ### 1、mysql 这里我们使用了mysql5.5版本,没其它用意,相比5.7以上版本,占内存和硬盘最小的一个版本 我们准备了一个`my.cnf`作为额外配置,这里我修改了数据库的时区 ```cnf [mysqld] default-time-zone = '+8:00' ``` ```Dockerfile FROM mysql:5.5 COPY my.cnf /etc/mysql/conf.d EXPOSE 3306 ``` ### 2、redis 我们使用准备的配置文件`redis.conf`覆盖容器默认启动的配置文件,修改了`ip绑定`和`密码` ```conf bind 0.0.0.0 requirepass root ``` ```Dockerfile FROM redis:latest COPY redis.conf /usr/local/etc/redis/redis.conf CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ] EXPOSE 6379 ``` ### 3、mongo mongodb我们没有特殊处理 ```Dockerfile FROM mongo:latest EXPOSE 27017 ``` ### 4、nginx 我们准备了一份`nginx.conf`和虚拟目录`conf.d`,为了以后可以动态的配置网站的代理和负载均衡 还有一个日志目录,放在外层`logs`目录里面,记录nginx的访问日志 特别注意的是`fastcgi_pass php:9000;`而不是`fastcgi_pass 127.0.0.1:9000;`,目前自己也没明白 ```Dockerfile FROM nginx:alpine COPY nginx.conf /etc/nginx/nginx.conf EXPOSE 80 ``` ### 5、php php算是这里面最难搞定的,因为我们需要额外的添加php扩展,虽然php的docker官方提供了`docker-php-ext-configure`, `docker-php-ext-install`, `docker-php-ext-enable`,还是有些扩展需要通过`手动编译`或者`pecl`安装 由于pecl官网下载慢,我们事先下载好了几个需要的扩展 php-fpm用的是debian的linux系统,下载也很慢,我们备用了阿里云的镜像`sources.list` 我们还准备了php的默认配置`php.ini`和`opcache.ini` 比如swoole扩展安装,记得安装包用完后清理,还有得用`COPY`命令,`ADD`会解压缩 ```Dockerfile # swoole COPY swoole-4.2.10.tgz /home RUN pecl install /home/swoole-4.2.10.tgz && \ docker-php-ext-enable swoole && \ rm /home/swoole-4.2.10.tgz ``` ### 6、完整版 ```yml version: '3' networks: frontend: driver: bridge backend: driver: bridge volumes: mysql: driver: local mongo: driver: local redis: driver: local services: php: build: ./php volumes: - ${WORKER_DIR}:/var/www ports: - 9100:9000 depends_on: - mysql - redis - mongo networks: - backend nginx: build: ./nginx volumes: - ${WORKER_DIR}:/var/www - ./logs/nginx:/var/log/nginx - ./nginx/conf.d:/etc/nginx/conf.d ports: - 8000:80 depends_on: - php networks: - frontend - backend mysql: build: ./mysql environment: - MYSQL_ROOT_PASSWORD=root volumes: - ${DATA_PATH}/mysql:/var/lib/mysql ports: - 3310:3306 networks: - backend mongo: build: ./mongo environment: - MONGO_INITDB_ROOT_USERNAME=root - MONGO_INITDB_ROOT_PASSWORD=root ports: - 27010:27017 volumes: - ${DATA_PATH}/mongo:/data/db networks: - backend redis: build: ./redis volumes: - ${DATA_PATH}/redis:/data ports: - 6310:6379 networks: - backend ```