Dockerize lnmp for laravel

目的

    用docker-compose.yml文件配置lnmp本地环境从而让app运行在docker容器里


事先准备

  1. 安装Docker
  2. 安装Laravel

开始

Step 1

  • 在workspace内运行 $ laravel new docker-laravel 会自动生成一个名为 docker-laravel的项目
  • 在项目根目录创建docker-compose.yml文件    

Step 2

创建Nginx容器

在docker-compose.yml文件里面写入 

version: '3'

services:
  webserver:
    container_name: webserver
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./:/var/www/html

 注释:

  • container_name - 容器名字,任意命名但是必须唯一
  • image: nginx:last - Nginx官方镜像,标签为last
  • ports: - "8080:80" - 映射本地端口8080到容器端口80,所以我们可以在浏览器输入localhost:8080 就可以读取webserver容器的端口80。本地端口可以自定义,只要没有被占用。
  • volumes: - ./:/var/www/html - 把当前文件夹(./)里面的所有内容架置在容器 /var/www/html文件夹

在根目录(docker-laravel)运行 $ docker-compose up -d 创建容器

当容器创建完毕以后,运行 $ docker ps 你会看到正在运行的容器, 类似于


现在打开浏览器 输入localhost:8080,如果你看见Nginx官方默认页面,你就成功踏出了第一步


创建application容器

在docker-compose.yml文件里继续添加

application:
    container_name: application
    build: ./images/application
    ports:
      - "9500:9000"
    volumes:
      - ./:/var/www/html

注释:

build: ./images/application - 根据images/application内的Dockerfile文件,创建自己的image

ports: - "9500:9000" - 映射本地端口9500到容器端口9000。本地端口可以自定义,只要没有被占用。

volumes: - ./:/var/www/htm - 映射本地文件夹到容易文件夹,这样我们本地修改的任何代码都会直接反应在docker容器内,几乎无延迟


在 images/application 文件夹内创建 Dockerfile文件

Dockerfile

FROM php:7.1.12-fpm

RUN apt-get update && apt-get install -y libmcrypt-dev mysql-client \
    && docker-php-ext-install mcrypt pdo_mysql

注释:

从docker hub拉去php:7.1.12-fpm镜像并以此为基础安装了一些laravel需要的一些基础插件,然后创建名为application的容器

php版本可以根据自己需求切换,只需要重新运行 composer-up -d


连接webserver容器和application容器

现在我们要让webserver容器能够指向application容器,我们需要在docker-compose.yml做一些修改

services:
  webserver:
    container_name: webserver
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./:/var/www/html
      - ./images/nginx/vhost.conf:/etc/nginx/conf.d/default.conf
    working_dir: /var/www/html
    links:
      - application

注释:

volumes: - ./images/nginx/vhost.conf:/etc/nginx/conf.d/default.conf - 映射本地./images/nginx/vhost.conf文件 到 webserver容器的./etc/nginx/conf.d/default.conf文件

- links: - application - 让webserver容器能够看得见application容器

在images/nginx文件夹内创建vhost.conf文件

vhost.conf:

server {
    listen 80;
    index index.php index.html;
    root /var/www/html/public;

    location / {
        try_files $uri /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass application:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

在nginx基础设置里面 我们需要注意几点

  • root /var/www/html/public; - root /var/www/html/public - var/www/html是本地docker-laravel项目的映射,public文件夹正是laravel框架内index.php的位置
  • fastcgi_pass application:9000; - 这里必须写上我们application的容器名以及容器端口(application: 9000)

创建数据库

docker-compose.yml文件内继续加入

database:
    container_name: database
    image: mysql:5.7
    ports:
      - "3306:3306"
    volumes:
      - ./dbdata:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=docker-database
  redis:
    container_name: redis
    image: redis:latest
    ports:
      - "6500:6379"

注释:

  • 增加了mysql容器和redis容器,容器名分别为database和redis
  • volumes - ./dbdata:/var/lib/mysql - 映射本地文件夹dbdata到mysql容器内 var/lib/mysql文件夹。我们不需要创建dbdata文件夹,当容器生成的时候,docker会自动创建dbdata文件夹并且把mysql容器内的数据备份到此文件夹。这样做的好处就是如果我们的容器不小心被删除掉了,docker数据库里面的数据会依然保存在我们本地电脑。当重新创建数据库容器的时候,所有的数据不会丢失。
  • 数据库映射本地端口3306到容器端口3360,所以我们可以用数据库UI软件(例如Sequel,Induction)通过本地端口3306访问docker容器内数据
  • environment: - MYSQL_ROOT_PASSWORD=root -MYSQL_DATABASE=docker-database - 设置密码为root,database那么为docker-database

如果通过数据库管理软件访问数据库,设置信息类似于


连接数据库:

只需要在application service里加入 

links
 -application
 -redis

最后

运行 docker-copose up -d 然后去浏览器


最后的最后

如果要运行artisan data migration,有两种办法

第一种在docker上直接运行

docker-compose exec application php artisan migrate

第二中办法是设置application的environment

application:
    container_name: application
    build: ./images/application
    ports:
      - "9500:9000"
    volumes:
      - ./:/var/www/html
    working_dir: /var/www/html
    links:
      - database
    environment:
      - DB_PORT=3306
      - DB_HOST=database

环境设置好了以后 就可以直接在本地laravel项目直接运行

php artisan migrate

整个docker-compose.yml文件:

version: '3'

services:
  webserver:
    container_name: webserver
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./:/var/www/html
      - ./images/nginx/vhost.conf:/etc/nginx/conf.d/default.conf
    working_dir: /var/www/html
    links:
      - application

  application:
    container_name: application
    build: ./images/application
    ports:
      - "9500:9000"
    volumes:
      - ./:/var/www/html
    working_dir: /var/www/html
    links:
      - database
    environment:
      - DB_PORT=3306
      - DB_HOST=database

  database:
    container_name: database
    image: mysql:5.7
    ports:
      - "3306:3306"
    volumes:
      - ./dbdata:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=docker-database
  redis:
    container_name: redis
    image: redis:latest
    ports:
      - "6500:6379"


$ docker ps


github 传送门


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页