12/08/2018, 15:00

Sử dụng docker-compose cho dự án Laravel

Chủ đề mà mình muốn đề cập đến đó build một môi trường cho dự án Laravel một cách nhanh bằng docker-compose. Khỏi cần phải nhắc đến docker là gì nữa nhỉ, vì chỉ cần search key word "docker viblo" là đã ra một list những bài viết về docker rồi, nên mọi người có thể tìm hiểu căn bản trước nhé. Vậy ...

Chủ đề mà mình muốn đề cập đến đó build một môi trường cho dự án Laravel một cách nhanh bằng docker-compose. Khỏi cần phải nhắc đến docker là gì nữa nhỉ, vì chỉ cần search key word "docker viblo" là đã ra một list những bài viết về docker rồi, nên mọi người có thể tìm hiểu căn bản trước nhé. Vậy nên mình sẽ đi sâu vào chủ đề của bài viết.

1. Bước đầu tiên để thực hiện đó là cài đặt docker-compose:

$ curl -L "https://github.com/docker/compose/releases/download/1.11.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

2. Cấp quyền thực thi cho docker-compose

$ chmod +x /usr/local/bin/docker-compose

Để chắc chắn docker-compose đã được cài đặt thành công trên máy chúng ta kiểm tra bằng lệnh: docker-compose -v Kết quả thế này hoặc tương đương nhưng khác version thì xem như đã cài đặt thành công docker-compose docker-compose version 1.9.0, build 2585387 Tới đây xem như việc cài đặt docker-compose đã thành công. Tiếp theo ...

3. Cấu trúc thư mục cho dự án

Bây giờ thứ cần đã có, việc tiếp theo là mình sẽ đi tạo folder để lưu config của docker và source code: Cấu trúc thư mục có dạng như sau:

*  demo 
    * conf.d
        * vhosts.conf
    * src (thư mục lưu source code của mình)
    * Dockerfile
    * docker-compose.yml 
    * readme.md  

Bây giờ mình sẽ đi giải thích nội dung của từng file.

Trong file vhosts.conf sẽ lưu những nội dung config virtualhost trong docker-container mà mình sẽ tạo ra.

DirectoryIndex index.php index.html
<Directory /app/public/>
       Options -Indexes +FollowSymLinks
       AllowOverride All
       Require all granted
   </Directory>
   <VirtualHost *:80>
       ServerName localhost
       DocumentRoot /app/public
       <Directory "/app/public">
           AllowOverride All
           Options -Indexes +FollowSymLinks
           Order allow,deny
           Allow from all
       </Directory>
   </VirtualHost>

Như đã giải thích ở trên thư mục src là thư mục lưu source code, là tất cả những gì mà một dự án laravel cần. Trong file Dockerfile sẽ lưu những config để build lên một image với những thứ mà mình đã config trong này. Ví dụ như PHP, apache2, composer ... Nếu bạn muốn cài thêm bất cứ thứ gì vào image thì cứ thêm vào file này, ví dụ như nodejs, npm, bower chẳng hạn.
Nội dung của Dockerfile

FROM ubuntu:16.04

// Install apache, PHP, and supplimentary programs. openssh-server, curl, 
// and lynx-cur are for debugging the container.
RUN apt-get update && apt-get -y upgrade && apt-get -y install 
 apache2 php libapache2-mod-php php-mcrypt php-mysql curl php-cli php-mbstring git unzip php-xml 
 libcurl4-openssl-dev pkg-config libssl-dev libsslcommon2-dev php-pear php-dev vim

RUN curl -sS https://getcomposer.org/installer -o composer-setup.php
RUN php composer-setup.php --install-dir=/usr/local/bin --filename=composer

// Enable apache mods.
RUN a2enmod rewrite
RUN a2enmod headers

// Manually set up the apache environment variables
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
ENV APACHE_PID_FILE /var/run/apache2.pid

// install nodejs, npm, bower
RUN apt-get -y install nodejs npm git
RUN npm install -g bower
RUN npm install --global gulp-cli
RUN apt-get install -y ruby-full rubygems
RUN gem install sass
RUN ln -s /usr/bin/nodejs /usr/bin/node

RUN mkdir /app
WORKDIR /app

// Expose apache.
EXPOSE 80

// Update the default apache site with the config we created.
ADD conf.d/vhosts.conf /etc/apache2/sites-enabled/000-default.conf

// By default start up apache in the foreground, override with /bin/bash for interative.
CMD systemctl restart apache2
CMD /usr/sbin/apache2ctl -D FOREGROUND

File docker-compose.yml sẽ định nghĩa các container mà chúng ta cần. Hiện tại, chúng ta cần một container Web và một container cho cơ sở dữ liệu. Để hiểu rõ hơn về file này các bạn có thể tham khảo thêm ở đây

version: '2'
services:
  web:
    build: .
    container_name: demo-web
    volumes:
      - ./src:/app
    ports:
      - "90:80"
    links:
      - serverdb
  serverdb:
    image: mysql:5.7
    container_name: demo-serverdb
    volumes:
      - ./data/mysql:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=admin
    ports:
      - 3406:3306

Trong file này có một config đó là links. Config này sẽ tự động liên kết tới container khác trong hệ thống docker. Ví dụ ở đây là container serverdb. Trong file .env của project t chỉ cần khai báo DB_HOST=serverdb là sẽ tự động hiểu được host database ở container serverdb

4. Cấp quyền cho thư mục

Mọi công tác chuẩn bị dường như đã đâu vào đấy, nhưng đừng quên phân quyền cho 2 thư mục src/storage và src/bootstrap/cache sudo chmod 777 -R src/storage src/bootstrap/cache

5. Build docker image từ Dockerfile

Bây giờ chúng ta sẽ build image trong docker bằng lệnh :
docker-compose build

Tới đây thì hãy vui longf ngồi đợi vì lệnh build này sẽ kéo một image Ubuntu:16.04 về và cài đặt mọi thứ mà chúng ta config trong Dockerfile lên nó nên sẽ khá tốn thời gian.

6. Build docker container

Sau khi chạy xong lệnh build thì chạy lệnh docker-compose up Lệnh này dùng để build ra container mà chúng ta cần. Chạy lệnh đểdocker ps để xem nó đang chạy những container nào nhé.

Bây giờ lên trình duyệt try cập vào localhost:90 để xem kết quả. Chúc mọi người thành công

Link tham khảo :

https://viblo.asia/naa/posts/AQrMJbWNM40E https://docs.docker.com/compose/

0