docker-compose搭建php开发环境

Docker Compose简介


Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。而DockerCompose作为一种容器编排工具,可以让我们轻松地配置和管理多个Docker容器,从而快速搭建PHP开发环境。

Compose 使用的三个步骤:

  • 使用 Dockerfile 定义应用程序的环境。
  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。如果你还不了解 YML 文件配置,可以先阅读 YAML 入门教程。
  • 最后,执行 docker-compose up 命令来启动并运行整个应用程序。

安装docker


Ubuntu

依次执行下面的命令

# 更新apt
sudo apt update
sudo apt upgrade
# 安装依赖
sudo apt-get install ca-certificates curl gnupg lsb-release
# 添加Docker官方GPG密钥
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# 配置Docker镜像源
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# 安装docker
sudo apt-get install docker-ce docker-ce-cli containerd.io
# 配置用户组(可选)
sudo usermod -aG docker $USER
# 查看版本检查是否安装成功
docker --version
# 启动docker,一般安装完会自动启动,如果没有启动请手动执行
systemctl start docker

CentOS

依次执行下面的命令

# 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
# 配置Docker镜像源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新yum软件包索引
yum makecache fast
# 安装docker
yum install docker-ce 
# 查看版本检查是否安装成功
docker --version
# 启动docker,一般安装完会自动启动,如果没有启动请手动执行
systemctl start docker

安装docker-compose


访问Releases · docker/compose (github.com)查看最新版本

然后依次执行下面的命令:

# 下载docker-compose文件,自行修改版本号
sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose# 给他执行权限
sudo chmod +x /usr/local/bin/docker-compose# 查看是否安装成功
docker-compose --version

如果觉得下载慢,可以将github.com替换为其他镜像域名加速下载,例如:

sudo curl -L "https://hub.nuaa.cf/docker/compose/releases/download/v2.24.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

docker-compose初始配置


创建初始 docker-compose.yml 文件(不含各服务的配置文件映射),在哪个目录不做要求,内容如下,自行修改项目路径和配置文件路径为自己的电脑文件夹路径,我这里新建在home/docker目录下:

#yaml 配置实例
version: '3'
services:php:container_name: php7.4image: php:7.4-fpmrestart: alwaysprivileged: trueports:- "9000:9000"volumes:- "/home/www:/var/www" # php代码目录nginx:container_name: nginximage: nginx:latestprivileged: truerestart: alwaysenvironment:- TZ=Asia/Shanghaiports:- "80:80"- "443:443"depends_on:- "php"volumes:- "/home/www:/var/www" # php代码目录- "/home/docker/nginx/logs:/var/log/nginx" # nginx日志文件mysql:image: mysql:5.7container_name: mysql5.7privileged: truerestart: alwaysports:- "3306:3306"volumes:- /home/docker/mysql/data:/var/lib/mysql # mysql数据目录- /home/docker/mysql/log:/var/log/mysql # mysql日志文件- /etc/localtime:/etc/localtime:ro # 让容器的时钟与宿主机时钟同步,避免时间的问题,ro是read only只读的意思environment:- MYSQL_ROOT_PASSWORD=123456 # root账户密码redis:image: redis:latestcontainer_name: redisprivileged: truerestart: alwaysports:- "6379:6379"command: redis-server /usr/local/redis/conf/redis.conf # 启动redis服务并指定配置文件volumes:- /home/docker/redis/data:/data # redis数据目录- /home/docker/redis/conf/redis.conf:/usr/local/redis/conf/redis.conf #redis配置文件

常用参数说明

version:指定Docker Compose文件的语法版本,3是当前广泛使用的版本

services:要运行的服务,里面是各个服务名称和服务配置

container_name:容器名称

image:使用的镜像名称

restart:容器在退出后的行为,[always:总是重启容器,no:不重启,unless-stopped:重启容器,除非容器被手动停止,on-failure:退出状态码不为0(即失败)时自动重启该容器]

networks:将当前容器加入到这个网络中以方便数据传输,默认是使用brige连接方式名为docker_default的网络,但重启容器后会改变ip地址,如果要固定容器ip,就要自定义网络

volumes:宿主机和容器的目录映射

environment:添加环境变量,可添加一个或多个键值对,布尔含义的值要用引号包裹

ports:宿主机和容器的端口映射

build:使用当前目录下的dockerfile构建

expose:暴露容器端口,但不映射到宿主机,只通过ip等方式访问容器的时候访问

