使用构建好的 Docker 镜像来搭建 Laravel Sail 开发环境,解决 Laravel Sail 镜像构建失败的问题

背景

最近有很多小伙伴给我留言,说按照教程《将 Laravel 开发环境由 Homestead 迁移到 Laravel Sail ( Docker ) 完整详细教程
搭建 Laravel Sail 开发环境时总是构建镜像失败。其实构建镜像失败的主要原因就是国内的网络问题,这给刚学习 Laravel Sail 开发环境搭建的小白带来了“巨大的”挑战,所以我将本地构建好的 Sail 镜像共享到了百度网盘上,大家直接从百度网盘下载构建好的 Laravel Sail 镜像导入 Docker Desktop 里面,然后从导入的镜像来构建开发环境就可以了。当然,为了下载速度快一些,你可能要给百度网盘充点钱钱。:blush:

镜像地址

链接:pan.baidu.com/s/1FKXRZWZYhPjnY2mwX...
提取码:b7br
镜像列表:

  • sail-7.4.tar (适用于基于 php7.4 开发的项目)
  • sail-8.0.tar (适用于基于 php8.0 开发的项目)
  • sail-8.0-octane.tar (适用于基于 php8.0 开发且由 laravel octane 驱动的项目)
  • sail-8.1 (适用于基于php8.1开发的项目)
  • mysql-8.0
  • redis

基础环境准备

  • 开启 wsl2
  • 安装 Ubuntu 子系统
  • 安装 Docker Desktop 并让 Docker Desktop 基于 wsl2 来运行

搭建步骤

安装 Laravel Sail

请参照《将 Laravel 开发环境由 Homestead 迁移到 Laravel Sail ( Docker ) 完整详细教程》 发布 Dockerfile 以便定制这一步骤之前的步骤。因为我们使用从百度网盘下载的镜像来构建开发环境,所以不需要我们重新定制 Dockerfile 来构建镜像了。

下载并导入 Laravel Sail 镜像

从上面我分享的镜像中,选择你需要的镜像下载到本地电脑。这里假设我需要的是 sail-8.0.tar,我的镜像下载到了/mnt/c/sail-8.0.tar这个路径里面。
首先导入镜像:

$ docker load < /mnt/c/sail-8.0.tar

查看导入的镜像:

$ docker image ls

运行结果如下:

使用构建好的 Docker 镜像来搭建 Laravel Sail 开发环境,解决 Laravel Sail 镜像构建失败的问题

给镜像命名:

由于我导出镜像的时候用的镜像ID,所以导入镜像的 REPOSITORY 和 TAG 都为空值,这是我当时的失误,所以加上这一步。

$  docker tag e4bd20deb92f sail-8.0/app:latest

运行 docker image ls就可以看到导入的镜像了。

编辑 docker-compose.yml 文件,编排镜像。

将你的服务配置中的build选项删除,因为我们已经导入了镜像,不需要构建了。编辑后的配置文件如下:

# For more information: https://learnku.com/docs/laravel/sail
version: '3'
services:
    your-service.test:
        image: sail-8.0/app
        extra_hosts:
            - 'host.docker.internal:host-gateway'
        ports:
            - '${APP_PORT:-80}:80'
        environment:
            WWWUSER: '${WWWUSER}'
            LARAVEL_SAIL: 1
            XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'
            XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'
        volumes:
            - '.:/var/www/html'
        networks:
            - sail
        depends_on:
            - mysql
            - redis
    mysql:
        image: 'mysql:8.0'
        ports:
            - '${FORWARD_DB_PORT:-3306}:3306'
        environment:
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            MYSQL_DATABASE: '${DB_DATABASE}'
            MYSQL_USER: '${DB_USERNAME}'
            MYSQL_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
        volumes:
            - 'sailmysql:/var/lib/mysql'
        networks:
            - sail
        healthcheck:
            test: ["CMD", "mysqladmin", "ping", "-p${DB_PASSWORD}"]
            retries: 3
            timeout: 5s
    redis:
        image: 'redis:alpine'
        ports:
            - '${FORWARD_REDIS_PORT:-6379}:6379'
        volumes:
            - 'sailredis:/data'
        networks:
            - sail
        healthcheck:
            test: ["CMD", "redis-cli", "ping"]
            retries: 3
            timeout: 5s
