当前位置: 首页 > news >正文

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.重启容器

相关文章:

docker-compose搭建php开发环境

Docker Compose简介 Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose&#xff0c;您可以使用 YML 文件来配置应用程序需要的所有服务。然后使用一个命令&#xff0c;就可以从 YML 文件配置中创建并启动所有服务。而DockerCompose作为一种容器编排工具&…...

翻译论文:Beating Floating Point at its Own Game: Posit Arithmetic(一)

仅作记录学习使用&#xff0c;侵删 原文Beating Floating Point at its Own Game: Posit Arithmetic 参考翻译Posit: 替换IEE754的新方式 | SIGARCH 摘要 IEEE标准754浮点数&#xff08;浮点数&#xff09;的直接接点替换 Posit的优势 不需要区间算术或可变大小操作数 如…...

【数据结构-图论】并查集

并查集&#xff08;Union-Find&#xff09;是一种数据结构&#xff0c;它提供了处理一些不交集的合并及查询问题的高效方法。并查集主要支持两种操作&#xff1a; 查找&#xff08;Find&#xff09;&#xff1a;确定某个元素属于哪个子集&#xff0c;这通常意味着找到该子集的…...

云计算时代的运维: 职业发展方向与岗位选择

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…...

java锁底层概述

Java中的锁是并发编程中核心的同步机制之一&#xff0c;用于控制多个线程对共享资源的访问&#xff0c;以保证数据的一致性和完整性。Java锁的底层实现依赖于操作系统的原生线程模型和Java虚拟机&#xff08;JVM&#xff09;的实现。这里主要讨论两种常见的锁&#xff1a;synch…...

win10如何添加指纹登陆

1、首先进入设置,进入下一个设置页面 2、在下一个设置页面内,我们直接使用右上角的搜索框,输入“指纹/finger”进行搜索。回车之后进入设置指纹登陆选项 3、设置指纹登陆的前期是设置好你的密码和pin码(先要设定登录密码和pin码),这里pin和密码都可以直接登陆我们的win10,设…...

足底筋膜炎的症状及治疗

足底筋膜炎症状&#xff1a;足底筋膜炎通常表现为足跟部疼痛&#xff0c;尤其是在晨起或长时间站立、行走后加重。疼痛可能向足底前部或足弓处放射&#xff0c;严重时可能影响行走。此外&#xff0c;患者还可能出现足跟部肿胀、皮肤温度升高、局部压痛等症状。 足底筋膜炎治疗方…...

udp丢包问题研究

//发现udp 有收不到数据包现象. 一: 观察丢包 1. ifconfig enp8s0 2. netstat -s -u 二: 修改系统缓存参数. recv_buffer_size 修改系统buffer_size sysctl -w net.core.rmem_max26214400 sysctl -w net.core.rmem_default26214400 三: 应用程序考虑 av_dict_set(&m_o…...

在idea中用模板骨架初始创建maven管理的web项目时没有src有关的目录的解决方案

一.问题如下 二.解决方法 首先关闭当前项目&#xff0c;接着修改全局设置&#xff0c;重新创建项目 在VM Options中添加"-DarchetypeCataloginternal"&#xff0c;点击ok保存 点击创建&#xff0c;如果创建成功没报错且有src&#xff0c;就ok了。 当然如果出现以下…...

WPF 【十月的寒流】学习笔记(2):MVVM中是怎么实现通知的

文章目录 前言相关链接代码仓库项目配置代码初始代码ViewPersonViewModel 尝试老办法通知解决方案ObservableCollectionBindingListICollectionView 总结 前言 我们这次详细了解一下列表通知的底层是怎么实现的 相关链接 十月的寒流 MVVM实战技巧之&#xff1a;可被观测的集合…...

数据结构:广义表