depends_on:以依赖性顺序启动服务,先启动depends_on中的服务再启动当前服务,注意事项:服务启动不会等依赖服务里面的程序启动完才启动,只依赖服务是否启动

privileged:给容器root权限

启动服务


在 docker-compose.yml 文件所在的目录下执行下面的命令一键启动所有服务

docker-compose up

现在打开浏览器访问locahost应该能访问到nginx的首页了,如果你是在本地电脑或虚拟机的docker,需要在宿主机添加hosts文件ip映射,

# 将ip改为你的服务器ip
192.168.204.128 demo.net

下面是docker-compose的其他命令

# 一键启动所有服务
docker-compose up# 或者启动所有服务并在后台运行
docker-compose up -d# 停止服务
docker-compose stop# 重启服务
docker-compose restart# 进入指定容器
docker-compose exec [service_name] bash# 查看容器状态
docker-compose ps

复制配置文件


如果你不需要自定义配置各个服务,可以跳过这个也不用下一步调整docker-compose配置

复制容器的默认配置文件到宿主机,冒号前是容器名称,冒号后面是容器中配置文件的路径,最后是宿主机的配置文件存放目录,如果宿主机目录不存在请创建

# nginx
sudo docker cp nginx:/etc/nginx/nginx.conf /home/docker/nginx/nginx.conf
sudo docker cp nginx:/etc/nginx/conf.d /home/docker/nginx/conf.d
# php
sudo docker cp php7.4:/usr/local/etc/php/php.ini-production /home/docker/php/php.ini
# mysql
sudo docker cp mysql5.7:/etc/my.cnf /home/docker/mysql/my.cnf
# redis
自动生成空白配置

调整docker-compose配置


这个配置加入了各个服务自定义的配置文件映射,先执行docker-compose stop停止服务,然后用下面的配置替换上面 docker-compose.yml 文件的初始配置,然后重新启动服务即可

#yaml 配置实例
version: '3'
services:php:container_name: php7.4image: php:7.4-fpmrestart: alwaysprivileged: trueports:- "9000:9000"volumes:- "/home/www:/var/www" # php代码目录- "/home/docker/php/php.ini:/usr/local/etc/php/php.ini" # php配置文件目录nginx:container_name: nginximage: nginx:latestprivileged: truerestart: alwaysenvironment:- TZ=Asia/Shanghaiports:- "80:80"- "443:443"depends_on:- "php"volumes:- "/home/docker/nginx/nginx.conf:/etc/nginx/nginx.conf" # nginx配置文件目录- "/home/docker/nginx/conf.d:/etc/nginx/conf.d" # nginx虚拟主机配置文件目录- "/home/www:/var/www" # php代码目录- "/home/docker/nginx/logs:/var/log/nginx" # nginx日志目录mysql:image: mysql:5.7container_name: mysql5.7privileged: truerestart: alwaysports:- "3306:3306"volumes:- /home/docker/mysql/data:/var/lib/mysql # mysql数据目录- /home/docker/mysql/my.cnf:/etc/my.cnf # mysql配置文件- /home/docker/mysql/log:/var/log/mysql # mysql日志文件- /etc/localtime:/etc/localtime:ro # 让容器的时钟与宿主机时钟同步,避免时间的问题,ro是read only只读的意思environment:- MYSQL_ROOT_PASSWORD=123456 # root账户密码redis:image: redis:latestcontainer_name: redisprivileged: truerestart: alwaysports:- "6379:6379"command: redis-server /usr/local/redis/conf/redis.conf # 启动redis服务并指定配置文件volumes:- /home/docker/redis/data:/data # redis数据目录- /home/docker/redis/conf/redis.conf:/usr/local/redis/conf/redis.conf #redis配置文件

新建站点


创建站点配置文件,例如网站域名是http://demo.net,那么就在ngxin/conf.d目录下新建一个demo.net.conf

cd  /home/docker/nginx/conf.d
sudo vi demo.net.conf

文件内容如下

server {listen        80;server_name  www.demo.net demo.net;root   /var/www/demo;index index.php index.html;location ~ \.php(.*)$ {fastcgi_pass   php:9000;fastcgi_index  index.php;fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;fastcgi_param  PATH_INFO  $fastcgi_path_info;fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;include        fastcgi_params;}
}

注意修改你的root为容器里的代码目录,server_name为你的域名

在你的站点代码目录新建php文件,内容随便写

