Cách thiết lập Laravel, Nginx và MySQL với Docker Compose
Trong vài năm qua, Docker đã trở thành một giải pháp được sử dụng thường xuyên để triển khai các ứng dụng nhờ vào cách nó đơn giản hóa việc chạy và triển khai các ứng dụng trong các vùng chứa tạm thời. Ví dụ: khi sử dụng ứng dụng LEMP với PHP , Nginx , MySQL và khung Laravel , Docker có thể hợp lý hóa đáng kể quá trình cài đặt . Docker Compose đã đơn giản hóa hơn nữa quy trình phát triển bằng cách cho phép các nhà phát triển xác định cơ sở hạ tầng của họ, bao gồm các dịch vụ ứng dụng, mạng và dung lượng , trong một file duy nhất. Docker Compose cung cấp một giải pháp thay thế hiệu quả để chạy nhiều lệnh docker container create
docker container run
và docker container run
lệnh docker container run
.
Trong hướng dẫn này, bạn sẽ xây dựng một ứng dụng web bằng cách sử dụng khung công tác Laravel, với Nginx làm web server và MySQL làm database , tất cả đều nằm trong containers Docker. Bạn sẽ xác định toàn bộ cấu hình trong một file do docker-compose
, cùng với các file cấu hình cho PHP, MySQL và Nginx.
Yêu cầu
Trước khi bắt đầu, bạn cần :
- Một server Ubuntu 18.04 và một user không phải root có quyền
sudo
. Làm theo hướng dẫn Cài đặt server ban đầu với Ubuntu 18.04 để cài đặt điều này. - Docker đã được cài đặt, làm theo Bước 1 và 2 của Cách cài đặt và sử dụng Docker trên Ubuntu 18.04 .
- Docker Compose đã được cài đặt, làm theo Bước 1 của Cách cài đặt Docker Compose trên Ubuntu 18.04 .
Bước 1 - Download Laravel và cài đặt các phụ thuộc
Bước đầu tiên, ta sẽ tải version mới nhất của Laravel và cài đặt các phần phụ thuộc cho dự án, bao gồm Composer , trình quản lý gói cấp ứng dụng cho PHP. Ta sẽ cài đặt các phần phụ thuộc này với Docker để tránh phải cài đặt Composer trên phạm vi global .
Trước tiên, hãy kiểm tra xem bạn có đang ở trong folder chính của bạn không và sao chép bản phát hành Laravel mới nhất vào một folder có tên laravel-app
:
- cd ~
- git clone https://github.com/laravel/laravel.git laravel-app
Di chuyển vào folder laravel-app
:
- cd ~/laravel-app
Tiếp theo, sử dụng hình ảnh trình composer
của Docker để mount các folder mà bạn cần cho dự án Laravel của bạn và tránh chi phí cài đặt Composer trên phạm vi global :
- docker run --rm -v $(pwd):/app composer install
Sử dụng cờ -v
và --rm
với --rm
docker run
sẽ tạo ra một containers tạm thời sẽ được mount vào folder hiện tại của bạn trước khi bị xóa. Thao tác này sẽ sao chép nội dung của folder ~/ laravel-app
vào containers và cũng đảm bảo folder của vendor
Composer tạo bên trong containers được sao chép vào folder hiện tại của bạn.
Bước cuối cùng, hãy đặt quyền trên folder dự án để nó thuộc sở hữu của user không phải root của bạn:
- sudo chown -R $USER:$USER ~/laravel-app
Điều này sẽ quan trọng khi bạn viết Dockerfile cho hình ảnh ứng dụng của bạn ở Bước 4, vì nó sẽ cho phép bạn làm việc với mã ứng dụng và chạy các quy trình trong containers của bạn với quyền là user không phải root .
Với mã ứng dụng của bạn tại chỗ, bạn có thể chuyển sang xác định các dịch vụ của bạn với Docker Compose.
Bước 2 - Tạo file docker composer
Việc xây dựng các ứng dụng của bạn với Docker Compose giúp đơn giản hóa quá trình cài đặt và tạo version cho cơ sở hạ tầng của bạn. Để cài đặt ứng dụng Laravel của ta , ta sẽ viết một file docker docker-compose
xác định web server , database và các dịch vụ ứng dụng của ta .
Mở tập tin:
- nano ~/laravel-app/docker-compose.yml
Trong file docker-compose
, bạn sẽ xác định ba dịch vụ: app
, webserver
và db
. Thêm mã sau vào file , đảm bảo thay thế password gốc cho MYSQL_ROOT_PASSWORD
, được xác định là một biến môi trường trong dịch vụ db
, với password mạnh do bạn chọn:
version: '3' services: #PHP Service app: build: context: . dockerfile: Dockerfile image: digitalocean.com/php container_name: app restart: unless-stopped tty: true environment: SERVICE_NAME: app SERVICE_TAGS: dev working_dir: /var/www networks: - app-network #Nginx Service webserver: image: nginx:alpine container_name: webserver restart: unless-stopped tty: true ports: - "80:80" - "443:443" networks: - app-network #MySQL Service db: image: mysql:5.7.22 container_name: db restart: unless-stopped tty: true ports: - "3306:3306" environment: MYSQL_DATABASE: laravel MYSQL_ROOT_PASSWORD: your_mysql_root_password SERVICE_TAGS: dev SERVICE_NAME: mysql networks: - app-network #Docker Networks networks: app-network: driver: bridge
Các dịch vụ được định nghĩa ở đây bao gồm:
-
app
: Định nghĩa dịch vụ này chứa ứng dụng Laravel và chạy Docker image tùy chỉnh,digitalocean.com/php
, mà bạn sẽ xác định trong Bước 4. Nó cũng đặtworking_dir
trong containers thành/var/www
. -
webserver
: Định nghĩa dịch vụ này kéo hình ảnhnginx:alpine
từ Docker và hiển thị các cổng80
và443
. -
db
: Định nghĩa dịch vụ này lấy hình ảnhmysql:5.7.22
từ Docker và xác định một vài biến môi trường, bao gồm database có tênlaravel
cho ứng dụng của bạn và password gốc cho database . Bạn có thể tự do đặt tên cho database bất cứ điều gì bạn muốn và bạn nên thay thếyour_mysql_root_password
bằng password mạnh của bạn . Định nghĩa dịch vụ này cũng ánh xạ cổng3306
trên server tới cổng3306
trên container.
Mỗi thuộc tính container_name
xác định một tên cho containers , tương ứng với tên của dịch vụ. Nếu bạn không xác định thuộc tính này, Docker sẽ chỉ định tên cho mỗi containers bằng cách kết hợp tên của một người nổi tiếng trong lịch sử và một từ ngẫu nhiên được phân tách bằng dấu gạch dưới.
Để tạo điều kiện giao tiếp giữa các containers , các dịch vụ được kết nối với một mạng cầu nối được gọi là mạng app-network
. Mạng cầu nối sử dụng một cầu nối phần mềm cho phép các container được kết nối với cùng một mạng cầu nối giao tiếp với nhau. Trình điều khiển cầu nối tự động cài đặt các luật trong server để các container trên các mạng cầu nối khác nhau không thể giao tiếp trực tiếp với nhau. Điều này tạo ra mức độ bảo mật cao hơn cho các ứng dụng, đảm bảo chỉ các dịch vụ liên quan mới có thể giao tiếp với nhau. Điều đó cũng nghĩa là bạn có thể xác định nhiều mạng và dịch vụ kết nối với các chức năng liên quan: ví dụ, các dịch vụ ứng dụng front-end có thể sử dụng mạng frontend
và các dịch vụ back-end có thể sử dụng mạng backend
.
Hãy xem cách thêm dung lượng và liên kết mount vào định nghĩa dịch vụ của bạn để duy trì dữ liệu ứng dụng của bạn.
Bước 3 - Dữ liệu tồn tại
Docker có các tính năng mạnh mẽ và tiện lợi để lưu trữ dữ liệu. Trong ứng dụng của ta , ta sẽ sử dụng dung lượng và các liên kết mount để duy trì database cũng như các file ứng dụng và cấu hình. Dung lượng cung cấp tính linh hoạt cho các bản backup và sự bền bỉ ngoài vòng đời của containers , trong khi các liên kết mount tạo điều kiện thay đổi mã trong quá trình phát triển, áp dụng các thay đổi đối với file server hoặc folder của bạn ngay lập tức có sẵn trong containers của bạn. Cài đặt của ta sẽ sử dụng cả hai.
Cảnh báo: Bằng cách sử dụng liên kết mount , bạn có thể thay đổi hệ thống file server lưu trữ thông qua các quy trình chạy trong containers , bao gồm tạo, sửa đổi hoặc xóa các file hoặc folder hệ thống quan trọng. Đây là một khả năng mạnh mẽ với các tác động bảo mật và có thể ảnh hưởng đến các quy trình không phải Docker trên hệ thống server . Sử dụng mount ràng buộc cẩn thận.
Trong file docker-compose
, xác định một ổ đĩa được gọi là dbdata
theo định nghĩa dịch vụ db
để duy trì database MySQL:
... #MySQL Service db: ... volumes: - dbdata:/var/lib/mysql networks: - app-network ...
dbdata
được đặt tên vẫn tồn tại nội dung của folder /var/lib/mysql
có bên trong containers . Điều này cho phép bạn dừng và khởi động lại dịch vụ db
mà không làm mất dữ liệu.
Ở cuối file , thêm định nghĩa cho ổ đĩa dbdata
:
... #Volumes volumes: dbdata: driver: local
Với định nghĩa này, bạn có thể sử dụng dung lượng này trên các dịch vụ.
Tiếp theo, thêm một liên kết mount vào dịch vụ db
cho các file cấu hình MySQL mà bạn sẽ tạo trong Bước 7:
... #MySQL Service db: ... volumes: - dbdata:/var/lib/mysql - ./mysql/my.cnf:/etc/mysql/my.cnf ...
Mount liên kết này liên kết ~/laravel-app/mysql/my.cnf
với /etc/mysql/my.cnf
trong containers .
Tiếp theo, thêm các liên kết ràng buộc vào dịch vụ webserver
. Sẽ có hai: một cho mã ứng dụng của bạn và một cho định nghĩa cấu hình Nginx mà bạn sẽ tạo trong Bước 6:
#Nginx Service webserver: ... volumes: - ./:/var/www - ./nginx/conf.d/:/etc/nginx/conf.d/ networks: - app-network
~/laravel-app
kết liên kết đầu tiên liên kết mã ứng dụng trong folder ~/laravel-app
folder /var/www
bên trong containers . Tệp cấu hình mà bạn sẽ thêm vào ~/laravel-app/nginx/conf.d/
cũng sẽ được gắn vào /etc/nginx/conf.d/
trong containers , cho phép bạn thêm hoặc sửa đổi nội dung của folder cấu hình nếu cần .
Cuối cùng, thêm các liên kết ràng buộc sau vào dịch vụ app
cho mã ứng dụng và file cấu hình:
#PHP Service app: ... volumes: - ./:/var/www - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini networks: - app-network
Dịch vụ app
đang ràng buộc-mount folder ~/laravel-app
, chứa mã ứng dụng, vào folder /var/www
trong containers . Điều này sẽ đẩy nhanh quá trình phát triển, vì bất kỳ thay đổi nào được thực hiện đối với folder ứng dụng local của bạn sẽ được phản ánh ngay lập tức bên trong containers . Bạn cũng đang liên kết file cấu hình PHP của bạn , ~/laravel-app/php/local.ini
, với /usr/local/etc/php/conf.d/local.ini
bên trong containers . Bạn sẽ tạo file cấu hình PHP local trong Bước 5.
Tệp docker-compose
của bạn bây giờ sẽ trông giống như sau:
version: '3' services: #PHP Service app: build: context: . dockerfile: Dockerfile image: digitalocean.com/php container_name: app restart: unless-stopped tty: true environment: SERVICE_NAME: app SERVICE_TAGS: dev working_dir: /var/www volumes: - ./:/var/www - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini networks: - app-network #Nginx Service webserver: image: nginx:alpine container_name: webserver restart: unless-stopped tty: true ports: - "80:80" - "443:443" volumes: - ./:/var/www - ./nginx/conf.d/:/etc/nginx/conf.d/ networks: - app-network #MySQL Service db: image: mysql:5.7.22 container_name: db restart: unless-stopped tty: true ports: - "3306:3306" environment: MYSQL_DATABASE: laravel MYSQL_ROOT_PASSWORD: your_mysql_root_password SERVICE_TAGS: dev SERVICE_NAME: mysql volumes: - dbdata:/var/lib/mysql/ - ./mysql/my.cnf:/etc/mysql/my.cnf networks: - app-network #Docker Networks networks: app-network: driver: bridge #Volumes volumes: dbdata: driver: local
Lưu file và thoát khỏi editor khi bạn thực hiện xong các thay đổi.
Với file docker-compose
của bạn được viết, bây giờ bạn có thể tạo hình ảnh tùy chỉnh cho ứng dụng của bạn .
Bước 4 - Tạo Dockerfile
Docker cho phép bạn chỉ định môi trường bên trong các containers riêng lẻ bằng Dockerfile . Dockerfile cho phép bạn tạo hình ảnh tùy chỉnh mà bạn có thể sử dụng để cài đặt phần mềm theo yêu cầu của ứng dụng và cấu hình cài đặt dựa trên yêu cầu của bạn. Bạn có thể đẩy các hình ảnh tùy chỉnh mà bạn tạo vào Docker Hub hoặc bất kỳ cơ quan đăng ký riêng tư nào.
Dockerfile
của ta sẽ nằm trong folder ~/laravel-app
của ta . Tạo file :
- nano ~/laravel-app/Dockerfile
Dockerfile
này sẽ cài đặt hình ảnh cơ sở và chỉ định các lệnh và hướng dẫn cần thiết để xây dựng hình ảnh ứng dụng Laravel. Thêm mã sau vào file :
FROM php:7.2-fpm # Copy composer.lock and composer.json COPY composer.lock composer.json /var/www/ # Set working directory WORKDIR /var/www # Install dependencies RUN apt-get update && apt-get install -y \ build-essential \ libpng-dev \ libjpeg62-turbo-dev \ libfreetype6-dev \ locales \ zip \ jpegoptim optipng pngquant gifsicle \ vim \ unzip \ git \ curl # Clear cache RUN apt-get clean && rm -rf /var/lib/apt/lists/* # Install extensions RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl RUN docker-php-ext-configure gd --with-gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/ RUN docker-php-ext-install gd # Install composer RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer # Add user for laravel application RUN groupadd -g 1000 www RUN useradd -u 1000 -ms /bin/bash -g www www # Copy existing application directory contents COPY . /var/www # Copy existing application directory permissions COPY --chown=www:www . /var/www # Change current user to www USER www # Expose port 9000 and start php-fpm server EXPOSE 9000 CMD ["php-fpm"]
Đầu tiên, Dockerfile tạo một hình ảnh phía trên Docker image php:7.2-fpm
. Đây là hình ảnh dựa trên Debian đã cài đặt PHP-FPM triển khai PHP FastCGI. Tệp cũng cài đặt các gói yêu cầu cho Laravel: mcrypt
, pdo_mysql
, mbstring
, và imagick
với composer
.
Lệnh RUN
chỉ định các lệnh để cập nhật, cài đặt và cấu hình cài đặt bên trong containers , bao gồm cả việc tạo user và group chuyên dụng có tên www . Lệnh WORKDIR
chỉ định folder /var/www
là folder làm việc cho ứng dụng.
Việc tạo một user và group chuyên dụng với các quyền hạn chế sẽ giảm thiểu lỗ hổng vốn có khi chạy các containers Docker, được chạy theo mặc định dưới quyền root . Thay vì chạy containers này dưới dạng root , ta đã tạo user www , người có quyền truy cập đọc / ghi vào folder /var/www
nhờ vào hướng dẫn COPY
mà ta đang sử dụng với cờ --chown
để sao chép quyền của folder ứng dụng .
Cuối cùng, lệnh EXPOSE
hiển thị một cổng trong containers , 9000
, cho server php-fpm
. CMD
chỉ định lệnh sẽ chạy khi containers được tạo. Ở đây, CMD
chỉ định "php-fpm"
, sẽ khởi động server .
Lưu file và thoát khỏi editor khi bạn thực hiện xong các thay đổi.
Đến đây bạn có thể chuyển sang định nghĩa cấu hình PHP của bạn .
Bước 5 - Cấu hình PHP
Đến đây bạn đã xác định cơ sở hạ tầng của bạn trong file docker-compose
, bạn có thể cấu hình dịch vụ PHP để hoạt động như một PHP processor cho các yêu cầu đến từ Nginx.
Để cấu hình PHP, bạn sẽ tạo file local.ini
bên trong folder php
. Đây là file mà bạn đã mount vào /usr/local/etc/php/conf.d/local.ini
bên trong containers ở Bước 2. Tạo file này sẽ cho phép bạn overrides file php.ini
mặc định mà PHP đọc Khi nó bắt đầu.
Tạo folder php
:
- mkdir ~/laravel-app/php
Tiếp theo, mở file local.ini
:
- nano ~/laravel-app/php/local.ini
Để trình bày cách cấu hình PHP, ta sẽ thêm đoạn mã sau để đặt giới hạn kích thước cho các file đã tải lên:
upload_max_filesize=40M post_max_size=40M
Các chỉ thị upload_max_filesize
và post_max_size
đặt kích thước tối đa được phép cho các file đã tải lên và trình bày cách bạn có thể đặt cấu hình php.ini
từ file local.ini
của bạn . Bạn có thể đặt bất kỳ cấu hình dành riêng cho PHP nào mà bạn muốn overrides vào file local.ini
.
Lưu file và thoát khỏi editor .
Với file local.ini
PHP của bạn tại chỗ, bạn có thể chuyển sang cấu hình Nginx.
Bước 6 - Cấu hình Nginx
Với dịch vụ PHP được cấu hình , bạn có thể sửa đổi dịch vụ Nginx để sử dụng PHP-FPM làm server FastCGI để cung cấp nội dung động. Server FastCGI dựa trên giao thức binary để kết nối các chương trình tương tác với web server . Để biết thêm thông tin, vui lòng tham khảo bài viết này về Hiểu và Triển khai FastCGI Proxying trong Nginx .
Để cấu hình Nginx, bạn sẽ tạo một file app.conf
với cấu hình dịch vụ trong folder ~/laravel-app/nginx/conf.d/
.
Đầu tiên, tạo folder nginx/conf.d/
:
- mkdir -p ~/laravel-app/nginx/conf.d
Tiếp theo, tạo file cấu hình app.conf
:
- nano ~/laravel-app/nginx/conf.d/app.conf
Thêm mã sau vào file để chỉ cấu hình Nginx của bạn:
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; } }
Khối server xác cấu hình cho web server Nginx với các lệnh sau:
-
listen
: Chỉ thị này xác định cổng mà server sẽ lắng nghe các yêu cầu đến. -
error_log
vàaccess_log
: Các lệnh này xác định các file để ghi log . -
root
: Chỉ thị này đặt đường dẫn folder root , tạo thành đường dẫn hoàn chỉnh đến các file nào được yêu cầu trên hệ thống file local .
Trong khối vị trí php
, chỉ thị fastcgi_pass
chỉ định rằng dịch vụ app
đang lắng nghe trên socket TCP trên cổng 9000
. Điều này làm cho server PHP-FPM lắng nghe qua mạng thay vì trên socket Unix. Mặc dù socket Unix có một chút lợi thế về tốc độ so với socket TCP, nhưng nó không có giao thức mạng và do đó bỏ qua mạng . Đối với trường hợp các server được đặt trên một máy, socket Unix có thể có ý nghĩa, nhưng trong trường hợp bạn có các dịch vụ đang chạy trên các server khác nhau, socket TCP mang lại lợi thế cho phép bạn kết nối với các dịch vụ phân tán. Bởi vì containers app
của ta đang chạy trên một server lưu trữ khác với containers webserver
của ta , nên socket TCP có ý nghĩa nhất đối với cấu hình của ta .
Lưu file và thoát khỏi editor khi bạn thực hiện xong các thay đổi.
Nhờ mount liên kết mà bạn đã tạo ở Bước 2, bất kỳ thay đổi nào bạn thực hiện bên trong folder nginx/conf.d/
sẽ được phản ánh trực tiếp bên trong containers webserver
.
Tiếp theo, hãy xem cài đặt MySQL của ta .
Bước 7 - Cấu hình MySQL
Với PHP và Nginx được cấu hình, bạn có thể cho phép MySQL hoạt động như một database cho ứng dụng của bạn.
Để cấu hình MySQL, bạn sẽ tạo file my.cnf
trong folder mysql
. Đây là file mà bạn đã mount vào /etc/mysql/my.cnf
bên trong containers ở Bước 2. Mount liên kết này cho phép bạn overrides cài đặt my.cnf
khi cần thiết.
Để chứng minh cách hoạt động của điều này, ta sẽ thêm cài đặt vào file my.cnf
để kích hoạt log truy vấn chung và chỉ định file log .
Đầu tiên, tạo folder mysql
:
- mkdir ~/laravel-app/mysql
Tiếp theo, tạo file my.cnf
:
- nano ~/laravel-app/mysql/my.cnf
Trong file , hãy thêm mã sau để bật log truy vấn và đặt vị trí file log :
[mysqld] general_log = 1 general_log_file = /var/lib/mysql/general.log
Tệp my.cnf
này kích hoạt các bản ghi, xác định cài đặt general_log
là 1
để cho phép các bản ghi chung. Cài đặt general_log_file
chỉ định nơi các bản ghi sẽ được lưu trữ.
Lưu file và thoát khỏi editor .
Bước tiếp theo của ta sẽ là bắt đầu các container.
Bước 8 - Sửa đổi cài đặt môi trường và chạy các containers
Đến đây bạn đã xác định tất cả các dịch vụ của bạn trong file docker-compose
và tạo file cấu hình cho các dịch vụ này, bạn có thể bắt đầu các containers . Là một bước cuối cùng, tuy nhiên, ta sẽ tạo một bản sao của .env.example
file đó Laravel bao gồm theo mặc định và đặt tên cho bản sao .env
, đó là file Laravel hy vọng sẽ xác định môi trường của nó:
- cp .env.example .env
Đến đây bạn có thể sửa đổi file .env
trên containers app
để bao gồm các chi tiết cụ thể về cài đặt của bạn.
Mở file bằng nano
hoặc editor mà bạn chọn:
- nano .env
Tìm khối chỉ định DB_CONNECTION
và cập nhật nó để phản ánh các chi tiết cụ thể về cài đặt của bạn. Bạn sẽ sửa đổi các trường sau:
-
DB_HOST
sẽ là containers databasedb
của bạn. -
DB_DATABASE
sẽ là databaselaravel
. -
DB_USERNAME
sẽ là tên user bạn sẽ sử dụng cho database của bạn . Trong trường hợp này, ta sẽ sử dụnglaraveluser
. -
DB_PASSWORD
sẽ là password an toàn mà bạn muốn sử dụng cho account user này.
DB_CONNECTION=mysql DB_HOST=db DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=laraveluser DB_PASSWORD=your_laravel_db_password
Lưu các thay đổi và thoát khỏi editor .
Với tất cả các dịch vụ của bạn được xác định trong file docker-compose
, bạn chỉ cần đưa ra một lệnh duy nhất để khởi động tất cả các containers , tạo các ổ đĩa, cài đặt và kết nối các mạng:
- docker-compose up -d
Khi bạn chạy docker-compose up
lần đầu tiên, nó sẽ download tất cả các Docker image cần thiết, có thể mất một lúc. Khi hình ảnh được download và lưu trữ trong máy local của bạn, Soạn sẽ tạo containers của bạn. Cờ -d
daemonized quá trình, chạy các containers của bạn trong nền.
Khi hoàn tất , hãy sử dụng lệnh sau để liệt kê tất cả các containers đang chạy:
- docker ps
Bạn sẽ thấy kết quả sau với các chi tiết về app
, webserver
và containers db
:
OutputCONTAINER ID NAMES IMAGE STATUS PORTS c31b7b3251e0 db mysql:5.7.22 Up 2 seconds 0.0.0.0:3306->3306/tcp ed5a69704580 app digitalocean.com/php Up 2 seconds 9000/tcp 5ce4ee31d7c0 webserver nginx:alpine Up 2 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp
CONTAINER ID
trong kết quả này là số nhận dạng duy nhất cho mỗi containers , trong khi NAMES
liệt kê tên dịch vụ được liên kết với mỗi containers . Bạn có thể sử dụng cả hai số nhận dạng này để truy cập các containers . IMAGE
xác định tên hình ảnh cho mỗi containers , trong khi STATUS
cung cấp thông tin về trạng thái của containers : cho dù nó đang chạy, khởi động lại hay đã dừng.
Bây giờ ta sẽ sử dụng docker-compose exec
để cài đặt các phím ứng dụng cho các ứng dụng Laravel. Lệnh thực thi docker-compose exec
cho phép bạn chạy các lệnh cụ thể trong containers .
Lệnh sau sẽ tạo một khóa và sao chép nó vào file .env
của bạn, đảm bảo các phiên user và dữ liệu được mã hóa của bạn vẫn an toàn:
- docker-compose exec app php artisan key:generate
Đến đây bạn có cài đặt môi trường cần thiết để chạy ứng dụng của bạn . Để lưu vào bộ nhớ cache các cài đặt này vào một file , điều này sẽ tăng tốc độ tải ứng dụng của bạn, hãy chạy:
- docker-compose exec app php artisan config:cache
Cài đặt cấu hình của bạn sẽ được tải vào /var/www/bootstrap/cache/config.php
trên containers .
Bước cuối cùng, hãy truy cập http:// your_server_ip
trong trình duyệt. Bạn sẽ thấy trang chủ sau cho ứng dụng Laravel của bạn :
Với các containers của bạn đang chạy và thông tin cấu hình của bạn có , bạn có thể chuyển sang cấu hình thông tin user của bạn cho database laravel
trên containers db
.
Bước 9 - Tạo user cho MySQL
Cài đặt MySQL mặc định chỉ tạo account quản trị gốc , có các quyền không giới hạn trên server database . Nói chung, tốt hơn hết là bạn nên tránh sử dụng account quản trị gốc khi tương tác với database . Thay vào đó, hãy tạo một user database chuyên dụng cho database Laravel của ứng dụng của ta .
Để tạo user mới, hãy thực thi một bash shell tương tác trên containers db
bằng docker-compose exec
:
- docker-compose exec db bash
Bên trong containers , đăng nhập vào account quản trị gốc MySQL:
- mysql -u root -p
Bạn sẽ được yêu cầu nhập password mà bạn đã đặt cho account gốc MySQL trong khi cài đặt trong file docker-compose
của bạn.
Bắt đầu bằng cách kiểm tra database có tên laravel
, bạn đã xác định database này trong laravel
docker-compose
. Chạy lệnh show databases
để kiểm tra các database hiện có:
- show databases;
Bạn sẽ thấy database laravel
được liệt kê trong kết quả :
Output+--------------------+ | Database | +--------------------+ | information_schema | | laravel | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec)
Tiếp theo, tạo account user sẽ được phép truy cập database này. Tên user của ta sẽ là laraveluser
, mặc dù bạn có thể thay thế tên này bằng tên khác nếu muốn. Chỉ cần đảm bảo tên user và password của bạn ở đây trùng với các chi tiết bạn đã đặt trong file .env
của bạn ở bước trước:
- GRANT ALL ON laravel.* TO 'laraveluser'@'%' IDENTIFIED BY 'your_laravel_db_password';
Xóa các quyền để thông báo cho server MySQL về những thay đổi:
- FLUSH PRIVILEGES;
Thoát MySQL:
- EXIT;
Cuối cùng, thoát khỏi containers :
- exit
Bạn đã cấu hình account user cho database ứng dụng Laravel của bạn và sẵn sàng di chuyển dữ liệu và làm việc với console Tinker.
Bước 10 - Di chuyển dữ liệu và làm việc với console Tinker
Khi ứng dụng của bạn đang chạy, bạn có thể di chuyển dữ liệu của bạn và thử nghiệm với lệnh tinker
, lệnh này sẽ khởi chạy console PsySH với Laravel được tải sẵn. PsySH là một console dành cho nhà phát triển thời gian chạy và trình gỡ lỗi tương tác cho PHP và Tinker là một REPL dành riêng cho Laravel. Sử dụng lệnh tinker
sẽ cho phép bạn tương tác với ứng dụng Laravel của bạn từ dòng lệnh trong một shell tương tác.
Đầu tiên, hãy kiểm tra kết nối với MySQL bằng cách chạy lệnh artisan migrate
Laravel, lệnh này tạo bảng migrations
trong database từ bên trong containers :
- docker-compose exec app php artisan migrate
Lệnh này sẽ di chuyển các bảng Laravel mặc định. Kết quả xác nhận việc di chuyển sẽ trông giống như sau:
Output Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table
Khi quá trình di chuyển hoàn tất, bạn có thể chạy một truy vấn để kiểm tra xem bạn có được kết nối đúng cách với database hay không bằng cách sử dụng lệnh tinker
:
- docker-compose exec app php artisan tinker
Kiểm tra kết nối MySQL bằng cách lấy dữ liệu bạn vừa di chuyển:
- \DB::table('migrations')->get();
Bạn sẽ thấy kết quả giống như sau:
Output=> Illuminate\Support\Collection {#2856 all: [ {#2862 +"id": 1, +"migration": "2014_10_12_000000_create_users_table", +"batch": 1, }, {#2865 +"id": 2, +"migration": "2014_10_12_100000_create_password_resets_table", +"batch": 1, }, ], }
Bạn có thể sử dụng tinker
để tương tác với database của bạn và thử nghiệm với các dịch vụ và mô hình.
Với ứng dụng Laravel của bạn tại chỗ, bạn đã sẵn sàng để phát triển và thử nghiệm thêm.
Kết luận
Đến đây bạn có một ứng dụng LEMP đang chạy trên server của bạn , mà bạn đã thử nghiệm bằng cách truy cập trang chào mừng Laravel và tạo di chuyển database MySQL.
Key cho sự đơn giản của cài đặt này là Docker Compose, cho phép bạn tạo một group các containers Docker, được xác định trong một file duy nhất, bằng một lệnh duy nhất. Nếu bạn muốn tìm hiểu thêm về cách thực hiện CI với Docker Compose, hãy xem Cách cấu hình Môi trường kiểm tra tích hợp liên tục với Docker và Docker Compose trên Ubuntu 16.04 . Nếu bạn muốn hợp lý hóa quy trình triển khai ứng dụng Laravel của bạn thì Cách tự động triển khai ứng dụng Laravel với Trình triển khai trên Ubuntu 16.04 sẽ là một tài nguyên phù hợp.
Các tin liên quan
Cách cài đặt Nginx trên CentOS 82020-03-03
Cách thiết lập Django với Postgres, Nginx và Gunicorn trên Debian 10
2019-07-25
Cách tạo chứng chỉ SSL tự ký cho Nginx trên Debian 10
2019-07-15
Cách bảo mật Nginx bằng Let's Encrypt trên Debian 10
2019-07-11
Cách cài đặt Nginx trên Debian 10
2019-07-10
Cách cài đặt và bảo mật phpMyAdmin bằng Nginx trên server Debian 9
2019-06-13
Cách cài đặt và bảo mật phpMyAdmin với Nginx trên server Ubuntu 18.04
2019-04-18
Cách bảo mật một ứng dụng Node.js được chứa đựng bằng Nginx, Let's Encrypt và Docker Compose
2019-01-04
Cách cài đặt Nginx trên FreeBSD 11.2
2018-11-15
Cách bảo mật Nginx bằng NAXSI trên Ubuntu 16.04
2018-11-09