新手也能用docker搭建PHP环境

2017/08/05

虽然这篇叫Docker环境搭建,但是是用了一个别人写好的配置文件,为什么要用别人写好的呢?因为第一节省了我们学习的成本,类似一键安装环境的东西。二节省了我们的构造docker和测试docker的时间。三也省略了我们在去写额外的服务器配置。
这里我选用LaraDock,因为它的容器多,不仅仅用来作web服务器。LaraDock官网
以下,所说的文件夹和目录是同一个意思,只不过不同的操作系统叫法不一样而已。

1. 安装前的准备工作

  • GIT
  • Docker

这两个各自的官网上都有,这就不多介绍了。安装也比较方便,没什么难点

2. Docker镜像源更改

这里我们要更改下Docker源,不然会一直提示连接不了服务器,即便连接上也会下载巨慢。
这里我选择DaoCloud

  1. 首先注册DaoCloud号,只有注册以后,才能用它的加速服务,免费的。所以我们要感谢DaoCloud的免费。
  2. 访问网址http://www.daocloud.io/mirror#accelerator-doc,上面有根据系统如何更改镜像源,不复杂,很简单就完成了(PS:这个网址必须在登录的情况下才能访问到,免费的服务,为了以后大家都用着舒心就支持下,注册下)

(PS:如果你碰到提示 ERROR: Service ‘mysql’ failed to build: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on 192.168.65.1:53: too many redirects 这个错误提示就是没有连接上镜像的服务器,多试几次就好了)

3. 安装LaraDock

这里以新项目为例,如果是在已有的项目的情况下,请参考LaraDock官方文档

  git clone https://github.com/Laradock/laradock.git

这里会下载一些docker配置文件,git下来后有个laradock目录,里面有很多容器,到时候需要什么容器就加载什么容器就可以了,非常方便。

4. 修改docker镜像配置文件

  1. 进入刚刚git下来的laradock目录
  2. 拷贝配置文件,并命名为.env
cp env-example .env

5. 修改配置文件

修改刚刚复制的配置文件,最上面有行Application的配置,是指你项目的位置所在,这里指的是你的项目要放在哪个文件夹下,把APPLICATION=../改为APPLICATION=../project-z/,当然这个后期也是可以更改的

虽然我把项目放在了project-z目录下,其实nginx真正访问到的位置为 project-z/public/

### Application Path
# Point to your application code, will be available at `/var/www`.

APPLICATION=../project-z/

这个目录的意思是project-z文件夹的父目录,是和project-z文件夹在同一级的project-z目录 如果目录不存在的话一般生成容器的时候会自动创建,如果生成的时候没创建或者生成容器的时候提示找不到目录的话,就新建好这个文件夹,因为linxu里会有权限的问题。

6. 生成容器并启动服务器

以后如果启动服务器的话,就执行这条命令就行了。注意,第一次执行这个命令会先从网上服务器里下载docker镜像,然后在用镜像生成容器,有了容器以后,下次启动就直接启动容器了。 第一次执行因为要下载镜像,随便一个镜像都很大,所以,如果不更改Docker源的话,基本上就无望了。好多人也都是在这步放弃的,即便你更改了Docker源有时候也会下载失败,多执行几次这条命令就,直到执行成功。

docker-compose up -d nginx mysql

(-d,表示后台启动。workspace 和 php-fpm 将运行在大部分实例中, 所以不需要在 up 命令中加上它们。) 安装完成,并且启动以后的效果,应该类似这样的

Starting laradock_mysql_1 ... 
Starting laradock_mysql_1
Recreating laradock_applications_1 ... 
Recreating laradock_applications_1 ... done
Recreating laradock_workspace_1 ... 
Recreating laradock_workspace_1 ... done
Recreating laradock_php-fpm_1 ... 
Recreating laradock_php-fpm_1 ... done
Recreating laradock_nginx_1 ... 
Recreating laradock_nginx_1 ... done

会发现启动的时候有些显示的是done的,这些不用管,我琢磨着应该是重复启动相同的容器,然后端口被占用所造成的失败。

7. 查看启动效果

在本地的浏览器上输入http://localhost/,会发现提示404,这是因为我们虽然创建了project-z,但是并没有在里面新建文件,在里面放入一个新建的index.php文件。 放入index.php文件后重新访问,发现还是提示404,其实,这是因为ngixn默认配置是在public目录下的。在project-z文件夹里面新建一个public目录,然后再在里面放入index.php发现就能访问到了。

