laradock开发环境搭建笔记
主机环境:mac os
目标:搭建laravel框架运行环境。需要启用的服务有:workspace、php-fpm、php-worker、nginx、mysql、redis、rabbitmq。
步骤:
1、主机安装Docker Desktop。官网下载安装即可。
2、给Docker Desktop配置代理以及国内的镜像源。国外镜像下载很慢、而且在build镜像的时候,部分外网的源代码由于网络环境或GFW导致无法下载,创建失败。所有需要有一个可以连接到外网的代理服务器。
b、修改 Preferences --> Docker Engine 配置。附上官方文档地址:https://docs.docker.com/network/proxy/
{ "debug": true, "registry-mirrors": [ "https://registry.docker-cn.com" ], "experimental": false, "proxies": { "default": { "httpProxy": "http://192.168.1.128:10809", "httpsProxy": "http://192.168.1.128:10809", "noProxy": "" } } }
b、Preferences --> Resources --> PROXIES --> Manual proxy configuration 开关打开。Web Server (HTTP) 以及 Secure Web Server(HTTPS) 填入你的代理服务器地址和端口。我的代理服务器是和mac book连接到同一个路由器的手机,手机安装了 yar2v(倒过来)
3、rabbitmq 启动/重启失败。
a. 报错:docker chown: /var/lib/rabbitmq/.erlang.cookie: I/O error。执行以下命令:`chmod 770 ~/.laradock/data/rabbitmq/.erlang.cookie`。
b. windows 环境的docker可能报错:Cookie file /var/lib/rabbitmq/.erlang.cookie must be accessible by owner only 解决办法:docker-compose.yml文件中的rabbitmq配置修改一下
volumes:
- ${DATA_PATH_HOST}/rabbitmq:/var/lib/rabbitmq/mnesia
4、项目中的数据库、redis的配置使用服务的网络别名。laravel项目中的.env 配置数据库。`DB_HOST=mysql`, `REDIS_HOST=redis`,其实就是使用容器的网络别名。不清楚的可看官方文档关于docker网络配置。简单总结就是:让所有容器都连接到你自己创建的网络(user definded network),如果连接docker创建的默认网络是无法使用网络别名相互访问的,一个容器可以连接到多个网络,并且一个容器在一个网络中可以有多个网络别名。
具体怎么配置,参考下面的 nginx的docker-compose配置(基于laradock的配置):
a、nginx容器连接到两个网络backend和frontend。其中nginx容器在backend网络配置了3个别名,这里我给每个项目配置一个网络别名,其他容器(php-fpm、workspace等)都可以通过nginx的网络别名正常访问各个项目了。另外一个方法是给其他容器配置 extra_hosts,但是相对比较麻烦。
### NGINX Server ######################################### nginx: build: context: ./nginx args: - CHANGE_SOURCE=${CHANGE_SOURCE} - PHP_UPSTREAM_CONTAINER=${NGINX_PHP_UPSTREAM_CONTAINER} - PHP_UPSTREAM_PORT=${NGINX_PHP_UPSTREAM_PORT} - http_proxy - https_proxy - no_proxy volumes: - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}${APP_CODE_CONTAINER_FLAG} - ${NGINX_HOST_LOG_PATH}:/var/log/nginx - ${NGINX_SITES_PATH}:/etc/nginx/sites-available - ${NGINX_SSL_PATH}:/etc/nginx/ssl ports: - "${NGINX_HOST_HTTP_PORT}:80" - "${NGINX_HOST_HTTPS_PORT}:443" - "${VARNISH_BACKEND_PORT}:81" depends_on: - php-fpm networks: backend: aliases: - a.service.test - b.service.test - c.service.test frontend: