Hướng Dẫn Cài Đặt Và Sử Dụng Docker Compose Trên Ubuntu 20.04

Giới thiệu

Trong thế giới phát triển phần mềm hiện đại, việc quản lý các container Docker đã trở thành một kỹ năng thiết yếu. Tuy nhiên, khi dự án của bạn mở rộng và bao gồm nhiều dịch vụ như web server, database, và cache, việc quản lý chúng một cách thủ công trở nên vô cùng phức tạp và tốn thời gian. Bạn sẽ phải chạy từng lệnh docker run với hàng tá tham số, kết nối các network và quản lý volumes một cách riêng lẻ. Đây chính là lúc Docker Compose tỏa sáng như một giải pháp cứu cánh.

Docker Compose là một công cụ mạnh mẽ giúp bạn định nghĩa và chạy các ứng dụng Docker đa container một cách dễ dàng. Thay vì những dòng lệnh dài dòng, bạn chỉ cần một file cấu hình duy nhất (docker-compose.yml) để quản lý toàn bộ vòng đời của ứng dụng. Công cụ này không chỉ đơn giản hóa quá trình thiết lập môi trường phát triển mà còn đảm bảo tính nhất quán giữa các môi trường khác nhau. Bài viết này sẽ hướng dẫn bạn từ A-Z, từ việc chuẩn bị môi trường, cài đặt chi tiết cho đến cách sử dụng Docker Compose trên Ubuntu 20.04 một cách hiệu quả nhất.

Hình minh họa

Chuẩn bị môi trường để cài đặt Docker Compose trên Ubuntu 20.04

Trước khi đi vào cài đặt Docker Compose, chúng ta cần đảm bảo rằng hệ thống Ubuntu 20.04 của bạn đã sẵn sàng. Một môi trường được chuẩn bị tốt sẽ giúp quá trình cài đặt diễn ra suôn sẻ và tránh được các lỗi không đáng có. Hãy coi đây là bước khởi động quan trọng, tạo nền tảng vững chắc cho các bước tiếp theo. Quá trình này bao gồm hai phần chính: kiểm tra và cập nhật hệ điều hành, sau đó là cài đặt Docker Engine.

Kiểm tra phiên bản Ubuntu và cập nhật hệ thống

Đầu tiên, bạn cần chắc chắn rằng mình đang làm việc trên đúng phiên bản Ubuntu 20.04. Việc này đảm bảo các lệnh và gói phần mềm trong hướng dẫn sẽ tương thích hoàn toàn. Hãy mở terminal và chạy lệnh sau để kiểm tra:

lsb_release -a

Kết quả trả về sẽ hiển thị thông tin chi tiết về phiên bản hệ điều hành của bạn. Nếu bạn thấy dòng Distributor ID: UbuntuRelease: 20.04, thì bạn đã sẵn sàng cho bước tiếp theo. Nếu chưa, hãy đảm bảo bạn đang truy cập đúng máy chủ.

Hình minh họa

Tiếp theo, việc cập nhật hệ thống là cực kỳ quan trọng. Nó không chỉ giúp vá các lỗ hổng bảo mật mà còn đảm bảo các thư viện và gói phần mềm trên hệ thống của bạn là mới nhất. Chạy lệnh sau để cập nhật danh sách gói và nâng cấp chúng:

sudo apt update && sudo apt upgrade -y

Lệnh này kết hợp hai tác vụ: apt update làm mới danh sách các gói từ kho lưu trữ và apt upgrade tiến hành nâng cấp các gói đã cài đặt lên phiên bản mới nhất. Tùy chọn -y sẽ tự động xác nhận mọi yêu cầu, giúp quá trình diễn ra nhanh hơn.

Cài đặt Docker Engine trên Ubuntu 20.04

Một điều kiện tiên quyết không thể thiếu trước khi cài Docker Compose là hệ thống của bạn phải có Docker Engine. Docker Compose chỉ là công cụ để “ra lệnh”, còn Docker Engine mới là cỗ máy thực thi, chịu trách nhiệm xây dựng, chạy và quản lý các container. Nếu không có Docker Engine, Docker Compose sẽ không có gì để điều khiển.