8. 完成

到这里其实已经完成了,因为已经能访问到项目了,以后再次启动服务器的时候只需要运行docker-compose up -d nginx mysql就能直接启动服务了

9. 安装laravel项目

  1. 首先进入到项目容器里面
docker-compose exec --user=laradock workspace bash

执行完这条命令后,会发现你的用户已经变更了,说明你已经进入到容器里面了

  1. 安装laravel项目
composer create-project laravel/laravel coolapp

(PS:为什么要在容器里安装,而不直接在本地直接安装呢?这个我琢磨着应该是权限的问题,因为linxu和mac会有用户权限和文件夹权限这一说法)

  1. 按照安装laravel的要求,给一些目录设置写权限

8. 更改项目为laravel目录

  1. 输入exit,退出容器
  2. 输入docker-compose stop关闭所有容器。
  3. 然后更改.env文件。由原来的../project-z/目录改为../project-z/coolapp/。(PS:注意,这里默认就是进入的publi目录,所以不需要额外的在指定public目录了)
  4. 启动服务docker-compose up -d nginx mysql
  5. 在浏览器地址栏上输入http://localhost/,查看效果

9. 更改laravel的数据库连接

进入laravel项目目录下,更改coolapp目录里的.env的laravel配置文件为DB_HOST=mysql

那么问题来了,mysql的用户名密码以及数据库的名字是什么?这个可以查看laradock目录下的.env配置文件,然后在文件里搜索mysql关键字,你就会看到mysql的一些配置,数据库,密码,用户名等等。

其它问题

  1. 下载镜像的时候有的提示需要key之类的,意思是你需要登录你的docker,去到Docker官网上注册个号,然后在你本机的Docker服务上登录上你的号就可以了。
  2. 以上步骤是单项目下的服务器配置。即,只针对一个域名下的配置,多域名的请参考Laradock官方文档的多项目配置。
  3. 启动服务正常,访问一直是’404 Not Found’,进入nginx容器里,查看nginx配置,发现里面多了一个public目录,所以需要在指定的项目目录下在新建一个public目录。
  4. 执行docker-compose up -d nginx mysql,会提示经常提示服务器错误,因为即便更换了Docker源,但是因为不稳定,所以还是经常下载失败。多执行几次这条命令
  5. 生成镜像的时候,有可能生成镜像的时候失败过,然后再次执行docker-compose up -d nginx mysql无法构建当前镜像。查看镜像发现有生成为none的镜像,删除掉即可
  6. 镜像有时候删除不掉,是因为还有依赖它生成的容器没有关闭,所以先停止所有容器,然后在删除镜像。

注意事项

  1. 各个端口一定不能被占用,不然服务会启动失败
  2. 切换Docker源,不然下载镜像的时候会非常慢
  3. 项目默认位置是在你设置目录的public目录下面的
  4. 服务器的配置都能在.env里找到,如果找不到,进入你的服务器容器里,然后直接查看配置
  5. 其它容器组合直接可以看laradock目录下有啥文件夹,就有啥服务。
  6. docker默认是挂载的方式(即类似于共享目录的方式),把你本地的目录挂载到容器里的,所以docker里有配置挂载目录的选项,如果找不到目录,可以到docker服务器里查看有没有把项目的目录挂载上去。

基本docker命令

  1. 关闭所有容器(停止所有服务)
    docker-compose stop
    
  2. 删除所有容器
    docker-compose down
    
  3. 删除所有镜像
    docker rmi $(docker images -q)
    
  4. 后台启动容器(以后台的方式启动服务)
    docker-compose up -d {容器名称}
    
  5. 查看所有容器
    docker ps
    
  6. 查看所有镜像
    docer images
    
  7. 查看容器IP

    需要先使用命令docker ps查看出容器的IP

    docker inspect [容器ID]
    
  8. 远程连接mysql并执行mysql命令行模式

    mysql的用户名和密码可以在.env里找

    docker-compose exec mysql mysql -u [用户名] -p[密码]
    
  9. 远程连接redis并进入redis命令行模式

    这条命令是默认端口为6379,如果你更改了端口请在后面加上 -p [端口号]

    docker-compose exec redis redis-cli -h redis
    

原文链接:Dennis`s blog
参考链接:
基于 LaraDock 在 Docker 中快速构建 Laravel 应用系列教程 —— 搭建开发环境
laradock文档
开始使用Docker for Mac

Post Directory