networks:
    sail:
        driver: bridge
volumes:
    sailmysql:
        driver: local
    sailredis:
        driver: local

启动服务

./vendor/bin/sail up

后续步骤

后续步骤请查看《将 Laravel 开发环境由 Homestead 迁移到 Laravel Sail ( Docker ) 完整详细教程》构建镜像并启动容器及后续章节。

其他

本作品采用《CC 协议》,转载必须注明作者和本文链接
顺势而为
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 24
playmaker
2年前 评论
myhui0926 (楼主) 2年前

直接在dockerfile里RUN apt update 之前加上

RUN  sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
RUN  sed -i s@/security.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list

RUN  apt-get clean

file

2年前 评论
myhui0926 (楼主) 2年前
lun1bz (作者) 2年前
myhui0926 (楼主) 2年前

file那位高人指点指点,这是怎么回事?

2年前 评论
myhui0926 (楼主) 2年前

Ubuntu 安装以后 sudo ufw status ? 443 能开启吗?

2年前 评论
myhui0926 (楼主) 2年前
Oyxiaoxi (作者) 2年前

file

# For more information: https://learnku.com/docs/laravel/sail
version: '3'
services:
    your-service.test:
        image: sail-8.0/app
        extra_hosts:
            - 'host.docker.internal:host-gateway'
        ports:
            - '${APP_PORT:-80}:8088'
        environment:
            WWWUSER: '${WWWUSER}'
            LARAVEL_SAIL: 1
            XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'
            XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'
        volumes:
            - '.:/var/www/html'
        networks:
            - sail
        depends_on:
            - mysql
            - redis
    mysql:
        image: 'mysql:8.0'
        ports:
            - '${FORWARD_DB_PORT:-3306}:33060'
        environment:
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            MYSQL_DATABASE: '${DB_DATABASE}'
            MYSQL_USER: '${DB_USERNAME}'
            MYSQL_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
        volumes:
            - 'sailmysql:/var/lib/mysql'
        networks:
            - sail
        healthcheck:
            test: ["CMD", "mysqladmin", "ping", "-p${DB_PASSWORD}"]
            retries: 3
            timeout: 5s
    redis:
        image: 'redis:alpine'
        ports:
            - '${FORWARD_REDIS_PORT:-6379}:6379'
        volumes:
            - 'sailredis:/data'
        networks:
            - sail
        healthcheck:
            test: ["CMD", "redis-cli", "ping"]
            retries: 3
            timeout: 5s
networks:
    sail:
        driver: bridge
volumes:
    sailmysql:
        driver: local
    sailredis:
        driver: local
2年前 评论
myhui0926 (楼主) 2年前

我是卡在了sail up 这一步了, 换源也不好使,对ubuntu不是很了解,发现个问题。
看论坛的教程执行

curl -s https://laravel.build/example-app | bash

这个产生的Dockerfile文件里面都是

FROM ubuntu:21.04

但我是win10系统用wsl2,unbuntu20.04
我观察sail up的过程 请求的地址也是类似

http://archive.ubuntu.com/ubuntu hirsute/main amd64

这样是不是不合适啊。

2年前 评论
myhui0926 (楼主) 2年前

docker load < /mnt/c/sail-7.4.tar 之后显示

REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
<none>       <none>    5357091b6f9e   7 months ago   706MB

怎么解决

2年前 评论
myhui0926 (楼主) 2年前
myhui0926 (楼主) 2年前
dollzcx (作者) 2年前
myhui0926 (楼主) 2年前

是sail 里自带了nginx 还是说是用的laravel 自己的serve ,我也是昨天晚上装好的.单纯好奇

2年前 评论
myhui0926 (楼主) 2年前
talers69 1年前

./vendor/bin/sail up一直报这个错误

ERROR: Invalid interpolation format for "ports" option in service "laravel.test": "${APP_PORT:-80}:8088"
1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!