文章目录
前言
在实际部署环境中,是需要我们在全新机器上搭建运行环境的,传统的LNMP都需要准备。如果使用Docker镜像来作为运行环境,就可以帮我们节省很多工作。这一章,尝试使用LaraDock运行起来我们之前准备好的Laravel工程。
一、准备LaraDock环境
我是参考后盾人的教程来安装的,当然官方也有具体的方法,都可以看一下:
https://doc.houdunren.com/wamp/4%20laradock.html#workspace
https://laradock.io/getting-started/
1. 安装Docker
整体流程:1. 先安装docker前置依赖;2. 安装Docker服务;
1.1 先安装前置服务
vagrant@laravel: sudo apt-get update
vagrant@laravel: sudo apt-get install \
> apt-transport-https \
> ca-certificates \
> curl \
> gnupg \
> lsb-release
1.2 安装Docker服务
这里可以利用docker官方提供的一键安装脚本,避免复杂的安装流程
vagrant@laravel: curl -fsSL get.docker.com -o get-docker.sh
vagrant@laravel: sudo sh get-docker.sh
启动Docker服务
在Windows上,也可以直接启动DockerDestop,也会顺便启动Docker服务。不启动的话,是没有办法在命令行下使用docker相关命令的。
root@laravel: sudo systemctl enable docker
root@laravel: sudo systemctl start docker
测试Docker服务
这个命令会从DockerHub的服务器拉取"hello-world"镜像,然后运行+移除容器
root@laravel: docker run --rm hello-world
安装docker-compose服务:
docker-compose 用来管理容器集群的开源软件, 因为一个web服务器往往需要很多服务来支持,如果把能想到的都放进一个镜像,既臃肿又冗余。用这个管理器来进行组合式管理,既可以多情景复用,还极大减少了冗余。
root@laravel: sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
root@laravel: sudo chmod +x /usr/local/bin/docker-compose
root@laravel: docker-compose --version
docker-compose version 1.29.2, build 5becea4c
1.3 配置镜像
docker在build镜像时,需要使用 pull 命令从官方镜像仓库拉取一些必要的依赖,因为服务器在国外,很可能会有类似报错:TLS handshake timeout 解决方式:增加国内镜像的配置Windows DockerDestop:
依次打开 Setings >> Docker Engine,在Docker Engine里配置如下内容:
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
],
Linus:
对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件):
{"registry-mirrors":["https://reg-mirror.qiniu.com/","http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn"]}
设置好之后,可以运行命令检查
root@laravel: docker info
...
...
Insecure Registries:
hubproxy.docker.internal:5000
127.0.0.0/8
Registry Mirrors:
https://registry.docker-cn.com/
http://hub-mirror.c.163.com/
https://docker.mirrors.ustc.edu.cn/
...
...
2. 安装LaraDock
2.1 下载LaraDock
LaraDock其实就是使用Docker来封装的一组镜像,涵盖了正常Web开发可能用到的几乎所有服务;每个服务都有对应的Dockerfile进行镜像定义,我们只要下载了这些Dockerfile文件,就能在本地自己build出对应的服务镜像来使用。
下载LaraDock定义文件
root@laravel: git clone https://github.com/Laradock/laradock.git
2.2 配置LaraDock
首先创建整体配置文件:
root@laravel: cp env-example .env
然后修改**.env**文件里的几个关键数据:
# 此处修改是为了能够让各个镜像服务能够定位到我们的工程代码,比如Nginx
APP_CODE_PATH_HOST=../../Laravel/Projects/laravel-project-mac/code/
# php-fpm和workspace镜像要保证和我们的工程使用版本一致
PHP_VERSION=8.0
# mysql镜像使用的DB配置,我这里的修改只是为了确保和我外面的Laravel工程的配置保持一致
MYSQL_DATABASE=homestead
MYSQL_USER=homestead
# workspace最新版本只有PHP8.1.1,所以要指定版本--下文有具体介绍
WORKSPACE_BASE_IMAGE_TAG_PREFIX=20220115
nginx服务镜像还需要单独配置域名和端口等:
root@laravel: cp nginx/sites/laravel.conf.example nginx/sites/laravel-win.conf
修改laravel-win.conf内容:
server_name laravel.win;
# 注意这里的/var/www/ 对应的其实就是 APP_CODE_PATH_HOST 里配置的路径
root /var/www/public;
2.3 编译启动LaraDock
可以单独编译每个镜像,然后再启动:
root@laravel: docker-compose build nginx
root@laravel: docker-compose build mysql
root@laravel: docker-compose build redis
root@laravel: docker-compose build php-fpm
root@laravel: docker-compose build workspace
也可以使用运行命令,会自动先进行编译:
# php-fpm 镜像会因为workspace的启动而自动被创建和启动, 所以不需要放到命令里
root@laravel: docker-compose up -d nginx mysql redis workspace
2.4 踩坑记录
在编译workspace的时候,可能遇到一个编译错误:
XML Extension not found
这个问题原因是.env文件里的配置是下载最新的镜像,但是最新的镜像只For PHP8.1.1,是没有其他PHP版本的,导致编译失败,按照如下方法修改.env文件:
WORKSPACE_BASE_IMAGE_TAG_PREFIX=latest to WORKSPACE_BASE_IMAGE_TAG_PREFIX=20220115
https://github.com/laradock/laradock/issues/3133#issuecomment-1020392502
另一种常见错误是网络连接失败,这种没啥好办法,一个是指定目标服务器的host,另一个是利用翻墙的VPN
OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to raw.githubusercontent.com:443
或者
failed to solve: rpc error
所有需要的镜像安装好之后,就可以再次通过启动命令创建容器了
# php-fpm 镜像会因为workspace的启动而自动被创建和启动, 所以不需要放到命令里
root@laravel: docker-compose up -d nginx mysql redis workspace
root@laravel: docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
447d03cc0685 laradock_nginx "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:80-81->80-81/tcp, 0.0.0.0:443->443/tcp laradock-nginx-1
81fa09aacb46 laradock_php-fpm "docker-php-entrypoi…" About a minute ago Up About a minute 9000/tcp, 0.0.0.0:9003->9003/tcp laradock-php-fpm-1
2aa81e404279 laradock_workspace "/sbin/my_init" About a minute ago Up About a minute 0.0.0.0:3000-3001->3000-3001/tcp, 0.0.0.0:4200->4200/tcp, 0.0.0.0:8080->8080/tcp, 0.0.0.0:2222->22/tcp, 0.0.0.0:8001->8000/tcp laradock-workspace-1
fd81871c3eab laradock_mysql "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:3306->3306/tcp, 33060/tcp laradock-mysql-1
dca0f0dd291d docker:20.10-dind "dockerd-entrypoint.…" About a minute ago Up About a minute 2375-2376/tcp laradock-docker-in-docker-1
4b4798cf1de0 laradock_redis "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:6379->6379/tcp laradock-redis-1
二、使用LaraDock
LaraDock的使用和其他的docker使用区别不大,所以可以参考官方的操作文档:
https://www.runoob.com/docker/docker-image-usage.html
https://yeasy.gitbook.io/docker_practice/image/commit
1. 检查所有容器状态
在上一章最后,我们已经启动了所有需要的服务容器,再使用composer的命令查看一次:
PS E:\Work\Docker\laradock> docker-compose ps
NAME COMMAND SERVICE STATUS PORTS
laradock-docker-in-docker-1 "dockerd-entrypoint.…" docker-in-docker running 2375-2376/tcp
laradock-mysql-1 "docker-entrypoint.s…" mysql running 0.0.0.0:3306->3306/tcp
laradock-nginx-1 "/docker-entrypoint.…" nginx running 0.0.0.0:80-81->80-81/tcp, 0.0.0.0:443->443/tcp
laradock-php-fpm-1 "docker-php-entrypoi…" php-fpm running 0.0.0.0:9003->9003/tcp
laradock-redis-1 "docker-entrypoint.s…" redis running 0.0.0.0:6379->6379/tcp
laradock-workspace-1 "/sbin/my_init" workspace running 0.0.0.0:2222->22/tcp, 0.0.0.0:3000-3001->3000-3001/tcp, 0.0.0.0:4200->4200/tcp, 0.0.0.0:8001->8000/tcp, 0.0.0.0:8080->8080/tcp
首先确认状态Status是running,这里如果是exited,则说明容器已经被关掉,需要重新使用 docker-compose up 或者 docker-compose start 命令启动所有的容器
最后,可以第一次尝试用网页访问我们的laravel服务了:
http://127.0.0.1
SQLSTATE[HY000] [2002] Connection refused (SQL: select * from `sessions` where `id` = ZRVgrzIDLG49RGofYXKvEqtLdMahh4vuXs5gghUJ limit 1)
如果是上面的错误,恭喜你,所有的服务都已经起来了,至于这个报错,因为我们的环境是全新的,需要重新将需要的DB Table都创建一遍。开发系列五里提过类似的情况,执行数据库迁移即可。
2. 执行Laravel数据库迁移
要做这一步,首先要登陆到workspace容器。
这里强调一下,workspace的角色,其实是一个让我们用来执行php脚本的地方。说白了,就是调试代码工程的地方。
E:\Work\Docker\laradock> docker-compose exec workspace bash
root@2aa81e404279:/var/www#
踩坑记录: 如果你遇到了下面的错误,不要慌,换个命令行软件就行了。。
the input device is not a TTY. If you are using mintty, try prefixing the command with 'winpty'
或者
panic: the handle is invalid
错误的原因很简单,我是在windows下访问容器,它只认识windows的命令行工具,之前使用的git bash是不行的。。
执行数据库迁移:
root@2aa81e404279:/var/www# php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table (84.24ms)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table (102.31ms)
Migrating: 2014_10_12_200000_add_two_factor_columns_to_users_table
Migrated: 2014_10_12_200000_add_two_factor_columns_to_users_table (93.76ms)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated: 2019_08_19_000000_create_failed_jobs_table (60.97ms)
Migrating: 2019_12_14_000001_create_personal_access_tokens_table
Migrated: 2019_12_14_000001_create_personal_access_tokens_table (87.12ms)
Migrating: 2021_03_30_054810_create_sessions_table
Migrated: 2021_03_30_054810_create_sessions_table (162.13ms)
Migrating: 2021_06_09_135841_create_config_data
Migrated: 2021_06_09_135841_create_config_data (59.40ms)
踩坑记录: 这里可能遇到报错:
SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = homestead and table_name = migrations and table_type = 'BASE TABLE')
问题原因:mysql和redis的服务,都不能认为是本机,而是其他容器。
所以Laravel的.env中,mysql和redis要使用hostname,而非IP:
root@2aa81e404279:/var/www# vi .env
...
DB_CONNECTION=mysql
...
REDIS_HOST=redis
...
第二次尝试登陆,便已经能够看到我们的laravel项目界面了~
http://127.0.0.1
最后,进入调试状态之前,先启动npm自动打包webpack:
root@2aa81e404279:/var/www: npm run watch-poll
踩坑记录: 这里可能会遇到报错
Error: error:0308010C:digital envelope routines::unsupported
code: 'ERR_OSSL_EVP_UNSUPPORTED'
修复方案:
Node.js version 17 has switched to using OpenSSL 3.0,so…
改为使用命令:
root@2aa81e404279:/var/www NODE_OPTIONS=--openssl-legacy-provider npm run dev
参考: https://stackoverflow.com/questions/70582072/npm-run-watch-fails-with-err-ossl-evp-unsupported
现在,登陆http://127.0.0.1,看看自己的Laravel页面吧!
总结
使用Docker替换虚拟机,主要是为了未来发布环境到服务器上比较方便,避免了服务组件的临时安装步骤。