如何在Windows上使用Docker搭建PHP开发环境

前言

在本地搭建开发环境我好像没几年就要折腾一次,因为本地开发电脑使用的是windows,早些年的时候,用过很多类似WAMP之类的东西,但最终都有或多或少不满意的地方,前两年的时候,还折腾过WSL,但也是有这样那样的问题,不过后来终于是win版宝塔更新了, 基本能和linux版的保持一致了,虽然有些东西在windows上要不没有,要不用不了;

最近又换了电脑,本地的环境需要重新配置,借此机会,其实我一直想试试docker,前两年折腾wsl2的时候,发现其实wsl2的io已经没有那么差了。 而且Docker Desktop for windows 也已经支持基于wsl2来创建使用了。

(至于为什么要换,因为我老机器上跑的nginx好像内存泄露了一样,启动四到五个小时候内存占用就会跑到90%以上;启动一天,远程都连不上,鼠标都不会动了;老机器的环境是win版宝塔)

所以,花了几天的时间,现在终于是弄通了,本文记录下流程,以做沉淀。

安装Docker Desktop

Docker Desktop: The #1 Containerization Tool for Developers | Docker
访问上述链接即可下载,访问不了的话可能需要想想办法;
至于具体安装, 这个网上有很多教程,不是本文要记录的重点,所以暂且路过,不过有一点要说明的是,要使用wsl2;wsl2要求应该是win10某个版本以上,目前你能下载到的新一点的win10镜像肯定都是没问题的;wsl2的启用可能也会有些小步骤,这个也建议去看下资料看看怎么安装使用,本文略过;

选择镜像

假设上面的必备条件都已经准备妥当。
接下来就是选择镜像来启动了, 其实在一开始我是打算全部单独启动容器,比如我需要用到的php,mysql,nginx等等,我原计划打算一个php版本就启动一个容器,然后以后需要的时候就再用需要的php版本镜像再启动一个容器就好了;

但实际操作中,需要自己修改调试的东西还是很多,不仅要先理解docker的基本语法来进行端口映射和卷映射,还需要了解在nginx中怎么配置才能将请求转发到php进程进行处理,这些坑其实我都已经踩过了,但最后为什么放弃呢?

因为在我的实际开发中,虽然并不是外包公司,但是内部其实还是有很多大大小小的项目的,所以需要经常创建站点部署新项目,每配置一个新项目,我就需要去修改nginx的配置文件来配置代理,中间也记录了一些操作笔记,也自己尽量划分好了文件夹等等来实现nginx.conf自动加载某个目录下的文件来实现快速的新增站点,但这个问题解决完后又发现,在一些项目中,还需要为php安装特定扩展等等,我还想把php的配置文件映射到本地来随时修改并保证删除容器也不会对我做过的修改造成影响等等,更不用说还有mysql等等,这一系列操作,可能熟练了,或者专业的运维人员应该问题不大,但让我来一个个去配置确实很难受。

后来我还试过利用docker-compose来编排服务依赖等等,在某种程度上来说,确实减少了一些操作步骤等,但我在对docker不是很熟练的情况下, 写了很多很多个版本,都没有一次性的成功启动并完美运行,前前后后也是折腾了两三天,到了最后还是绕不过手动配置站点以及其它的问题。再加上,需要端口映射,启动过的容器好像是不能修改端口映射了。 这就很烦,网络是host模式我这边仅仅成功了一次,之后就直接失灵再也没正常过了;

所以,最后最后最后,我还是妥协了,我选择使用宝塔;
当然,我这次选择使用docker版的宝塔,相比于win版宝塔,linux版的宝塔要好用的多;

使用宝塔镜像

其实在以前我是知道在docker hub上是有大佬制作过baota镜像的,但是因为当时不知道docker具体指令是干什么用的,一知半解下启动的容器后来因为不懂把卷给删了,自己可算是把自己给坑到哭了;

这次发现宝塔官方有提供docker镜像,看了下版本也还算新(8.05);于是就直接拿来使用了;

拉取镜像: docker pull btpanel/baota:lib ,我建议拉lib标签的,你可以先看一下官方的docker hub介绍: hub.docker.com/r/btpanel/baota ,介绍里给的例子是拉取lnmp标签, 本身做php开发确实要这个就刚刚好,但是我启动后,发现里面的nginx,mysql,php什么的,都是挂掉的, 反正是不能用。试了两次都不行,最后是卸载了重新安装才可以,所以与其如此,我觉得直接拉取lib标签的镜像就好了,启动进入后自己需要什么再单独安装吧;

