使用 Vagrant+Docker 构建 PHP 最优开发环境[通俗易懂]

使用 Vagrant+Docker 构建 PHP 最优开发环境

大家好,又见面了,我是全栈君。

PS: 此方案适用于 Windows、macOS

老祖宗说过磨刀不误砍柴工,又说过工欲善其事,必先利其器。这话无论放到何时都适用。上次折腾开发环境是 Docker 优化之 Docker-sync 解决 Docker 挂载缓慢 的问题,然而这一改问题更大了。

在我日常开发了数天后,总结了 docker-sync 的诸多问题:

  1. 宿主机修改时而不同步,这个在文章中有讲过,怀疑和内存/运行时间有关系
  2. 如果项目过大,start 命令的同步时间过长,这通常需要 10~20 分钟

试想,问题 1 和 2 通常是成对出现的,也就是说只要发现文件不同步,那可就一直不同步了,我曾认为同步是监听文件的修改事件来通知更新,然而 CTRL + S 按烂也没有反应。接着能做的只有清除掉同步的数据然后重新同步。使用 Vagrant+Docker 构建 PHP 最优开发环境[通俗易懂]

这通常折腾你两次你可能就很难受了,重新同步完你刚刚做的什么也忘得七七八八了,谁曾想装个同步工具反倒同步出了问题。使用 Vagrant+Docker 构建 PHP 最优开发环境[通俗易懂]

上篇文章有提到,挂载速度损耗最小的是利用虚拟机挂载。

环境结构

简单描述这几套开发环境的结构。

1
2
3
4
5
只使用 Docker:本地文件 --挂载--> Docker 容器 --映射端口--> 宿主机

只使用 Vagrant:本地文件 --挂载--> 虚拟机 --映射端口--> 宿主机

Docker+Vagrant:本地文件 --挂载--> 虚拟机 --挂载--> Docker --映射端口--> 虚拟机 --映射端口--> 宿主机

安装

首先需要安装 Vagrant 和 VirtualBox 这两个程序。

选择你系统对应的最新版本,安装步骤不用细细的讲。

导入镜像

1
2
3
4
5
# 创建 vagrant 镜像配置目录
$ mkdir ~/vagrant
# 拉取 centos 镜像
$ cd ~/vagrant
$ vagrant init centos/7

通过 vagrant init 命令拉取镜像在国内速度很慢,你可以配置代理来加速拉取,前提是需要先启用代理。

1
2
$ export http_proxy=http://0.0.0.0:1087
$ export https_proxy=http://0.0.0.0:1087

或者你可以自己下载镜像,通过命令来手动导入镜像。

1
2
3
4
// 复制镜像到 vagrant 目录
$ cp /path/to/centos-7.box ~/vagrant
$ vagrant box add centos-7.box
$ vagrant init centos-7

配置

当镜像导入成功后,~/vagrant 目录将生成一个 Vagrantfile 你可以编辑它用于配置挂载的目录,映射的端口等。

1
2
3
4
5
6
7
# 映射端口
config.vm.network "forwarded_port", guest: 80, host: 80
config.vm.network "forwarded_port", guest: 80, host: 80, host_ip: "127.0.0.1"
# 挂载目录 忽略挂载 vagrant 目录
config.vm.synced_folder ".", "/vagrant", disabled: true
config.vm.synced_folder "~/dnmp", "/root/dnmp"
config.vm.synced_folder "~/Project", "/root/Project"

端口映射 80 和 3306 等,目录挂载我这里挂载了 ~/dnmp 目录,这个是一个类似 laradock/laradock 的项目,配置了我日常的开发环境,包括 PHP、Nginx、Redis、MySQL 等,使用 Docker 能快速构建我的开发环境。

安装 Docker

当 Vagrantfile 配置完成,便可以使用 vagrant up 命令启动虚拟机。但注意,关于 vagrant 相关的命令,你只能在 ~/vagrant 目录下才能执行,它依赖 Vagrantfile 文件。

1
2
3
4
5
6
7
8
9
$ cd ~/vgrant
# 开启虚拟机
$ vagrant up
...
# 登录到虚拟机
$ vagrant ssh
...
# 默认登录是 vagrant 用户,手动切换到 root 用户
$ sudo su -

至此虚拟机部分已经安装完成,后续如果调整 Vagrantfile 后需要执行 vagrant reload --provision 命令。

后续操作全部在虚拟机(使用 vagrant ssh 登录)中进行,然后准备 Docker 安装的必要的工具以及 Docker 的软件源。

1
2
3
4
5
6
7
8
9
10
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加 docker 的软件源
$ sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新 yum 缓存
$ sudo yum makecache fast
# 安装 docker-ce 版本
$ sudo yum -y install docker-ce
...
# 安装完成后启动 docker 的后台程序
$ sudo systemctl start docker

安装完成后,你可以使用 docker -v 命令查看当前安装的 Docker 版本。

优化 Docker

首先需要修改 Docker 的镜像地址,大陆使用 Docker 官方镜像速度令人发指,这里我使用阿里云提供的镜像加速服务。你可以打开登录阿里云的容器镜像服务来获取加速地址。地址:容器镜像服务

