# docker-compose-lnmp **Repository Path**: zandli/docker-compose-lnmp ## Basic Information - **Project Name**: docker-compose-lnmp - **Description**: 使用docker-compose一键安装lnmp+redis - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2021-04-08 - **Last Updated**: 2022-05-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # lnmp搭建的具体步骤和说明: ### 安装条件: 1. 安装好docker引擎; 2. 安装好docker-compose; ### 安装环境说明: 使用docker-compose来安装,只能针对单机版,不能管理集群; 本次安装nginx是最新版本,php是7.4,mysql是8.0,redis是6.0; ### 1、创建目录和文件: 1. 创建一个空目录,这里创建的是:/home/compose-lnmp; 2. 在compose-lnmp下创建: * 文件:docker-compose.yml,Read.md ; * 目录:php-dockerfile,project,server; 3. docker-compose.yml必须为可执行的文件; ``` chmod +x docker-compose.yml ``` ### 2、在php-dockerifle下创建Dockerfile文件并编写命令: * 同样,这个Dockerfile应该为可执行的文件; ``` chmod +x Dockerfile ``` * 编写安装php-7.4以及扩展的命令: 参考: docker hub仓库:https://hub.docker.com/_/php 使用docker-php-extension-installer 安装扩展:https://github.com/mlocati/docker-php-extension-installer 说明:使用docker-php-extension-installer 来安装扩展,写法更简单,但是速度比较慢,中间需要一定的等待时间,卡在那里半个多小时吧(实际是在下载扩展),千万不要退出! 这里写了22个扩展,有些用不上也可以去掉,不然安装扩展真的很慢很慢! ``` FROM php:7.4-fpm ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/ RUN chmod +x /usr/local/bin/install-php-extensions && sync && \ install-php-extensions bz2 bcmath \ calendar \ dba \ exif \ gettext gd \ imagick \ mysqli mcrypt \ opcache \ pcntl pdo_mysql \ redis \ shmop sysvmsg sysvsem sysvshm sockets soap \ xdebug \ zip ``` ### 3、在server里创建这四个目录以及子目录: nginx :etc,log; php:etc,log; mysql:data,etc,log; redis:data,etc ; ### 4、下载redis: * 通过实验docker单独安装redis,发现最新的为6.0.10; ``` wget http://download.redis.io/releases/redis-6.0.10.tar.gz tar xzf redis-6.0.10.tar.gz cd redis-6.0.10 //找到redis.conf文件 ``` * 将redis.conf复制一份到server/redis/etc目录下面; ### 5、编写docker-compose.yml文件(最重要): yaml文件经常写的报错,很头痛!如果yml文件报错,就复制到这个网站来检查哪里报错:http://yaml.cn/ ``` version: "3.8" services: nginx: #定义容器名称 container_name: "compose-nginx" #镜像(后面可以写版本) image: nginx #重启策略: #no,默认策略,在容器退出时,不重启容器; #on-failure,在容器非正常退出时(退出状态非0),才会重启容器 #on-failure:3,在容器非正常退出时重启容器,最多重启3次 #always,在容器退出时,总是重启容器 #unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器 restart: always #端口映射(宿主机8080->nginx容器80,可以映射多个,比如443端口) ports: - "80:80" - "443:443" environment: - TZ=Asia/Shanghai #依赖关系(先跑PHP) depends_on: - php #数据卷挂载 volumes: #nginx的配置文件挂载到宿主机的etc/nginx下面 - "$PWD/server/nginx/etc/conf.d:/etc/nginx/conf.d" - "$PWD/server/nginx/etc/nginx.conf:/etc/nginx/nginx.conf" #nginx的日志文件 - "$PWD/server/nginx/log:/var/log/nginx" #nginx默认指向的目录挂载 - "$PWD/project/html:/usr/share/nginx/html" #使用自定义的网络 networks: - app_net #也可以配置具体的ip #networks: # app_net: # ipv4v php: #容器的名称 container_name: "compose-php" #创建镜像使用的Dockerfile所在的目录 build: ./php-dockerfile #使用的镜像(如果本地不存在,就会从远程仓库拉起) image: php:7.4-fpm #php进程的端口号的映射 ports: - "9000:9000" #数据卷的挂载 volumes: #项目所在的目录 - "$PWD/project/php:/var/www/html" #php的配置目录 - "$PWD/server/php/etc:/usr/local/etc" #php日志目录 - "$PWD/server/php/log/:/var/log/php/" #这两条是防止启动php失败 stdin_open: true tty: true #links: # - "mysql" #网络定义 networks: - app_net # 设置时区 environment: - TZ=Asia/Shanghai mysql: #容器名称 container_name: "compose-mysql" #myslq镜像 #image: mysql:5.7 image: mysql:8 #mysql的端口 ports: - "3306:3306" #数据卷挂载设置 volumes: #- /data/mysql/data:/var/lib/mysql #- /data/mysql/conf:/etc/mysql/conf.d #- /data/mysql/logs:/data/mysql/logs #挂载mysql的data文件目录 - "$PWD/server/mysql/data:/var/lib/mysql" #挂载mysql的配置文件目录 - "$PWD/server/mysql/etc:/etc/mysql" #挂载mysql的日志文件目录 - "$PWD/server/mysql/logs:/data/mysql/logs" environment: - TZ=Asia/Shanghai # 设置时区 #设置mysql的密码 - MYSQL_ROOT_PASSWORD=12345 networks: app_net: ipv4_address: 10.10.10.1 redis: container_name: "compose-redis" #指定镜像 image: redis:6 restart: always ports: #端口映射 - "6379:6379" volumes: #挂载redis的配置目录 - "$PWD/server/redis/conf:/usr/local/etc/redis" - "$PWD/server/redis/data:/data" command: #执行命令(设置密码和持久化) redis-server /usr/local/etc/redis/redis.conf --requirepass 12345 --appendonly yes #不设置密码 #redis-server /usr/local/etc/redis/redis.conf environment: - TZ=Asia/Shanghai # 设置时区 networks: - app_net #自定义的网络 networks: app_net: driver: bridge driver_opts: com.docker.network.enable_ipv6: "true" ipam: config: - subnet: 10.10.0.0/16 ``` ### 6、运行docker-compose up命令: 重点注意: 1. 在运行docker-compose up命令之前,应该先将各个挂载卷的配置目录先注释掉; 原因:因为宿主机中的这些目录都是空目录,会覆盖掉容器中的这些配置目录,容器中的这些配置 ``` //nginx的volumes #- "$PWD/server/nginx/etc/conf.d:/etc/nginx/conf.d" #- "$PWD/server/nginx/etc/nginx.conf:/etc/nginx/nginx.conf" //mysql的volumes #- "$PWD/server/mysql/etc:/etc/mysql" //php的volumes #- "$PWD/server/php/etc:/usr/local/etc" //redis的volumes (redis这里不可以不需要注释,因为配置文件已经存在宿主机的这个位置了) #- "$PWD/server/redis/conf:/usr/local/etc/redis" ``` 2. 运行docker-compose up,然后等待启动成功,其中php的扩展安装就需要半个小时,这里很慢,请千万不要退出; 3. 使用命令将对应的容器中的配置复制出来: 注意:cp命令后紧跟的是对应的 容器id 通过docker ps -a可以看到 ``` nginx: docker cp b3192d26a98e:/etc/nginx/conf.d/. /home/compose-lnmp-new/server/nginx/etc/conf.d/ docker cp b3192d26a98e:/etc/nginx/nginx.conf /home/compose-lnmp-new/server/nginx/etc/nginx.conf php: docker cp 7b0a28545242:/usr/local/etc/. /home/compose-lnmp-new/server/php/etc mysql: docker cp 16afda487bc9:/etc/mysql/. /home/compose-lnmp-new/server/mysql/etc redis这里不需要再cp了 redis: 因为主机上开始就存在配置文件,会直接同步到redis容器里 ``` nginx的配置文件示例: /home/compose-lnmp-new/server/nginx/etc/conf.d/default.conf ``` server { listen 80; listen [::]:80; server_name localhost; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { root /usr/share/nginx/html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ \.php$ { root /var/www/html; #注意这里写的是php服务,不是写的是ip fastcgi_pass php:9000; fastcgi_index index.php; #fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } ``` 4. 将之前注释掉的地方都去掉注释,就是将“#”去掉; 5. 重启服务:完成相关配置目录文件的挂载 ``` docker-compose stop docker-compose up -d //加-d表示后台启动 ``` 注意:docker-compose up -d 和docker-compose stop 这两个命令执行的位置,必须在docker-compose.yml文件所在的目录下面; 6. 另外,php如果要连接redis,还必须做如下处理: * 1、注释掉redis.conf的bind; * 2、给redis设置密码(这一步在docker-compose.yml里面已经做了,不需要再重复); * 3、php连接也需要加上密码: ``` connect("redis", 6379); //这里需要加上密码,才能连接 $auth = $redis->auth('12345'); echo "Connection to server successfully"; //查看服务是否运行 echo "Server is running: " . $redis->ping(); echo phpinfo(); ```