cd /var
sudo mkdir www
cd ./www && sudo mkdir demo
sudo vi test.php
<?php
echo 'hello world';

如果你是在本地电脑或虚拟机的docker,需要在宿主机添加hosts文件ip映射,

# 将ip改为你的服务器ip
192.168.204.128 demo.net

然后重启服务,现在打开浏览器访问http://demo.net/test.php就能看到输入的hello world

常见问题


  • laravel、thinkphp等框架站点配置伪静态示例

    server {listen        80;server_name  hello.net;root   /var/www/hello/public;	# 站点根目录include  /var/www/hello/public/nginx.htaccess; # 配置伪静态location ~ \.php(.*)$ {fastcgi_pass   php:9000;fastcgi_index  index.php;fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;fastcgi_param  PATH_INFO  $fastcgi_path_info;fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;include        fastcgi_params;}
    }
    
  • laravel框架报错The stream or file "/var/www/hello/storage/logs/laravel.log" could not be opened in append mode: failed to open stream: Permission denied The exception occurred while attempting to log

    原因:日志目录没有权限

    解决:sudo chmod -R 777 storage

  • laravel框架报错could not find driver (SQL: select * from admin_userswhereusername = admin limit 1)

    原因:没有安装php-pdo驱动

    解决:

    1.进入php容器一次执行下面的命令安装驱动

    docker-compose exec php bash
    docker-php-ext-install pdo pdo_mysql
    

    2.在php.ini文件添加扩展

    extension=pdo_mysql
    

    3.重启容器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/710424.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学不动系列-git-hooks和husky+lintstage

git-hooks 为了保证提交的代码符合规范&#xff0c;可以在上传代码时进行校验。常用husky来协助进行代码提交时的eslint校验。husky是基于git-hooks来实现&#xff0c;在使用husky之前&#xff0c;我们先来研究一下git-hooks。 构建git-hooks测试项目 需要使用git-hooks就需…

Java与JavaScript:深入剖析两种语言之间的相似性与差异

大家都知道JavaScript这个名字,听起来就像是Java的“小弟”或者“跟班”,但实际上,它们之间的关系远比这复杂。你可能会想,Java是大哥,JavaScript是小弟,那它们肯定有很多相似之处吧?错了!错了!错了!这完全是个误会。 JavaScript其实是个“蹭热点”的家伙。当Java这…

C++的设计模式:工厂方法模式(Factory Method)

工厂方法模式&#xff08;Factory Method&#xff09;是一种常用的创建型设计模式&#xff0c;它提供了一种创建对象的最佳方式。在工厂方法模式中&#xff0c;我们在创建对象时不会对客户端暴露创建逻辑&#xff0c;并且是通过使用一个共同的接口来指向新创建的对象。 意图 …

Git LFS提交大文件到GitHub

一、前言 关于 GitHub 上的大文件 GitHub Enterprise Cloud 限制存储库中允许的文件大小。 如果尝试添加或更新大于 50 MiB 的文件&#xff0c;您将从 Git 收到警告。 更改仍将成功推送到仓库&#xff0c;但您可以考虑删除提交&#xff0c;以尽量减少对性能的影响。 GitHub Ent…

QPaint绘制自定义仪表盘组件03

网上视频抄的&#xff0c;用来自己看一下&#xff0c;看完就删掉 ui mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QDebug> #include <QtMath> #include <QDialog> #include <QPainter> #include …

网络安全概述(一)

目录 资产保护 资产的类型 资产损失类型 资产保护考虑因素 安全强度、安全代价和侵入可能性的关系 信息安全技术发展 单机系统的信息保密阶段 信息保障阶段 信息保障技术框架IATF PDRR模型 网络攻击类型 阻断攻击、截取攻击、篡改攻击、伪造攻击 被动攻击和主动攻…

C#,双向链表(Doubly Linked List)归并排序(Merge Sort)算法与源代码

1 双向链表 双向链表也叫双链表&#xff0c;是链表的一种&#xff0c;它的每个数据结点中都有两个指针&#xff0c;分别指向直接后继和直接前驱。所以&#xff0c;从双向链表中的任意一个结点开始&#xff0c;都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循…

用来检查 CUDA、Conda 和 PyTorch 的版本的python文件

