Hôm nay mình sẽ chia sẻ với mọi người cách Setup Laravel 8 + Docker(mysql, adminer, nginx). Thông thường ta hay cài PHP mà Laravel yêu cầu. Như vậy thì mỗi Project Laravel khác nhau ta phải cài thêm php version khác, đúng là ta phải cài, nhưng như vậy nó quá mệt mỏi khi cài thêm nửa.
Docker sẽ giúp ta xử lý chúng một cách dễ dàng hơn nhiều, Mình nghĩ mọi người cũng biết sơ qua Docker là gì? rồi, nên mình sẽ không nói thêm nhiều nửa, với lại trên mạng search từ khóa thôi cũng rất rất là nhiều rồi, nói thêm nửa cũng làm cho bài viết khá dài và mệt thêm ::)
# Tạo Project Laravel
$ git clone -b 8.x https://github.com/laravel/laravel.git laravel-8.x $ cd laravel-8 $ docker run --rm -v $(pwd):/app composer install
Câu lệnh trên, đầu tiên chúng ta git clone version của laravel về máy tính, sau đó trỏ tới thư mục vừa download về, tiếp tục chạy lệnh composer install , để cài thư viện laravel cho chúng ta, nó sẽ sinh ra thư mục vendor trong project
$ cp .env.example .env
Hãy mờ thư mục project lên và tìm file .env cập nhật lại các thông số sau:
DB_CONNECTION=mysql DB_HOST=db DB_PORT=3306 DB_DATABASE=laravel8x DB_USERNAME=thanhhoa DB_PASSWORD=12345678
Chú ý ở DB_HOST hãy đặt = db
DB_USERNAME , bạn đừng để root nhé, hãy đặt 1 username nào đó, để tí ta gọi nó trong file docker-compose.yml, phía sau ta sẽ tạo file này và gọi chúng
Sau khi có được một project Laravel , tiếp tục ta cần cài một số thư quan trọng như:
+ PHP Version (7.3 - 8.1) : php của chúng ta cần cài phải nằm trong khoảng này nhé
+ Mysql : Cài mysql để quản lý cơ sở dữ liệu
+ Nginx : Cấu hình domain của chúng ta thông qua nginx
+ Adminer : Cấu hình giao diện quản lý cơ sở dữ liệu
Các vấn đề trên chúng ta cần làm việc trong Docker nhé
# Tạo file Dockerfile trong thư mục project
File Dockerfile này chúng ta cấu hình phiên bản cài đặt version PHP phải phù hợp với Laravel đang sử dụng. Đồng thời Dockerfile này sử dụng PHP-FPM Alpine, chúng ta có thể cài đặt các tiện ích mở rộng cần thiết, đặt thư mục làm việc, sao chép các tệp dự án Laravel và đặt lệnh để chạy Laravel.
FROM php:8.1-fpm # Arguments defined in docker-compose.yml ARG user ARG uid # Install system dependencies RUN apt-get update && apt-get install -y \ git \ curl \ libpng-dev \ libonig-dev \ libxml2-dev \ zip \ unzip RUN apt-get update; \ # Imagick extension apt-get install -y libmagickwand-dev; \ pecl install imagick; \ docker-php-ext-install gd; \ docker-php-ext-enable imagick; \ # Success true # Clear cache RUN apt-get clean && rm -rf /var/lib/apt/lists/* # Install PHP extensions RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd # Install Postgre PDO RUN apt-get update && apt-get install -y libpq-dev && docker-php-ext-install pdo pdo_pgsql RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer # Create system user to run Composer and Artisan Commands RUN useradd -G www-data,root -u $uid -d /home/$user $user RUN mkdir -p /home/$user/.composer && \ chown -R $user:$user /home/$user # Setup working directory WORKDIR /var/www/ CMD ["php-fpm"]
# Tạo Docker Composer
Chúng ta tạo một file docker-compose.yml để cấu hình(application, mysql, adminer, nginx), để chạy hệ thống của chúng ta
version: "3.8" services: app: build: args: user: thanhhoa uid: 1000 context: ./ dockerfile: Dockerfile image: skp container_name: skp-app restart: unless-stopped working_dir: /var/www/ volumes: - ./:/var/www networks: - skp db: image: mysql:5.7 container_name: skp-db restart: unless-stopped environment: MYSQL_DATABASE: ${DB_DATABASE} MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} MYSQL_PASSWORD: ${DB_PASSWORD} MYSQL_USER: ${DB_USERNAME} SERVICE_TAGS: dev SERVICE_NAME: mysql volumes: - ./docker-compose/sql:/docker-entrypoint-initdb.d networks: - skp adminer: image: adminer restart: always ports: - 8080:8080 networks: - skp nginx: image: nginx:alpine container_name: skp-nginx restart: unless-stopped ports: - 8000:80 volumes: - ./:/var/www - ./docker-compose/nginx:/etc/nginx/conf.d/ networks: - skp networks: skp: driver: bridge
OKay, các bạn xem file bên trên ta có gọi tới file Dockerfile để chạy cho ứng dụng app laravel của chúng ta. Nó sẽ đọc file Dockerfile và cài đặt php version và các tiện ích cần để chạy được laravel
Bạn sẽ thấy thư mục docker-compose/sql nó là chứa đựng file sql, bạn hãy tạo thư mục docker-compose/sql và copy file database của bạn vào thư mục đó. Chương trình sẽ tự import database
Tiếp tục tại phần nginx, mình có tạo đường dẫn thư mục docker-compose/nginx để cài đặt file cấu hình server.conf trong thư mục đó
server { listen 80; index index.php index.html; error_log /var/log/nginx/error.log; access_log /var/log/nginx/access.log; root /var/www/public; location ~ \.php$ { try_files $uri =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass app:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } location / { try_files $uri $uri/ /index.php?$query_string; gzip_static on; } }
Cấu nhình nginx thì đã xong rồi, mình muốn chia sẻ thêm mọi người là bên trong file docker-compose.yml mình có sử dụng adminer để quản lý database , giúp cho chúng ta dễ dàng thao tác hơn, bạn nào không thích thì bỏ nó ra cũng không sao, hoặc muốn sử dụng nó hay dùng phpmyadmin thay thế nó cũng được nhé, để lần sao mình chia sẻ cách sử dụng phpmyadmin trong docker nhé, nó hơi lu bu xíu
Okay vậy mọi thứ ok rồi, chúng ta thử chạy xem, thành quả nảy giờ chúng ta làm nhé
$ cd laravel-8.x $ docker-compose up --build
Hoặc
$ docker-compose up -d // close $ docker-composer down -v
Sau khi build thành công bạn có thể gõ trên trình duyệt :
http://localhost:8000 -> web laravel
http://localhost:8080 -> vào quản lý adminer
Nếu bạn muốn trỏ vào app laravel sau khi chạy docker xong, bạn chạy câu lệnh sau
$ docker-compose exec app composer install $ docker-compose exec app php artisan key:generate $ docker-compose exec app php artisan migrate
Còn nếu bạn cần xem database trong mysql của bạn thì chạy lệnh bash sao docker exec -it [container name] bash
$ docker exec -it skp-db bash $ mysql -u root -p
Sau đó bạn sữ dựng lệnh mysql bình thường: Chú ý: password là password trong file .env bạn vừa cấu hình bên trên "12345678"
hoặc bạn chạy lệnh : docker-compose exec db bash
Okay trường hợp xấu là sau khi bạn chạy ok hết mà lên website rõ http://localhost:8000 bị lỗi như sau: thì xin chúc mừng bạn đã chạy thành công, còn lỗi phía dưới chỉ là bị quyền giới hạn thôi, không sau
UnexpectedValueException The stream or file "/var/www/storage/logs/laravel.log" could not be opened in append mode: failed to open stream: Permission denied
Các xử lý như sau:
hoacode@DESKTOP-H6JD1PA:~$ cd laravel-8.x/ hoacode@DESKTOP-H6JD1PA:~/laravel-8.x$ docker-compose exec app bash root@f2b00f085346:/var/www# chown -R $USER:www-data storage/ root@f2b00f085346:/var/www# chmod -R 777 storage/
Bây giờ bạn thử quay lại website của mình , xem hết lỗi chưa