DEVELOPER TRAINING

  • Trang chủ
  • Khóa học
  • Tutorials
    • React Native
  • Đăng ký
  • Tài liệu
    • Thường thức iPhone
    • Mạng xã hội , Social Network
    • Android, ios, Windows phone, Blackberry
    • CRM
    • ERP
    • Joomla, Wordpress, Drupal...
    • Codeigniter, Zend, Phalcon...
    • Magento, Prestashop, opencart ...
    • Tài liệu khác
  • Tuyển dụng
    • Tìm người cùng khởi nghiệp
    • Tuyển thực tập lập trình
  • Chuyển đổi số
    • Chuyển đổi số
    • Kinh tế số
    • Kinh tế chia sẻ
    • Fintech
    • Mạng xã hội
    • insurtech
    • Bất động sản 4.0

Mạng xã hội , Social

Tài liệu

Docker Compose: Xây dựng môi trường phát triển ứng dụng web – PHP, MySql

  • Print

Chào mọi người!

Hôm nay sẽ tiếp tục loạt bài “Mình biết thì mình chia sẻ” của mình mong tiếp tục nhận được sự ủng hộ từ anh em

Rất xin lỗi vì sau bài viết trước Docker với lập trình viên web của mình thì mình lại ngắt quãng không thể đi luôn vào phần tìm hiểu tiếp tục kết nối với cơ sở dữ liệu. Hôm nay chúng ta sẽ cùng đi giải quyết vấn đề đó.

Docker Compose: Xây dựng môi trường phát triển ứng dụng web – PHP, MySql

Bài toán

  • Mình có một project php tên là selfproject xây dựng dựa trên laravel framework. Project này làm việc với hệ quản trị CSDL là MySql.
  • Vấn đề là bây giờ mình muốn chạy nó với docker!

Giải quyết

Cách 1

  • Theo như bài tìm hiểu lần trước mình sẽ sử dụng các images đã được chia sẻ bởi các lập trình viên khác trên dockerhub.
  • Mình sẽ sử dụng 2 images đó là tutum/apache-php cho service apache-php và mysql cho mysql server.
  • Đầu tiên mình cần tạo MySQL container trước
1
2
3
 
   docker run - p 3307 : 3306 -- name mysqlserver - e MYSQL_ROOT_PASSWORD = root - d mysql
 

1
2
3
 
   docker run - tid - p 9000 : 80 - v ~ / www / sites / FrProject / Github / selfproject : / var / www / html -- name selfproject - server -- link mysqlserver : mysql   tutum / apache - php
 

  • Ở đây mình cần mở rộng hơn trong bài tìm hiểu lần trước, đó là mình có 2 container là mysqlserver và selfproject-server, để chúng có thể giao tiếp với nhau cần link web server với mysql thông qua tùy chọn --link <container name or ID>:<alias>
  • Bây giờ mở trình duyệt và thử kết quả

Lý do?

Mình quên config lại trong file .env

1
2
3
4
 
     DB_CONNECTION = mysql
 
 

 

host bên ngoài local

DB_HOST=127.0.0.1

Sửa trong container nên sẽ config lại

 

1
2
3
4
5
6
7
8
 
     DB_HOST = mysql
     DB_PORT = 3306
     DB_DATABASE = selfproject
     DB_USERNAME = root
     DB_PASSWORD = root
 
 
  • Kết nối tới database trong container tạo db có tên selfproject. Ở command tạo MYSQL container mình cần expose port ra bên ngoài container là 3307. Do ở máy mình cổng 3306 đã được sử dụng cho ứng dụng khác.

  • Ở đây mình sử dụng công cụ trực quan mysql-workbench để thao tác với mysql, các bạn có thể dụng công cụ khác như php-myadmin…
  • Giờ vào vào trong container để migrate dữ liệu

docker exec -it containerName/containerId bash

Với mình

 

1
2
3
4
 
     docker exec - it selfproject - server bash
 
 

 

  • Và giờ là kết quả

  • Nhưng khi muốn vào đăng ký mình gặp phải

test2.png

Vấn đề: không thể truy cập được url nào khác ngoài public.
Khắc phục: trong container mình cần sửa lại file apache.conf đoạn AllowOverride None thành AllowOverride ALL trong <Directory /var/www/>

  • Vào trong container

 

1
2
3
4
 
     docker exec - it containerName / caintainerId bash
 
 

 

  • Sử dụng vim để sửa lại file apache.conf (Do container mình đang dùng không có nano =)) )

 

1
2
3
4
 
     vi / etc / apache2 / apache2 . conf
 
 

 

Sửa như sau

 