启动容器

docker run --name baota -v E:/www/wwwroot:/www/wwwroot -v E:/www/mysql_data:/www/server/data -v E:/www/vhost:/www/server/panel/vhost -p 22:22 -p 443:443 -p 80:80 -p 888:888 -p 8888:8888 -p 3306:3306 --restart=unless-stopped -d btpanel/baota:lib

上面是我的指令,简单解释下:
--name是给容器起名,我这里就起做baota了;

-v 是卷映射,:符号作为分隔,前面的是你本地的路径,后面的是容器内的实际路径,映射分几种不同的模式,我这里就是把本机(windows)下的目录映射到了容器里的具体路径,比如这里的wwwroot目录,做完映射就实现了代码在我本地宿主机上,我可以随时用windows来编辑修改;最重要的是不会随着容器删除等对我的代码造成影响;以上映射的三个目录也是遵循官方说明来做的, 一个站点目录,一个mysql数据目录,一个是虚拟域名的配置目录;

-p 是端口映射,因为我本地测试给容器使用host网络模式失败,所以最后只能采用bridge模式,bridge模式就必须做端口映射了,不然本地可能就访问不了你容器内的服务了,语法上,同样是:做分隔,前面是本地(宿主机)端口,后面是容器内具体服务的端口,例如我这里有80(nginx),8888(该宝塔镜像面板默认端口),以及mysql等等;按需做映射,或者如果你可以使用host模式,就不需要做映射了,但是要注意host模式下,是直接占用了宿主机的端口的,要注意这些端口是不是已经被占用;

--restart=unless-stopped 这个意思是仅在非正常停止的情况下自动重启容器,也有其它选项,可自行查询按需配置

-d 表示在后台运行,我想大概就是守护模式运行一个意思;

btpanel/baota:lib 这个是镜像名称,要指定使用哪个镜像来启动容器;

一般是可以正常启动的,启动后访问 http://localhost:8888/btpanel 就可以进入后台了,这个地址是官方镜像默认的地址,你可以自己使用docker进入容器,输入bt就可以调出宝塔的指令,可自行进行修改端口,路径,账号,密码等;

进入后版本为8.05,当前最新版本为8.20,我试过直接升级,目前没发现什么问题;但是要注意,你在容器中做的操作,除了映射到本地的文件夹外,其它内容都会随着容器的删除等等丢失!(该问题可以考虑先启动容器后把环境配置到自己满意的程度,然后把容器打包为新的镜像后期备用,同时镜像也是可以保存为文件的,可以保存为文件方便更换设备时使用)

附加:使用docker中的php来配置vscode中的php验证等

环境已经使用docker搭建了,其它一些依赖php的服务如果再让去本地再装一个php环境就本末倒置了,这点也有解决方案,但是有没有未知的问题我还不清楚;后续使用中如果有发现我再更新说明;

创建php.bat文件

自己找个目录,比如我放在了E:/www目录下,新建php.bat文件,命名随意;
内容如下,请根据备注释义按需修改:

@echo offrem 启用延迟变量扩展setlocal enabledelayedexpansionrem 设置 Docker 容器名称和 PHP 路径set CONTAINER_NAME=bt82lnmprem 设置php在docker中的执行路径set PHP_PATH=phprem 设置Windows映射盘符set WIN_DRIVE=E:\rem 设置要替换为的windows盘符内容set WIN_DRIVE_REPLACE=\rem 原始文件路径set FILE_PATH=%1if exist "%FILE_PATH%" (rem 将 Windows 路径转换为容器内的路径set "FILE_PATH=!FILE_PATH:%WIN_DRIVE%=%WIN_DRIVE_REPLACE%!"rem 将 Windows 路径转换为linux的路径set FILE_PATH=!FILE_PATH:\=/!)rem 使用 Docker 容器中的 PHP 运行传递的 PHP 文件docker exec %CONTAINER_NAME% %PHP_PATH% !FILE_PATH!rem 结束局部化变量的作用域endlocal

以上命令因为有注释,所以不过多解释,其中有个修改路径的操作,是因为我vscode中安装了code runner插件, 经常直接在php文件中执行某行代码测试用,这一块儿代码专门针对不能使用code runner的问题进行的处理;

配置php路径等

如上,创建完php.bat文件后,它的路径假如是这样: E:/www/php.bat 那么在vscode的配置文件中,路径就直接这样写: E://www//php.bat ,配置完后可以测试一下是否可用

打包容器为镜像

docker commit bt82lnmp baota bt82lnmp是新镜像名称,baota是当前容器的名称;

保存镜像为文件

docker save -o bt82lnmp.tar bt82lnmp bt82lnmp.tar是文件名称,可以带上路径,像我这样不带的话,那就看当前命令行是在哪个目录下,保存好的文件就直接在这个目录下了,后面的bt82lnmp是镜像名称;
(PS:打包格式好像必须是.tar)

加载镜像文件

docker load -i PATHFILE 在其它机器上加载镜像文件,这里的PATHFILE自行更换,填写你镜像.tar文件的具体路径

结语

至此,基本流程全部结束,间断的折腾了近一周,写文章写了快两个小时,写到后边的时候有些内容已经没有心思写的更详细了。但我总体看了下,基本流程应该已经没问题了;除了可能在实际操作中会碰到的一些乱七八糟的问题,但是基本都可以搜索解决;

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

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

相关文章

批量文件名修改软件:一键解决同一编码多型号文件分类与命名难题,高效管理文件

在数字化时代,图片文件已经成为我们工作中不可或缺的一部分。然而,当面对成百上千个同一编码下不同型号的图片文件时,如何快速、准确地进行分类和命名,成为了许多职场人士头疼的问题。现在,我们为您带来了一款神奇的批…

MyBatisPlus 基础数据表的增删改查 入门 简单查询

MyBatisPlus MyBatisPlus(简称MP)是一个基于MyBatis的增强工具库,简化了MyBatis的开发,提供了很多实用的功能和特性,如自动生成SQL、通用CRUD操作、分页插件、条件构造器、代码生成器等。它不仅简化了开发过程&#x…

2024海亮日记

写在前面:长文预警 20240617 听说要去海亮,不考(补考)期末考试,于是进行一个停课的办理,第一次进入410,被逆天的配置和气氛所震惊 发誓这回去HL一定要有好效果,于是制定了详细的计…

golang 未指定类型interface{} 类型的 int类型数据json.Unmarshal 解码后变成float64类型问题解决方法

golang内置的json反序列化方法,默认情况下对应 未指定类型interface{} 类型的的 int类型数据在经过Unmarshal解码后 int类型的数据会变成 float64类型。 因为json里面默认将interface{}类型的int数据都当做float64来处理。 解决方法很简单,就是使用自定…

优盘有盘符显示0字节:故障解析与数据恢复策略

一、优盘有盘符显示0字节现象描述 在使用优盘的过程中,我们有时会遇到一种令人困惑的情况:插入优盘后,电脑能正常识别到优盘的盘符,但当我们尝试访问其中的数据时,却发现优盘的容量显示为0字节,无法读取或…

快速掌握MyBatis

MyBatis 是一个流行的 Java 持久层框架,它提供了一种半自动的 SQL 映射方式,使得开发者能够更加灵活地编写 SQL 语句,同时避免了传统 JDBC 代码的冗余和复杂性。下面进行简要概述: MyBatis 快速掌握 核心概念:理解 My…

8.1 Firmware Update Process

8.1 Firmware Update Process 通过reset激活firmware 更新的过程: host发出firmare下载命令,将FW image下载到控制器。FW image可能有多个部分要下载,因此FW image 下载命令中指定正在下载的FW image的每个部分的偏移量。FW image 下载命令…

Sui创始团队在竞速环节中的快问快答

在Sui Basecamp活动期间,Sui区块链的最初贡献者在Oracle红牛赛车模拟器上展示了他们的技术能力,在驾驶圈时回答了有关Sui的问题。 Evan Cheng(又名Revvin’ Evan)在解释Mysticeti创下区块链最终性记录的同时保持着他的驾驶线路。…

Java | Leetcode Java题解之第200题岛屿数量

