使用 Vagrant+Docker 構建 PHP 最優開發環境

      網友投稿 1125 2025-03-31

      PS: 此方案適用于 Windows、macOS


      老祖宗說過磨刀不誤砍柴工,又說過工欲善其事,必先利其器。這話無論放到何時都適用。上次折騰開發環境是?docker 優化之 docker-sync 解決 Docker 掛載緩慢?的問題,然而這一改問題更大了。

      在我日常開發了數天后,總結了 docker-sync 的諸多問題:

      宿主機修改時而不同步,這個在文章中有講過,懷疑和內存/運行時間有關系

      如果項目過大,start?命令的同步時間過長,這通常需要 10~20 分鐘

      試想,問題 1 和 2 通常是成對出現的,也就是說只要發現文件不同步,那可就一直不同步了,我曾認為同步是監聽文件的修改事件來通知更新,然而 CTRL + S 按爛也沒有反應。接著能做的只有清除掉同步的數據然后重新同步。

      這通常折騰你兩次你可能就很難受了,重新同步完你剛剛做的什么也忘得七七八八了,誰曾想裝個同步工具反倒同步出了問題。

      上篇文章有提到,掛載速度損耗最小的是利用虛擬機掛載。

      環境結構

      簡單描述這幾套開發環境的結構。

      1 2 3 4 5

      只使用 Docker:本地文件 --掛載--> Docker 容器 --映射端口--> 宿主機 只使用 Vagrant:本地文件 --掛載--> 虛擬機 --映射端口--> 宿主機 Docker+Vagrant:本地文件 --掛載--> 虛擬機 --掛載--> Docker --映射端口--> 虛擬機 --映射端口--> 宿主機

      安裝

      首先需要安裝 vagrant 和 VirtualBox 這兩個程序。

      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

      使用 Vagrant+Docker 構建 PHP 最優開發環境

      # 映射端口 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 拉不起來,查看日志發現對應目錄不可寫?,在查找相關文檔的時候找到了 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 容器。

      CentOS Docker PHP

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:WPS演示在制作課件時添加動畫效果的方法
      下一篇:轉載全球前十大云計算專利所有者名單出爐:華為第八
      相關文章
      亚洲成av人片天堂网老年人| 国产精品亚洲综合久久 | 亚洲乱亚洲乱妇无码麻豆| 亚洲第一页综合图片自拍| 精品国产亚洲AV麻豆| 亚洲AV永久无码精品放毛片| 亚洲精品成a人在线观看☆| 在线综合亚洲欧洲综合网站| 亚洲永久网址在线观看| 亚洲熟女精品中文字幕| 亚洲精品无码专区在线| 亚洲av无码一区二区三区人妖| 亚洲精品第一国产综合亚AV| 国产亚洲人成在线播放| 色九月亚洲综合网| 国产午夜亚洲精品不卡电影| 亚洲阿v天堂在线2017免费| 亚洲日韩小电影在线观看| 亚洲第一成年免费网站| 亚洲精品精华液一区二区| 欧美亚洲国产SUV| 亚洲一区精品伊人久久伊人| www.亚洲色图| 国产成人综合亚洲AV第一页| 国产亚洲成AV人片在线观黄桃 | 亚洲人成色4444在线观看| 亚洲s码欧洲m码吹潮| 国产精品亚洲片在线花蝴蝶| 亚洲午夜精品久久久久久浪潮 | 亚洲色婷婷综合久久| 久久久久亚洲av无码尤物| 亚洲色图黄色小说| 亚洲六月丁香婷婷综合| 亚洲精品无码av中文字幕| 亚洲毛片网址在线观看中文字幕| 国产亚洲av人片在线观看| 亚洲一区综合在线播放| 亚洲成av人片在线看片| 亚洲人成网站免费播放| 亚洲精品第一国产综合境外资源| 亚洲日韩aⅴ在线视频|