1
2
3
4
5
6
7
8
 
     & lt ; Directory / var / www / & gt ;
     Options Indexes FollowSymLinks
     AllowOverride ALL
     Require all granted
     & lt ; / Directory & gt ;
 
 

 

  • Save lại và restart service apache bên trong container.

 

1
2
3
4
 
           service apache2 restart
 
 

 

  • Lúc này thì web server container này của mình sẽ bị terminate (ngắt kết nối) và mình cần start nó lại

Bên ngoài máy chủ của mình

docker start containerName/containerId

Với mình

 

1
2
3
4
 
       docker start selfproject - server
 
 

 

Kết quả thu được

test3.png

Ngon chạy rồi (hehe). Thử tương tác với db coi sao. Mình thử tạo một bài post và đây là kết quả

test4.png

Các bạn thử stop cả mysqlserver với web server đi rối start lại xem còn chạy và dữ liệu ok không nhé. Với mình thì tuyệt vời!

Một số câu hỏi và vấn đề mà mình gặp khi mới bắt đầu

  • Vậy dữ liệu hắn lưu ở đâu?
    1
    2
    3
    4
     
           Và o trong mysql container nhé và trong / var / lib / mysql /
     
     
  • Nên cẩn thận khi xóa container này nhé. Mình có thể khắc phục được vấn đề này là cũng mount/var/lib/mysql trong container ra một folder nào đó ngoài máy chủ của mình chẳng hạn “mysql-data” do mình tự tạo giống như mình mount folder project làm việc vào trong /var/www/html khi create web server container vậy!
  • Stop tất cả các container đang chạy
    1
    2
    3
    4
     
           docker stop $ ( docker ps - a - q )
     
     
  • Khi mình chỉnh sửa, làm việc với project thì sẽ gặp phải vấn đề permission do khi mount vào trong containerthì nó sửa toàn bộ dữ liệu trong folder của mình về owner và group là www-data, chứ không còn là current user của mình hoặc root nữa. Vậy nên mình vào trong container và cấp quyền ghi cho project của mình với user là guest.

Vào trong container web server

Đi đến folder project mà bạn đã mount

 

1
2
3
4
 
         chmod 777 - R .
 
 

 

Quyền các bạn tùy chọn nói chung là dạng –7 để thằng user không phải owner có thể ghi

  • Với laravel 5.3 mình không thể chạy php artisan trong container mặc dù bên ngoài vẫn ok
  • Lý do: laravel 5.3 yêu cầu version của php > 5.6 trong khi image mình đang dùng là tutum/apache-php với version php 5.5.9. Khá đau đầu với ông này mình mới nhìn ra được =))
  • Khắc phục: Tự build image hoặc sử dụng image khác có sẵn mà phiên bản > 5.6. Với mình chọn sử dụng image được chia sẻ bởi cộng đồng docker-hub. Thay vì dùng tutum/apache-php thì dùng webdevops/php-apache

Cách 2

Take it easy với Docker compose

  • Chẳng lẽ mỗi lần code lại start từng con server một, nếu có 3 hay nhiều hơn nữa thì mệt quá, phải nhớ container name vì id là bất khả thi rồi =)). Rồi lại cần nhớ thứ tự start nữa.
    • Như việc link Mysql với Apache thì cần start server MySql trước sau đó start Apache container
  • Điều đó dẫn đến việc mình bắt đầu thử sử dụng Docker compose

What is Docker composer

  • Docker compose là một công cụ cho việc định nghĩa và khởi chạy nhiều container với docker. Với compose mình sẽ khai báo nhiều container trong cùng một file và chỉ việc chạy một dòng lệnh là nó sẽ làm mọi việc start container cho mình.
  • Bạn có thể tham khảo tại đây

Sử dụng docker compose cho ứng dụng của mình

  • Cài đặt docker-compose thì các bạn cài đặt theo hướng dẫn tại trang chủ docker nhé.
  • Tạo docker compose file với tên docker-compose.yml
  • Khai báo mysql server và web server trong compose file này

