mac环境下使用docker搭建lnmp

     mac有机带的apache和php,但无法满足项目开发所需的环境,而我本人也更倾向于使用nginx服务,brew管理也不是很方便,所以我本地使用了docker,下面分享下我总结的docker搭建lnmp经验。

    docker安装和使用我就不细说了,很简单,不会的可以看下官方文档。我认为通常情况下php版本和mysql版本不同才造成了项目环境的不同,所以我本地的webserver使用brew安装的nginx,这里不细说(直接brew install nginx)。

    在docker中各个服务之间是以容器为单位进行分割的,而容器间的通信依赖于--link指令,所以这里先安装mysql,以便php安装时可以指定连接mysql。

    docker搭建lnmp环境有两种,一种是顺序安装依赖,一种是编写yml文件通过docker-compose运行yml生成集成

    第一种:

    查看docker提供的mysql镜像,不指定mysql版本默认安装最新版本

docker search mysql

     指定mysql版本

docker pull mysql:5.7

    查看docker镜像及容器服务

docker images

##查看服务进程
docker ps

    运行mysql并生成mysql容器

docker run -itdp 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql5.7 mysql:5.7

##-itdp docker指令,具体含义请查看文档,--name指定容器别名为mysql5.7,mysql:5.7镜像名(或镜像id)

##如果是线上安装,可以设置远程访问权限,以便mysql可视化工具连接
docker exec -it mysql5.7 /bin/bash
mysql -uroot -p123456
GRANT ALL ON *.* TO 'root'@'%';
flush privileges;
exit

    php安装 

docker pull php:7.3-fpm

docker run -itdp 9000:9000 -v /usr/local/var/www:/var/www --link mysql5.7:php-fpm7.3-mysql5.7 --name php-fpm7.3 php:7.3-fpm

##-v 指定项目挂载目录,我本地brew安装的nginx web目录为/usr/local/var/www,容器内目录/var/www(自定义)
## 挂载的目的是为了使项目持久化,当关闭容器服务后再次开启服务时,项目会自动挂载到容器内部
##--link 指定连接容器,这里是连接mysql容器,mysql5.7为镜像名,php-fpm7.3-mysql5.7为连接别名
##--name 指定容器别名为php-fpm7.3,镜像源为php:7.3-fpm

docker exec -it php-fpm7.3 /bin/bash
##进入容器
##pecl安装外,docker提供了docker-php-ext-install安装命令(后面会单独总结php扩展的安装)
##更新一下系统源apt-get update,缺少的php扩展可以pecl安装,也可以去Debian搜索要下载的包
##这两种安装都是编译安装,当然你也可以自己下载包,进行编译安装

 nginx我个人建议不要放在容器内部, 因为没必要安装多个nginx,除非你有apache服务。这里就不细说nginx安装,后面会补充nginx的vhost文件。

  第二种:

  编写yml集成文件,通过docker-compose up命令运行集成环境(docker-compseo -f path up -d)path为绝对路径,我个人推荐第二种,下面是我的yml文件,可做参考。

version: '3.6'
networks:
  lnmp:
    external: true

services:
  mysql5.7:
    image: mysql:5.7
    container_name: mysql5.7
    restart: always
    volumes:
      - /var/mysql/data:/var/lib/mysql
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: "your password"
      TZ: "Asia/Shanghai"
    networks:
      - lnmp

  redis5.0:
    image: redis:5.0
    container_name: redis5.0
    restart: always
    volumes:
      - /var/redis/config:/usr/local/etc/redis
      - /var/redis/data:/data #持久化数据
      - /etc/localtime:/etc/localtime:ro # 设置容器时区与宿主机保持一致
    entrypoint: ["redis-server", "/usr/local/etc/redis/redis.conf"]
    ports:
      - 6379:6379
    environment:
      TZ: "Asia/Shanghai"
    networks:
      - lnmp

  php-fpm7.3:
    image: php:7.3-fpm
    container_name: php-fpm7.3
    restart: always
    volumes:
      - /var/www/html:/var/www/html
    ports:
      - 9000:9000
    environment:
      TZ: "Asia/Shanghai"
    depends_on:
      - mysql5.7
      - redis5.0
    links:
      - mysql5.7
      - redis5.0
    networks:
      - lnmp
## 注意docker的内部网络属于局域网,你要创建专有的局域网以防止集成环境过多造成端口占用等问题,不清楚的可以看下docker网络类型介绍
## 这里的专有网络是lnmp,在运行yml之前就需要创建,创建命令docker network create lnmp
## 注意挂载是为了持久化
## redis安装时,去官网下载对应版本的redis.conf(如果你需要修改配置文件),也可以使用默认配置
## 编写的容器启动顺序,php-fpm一定要在最后且使用links指令链接redis和mysql服务

下面就是nginx配置文件了

server {
        listen       80;
        server_name www.test.com;

        root /usr/local/var/www/html;#注意1

        charset utf-8;

        #access_log  logs/host.access.log  main;
	    location ~ \.php$ {
	        root /var/www/html;#注意2
            fastcgi_pass   127.0.0.1:9000;#注意3
            fastcgi_index  index.php;
	        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

        location / {
            index  index.html index.htm index.php;
	        try_files $uri $uri/ /index.php?$query_string;
        }
}

注意:

1.这里的路径是为了nginx服务从本地目录中找到项目路径

2.这里的目录是为了容器内的php服务找到项目路径,二者并不冲突但必须都写,这是很容易忽视的一个点

3.如果nginx服务不在宿主机而在服务容器,此时的ip地址应该是容器局域网ip,我这里是宿主机,所以是127.0.0.1

TinkPHP项目和Laravel项目有时候需要路由重写,请参照各自的文档 进行修改

 

参考文献:

docker官方api文档

docker-从入门到实践

 

 

 

 

            

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值