Cài đặt Docker Engine trên Ubuntu 20.04 khá đơn giản. Bạn có thể làm theo hướng dẫn chính thức từ Docker để đảm bảo cài đặt phiên bản mới và ổn định nhất. Các bước cơ bản bao gồm gỡ cài đặt các phiên bản cũ (nếu có), thiết lập kho lưu trữ của Docker, và cuối cùng là cài đặt Docker Engine. Bạn có thể sử dụng kịch bản cài đặt tự động của Docker để quá trình diễn ra nhanh chóng:

curl -fsSL https://get.docker.com -o get-docker.sh

sudo sh get-docker.sh

Sau khi script chạy xong, Docker Engine đã được cài đặt và dịch vụ Docker sẽ tự động khởi chạy. Bạn có thể kiểm tra trạng thái của dịch vụ Docker bằng lệnh:

sudo systemctl status docker

Nếu thấy trạng thái “active (running)”, xin chúc mừng, bạn đã hoàn thành xuất sắc bước chuẩn bị môi trường!

Hình minh họa

Hướng dẫn chi tiết cài đặt Docker Compose trên Ubuntu 20.04

Khi môi trường đã sẵn sàng với Docker Engine đang hoạt động, chúng ta sẽ chuyển sang phần chính: cài đặt Docker Compose. Không giống như Docker Engine được cài đặt qua trình quản lý gói apt, Docker Compose thường được cài đặt bằng cách tải trực tiếp tệp nhị phân (binary) từ kho lưu trữ chính thức trên GitHub. Cách này đảm bảo bạn luôn có được phiên bản mới nhất và quá trình cài đặt cũng rất nhanh gọn.

Tải Docker Compose từ Github chính thức

Docker Team phát hành các phiên bản của Docker Compose trên trang GitHub của họ. Việc của chúng ta là chọn một phiên bản ổn định và tải về. Bạn có thể truy cập trang “Releases” của Docker Compose trên GitHub để xem danh sách các phiên bản. Tại thời điểm viết bài, một phiên bản ổn định và phổ biến là 2.27.0. Tuy nhiên, bạn nên kiểm tra để chọn phiên bản mới nhất nếu muốn.

Hãy sử dụng lệnh curl để tải file binary của Docker Compose vào một thư mục hệ thống, thường là /usr/local/bin để nó có thể được thực thi từ bất kỳ đâu. Lệnh dưới đây sẽ tự động lấy phiên bản mới nhất và lưu lại:

sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Lệnh này thực hiện vài việc thông minh: $(uname -s) sẽ lấy tên hệ điều hành (Linux là gì) và $(uname -m) sẽ lấy kiến trúc phần cứng (ví dụ: x86_64), đảm bảo bạn tải đúng phiên bản cho hệ thống của mình. File sẽ được lưu với tên docker-compose.

Cấp quyền thực thi cho Docker Compose

Sau khi tải về, file docker-compose chỉ là một file thông thường, nó chưa có quyền để được thực thi như một câu lệnh. Nếu bạn thử chạy docker-compose --version ngay bây giờ, bạn sẽ nhận được lỗi “Permission denied”. Do đó, chúng ta cần cấp quyền thực thi cho nó.

Sử dụng lệnh chmod (change mode) với tùy chọn +x để thêm quyền thực thi cho file:

sudo chmod +x /usr/local/bin/docker-compose

Lệnh này cấp cho tất cả người dùng quyền chạy file docker-compose. Bây giờ, file đã sẵn sàng để hoạt động.

Hình minh họa

Để kiểm tra lại lần cuối và xác nhận rằng Docker Compose đã được cài đặt thành công, hãy chạy lệnh kiểm tra phiên bản:

docker-compose --version

Nếu mọi thứ diễn ra đúng kế hoạch, terminal sẽ hiển thị phiên bản Docker Compose bạn vừa cài đặt, ví dụ như Docker Compose version v2.27.0. Điều này khẳng định rằng bạn đã cài đặt thành công và sẵn sàng để bắt đầu sử dụng công cụ mạnh mẽ này.

