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/