docker-compose.yml

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
     version : "2"
 
     services :
 
         selfproject :
             image : tutum / apache - php
             links :
                 - mysql
             ports :
                 - "8888:80"
             networks :
                 - back - tier
             volumes :
                 - . : / var / www / html / selproject
             environment :
                 - ALLOW_OVERRIDE = true
             hostname : selfproject
             cpu_shares : 512              # 0.5 CPU
             mem_limit : 536870912          # 512 MB RAM
 
         mysql :
             image : mysql
             ports :
                 - "3307:3306"
             networks :
                 - back - tier
             volumes :
                 - . / mysql - data / : / var / lib / mysql /
             environment :
                 - MYSQL_ROOT_PASSWORD = root
                 - MYSQL_DATABASE = selfproject
             hostname : mysql
             cpu_shares : 512              # 0.5 CPU
             mem_limit : 536870912          # 512 MB RAM
 
     networks :
         back - tier :
 
 

 

  • Về các options trong compose file mình sẽ không nói nhiều vì nó được mô tả khá chi tiết tại Composefile reference trên trang chủ của docker
  • Giải thích chút về nội dung file compose của mình
    • Trước tiên là về version sử dụng đối với docker file là version ‘2’. Bạn có thể tìm hiểu thêm trên trang chủ docker. Version ‘1’ là ‘legacy format’, version hiện tại là ‘2.1’ và ‘2’ là version được khuyến khích sử dụng có một số thay đổi về options so với version ‘1’.
    • Với service mysql:
      • image sử dụng là mysql
      • ports ở đây như mình đã nói với phần sử dụng command. 3306 là port được sử dụng bên trong container, 3307 được export ra bên ngoài để mình có thể xem và thao tác với dữ liệu.
      • networks sử dụng là back-tier
      • volumes ở đây chính là mount folder bên ngoài với bên trong container như phần sử dụng command. ‘./mysql-data’ là folder mình muốn lưu trữ dữ liệu ở bên ngoài, bạn có thể link bất kỳ tới đâu bạn muốn.
      • hostname: mysql
    • Với web service
      • image mình sử dụ là tutum/apache-php. Lưu ý là với laravel 5.2 trở về trước nhé, hay là với project mình không yêu cầu version php > 5.6
      • links tới mysql container
      • networks: cũng phải sử dụng là back-tier cùng với mysql cho toàn bộ service trong compose file để các container có thể giao tiếp với nhau
      • volumes: Do docker-compose.yml file này của mình đặt ngày trong folder selfproject của mình nên đường dẫn đến project bên ngoài máy chủ là “.” thư mục hiện tại và mount vào “/var/www/html/selproject” trong container
      • 1
        2
        3
        4
        5
         
        environment :
           - ALLOW_OVERRIDE = true
         
         
      • Như vấn đề với Override mà mình đã nói bên trên và đoạn config này giải quyết vấn đề đó.
  • OK việc cần làm là start nó

Đi đến thư mục chứa compose file

 

1
2
3
4
 
         docker - compose up
 
 

 

Khi làm việc xong

 

1
2
3
4
 
         docker - compose down
 
 

 

  • Nhớ lưu ý tới việc quyền hạn và config nhá

Kết luận

  • Cảm ơn các bạn đã dành thời gian đọc bài viết của mình. Thời gian mình tìm hiểu về docker chưa được nhiều nên có thể có nhiều sai xót, rất mong nhận được sự góp ý từ mọi người để sửa đổi nội dung bài viết được tốt hơn.
  • Hiện tại trong tài liệu chính thức của docker compose không khuyến nghị sử dụng cho production, chỉ nên sử dụng ở môi trường development, staging, continous integration

viblo

Có thể bạn chưa biết:

  • Bài giảng Quản trị nhân lực, quản trị nhân sự - Bài 3 Chiến Lược Và Hoạch Định Nguồn Nhân Lực
  • Bài giảng Quản trị nhân lực, quản trị nhân sự - Bài 1 Tổng Quan Về Quản Trị Nguồn Nhân Lực
  • Phần mềm bán hàng bằng Excel miễn phí
  • Giáo trình nghiệp vụ kế toán - chương 6 Kế toán Tài sản cố định, Kế toán doanh nghiệp
  • Bài giảng Quản trị nhân lực, quản trị nhân sự - Bài 5 Tuyển Mộ Nhân Sự
  • Bài giảng Quản trị nhân lực, quản trị nhân sự - Bài 9 Hệ thống tiền lương
  • Giáo trình nghiệp vụ kế toán - chương 4 Phương Pháp Tính Giá
  • Bài giảng Quản trị nhân lực, quản trị nhân sự - Bài 7 Quản Trị Thành Tích
  • Quy trình quản lý kho chuyên nghiệp
  • Hướng dẫn tải miễn phí bản chính thức Windows 7, Windows 8.1, Windows 10, ... trực tiếp từ Microsoft
  • Quy định về việc nộp báo cáo tài chính của doanh nghiệp
  • Bài giảng Quản trị nhân lực, quản trị nhân sự - Bài 6 Tuyển Chọn Nhân Sự

Có thể bạn chưa biết:

TUYỂN THỰC TẬP REACT NATIVE