Hướng dẫn sử dụng Docker Compose để quản lý container Docker

Cài đặt thành công chỉ là bước khởi đầu. Sức mạnh thực sự của Docker Compose nằm ở cách bạn sử dụng nó để điều phối các container. Thay vì phải nhớ và gõ lại những lệnh docker run phức tạp, giờ đây bạn có thể định nghĩa toàn bộ ứng dụng của mình trong một file duy nhất. File này chính là trái tim của Docker Compose, nơi bạn mô tả các dịch vụ, mạng lưới và volumes cần thiết.

Cấu trúc file docker-compose.yml cơ bản

File cấu hình mặc định của Docker Compose có tên là docker-compose.yml. Đây là một file văn bản theo định dạng YAML (YAML Ain’t Markup Language), một định dạng dữ liệu có cấu trúc dễ đọc cho cả người và máy. Một file docker-compose.yml cơ bản thường bao gồm các thành phần chính sau:

  • version: Khai báo phiên bản của cú pháp file Compose. Việc này giúp Docker Compose biết cách diễn giải file. Phiên bản ‘3.8’ là một lựa chọn phổ biến và hiện đại.
  • services: Đây là nơi bạn định nghĩa các container sẽ chạy. Mỗi dịch vụ tương ứng với một container, ví dụ: web, db, api. Trong mỗi dịch vụ, bạn sẽ chỉ định image để sử dụng, các port cần mở, các biến môi trường, và volumes để lưu trữ dữ liệu.
  • volumes: Định nghĩa các “ổ đĩa” lưu trữ dữ liệu bền vững cho container. Dữ liệu trong volume sẽ không bị mất ngay cả khi container bị xóa và tạo lại.
  • networks: Cho phép bạn tạo các mạng ảo tùy chỉnh để các dịch vụ có thể giao tiếp với nhau một cách an toàn và dễ dàng.

Hãy xem một ví dụ minh họa đơn giản cho một ứng dụng blog WordPress, bao gồm một dịch vụ web (WordPress) và một dịch vụ cơ sở dữ liệu (MySQL):

version: '3.8' services:   db:     image: mysql:5.7     volumes:       - db_data:/var/lib/mysql     environment:       MYSQL_ROOT_PASSWORD: example_root_password       MYSQL_DATABASE: wordpress       MYSQL_USER: wordpress       MYSQL_PASSWORD: example_wordpress_password   wordpress:     depends_on:       - db     image: wordpress:latest     ports:       - "8000:80"     environment:       WORDPRESS_DB_HOST: db:3306       WORDPRESS_DB_USER: wordpress       WORDPRESS_DB_PASSWORD: example_wordpress_password       WORDPRESS_DB_NAME: wordpress volumes:   db_data:

Hình minh họa

Các lệnh Docker Compose phổ biến

Với file docker-compose.yml đã được tạo, việc quản lý toàn bộ ứng dụng của bạn giờ đây chỉ cần vài câu lệnh đơn giản. Bạn sẽ thực thi các lệnh này trong cùng thư mục chứa file docker-compose.yml.

Để khởi chạy toàn bộ ứng dụng, bao gồm việc tải image, tạo network, volume và khởi động các container, bạn chỉ cần chạy:

docker-compose up

Nếu bạn muốn chạy các container trong chế độ nền (detached mode) để terminal không bị chiếm giữ, hãy thêm tùy chọn -d:

docker-compose up -d

Để dừng và xóa tất cả các container, network được định nghĩa trong file compose, sử dụng lệnh:

docker-compose down

Nếu bạn muốn xóa cả các volume đã tạo để làm sạch hoàn toàn, hãy thêm tùy chọn --volumes:

docker-compose down --volumes

Trong quá trình phát triển, việc xem logs của các dịch vụ là rất quan trọng để gỡ lỗi. Docker Compose giúp việc này trở nên cực kỳ tiện lợi:

docker-compose logs

Bạn cũng có thể xem logs của một dịch vụ cụ thể, ví dụ wordpress:

