本文主要记录全新全新安装Docker、Devilbox等相关组件,实现本机利用Devilbox的能力可以快速搭建本地开发环境。
安装WSL
- Windows+X键,弹出的菜单中选择Windows终端(管理员)
-
输入以下指令激活wsl服务
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
重启系统,使wsl服务生效
- 设置默认为wsl2版本
wsl --set-default-version 2
wsl --update
重启系统。
PS:可选项 wsl --install,可以安装指定的系统,当然具体可以到windows store里面看看支持哪些,一般情况下大家用ubuntu即可
- 下载docker desktop,到官网下载最好:下载地址;下载并安装完成后可以用wsl --list -v查看信息,显示docker-desktop和docker-desktop-data即表示安装成功
- 这里可以处理下默认镜像和容器生成位置,避免C盘空间不够(可能会有问题,导致无法启动,有问题可以恢复docker出厂设置),以下是windows下的方法
- 托盘区找到docker图标,右键点击后选择退出
- 执行命令
wsl --list -v
查看运行状态,编程stopped - 执行命令
wsl --shutdown
,关闭wsl - 执行命令
wsl --export docker-desktop-data 你的保存路径.tar
,导出为一个文件 - 执行命令
wsl --export docker-desktop 你的保存路径2.tar
,导出为一个文件 - 执行命令
wsl --unregister docker-desktop-data
,注销原来的docker-data镜像 - 执行命令
wsl --unregister docker-desktop
,注销原来的docker镜像 - 使用以下命令,导入镜像文件,然后重启docker-desktop
wsl --import docker-desktop-data 目标存储路径 你的保存路径.tar wsl --import docker-desktop 目标存储路径2 你的保存路径2.tar
- 以下是linux下修改方式
- 执行命令
systemctl stop docker
停止docker - 修改
/usr/lib/systemd/system/docer.service
文件,找到ExecStart=/usr/bin/dockerd
所在的行,修改为ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --data-root=你打算保存的数据目录 --pidfile=你打算保存的数据目录/docker.pid
- 执行以下命令
systemctl daemon-reload mv /var/lib/docker /data/docker systemctl start docker
- 启动后数据目录就已经变更完成
- 修改镜像源地址,打开docker desktop客户端,点击右上角齿轮图标,选择Docker Engine菜单,然后添加docker镜像源,json格式,可以参考如下内容:
{ "builder": { "gc": { "defaultKeepStorage": "20GB", "enabled": true } }, "debug": false, "experimental": true, "features": { "buildkit": true }, "insecure-registries": [], "registry-mirrors": [ "http://hub-mirror.c.163.com" ] }
安装DevilBox
- 获取devilbox的代码,下载地址
- 进入devilbox目录,复制一份env-example文件,重命名为.env,并修改其中内容
- 搜索PHP_SERVER,MYSQL_SERVER,将你需要的版本取消注释,其他的注释继续保留
- 搜索HOST_PATH_HTTPD_DATADIR,将他修改为你的所有项目所在的目录下,devilbox启动的时候会扫描这个目录下的文件,并将该目录下的每个目录当成一个站点看待。比如你设置了D:\Project,目录下有D:\Project\WebSite1和D:\Project\WebSite2,那么devilbox就会把它视为2个站点,会有相应的请求转发过去
- 搜索PHP_MODULES_ENABLE,添加swoole,这个是php加载的模块,可以根据需要添加,更多支持的模块可以到DevilBox的github仓库去看文档
- 搜索PHP_MODULES_DISABLE,删除swoole
- 进入devilbox目录,执行启动命令docker compose up -d httpd php redis,未来需要其他容器的可以自由添加
- 启动后可以访问localhost查看devilbox相关功能
部署站点
- 进入devilbox目录,然后执行
.\shell.bat
,这样就进入到了容器内部 - 执行
composer create-project topthink/think tp6.0.*
,创建tp6.0新项目 - 进入新创建的ThinkPHP目录,创建htdoc软链接,执行命令
ln -s /shared/httpd/tp/public /shared/httpd/tp/htdocs
,这个主要目的是devilbox默认会设置每个项目目录下的htdocs作为站点根目录 - 修改windows下的hosts,增加tp.loc解析,devilbox会将每个站点目录名称映射为"目录名.loc"这个域名,所以需要自行添加hosts来指向本地,比如现在的示例目录就是tp.loc
- 如果需要对nginx有修改,可以复制devilbox\cfg\vhost-gen下的文件至"你的项目目录.devilbox"下,并重命名为vhost.yml后缀,这样在docker启动时候就会根据这个yml模板内容生成对应的vhost了。同样devilbox\cfg下的其他文件都可以复制到每个项目的.devilbox下,后缀保持yml即可自动加载
- 分享下我的tp项目下.devilbox\nginx.yml的模板内容(请注意,因为markdown特殊符号原因,请自行替换下方¥为
$
)
vhost: |
server {
listen __PORT____HTTP_PROTO____DEFAULT_VHOST__;
server_name __VHOST_NAME__;
access_log "__ACCESS_LOG__" combined;
error_log "__ERROR_LOG__" warn;
__REDIRECT__
__SSL__
__VHOST_DOCROOT__
__VHOST_RPROXY__
__PHP_FPM__
__ALIASES__
__DENIES__
__SERVER_STATUS__
__CUSTOM__
}
vhost_type:
docroot: |
root "__DOCUMENT_ROOT__";
index __INDEX__;
rproxy: |
# Define the vhost to reverse proxy
location __LOCATION__ {
proxy_set_header Host ¥host;
proxy_set_header X-Real-IP ¥remote_addr;
proxy_pass __PROXY_PROTO__://__PROXY_ADDR__:__PROXY_PORT__;
}
features:
ssl: |
ssl_certificate __SSL_PATH_CRT__;
ssl_certificate_key __SSL_PATH_KEY__;
ssl_protocols __SSL_PROTOCOLS__;
ssl_prefer_server_ciphers __SSL_HONOR_CIPHER_ORDER__;
ssl_ciphers __SSL_CIPHERS__;
redirect: |
return 301 https://__VHOST_NAME__:__SSL_PORT__request_uri;
php_fpm: |
location / {
if (!-e ¥request_filename) {
rewrite ^(.*)¥ /index.php?s=¥1 last;
}
}
location ~ \.php?¥ {
try_files ¥uri = 404;
include fastcgi_params;
fastcgi_keep_conn off;
fastcgi_param SCRIPT_FILENAME ¥document_root¥fastcgi_script_name;
fastcgi_split_path_info ^(.+\.php)(.*)¥;
fastcgi_pass __PHP_ADDR__:__PHP_PORT__;
fastcgi_read_timeout __PHP_TIMEOUT__;
fastcgi_index index.php;
fastcgi_intercept_errors on;
}
alias: |
location ~ __ALIAS__ {
root __PATH__;
__XDOMAIN_REQ__
}
deny: |
location ~ __REGEX__ {
deny all;
}
server_status: |
location ~ __REGEX__ {
stub_status on;
access_log off;
}
xdomain_request: |
if (http_origin ~* (__REGEX__) ) {
add_header "Access-Control-Allow-Origin" "¥http_origin";
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
add_header 'Access-Control-Expose-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
add_header 'Access-Control-Max-Age' 0;
return 200;
}
总结
整体配置完毕后,使用devilbox进行本地开发还是方便不少,依赖于devilbox对容器的网络管理已经配置Ok,并且集成了多种容器,覆盖常见的web、缓存、数据库、消息队列等,可以快速方便搭建本地开发环境!
文章评论