* Trang bị kỹ năng về JS, lập trình hybrid app, sử dụng những công cụ hỗ trợ (VScode, github, sourcetree, ...)
* Thành quả mong muốn là các bạn tham gia sẽ có được kỹ năng lập trình hybrid app

Biểu mẫu đăng ký training tại đây >> http://bit.ly/2NK9YWd

TEAM MOBILE APPS - CTY DVMS

  • Prev
  • Next
  • tweet

Nhiều người quan tâm

  • Mã nguồn mạng xã hội giống y Facebook
  • Tìm co-founder cho các dự án khởi nghiệp
  • Phương pháp giải quyết phản bác
  • Gần 700 forum, trang rao vặt giúp tăng độ phủ quảng cáo, SEO, Backlink
  • Danh sách 6.500 website mua bán rao vặt, tốt để quảng cáo, SEO và tạo backlink
  • Top danh sách hơn 300 website submit PR cao

Tin mới

Lập trình: cũng chỉ là viết? 09 January 2019
Cách cài đặt máy in, máy scan... khi hệ điều hành không hỗ trợ driver 01 December 2016
Cách đổi số điện thoại trên website cực nhanh sau khi đổi thuê bao từ 11 số sang 10 số. Không phải ai cũng biết 12 September 2018
6 libs “vi diệu” dành cho các lập trình viên iOS (phần 3) 09 January 2019
Tìm co-founder cho các dự án khởi nghiệp 27 September 2018
Sử dụng Node.js để tương tác với Graph API Facebook 09 January 2019

Blogs

  • app SOS, gọi nhanh tới các số hỗ trợ (đường dây nóng) tại Việt Nam
  • DV SMS Remote sử dụng điện thoại cả khi quên
  • Ứng dụng SMS gateway
  • Driver Plus nhắc nhở bảo dưỡng xe, thay nhớt...
  • ứng dụng nghe nhạc trên Blackberry
  • Mẫu văn bản cho công ty gia công phần mềm, phát triển mobile apps

Lập trình ứng dụng di động

  • Lập trình Android
  • Lập trình iOS
  • Lập trình Windows Phone
  • Lập trình BlackBerry OS
  • Lập trình BlackBerry 10
  • Lập trình J2ME
  • Lập trình game mobile
  • Đồ họa cho ứng dụng
  • Lập trình Phonegap
  • Lập trình Unity 3D
  • Lập trình Xamarin
  • Lập trình web mobile
  • Lập trình Node js

Học lập trình

  • Lập trình .NET
  • Lập trình C/C++
  • Visual C++
  • Visual C#
  • Lập trình Visual Basic
  • Visual Basic .NET
  • Lập trình Java
  • Lập trình trên Linux
  • Công cụ, ebooks .NET
  • Dự án lập trình .NET
  • Hỏi đáp về lập trình
  • Hướng dẫn cho người mới
  • Thủ thuật
  • Hỏi đáp tin học

Lập trình web

  • Lập trình PHP
  • Flash và các vấn đề
  • Thiết kế web
  • Lập trình web JSP
  • Lập trình web ASP
  • Lập trình web ASP.NET
  • HTML - CSS
  • Webmaster/ SEO
  • JavaScript / Ajax, jQuery
  • Lập trình Phalcon

Cơ sở dữ liệu

  • MS SQL Server
  • MySQL
  • Oracle
  • Các hệ CSDL khác
  • Bigdata
  • Blockchain

OpenSource Master

  • Lập trình và quản trị Joomla
  • Lập trình và quản trị Wordpress
  • Lập trình và quản trị Drupal
  • Lập trình và quản trị SugarCRM
  • Lập trình và quản trị VTigerCRM
  • Lập trình và quản trị Open ERP
  • Lập trình và quản trị Dolibarr ERP

 

Copyright © Tạo Ứng Dụng, All Rights Reserved. Developed By DVMS | All solution for smartphone & tablet.. Designed By JoomShaper

Tìm kiếm

  • Trang chủ
  • Khóa học
  • Tutorials
    • React Native
  • Đăng ký
  • Tài liệu
    • Thường thức iPhone
    • Mạng xã hội , Social Network
    • Android, ios, Windows phone, Blackberry
    • CRM
    • ERP
    • Joomla, Wordpress, Drupal...
    • Codeigniter, Zend, Phalcon...
    • Magento, Prestashop, opencart ...
    • Tài liệu khác
  • Tuyển dụng
    • Tìm người cùng khởi nghiệp
    • Tuyển thực tập lập trình
  • Chuyển đổi số
    • Chuyển đổi số
    • Kinh tế số
    • Kinh tế chia sẻ
    • Fintech
    • Mạng xã hội
    • insurtech
    • Bất động sản 4.0