docker-compose logs wordpress

Việc quản lý container theo nhóm như vậy không chỉ giúp tiết kiệm thời gian mà còn giảm thiểu sai sót, nâng cao hiệu quả làm việc một cách đáng kể.

Hình minh họa

Các lưu ý và kinh nghiệm khi sử dụng Docker Compose

Sử dụng Docker Compose một cách hiệu quả không chỉ dừng lại ở việc biết các câu lệnh cơ bản. Để trở thành một người dùng thông thạo, bạn cần nắm vững các kinh nghiệm và những lưu ý quan trọng. Điều này sẽ giúp bạn tối ưu hóa quy trình làm việc, đảm bảo tính bảo mật và duy trì các file cấu hình một cách khoa học. Hãy cùng khám phá một số bí quyết giúp bạn làm chủ công cụ này.

Quản lý phiên bản và cập nhật Docker Compose

Công nghệ luôn thay đổi, và Docker Compose cũng không ngoại lệ. Các phiên bản mới thường đi kèm với các tính năng hữu ích, cải thiện hiệu suất và vá các lỗ hổng bảo mật. Do đó, việc duy trì phiên bản Docker Compose của bạn ở trạng thái cập nhật là rất cần thiết.

Để kiểm tra phiên bản hiện tại, bạn đã biết lệnh docker-compose --version. Để nâng cấp, quy trình cũng tương tự như khi cài đặt. Bạn chỉ cần lặp lại lệnh tải file binary từ GitHub. Lệnh này sẽ tự động tìm phiên bản mới nhất và ghi đè lên file cũ tại /usr/local/bin/docker-compose. Luôn nhớ kiểm tra trang “Releases” trên GitHub để biết các thay đổi quan trọng trong phiên bản mới trước khi nâng cấp để tránh các sự cố không tương thích.

Những lưu ý khi thiết kế file docker-compose.yml