提供的 Python 代码片段包括几个语句&#xff0c;用来检查 CUDA、Conda 和 PyTorch 的版本&#xff0c;以及一些与 CUDA 相关的系统配置。让我们分解一下&#xff1a;PyTorch 版本和配置&#xff1a;torch.__config__.show()&#xff1a;显示 PyTorch 的构建配置。 torch.__ver…

LNMP架构介绍及配置--部署Discuz社区论坛与wordpress博客

一、LNMP架构定义 1、LNMP定义 LNMP&#xff08;Linux Nginx Mysql Php&#xff09;是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写&#xff1b;Linux系统下NginxMySQLPHP这种网站服务器架构。 Linux是一类Unix计算机操作系统的统称&#xff0c;是目…

基于单片机负载控制的无人机电气设备监测系统设计

摘要:为深入分析无人机电气设备的电子负载性能,实现对传输电子量的合理性监管与控制,设计基于单片机负载控制的无人机电气设备监测系统;利用电气信号发生电路,构建负载网络控制器与以太网模块运行所需的电气设备负载环境,借助PCB监控板建立PLC扩展负载模块与核心监控主机…

nftables 测试一拒绝所有流量

要配置 nftables 先拒绝所有流量&#xff0c;然后再添加允许的规则&#xff0c;您可以按照以下步骤操作&#xff1a; 创建一个空的 nftables 配置文件&#xff08;例如 /etc/nftables.conf&#xff09;并添加如下内容&#xff1a; flush rulesettable inet filter {chain input…

Java学习—Stream流

Java 8引入的Stream API是对集合操作的一种高级抽象。Stream API不仅使代码更加简洁易读&#xff0c;还引入了函数式编程的强大功能&#xff0c;使得对集合的操作更加灵活和强大。让我们更详细地探讨Stream的核心概念、操作以及它在实际编程中的应用。 核心概念 Stream&#…

王者荣耀,急于补齐内容短板

问十个人&#xff0c;有九个人知道《王者荣耀》&#xff1b;但如果再问十个知道《王者荣耀》的人&#xff0c;这款游戏到底讲了一个什么故事&#xff0c;每个角色又有怎样的背景&#xff0c;可能十个人都不知道。 整个新年档口&#xff0c;《王者荣耀》都很忙碌。 1月&#x…

《HelloGitHub》第 95 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、Java、Go、C/C、Swift...让你在短时间内…

ODOO12设置收发邮件服务器教程

一、设置-技术 二、设置–技术–发件服务器 信息填写完整后&#xff0c;点击‘测试连接’&#xff0c;若提示成功&#xff0c;则发件服务器设置成功。 三、设置–技术–收件服务器 四、设置–参数–系统参数 修改之前的email系统参数&#xff1a; mail.catchall.alias: 收件服…

Vue页面更新后刷新页面不会渲染解决

小编今天犯了个很低级的错误&#xff0c;导致VUE页面刷新样式不会更新的问题&#xff01; 解决方法&#xff1a;查看你的路由路径大小写是否正确&#xff01;小编是犯了这种错误&#xff0c;特此分享下&#xff01;

Linux中docker项目提示No such file or directory

本来以为是文件权限问题&#xff0c;后来发现是个非常蠢的问题 文件没有映射到容器中 docker文件映射语法 Docker 使用 -v 或 --volume 参数来指定文件映射。 增加在运行命令后 -v <宿主机目录>:<容器目录> 其中&#xff0c;宿主机目录 是指要映射的宿主机上的…

【Django】执行查询—创建和修改对象

创建对象和修改对象 直接上例子&#xff1a; # 创建对象 >>> from blog.models import Blog >>> b Blog(name"Beatles Blog", tagline"All the latest Beatles news.") >>> b.save() # 修改对象 >>> b5.name &quo…

任务创建后只执行后创建的任务,不进行调度?

1、问题说明 通过HAL创建STM32裸机程序后&#xff0c;移植FreeRTOS程序且编译不报错。创建了两个串口打印的任务&#xff0c;却只有后创建的任务运行&#xff0c;不会进行任务间的调度。 主要代码&#xff1a; /**功能&#xff1a;将C库printf函数重定向到USART1*参数&#x…

oracle 数据库建集群式数据库的DBLINK的语法

根据需要修改以下红色字体的部分即可。 1、连接集群式数据库DBLINK语法 create public database link 自定义的dblink名字 connect to 连接对方数据库的用户名 identified by "密码" using (DESCRIPTION (ADDRESS_LIST (FAILOVER ON) (LOAD_BALANCE OFF) …