Docker là gì?
Docker là một dự án mã nguồn mở giúp tự động triển khai các ứng dụng Linux và Windows vào trong các container ảo hóa.
Docker cung cấp một lớp trừu tượng và tự động ảo hóa dựa trên Linux. Docker sử dụng những tài nguyên cô lập của Linux như cgroups, kernel, quản lý tệp để cho phép các container chạy độc lập bên trong một thực thể Linux.
Docker được viết bằng Golang.
-Wikipedia-
Nói ngắn gọn, Docker là một phần mềm sử dụng các thành phần lõi của Linux để chạy các lớp trừu tượng (được gọi là container) như một máy chủ riêng biệt.
So sánh Docker và Virtual Machine
Trước khi phân tích, chúng ta hãy cùng xem qua kiến trúc của 2 loại mô hình này.
Khác với mô hình máy ảo, các container trong Docker dùng chung nhân hệ điều hành mẹ và có thể dùng chung tài nguyên (CPU, RAM, HDD,…). Qua đó ta có thể nhận thấy ưu điểm của Docker so với mô hình máy ảo:
- Tiết kiệm tài nguyên hơn, do có thể dùng chung tài nguyên.
- Tốc độ thực thi nhanh hơn do không phải thông qua 2 lớp OS
Docker còn tỏ ra vượt trội hơn máy ảo trong việc triển khai do có thể lưu lại quá trình cài đặt trong 1 file (image).
Giả dụ nếu bạn có 30 container Docker mà bạn muốn chạy, bạn có thể chạy chúng trên một server duy nhất. Để chạy 30 máy ảo, bạn phải khởi động 30 hệ điều hành với ít nhất là yêu cầu về tài nguyên tối thiểu có sẵn trước khi đưa ra các cấu hình cơ bản để chạy trên guest OS. Với Docker việc duy nhất bạn cần làm là xây dựng các file image ban đầu hoặc có thể dùng các public image trên DockerHub và chạy chúng với các tùy chọn cho app. Về tài nguyên, các container sẽ chia sẻ với nhau dựa trên cấu hình của máy mẹ. Việc chạy multiple container còn có thể rút gọn lại với docker-compose.
Cài đặt docker
Docker hỗ trợ cho cả Window, Mac, Linux. Cách cài đặt các bạn có thể tham khảo tại trang chủ https://www.docker.com.
Nếu dùng Window bạn có thể làm theo hướng dẫn tại https://store.docker.com/editions/community/docker-ce-desktop-windows
Docker cơ bản
- Tải về 1 image từ DockerHub
docker pull <image>:<tag>
Ví dụ: docker pull nginx:1.12
Nếu để trống tag thì mặc định tag sẽ là latest
- Chạy 1 image
docker run -d –-name <tên container> -v <thư mục trên máy tính>:<thư mục trong container> -w <thư mục làm việc mặc định> -p <port máy tính>:<port_container> <image name>
Ví dụ: docker run -d –name nginx_1.12 -v /var/www:/var/www -w /var/www -p 8080:80 nginx
Trong đó:
-d: chạy ngầm container
–name: tên container, yêu cầu không được trùng với tên container khác. Nếu không đặt docker sẽ tự tạo
-v: bind thư mục trong máy tính vào trong container
-w: thư mục làm việc mặc định của container. Nếu để trống thì mặc định là thư mục gốc /
-p: bind port của container ra máy tính
- Liệt kê các images
docker images
- Xóa 1 images
docker rmi <tên image>
- Liệt kê các container
docker ps
- Chạy 1 container
docker exec -it <tên image>:<tag> <lệnh muốn chạy trong container>
Ví dụ:
docker exec -it nginx bash
- Dừng 1 container
docker stop <container_id hoặc name_container>
- Export container
docker export <container_id hoặc name_container> | gzip > file_export.tar.gz
Thực hành
Trong bài viết này mình sẽ hướng dẫn các bạn tạo môi trường cho 1 ứng dụng laravel cơ bản. Ví dụ dưới đây sẽ ăn sẵn 1 image từ docker hub vì mình hơi lười tạo image :P. Trong các phần tiếp theo mình sẽ mô tả chi tiết hơn về Dockerfile, multiple container với docker-compose
B1: pull image từ DockerHub về, trong ví dụ này mình sẽ dùng 1 image khá đầy đủ các thành phần là k2levin/php-laravel
docker pull k2levin/php-laravel
B2: copy source code laravel của bạn vào trong /var/www và tạo 1 file có tên vh.conf để làm file config virtual host cho nginx, có nội dung:
server { listen 80; server_name default.dev; root /var/www/public; index index.php index.html; client_max_body_size 100m; fastcgi_read_timeout 1800; sendfile off; charset utf-8; location / { try_files $uri $uri/ /index.php?$query_string; } location = /favicon.ico { access_log off; log_not_found off; expires max;} location = /robots.txt { access_log off; log_not_found off; expires max;} access_log off; error_log /var/log/nginx/default.dev-error.log error; location ~ \.php$ { try_files $uri =404; include fastcgi_params; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass 127.0.0.1:9000; } location ~ /\.ht { deny all; } }
B3: sau khi pull image xong chúng ta sẽ tạo container từ image đó
docker run -d –name my_first_docker_laravel -v /var/www:/var/www -v /var/www/vh.conf:/etc/nginx/conf.d/default.conf -w /var/www -p 8080:80 k2levin/php-laravel
Nếu bạn chưa có vendor, .env, …Bạn có thể vào trong container và chạy các lệnh như 1 máy tính bình thường
docker exec -it my_first_docker_laravel bash
composer install
cp .env.example .env
php artisan key:generate
Và tận hưởng thành quả của mình http://localhost:8080/
Qua bài hướng dẫn cơ bản này, hy vọng mọi người hình dung được cấu trúc, hệ thống, cách làm việc của Docker. Trong bài viết sắp tới, mình sẽ hướng dẫn mọi người phần xây dựng môi trường bằng Dockerfile và Docker compose.
Have fun!