File docker-compose.yml là bản thiết kế cho toàn bộ ứng dụng của bạn, vì vậy việc giữ nó sạch sẽ, dễ hiểu và an toàn là ưu tiên hàng đầu. Dưới đây là một số lưu ý quan trọng:

  • Giữ file đơn giản và rõ ràng: Đừng cố gắng nhồi nhét quá nhiều logic phức tạp vào file YAML. Hãy chia nhỏ các cấu hình phức tạp thành các file riêng biệt nếu cần thiết. Sử dụng comment (#) để giải thích các phần quan trọng hoặc các quyết định thiết kế.
  • Tránh lỗi format YAML: YAML rất nhạy cảm với việc thụt lề (indentation). Luôn sử dụng dấu cách (spaces) thay vì tab, và đảm bảo các cấp độ được thụt lề một cách nhất quán. Một lỗi thụt lề nhỏ cũng có thể khiến toàn bộ file bị lỗi.
  • Tối ưu hiệu suất: Chỉ định rõ các tài nguyên cần thiết. Ví dụ, sử dụng tmpfs cho các dữ liệu tạm thời để tăng tốc độ I/O. Sử dụng các image Docker nhỏ gọn (như Alpine) để giảm kích thước và thời gian tải.
  • Tăng cường bảo mật: Tuyệt đối không bao giờ ghi trực tiếp các thông tin nhạy cảm như mật khẩu, API key vào file docker-compose.yml. Thay vào đó, hãy sử dụng các biến môi trường (environment variables) hoặc Docker Secrets để quản lý chúng một cách an toàn.

Hình minh họa

Thường gặp lỗi và cách khắc phục khi sử dụng Docker Compose trên Ubuntu 20.04

Ngay cả những người dùng kinh nghiệm nhất cũng có thể gặp lỗi khi làm việc với Docker Compose. Điều quan trọng là biết cách nhận diện nguyên nhân và khắc phục chúng một cách nhanh chóng. Dưới đây là hai lỗi phổ biến nhất mà người dùng mới thường gặp trên Ubuntu và cách giải quyết chúng một cách đơn giản.

Lỗi không tìm thấy lệnh docker-compose

Đây có lẽ là lỗi đầu tiên bạn có thể gặp sau khi cài đặt. Bạn gõ docker-compose --version và nhận được thông báo lỗi: bash: docker-compose: command not found. Lỗi này nghe có vẻ nghiêm trọng nhưng nguyên nhân thường rất đơn giản.

Nguyên nhân và cách khắc phục:

  1. Cài đặt sai đường dẫn: Lệnh docker-compose chỉ có thể được gọi từ bất kỳ đâu nếu file thực thi của nó nằm trong một thư mục thuộc biến môi trường PATH của hệ thống (ví dụ: /usr/local/bin). Hãy kiểm tra lại xem bạn đã tải file vào đúng thư mục này chưa. Nếu bạn đã lỡ tải về một nơi khác, chỉ cần di chuyển nó đến đúng vị trí: sudo mv /đường/dẫn/sai/docker-compose /usr/local/bin/.
  2. Không cấp quyền thực thi: Đây là nguyên nhân phổ biến nhất. File đã được tải về đúng chỗ nhưng hệ điều hành không biết rằng nó có thể được “chạy”. Bạn chỉ cần chạy lại lệnh cấp quyền thực thi: sudo chmod +x /usr/local/bin/docker-compose.

Sau khi thực hiện một trong hai bước trên, hãy thử lại lệnh docker-compose --version để xác nhận lỗi đã được khắc phục.

Hình minh họa

Lỗi khi chạy docker-compose với quyền user thường

Một lỗi phổ biến khác là lỗi về quyền khi bạn cố gắng chạy docker-compose up mà không có sudo. Bạn có thể nhận được một thông báo lỗi dài dòng chứa cụm từ permission denied while trying to connect to the Docker daemon socket. Lỗi này xảy ra vì theo mặc định, chỉ có người dùng root và các thành viên của nhóm docker mới có quyền giao tiếp với Docker Engine.

Nguyên nhân và cách khắc phục:

Vấn đề nằm ở chỗ người dùng hiện tại của bạn không thuộc nhóm docker. Việc luôn phải sử dụng sudo cho mọi lệnh docker hoặc docker-compose là rất bất tiện và không phải là cách làm tốt nhất.

Để giải quyết triệt để, bạn cần thêm người dùng hiện tại của mình vào nhóm docker. Hãy chạy lệnh sau:

sudo usermod -aG docker ${USER}

Trong đó, -aG có nghĩa là thêm (append) người dùng vào một nhóm (Group) bổ sung. ${USER} là một biến hệ thống sẽ tự động lấy tên người dùng hiện tại của bạn.

Lưu ý quan trọng: Sau khi chạy lệnh này, thay đổi sẽ không có hiệu lực ngay lập tức. Bạn cần phải đăng xuất khỏi phiên làm việc hiện tại và đăng nhập lại, hoặc khởi động lại máy chủ để hệ thống cập nhật lại quyền cho người dùng của bạn. Sau đó, bạn có thể chạy các lệnh docker-compose mà không cần sudo.

Những kinh nghiệm và mẹo hay khi sử dụng Docker Compose

Khi bạn đã quen với những điều cơ bản, đã đến lúc nâng cao kỹ năng của mình với các mẹo và thủ thuật chuyên nghiệp. Những kinh nghiệm này sẽ giúp bạn làm việc với Docker Compose một cách ngăn nắp, linh hoạt và hiệu quả hơn, đặc biệt là trong các dự án lớn hoặc khi làm việc nhóm.

  • Tổ chức cấu hình YAML rõ ràng, comment đầy đủ: File docker-compose.yml có thể trở nên rất dài và phức tạp. Hãy dành thời gian để sắp xếp các dịch vụ một cách logic và quan trọng nhất là sử dụng comment (#) để ghi chú. Giải thích tại sao một cấu hình cụ thể được sử dụng, hoặc một biến môi trường có ý nghĩa gì. Điều này sẽ giúp chính bạn trong tương lai và cả những đồng đội khác khi đọc file.
  • Sử dụng môi trường biến (.env files) để tái sử dụng cấu hình: Đây là một trong những tính năng mạnh mẽ nhất. Thay vì hard-code các giá trị như mật khẩu, phiên bản image, hoặc port vào file YAML, bạn có thể tạo một file tên là .env trong cùng thư mục. Docker Compose sẽ tự động đọc các biến trong file này. Ví dụ, trong .env bạn có TAG=latest, thì trong file YAML bạn có thể dùng image: nginx:${TAG}. Điều này giúp bạn dễ dàng thay đổi cấu hình giữa môi trường development và production mà không cần sửa file YAML.
  • Hình minh họa

  • Đặt tên container, network dễ nhận biết: Mặc định, Docker Compose sẽ tạo tên cho các tài nguyên dựa trên tên thư mục. Điều này có thể gây khó hiểu. Bạn có thể tự đặt tên cho container bằng thuộc tính container_name và cho network bằng thuộc tính name. Một quy ước đặt tên rõ ràng (ví dụ: projectname-service-dev) sẽ giúp bạn dễ dàng xác định và quản lý các tài nguyên hơn.
  • Kiểm tra logs và debug thường xuyên: Đừng chờ đến khi có lỗi mới xem logs. Hãy tập thói quen sử dụng docker-compose logs -f (với -f để theo dõi logs theo thời gian thực) trong quá trình phát triển. Điều này giúp bạn phát hiện các vấn đề tiềm ẩn và hiểu rõ hơn về cách các dịch vụ tương tác với nhau.
  • Không sử dụng Docker Compose cho production phức tạp mà không có biện pháp dự phòng: Docker Compose rất tuyệt vời cho môi trường phát triển, testing và các ứng dụng production đơn giản. Tuy nhiên, nó thiếu các tính năng tự động phục hồi (self-healing), cân bằng tải nâng cao và quản lý cluster quy mô lớn. Đối với các hệ thống production quan trọng, hãy cân nhắc sử dụng các công cụ điều phối mạnh mẽ hơn như Docker Swarm hoặc Kubernetes, đồng thời luôn có kế hoạch backup dữ liệu và cấu hình đầy đủ.

Kết luận

Qua bài viết chi tiết này, chúng ta đã cùng nhau đi qua hành trình từ việc chuẩn bị một hệ thống Ubuntu 20.04 sạch sẽ, cài đặt Docker Engine, cho đến việc làm chủ Docker Compose. Bạn đã thấy được rằng, thay vì phải vật lộn với hàng loạt lệnh Docker phức tạp, Docker Compose mang đến một giải pháp thanh lịch và hiệu quả để định nghĩa, chạy và quản lý các ứng dụng đa container chỉ với một file cấu hình duy nhất.

Việc sử dụng Docker Compose không chỉ giúp tiết kiệm thời gian, giảm thiểu sai sót mà còn tạo ra một môi trường làm việc nhất quán và dễ dàng tái tạo. Từ các dự án cá nhân nhỏ cho đến các môi trường phát triển phức tạp của doanh nghiệp, công cụ này đều chứng tỏ được giá trị to lớn của mình. Đừng ngần ngại, hãy áp dụng ngay những kiến thức này vào dự án tiếp theo của bạn để cảm nhận sự khác biệt. Quản lý container chưa bao giờ dễ dàng và trực quan đến thế.

Bước tiếp theo trên con đường chinh phục thế giới container của bạn là gì? Sau khi đã thành thạo Docker Compose, bạn có thể tìm hiểu sâu hơn về các công nghệ điều phối ở quy mô lớn hơn như Docker Swarm để quản lý một cụm máy chủ, hoặc Kubernetes – tiêu chuẩn vàng trong ngành công nghiệp cho việc triển khai và mở rộng các ứng dụng container phức tạp. Chúc bạn thành công trên hành trình công nghệ của mình!

Hình minh họa

Đánh giá
Tác giả

Mạnh Đức

Có cao nhân từng nói rằng: "Kiến thức trên thế giới này đầy rẫy trên internet. Tôi chỉ là người lao công cần mẫn đem nó tới cho người cần mà thôi !"

Chia sẻ