题目&#xff1a; 题解&#xff1a; class Solution {void dfs(char[][] grid, int r, int c) {int nr grid.length;int nc grid[0].length;if (r < 0 || c < 0 || r > nr || c > nc || grid[r][c] 0) {return;}grid[r][c] 0;dfs(grid, r - 1, c);dfs(grid, r…

go Channel原理 (三)

Channel 设计原理 不要通过共享内存的方式进行通信&#xff0c;而是应该通过通信的方式共享内存。 在主流编程语言中&#xff0c;多个线程传递数据的方式一般都是共享内存。 Go 可以使用共享内存加互斥锁进行通信&#xff0c;同时也提供了一种不同的并发模型&#xff0c;即通…

【嵌入式——FreeRTOS】任务

【嵌入式——FreeRTOS】任务 任务创建和删除动态方式创建任务静态方式创建任务 删除任务任务切换调度器任务切换流程 任务挂起任务恢复相关API函数 任务创建和删除 动态方式创建任务 任务的任务控制块以及任务的栈空间所需的内存&#xff0c;均由freeRTOS从freeRTOS管理的堆中…

c#asp.net中字典的使用

字典是一个键值对&#xff0c;可以用来保存数据&#xff0c;再查询&#xff1b; 下面是一个案例&#xff1a;依据多个学号查询多个学生的姓名&#xff0c;只能到数据库查询一次数据&#xff01;&#xff01;&#xff01; 先在数据库查询学号对应的学生&#xff0c;把数据保存在…

mysql8.0.19安装zip版本

下载地址https://downloads.mysql.com/archives/community/ 下载版本 下载后解压&#xff0c;不包括data 和my.ini文件。其中data 文件是自动生成的【mysqld --initialize --console】&#xff0c;my.ini需要自己编写设置。 新建my.ini文件 需要自己设置 basedirG:\soft\mysql…

内网服务器时间校正

新购买的云服务器发现内网机器和可以访问外网的机器时间慢了三分钟&#xff0c;导致有些访问会报错&#xff0c;那么我们配置一下ntp校正一下时间。外网配置起来比较简单&#xff0c;直接下载ntp执行校正命令即可。 比当前时间慢了三分钟 注意当前服务器是可以访问外网的机器这…

【gitee使用教程】(创建项目仓库并上传代码简易版)

gitee使用教程&#xff0c;创建项目仓库并上传代码简易版 1.在码云上创建一个仓库2.将代码克隆到本地1.复制仓库地址2.找到你想要放置的文件位置&#xff0c;右键点击更多选项&#xff0c;选择Git Clone3.将复制的仓库地址填入URL 3. IDEA结合GIT和Gitee的简单使用idea需要识别…

【python】最新版抖音s逆向拿到数据,非常详细教程(附完整代码)

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

Excel 宏录制与VBA编程 ——VBA编程技巧篇一 (Union方法、Resize方法、Cells方法、UseSelect方法、With用法)

Uniom方法 使用Union方法可以将多个非连续区域连接起来成为一个区域&#xff0c;从而可以实现对多个非连续区域一起进行操作。 Resize方法 使用Range对象的Resize属性调整指定区域的大小&#xff0c;并返回调整大小后的单元格区域。 Cells方法 Cells属性返回一个Range对象。 Us…

Domino应用中的HTML5

大家好&#xff0c;才是真的好。 在xpages多年不见有效更新&#xff0c;前景不明的时候&#xff0c;Domino传统Web应用开发方式还是受到了应有的青睐。毕竟&#xff0c;在Nomad Web时代&#xff0c;连最传统的Notes CS原生应用也突然焕发了勃勃生机一样。 但&#xff0c;对有…

什么是strcmp函数

目录 开头1.什么是strcmp函数2.strcmp函数里的内部结构3.strcmp函数的实际运用(这里只列举其一)脑筋急转弯 结尾 开头 大家好&#xff0c;我叫这是我58。今天&#xff0c;我们要来认识一下C语言中的strcmp函数。 1.什么是strcmp函数 strcmp函数来自于C语言中的头文件<str…

ARP 原理详解 一

ARP 原理 ARP&#xff08;Address Resolution Protocol&#xff09;地址解析协议&#xff0c;是根据 IP 地址获取物理地址的一个 TCP/IP 协议。 OSI 网络七层模型中&#xff0c;IP 地址在 OSI 模型第三层&#xff0c;MAC 地址在第二层&#xff0c;彼此不直接通信。 在通过以…