然后复制上你的加速地址,并打开 Docker 的配置文件。

1
$ vi /etc/docker/daemon.json

增加配置文件,并复制替换加速地址,格式如下:

1
2
3
{
    "registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
}

配置完成后,需要重启 Docker 的镜像来加载加速地址。

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

构建开发环境

我这里使用的 yeszao/dnmp,我 fork 了一个分支到我的仓库并做了一些调整,地址:isecret/dnmp

本地我将仓库 clone 到 ~/dnmp 目录,并挂载到虚拟机的 /root/dnmp 目录,后续的操作使用同一套配置。

关于 dnmp 的操作可以查看对应的 README.md 来获得帮助。

注意事项

MySQL 无法启动,对应目录不可写入?

我曾在环境配置完成的时候发现 MySQL 拉不起来,查看日志发现对应目录不可写 使用 Vagrant+Docker 构建 PHP 最优开发环境[通俗易懂],在查找相关文档的时候找到了 Docker 官方仓库的 Issues,地址:mysqld: Can’t create/write to file ‘/var/lib/mysql/is_writable’ (Errcode: 13 – Permission denied) #219,翻译下原文,这种情况通常在 macOS 和 Windows 挂载会出现,Docker 容器默认会以 mysql 用户运行,而挂载的文件则是 root 用户的 UID,需要指定容器的用户为 docker 用户的 UID 1000:50

配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql:
    image: mysql:${MYSQL_VERSION}
    user: "1000:50"
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
    ports:
      - "${MYSQL_HOST_PORT}:3306"
    volumes:
      - ${MYSQL_CONF_FILE}:/etc/mysql/conf.d/mysql.cnf:ro
      - ${MYSQL_DATA_DIR}:/var/lib/mysql/:rw
    command: --innodb-use-native-aio=0
    networks:
      - default

 

修改完成后,需要重新 bulid 容器。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111977.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ubuntu怎么卸载docker_failed to start docker.service

    ubuntu怎么卸载docker_failed to start docker.serviceDocker卸载及安装(CentOS7)1.卸载:#停止docker服务systemctlstopdocker#查看当前所有版本安装信息rpm-qa|grepdocker#yumlistinstalled|grepdocker#docker-ce-cli-20.10.12-3.el7.x86_64#docker-ce-20.10.11-3.el7.x86_64#docker-scan-plugin-0.12.0-3.el7.x86_64#docker-ce-

    2025年10月3日
    4
  • docker nginx+php(docker nginx反向代理)

    一、docker安装:将微信公众号项目运行绑定至80端口(微信服务器只能和外部开通了80端口的服务器之间通信)docker一次构建可放在任何地方就可以运行,不需要进行任何改变DocKer就类似于一个容器。这个容器就好像咱们常用的虚拟机一样,当我们虚拟机里面安装过VS、SQL、浏览器……之后咱们就把虚拟机镜像备份下来、等到下一次需要重新搭一个环境的时候,就可以省去很多事情了,直接…

    2022年4月16日
    71
  • Docker(五)[通俗易懂]

    Docker(五)[通俗易懂]DockerDocker网络–link自定义网络网络连通Docker网络Docker是如何进行网络通讯的?查看本机的网卡和ip地址docker0类似与路由器ip地址一样(x.x.x.1)Dockerdocker run -d -P –name=tomcat03 tomcat:8.0查看容器ip地址docker exec -it a72d4ae634da ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noque

    2022年8月11日
    9
  • Linux&Docker&Mysql&GitWin常用命令

    Linux&Docker&Mysql&GitWin常用命令苦于有时候某个命令真的想不起,又得百度,干脆以后操作linux时,打开博文直接查询多爽。基于安装rabbitmq时,某个命令不会,写下的,后面再继续补充1.基本命令:删除文件:rm -rf + 名称查看当前路径: pwd复制文件:cp [ -r ] 源文件或目录 目标文件或目录复制多个文件:cp /home/usr/dir/{file1,file2,file3,file4} /home/usr/destination/显示解压文件的过程 tar -zxvf 文件名称 不显

    2022年6月13日
    28
  • Docker系列七: 使用Humpback管理工具管理容器(一款UI管理工具)

    Docker系列七: 使用Humpback管理工具管理容器(一款UI管理工具)Humpback可以帮助企业快速搭建轻量级的Docker容器云管理平台,若将你的Docker主机接入到Humpback平台中,就能够为你带来更快捷稳定的容器操作体验。功能特点Web操

    2022年8月2日
    5
  • es集群搭建_k8s和docker搭建es集群

    es集群搭建_k8s和docker搭建es集群单机的elasticsearch做数据存储,必然面临两个问题:海量数据存储问题、单点故障问题。ES集群搭建_使用docker-海量数据存储问题:将索引库从逻辑上拆分为N个分片(shard),存储到多个节点-单点故障问题:将分片数据在不同节点备份(replica)ES集群介绍为什么需要集群ES集群相关概念搭建ES集群集群职责划分集群脑裂问题…

    2022年10月12日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号