Hôm nay sẽ tiếp tục series 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 liên 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 đề đó
bài toán
Mình có một project tên php là selfproject được xây dựng dựa trên laravel framework. Dự án này đang làm việc với hệ thống 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 hình ảnh đã được chia sẻ bởi các lập trình viên khác nhau trên dockerhub
Mình sẽ sử dụng 2 image đó 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
docker run -p 3307:3306 --name mysqlserver -e MYSQL_ROOT_PASSWORD=root -d mysql
Sau đó tạo bộ chứa máy chủ web
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à
0 vàdocker exec -it containerName/containerId bash # Với mình docker exec -it selfproject-server bash
1, để họ có thể giao tiếp với nhau cần liên kết máy chủ web với mysql thông qua tùy chọndocker exec -it containerName/containerId bash # Với mình docker exec -it selfproject-server bash
2docker exec -it containerName/containerId bash # Với mình docker exec -it selfproject-server bash
Bây giờ mở trình duyệt và thử kết quả
Reason?
Mình quên cấu hình lại trong file. env
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
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=selfproject
DB_USERNAME=root
DB_PASSWORD=root
- Connected to database in container tạo db có tên
3. Ở lệnh tạo vùng chứa MYSQL mình cần phải hiển thị cổng bên ngoài vùng chứa là 3307. Do cổng máy mình 3306 đã được sử dụng cho ứng dụng khácdocker exec -it containerName/containerId bash # Với mình docker exec -it selfproject-server bash
Ở đâ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ể sử dụng công cụ khác như php-myadmin
Time into in container to
4 datadocker exec -it containerName/containerId bash # Với mình docker exec -it selfproject-server bash
docker exec -it containerName/containerId bash # Với mình docker exec -it selfproject-server bash
And now is results
- Nhưng khi muốn đăng ký mình gặp phải
Vấn đề. can't access url any other outside public. Khắc phục. in container mình cần sửa lại file apache. conf đoạn
5 thànhdocker exec -it containerName/containerId bash # Với mình docker exec -it selfproject-server bash
6 trongdocker exec -it containerName/containerId bash # Với mình docker exec -it selfproject-server bash
7docker exec -it containerName/containerId bash # Với mình docker exec -it selfproject-server bash
- Truy cập trong vùng chứa
docker exec -it containerName/caintainerId bash
- Sử dụng vim để sửa lại tệp apache. conf [Do container mình đang dùng không có nano =]] ]
vi /etc/apache2/apache2.conf
**Sửa như sau**
Options Indexes FollowSymLinks
AllowOverride ALL
Require all granted
- Lưu lại và khởi động lại dịch vụ apache bên trong vùng chứa
service apache2 restart
- Lúc này thì bộ chứa máy chủ web này của mình sẽ bị chấm dứt [ngắt kết nối] và mình cần bắt đầu lại
Bên ngoài máy chủ của mình
docker start containerName/containerId
với mình
docker start selfproject-server
Kết quả thu được
Ngon là chạy rồi [hehe]. Attempt to impact with db coi sao. Mình đang cố gắng tạo một bài post và đây là kết quả
Các bạn thử dừng cả máy chủ mysql với máy chủ web đã khởi động lại lỗi xem còn chạy và dữ liệu ok không nhé. Với mình thì tuyệt vời
docker exec -it containerName/containerId bash
# Với mình
docker exec -it selfproject-server bash
8
docker exec -it containerName/containerId bash
# Với mình
docker exec -it selfproject-server bash
Gõ dữ liệu đã lưu ở đâu?
Vào trong mysql container nhé và trong /var/lib/mysql/
Nên cẩn thận khi xóa vùng chứa này nhé. Mình có thể giải quyết được vấn đề này cũng là
9 /var/lib/mysql trong container ra một thư mục nào đó bên ngoài máy chủ của mình không hạn chế "mysql-data" do mình tự tạo giống như dự án thư mục mount của mình [nhớ nêndocker exec -it containerName/containerId bash # Với mình docker exec -it selfproject-server bash
Dừng tất cả các container đang chạy
0docker run -tid -p 9000:80 -v ~/www/sites/FrProject/Github/selfproject:/var/www/html --name selfproject-server --link mysqlserver:mysql tutum/apache-php
Khi mình chỉnh sửa, làm việc với dự án thì sẽ gặp phải vấn đề quyền làm khi
9 vào trong container thì nó sửa toàn bộ dữ liệu trong thư mục của mình về chủ sở hữu và nhóm là www-data, chứ không còn là người dùng hiện tại của mình . Do đó, mình nên vào trong container và cấp quyền ghi cho dự án của mình với người dùng là kháchdocker exec -it containerName/containerId bash # Với mình docker exec -it selfproject-server bash
1docker run -tid -p 9000:80 -v ~/www/sites/FrProject/Github/selfproject:/var/www/html --name selfproject-server --link mysqlserver:mysql tutum/apache-php
Với ấu trùng 5. 3 mình không thể chạy
1 trong container mặc dù bên ngoài vẫn okdocker exec -it containerName/caintainerId bash
- Reason. ấu trùng 5. 3 request version of php > 5. 6 trong khi image mình đang dùng là tutum/apache-php với phiên bản php 5. 5. 9. Khát đầu với ông này mình mới nhìn ra được =]]
- Khắc phục. Tự xây dựng hình ảnh hoặc sử dụng hình ảnh khác có sẵn mà phiên bản > 5. 6. Với lựa chọn của mình, sử dụng hình ảnh được chia sẻ bởi cộng đồng docker-hub. Thay vì dùng tutum/apache-php thì dùng webdevops/php-apache [Ông này cũng có vấn đề với bản laravel 5. 4 nếu có lỗi bạn có thể thử với nimmis/apache-php7 hoặc bất kỳ ông nào mà bạn tìm thấy trên docker hub và cảm thấy phù hợp với dự án của mình]
cách 2
docker exec -it containerName/caintainerId bash
2 với Docker soạn thư
docker exec -it containerName/caintainerId bash
Không thể 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ớ tên container vì id là bất khả thi rồi =]]. Rồi lại cần nhớ thứ tự bắt đầu nữa
- Như việc liên kết 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 soạn thảo
Nhà soạn nhạc Docker là gì
Docker soạn thảo là một công cụ định nghĩa và khởi động 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 soạn 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 tệp soạn thảo docker với tên
3docker exec -it containerName/caintainerId bash
Khai báo máy chủ mysql và máy chủ web trong tệp soạn thảo này
2docker run -tid -p 9000:80 -v ~/www/sites/FrProject/Github/selfproject:/var/www/html --name selfproject-server --link mysqlserver:mysql tutum/apache-php
Về các tùy chọn trong file soạn 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 ngắn gọn về nội dung tập tin soạn thảo của mình
- Trước tiên là về phiên bản sử dụng đối với tệp docker là phiên bản '2'. Bạn có thể tìm hiểu thêm trên docker trang chủ. Phiên bản '1' là 'định dạng cũ', phiên bản hiện tại là '2. 1' và '2' là phiên bản được khuyến mãi sử dụng có một số thay đổi về tùy chọn so với phiên bản '1'
- Với dịch vụ mysql
- image used as mysql
- các cổng ở đây như mình đã nói với phần sử dụng lệnh. 3306 là cổng được sử dụng bên trong container, 3307 được xuất bên ngoài để mình có thể xem và thao tác với dữ liệu
- các mạng sử dụng là tầng sau
- volume at here main is mount folder bên ngoài với bên trong container như phần sử dụng lệnh. '. /mysql-data' là thư mục bạn muốn lưu trữ dữ liệu ở bên ngoài, bạn có thể liên kết bất kỳ nơi nào bạn muốn
- tên máy chủ. mysql
- Với dịch vụ web
- hình ảnh mình sử dụng là tutum/apache-php. Save the idea is with laravel 5. 2 trở về trước nhé, hay là với project mình không yêu cầu phiên bản php > 5. 6
- liên kết đến vùng chứa mysql
- mạng lưới. phải sử dụng back-tier cùng với mysql cho toàn bộ dịch vụ trong quá trình soạn tệp để các vùng chứa có thể giao tiếp với nhau
- tập. Làm docker-compose. tập tin yml này của mình đặt ngày trong thư mục selfproject của mình nên đường dẫn đến dự án bên ngoài máy chủ là ". " thư mục hiện tại và gắn vào "/var/www/html/selproject" trong vùng chứa
3docker run -tid -p 9000:80 -v ~/www/sites/FrProject/Github/selfproject:/var/www/html --name selfproject-server --link mysqlserver:mysql tutum/apache-php
- Như vấn đề về Ghi đè mà mình đã nói bên trên và đoạn cấu hình này giải quyết vấn đề đó
OK work to work is start it
4docker run -tid -p 9000:80 -v ~/www/sites/FrProject/Github/selfproject:/var/www/html --name selfproject-server --link mysqlserver:mysql tutum/apache-php
Nhớ lưu ý tới quyền hạn và cấu hình 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ự đóng góp ý kiến từ mọi người để sửa đổi nội dung bài viết tốt hơn
Hiện tại trong tài liệu chính thức của docker soạn không khuyến nghị sử dụng cho sản xuất, chỉ nên sử dụng trong môi trường phát triển, dàn dựng, tích hợp liên tục