定义&#xff1a;有序数列  表示&#xff27;&#xff2c;&#xff1d;&#xff08;&#xff41;&#xff08;&#xff42;&#xff0c;&#xff43;&#xff09;&#xff09;长度 &#xff12;&#xff0c; 表头&#xff1a;&#xff41; 表尾&#xff1a;&#xff08;&am…...

你好,C++(18) 到底要不要买这个西瓜?4.1.6 操作符之间的优先顺序

你好&#xff0c;C&#xff08;18&#xff09; 到底要不要买这个西瓜&#xff1f;4.1.6 操作符之间的优先顺序 4.1.6 操作符之间的优先顺序 在表达一些比较复杂的条件判断时&#xff0c;在同一个表达式中&#xff0c;有时可能会存在多个操作符。比如&#xff0c;我们在判断要…...

C语言 for 循环语句的基本格式是什么?

一、问题 for 循环语句在C语⾔中是最为常见的循环语句&#xff0c;其功能强⼤&#xff0c;⽽且⽤法灵活&#xff0c;那么它的基本格式是什么呢&#xff1f; 二、解答 for 语句的⼀般形式为&#xff1a; for(表达式1;表达式2;表达3&#xff09;语句; 每条 for 语句包含三个⽤分…...

项目-SERVER模块-日志宏

日志宏 #define INF 0 #define DBG 1 #define ERR 2#define LOG_LEVEL INF #define LOG(level, format, ...) do {\if (level < LOG_LEVEL) break;\time_t t time(NULL);\struct tm *ltm localtime(&t);\char tmp[32] {0};\strftime(tmp, 31, "%H:%M:%S"…...

TCP为什么要三次握手?

TCP三次握手协议是为了在不可靠的互联网环境中可靠地建立起一个连接&#xff0c;三次握手可以确保两端的发送和接收能力都是正常的。 那么&#xff0c;为什么是三次而不是二次或四次握手呢&#xff1f; 为什么不是二次握手&#xff1f; 如果是二次握手&#xff0c;即客户端发…...

网络防御第6次作业

防病毒网关 按照传播方式分类 病毒 病毒是一种基于硬件和操作系统的程序&#xff0c;具有感染和破坏能力&#xff0c;这与病毒程序的结构有关。病毒攻击的宿主程序是病毒的栖身地&#xff0c;它是病毒传播的目的地&#xff0c;又是下一次感染的出发点。计算机病毒感染的一般过…...

Jmeter分布式部署

前期准备&#xff1a; 1. 控制机一台&#xff0c;代理机一台&#xff0c;Jmeter安装包 操作步骤&#xff1a; 1. Linux安装Jmeter&#xff08;windows安装教程自己搜一下&#xff09; 1.1创建一个单独的文件夹(jmeter)&#xff0c;用来存放Jmeter的安装包 mkdir jmeter 1.2…...

Odoo迈入开源第一低代码开发平台的重要里程碑

Odoo17的正式发布已经过去好几个月了&#xff0c;通过一段时间的运用&#xff0c;最大的感触就是&#xff0c;Odoo会成为企业管理软件低代码开发平台的重要一员&#xff0c;而V17则会成为这个过程中具有里程碑意义的版本。 时隔四个月&#xff0c;让我们回头来看看Odoo17带来的…...

WinForm、Wpf自动升级 AutoUpdater.NET

Github AutoUpdater.NET 目录 一、IIS部署 更新站点 二、创建Winform 一、IIS部署 更新站点 IIS默认站点目录下创建 目录 Downloads、Updates Updates目录创建文件 UpdateLog.html、AutoUpdaterStarter.xml UpdateLog.html&#xff1a; <html><body><h1…...

GPU不够用:语言模型的分布式挑战

引言 随着深度学习技术的飞速发展,大规模语言模型(LLM)在各种NLP任务中取得了令人瞩目的成绩。然而,这些模型的大小和复杂度也不断增加,给部署和应用带来了诸多挑战。特别是在单个GPU或服务器的内存容量有限的情况下,如何高效地利用分布式计算资源成为了一个亟待解决的问…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...