Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu cách cài đặt Docker trên các hệ điều hành phổ biến, các câu lệnh cơ bản để chạy và quản lý container, image của mình. Nếu bạn chưa nắm rõ khái niệm về Docker, cách hoạt động và lợi ích của nó với lập trình viên, mình khuyến khích bạn đọc bài viết này trước khi tiếp tục.
1. Hướng dẫn cài đặt Docker
1.2 Cài đặt Docker trên Windows
Bước 1: Tải ứng dụng Docker Desktop tại đường link, lưu ý nếu máy tính của bạn dùng chip ARM thì chúng ta sử dụng phiên bản dưới, nếu sử dụng chip x86/x64 của Intel và AMD thì tải phiên bản trên.
Nếu bạn muốn dùng Docker để phát triển các ứng dụng chạy trên hệ điều hành Windows thì phải cài windows 10 hoặc 11 bản Pro trở lên nhé.
Bước 2: Double click vào file Docker Desktop Installer.exe
đã download ở bước 1 để bắt đầu cài đặt. Mặc định, Docker Desktop
được cài đặt tại đường dẫn C:\Program Files\Docker\Docker
.
Bước 3: Nếu như máy tính của bạn hỗ trợ cả 2 chế độ Use WSL 2 và Hyper-V Docker sẽ hỏi bạn muốn chọn option nào, bạn click chọn WSL 2 vì nó là công nghệ mới hơn và có hiệu suất tốt hơn Hyper-V trước đây. Nếu hệ thống không hỏi gì tức là máy của bạn không hỗ trợ WSL 2, Docker sẽ mặc định chọn Hyper-V.
Bước 4: Chon tiếp tục cài đặt cho tới khi kết thúc.
1.2 Cài đặt Docker trên MacOS
Bước 1: Tải ứng dụng Docker Desktop tại đường link, lưu ý nếu máy tính của bạn dùng chip của Apple (từ dòng máy M1 trở về sau) thì chúng ta sử dụng phiên bản trên, nếu sử dụng chip x86/x64 của Intel và AMD thì tải phiên bản dưới.
Bước 2: Double click vào file Docker.dmg
đã download ở bước 1 để mở trình cài đặt, sau đó kéo biểu tượng Docker vào thư mục Applications. Mặc định, Docker Desktop sẽ được cài đặt tại đường dẫn /Applications/Docker.app
.
1.3 Cài đặt Docker trên Linux
Mình sẽ hướng dẫn cài đặt Docker trên hệ điều hành Ubuntu.
Bước 1: Thiết lập kho lưu trữ (repository) apt
của Docker trên Ubuntu. Mở terminal và chạy các lệnh sau.
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
Bước 2: Cài đặt package Docker
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
2. Hướng dẫn sử dụng Docker
2.1 Khởi động/Đóng Docker
Các bạn gõ Docker vào mục tìm kiếm trên Windows và MacOS để khởi động ứng dụng.
Khi muốn đóng, tạm dừng, khởi động lại Docker, các bạn click chuột phải vào biểu tượng Docker ở menu phía trên bên phải với MacOS và menu phía dưới bên phải với Windows -> chọn Quit Docker Desktop
.
2.2 Pull Docker Image
Trước khi đi vào phần thực hành chúng ta cần trả lời câu hỏi, Docker Image là gì và tại sao bạn lại cần làm việc với nó, mình đã đề cập đến về tính cô lập (isolation) của các container Docker trong bài viết trước đó.
Ví dụ: Bạn hoàn toàn có thể chạy 2 phiên bản mysql 5.6
và mysql 8.0
trên máy cá nhân mà không cần phải "thực sự" cài đặt bất kì chương trình gì trên máy tính cả, cũng không cần phải sợ xung đột khi 2 version này cùng dùng cổng 3306
(cổng mặc định của mysql), chúng hoàn toàn có thể hoạt động độc lập và không biết đến sự tồn tại của phiên bản kia, cũng như không biết đến trên máy bạn có cài mysql hay chưa.
Việc đầu tiên bạn cần làm là phải kéo (pull) về 2 image mysql 5.6 và 8.0 từ docker registry hay còn gọi là Docker Hub. Image sẽ chứa tất cả những gì bạn cần để chạy mysql nên trước khi chạy chúng ta cần download nó về máy.
- Bước 1: Mở ứng dụng Docker hoặc truy Docker Hub online.
- Bước 2: Search chữ
mysql
ở khung tìm kiếm, với bản web thì khung search nằm ngay chính giữa, với App trên máy thì nằm ở phía trên cùng.
- Bước 3: Click chọn vào image mysql đầu tiên (hơn 1 tỷ lượt tải), có chứng nhận
Docker Official Image
, với bản web các bạn chọn vào mụcTag
, gõ vào chữ 5.6 để tìm mysql version 5.6. Với bản App thì chúng ta không thể search được cái phiên bản xa trước đó mà chỉ có các phiên bản gần đây, nên mình khuyên các bạn dùng bạn web nhé.
- Bước 4: Để pull docker image về các bạn copy câu lệnh docker pull ở hình đầu tiên bên trên, sau đó mở ứng dụng terminal trên Mac hoặc PowerShell, Windows Terminal trên windows và chạy câu lệnh này, mình sẽ pull luôn 2 image mysql 5.6 và 8.0.
Lưu ý không có phiên bản mysql 5.6 cho chip arm, nên mình dùng bản 9.0 thay thế trong demo này. Nếu các bạn chỉ chạy câudocker pull mysql
thôi mà không điền version thì docker sẽ mặc định lấy version latest cho bạn như hình bên dưới.
docker pull mysql:5.6
docker pull mysql:8.0
2.3 Liệt kê Docker Image
Để liệt kê danh sách các image docker đã download về máy, bạn có thể chọn phần Image ở menu dọc bên trái app Docker hoặc gõ dòng lệnh docker images
vào terminal.
2.4 Xoá Docker Image
Khi muốn xoá một Docker Image bất kì bạn có thể tích chọn image đó và nhấn Delete trên app Docker hoặc nhấn nút thùng rác trên từng dòng, trên terminal thì chúng ta gõ docker rmi image_name:version
, nếu bạn không gõ version hệ thống sẽ mặc định xoá version latest
.
Nếu như có bất kì container nào đang sử dụng image này thì docker sẽ báo lỗi Error response from daemon: conflict: unable to delete [IMAGE_ID] (must be forced) - image is being used by stopped container [CONTAINER_ID]
, nếu vẫn muốn xoá bạn cần phải thêm chữ -f
(force) vào câu lệnh, lúc này hệ thống sẽ vừa xoá image vừa xoá luôn tất cả container nào đang dùng image này. Ví dụ docker rmi -f mysql
.
2.5 Khởi tạo Container
Câu lệnh docker run
được dùng để tạo và chạy một container từ một Docker Image. Bạn cần phải cung cấp cho câu lệnh này các tuỳ chọn (options) và tên image mà bạn muốn nó khởi tạo. Cụ thể bên dưới mình sẽ khởi tạo 2 container mysql 8.0 và 9.0 (bạn nào chạy được 5.6 thì cứ dùng version đó nhé).
docker run --name mysql-8 -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=mydb -e MYSQL_USER=myuser -e MYSQL_PASSWORD=mypassword -d -p 3309:3306 -v my-mysql-data-8:/var/lib/mysql mysql:8.0
docker run --name mysql-9 -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=mydb -e MYSQL_USER=myuser -e MYSQL_PASSWORD=mypassword -d -p 3308:3306 -v my-mysql-data-9:/var/lib/mysql mysql:9.0
Các tuỳ chọn bao gồm:
- --name: Tùy chọn này đặt tên cho container là
mysql-8,mysql-9
. Việc gán tên này giúp bạn dễ dàng quản lý và tham chiếu đến container sau này, thay vì phải sử dụng ID ngẫu nhiên mà Docker tự động tạo. - -e: Là viết tắt của "environment variable" (biến môi trường), biến môi trường này đặt mật khẩu cho tài khoản
root
của MySQL. Trong ví dụ này, chúng ta có 3 biến môi trường, mật khẩuroot
được đặt làmy-secret-pw
, user mặc định làmyuser
và pasword làmypassword
. - -d: Tùy chọn này chạy container ở chế độ nền (detached mode), có nghĩa là container sẽ chạy ở background và không chiếm quyền điều khiển terminal của bạn, mình luôn luôn sử dụng detached mode khi khởi tạo container.
- -p: Tùy chọn này ánh xạ (map) cổng
3306
bên trong container (cổng mặc định của MySQL) tới cổng3309
hay3308
trên máy host (máy của mình). Bạn có thể kết nối MySQL qualocalhost:3309
haylocalhost:3308
, 2 container này đều sẽ không xung đột với mysql đang được cài trên máy, sử dụng cổng 3306. Lưu ý là bạn chỉ có thể chọn map ra các cổng đang không được các service khác sử dụng, nếu đang bị sử dụngDocker sẽ báo lỗi. - -v: Tùy chọn này tạo một volume (ổ đĩa ảo) để lưu trữ dữ liệu MySQL. Volume
my-mysql-data-8
,my-mysql-data-9
trên máy host được gắn vào thư mục/var/lib/mysql
bên trong container. Điều này có nghĩa là dữ liệu của MySQL sẽ được lưu trên máy host trong volumemy-mysql-data
, đảm bảo rằng dữ liệu không bị mất nếu container bị xóa hoặc khởi động lại. - mysql:9.0: Docker Image và phiên bản.
Nếu bạn thắc mắc là Docker Image bất kì có bao nhiêu biến môi trường và tên của chúng ta gì thì bạn có thể tham khảo trong phần hướng dẫn của nhà phát hành trên Docker Hub, một Docker Image đạt chuẩn sẽ có phần hướng dẫn rõ ràng cho bạn như hình bên dưới.
2.6 Liệt kê Container
Để liệt kê tất cả container đang ở trạng thái running
và stopped
bạn dùng câu lệnh docker ps -a
, để liệt kê các container đang chạy bạn dùng câu lệnh docker ps
. Nếu dùng app Docker thì chúng ta xem trong menu Container ở góc trái
2.7 Xoá Container
Bạn dùng lệnh docker rm container_name
để xoá container đang dừng (stopped) và lệnh docker rm -f container_name
để xoá container đang chạy (bắt buộc dừng vào xoá). Bạn cũng có thể click chọn vào biểu tượng thùng rác trong app Docker
2.8 Dừng Container
Để dừng container, bạn dùng câu lệnh docker stop container_name
, hoặc click chọn vào nút Stop trên giao diện
2.9 Tự tạo Docker Image
Nếu bạn cảm thấy các Image docker có sẵn trên Docker Hub không đáp ứng được nhu cầu của mình: cài quá nhiều thư viện dư thừa làm cho image nặng hơn, thiếu một số thư viện cần thiết, version của thư viện quá mới, quá cũ, ... Bạn hoàn toàn có thể tự tạo một Docker Image riêng phù hợp với dự án của mình.
Ví dụ: Mình sẽ tạo một Image có cài python 3.8, mysq 8.0 và Jupyter Notebook.
- Bước 1: Tạo một tệp có tên là
Dockerfile
trong một folder bất kì có nội dung như sau.
# Sử dụng image Ubuntu làm base image
FROM ubuntu:20.04
# Thiết lập các biến môi trường không tương tác
ENV DEBIAN_FRONTEND=noninteractive
# Cập nhật và cài đặt các gói cần thiết
RUN apt-get update && apt-get install -y \
python3.8 \
python3-pip \
mysql-server-8.0 \
&& apt-get clean
# Cài đặt Jupyter Notebook
RUN pip3 install jupyter
# Đặt Python 3.8 làm phiên bản Python mặc định
RUN update-alternatives --install /usr/bin/python python /usr/bin/python3.8 1
# Khởi động MySQL và chạy Jupyter Notebook khi container bắt đầu
CMD service mysql start && jupyter notebook --ip=0.0.0.0 --allow-root --no-browser
- Bước 2: Mở terminal và điều hướng đến folder chứa tệp
Dockerfile
, gõ lệnhdocker build
như sau,-t my-python-mysql-jupyter
là tên Docker Image và.
chỉ định rằng Dockerfile nằm trong thư mục hiện tại.
docker build -t my-python-mysql-jupyter .
Sau khi đã tạo xong Docker Image bạn có thể kiểm tra lại bằng lệnh docker images
, sau đó chúng ta có thể sử dụng Image này khởi tạo các container.
3. Kết luận
Mình nghĩ việc tìm hiểu về Docker cũng quan trọng không kém so với ngôn ngữ lập trình, đặc biệt với các bạn đang làm về Backend và DevOps bởi những lợi ích mà nó mang lại. Docker không chỉ giúp bạn tạo ra một môi trường phát triển nhất quán và dễ dàng triển khai ứng dụng trên nhiều nền tảng, mà còn giúp giảm thiểu các vấn đề phổ biến khi chuyển giao phần mềm giữa các môi trường khác nhau. Hy vọng rằng bài viết này đã cung cấp cho bạn những kiến thức cơ bản và các bước cần thiết để cài đặt và sử dụng Docker một cách hiệu quả.
Các bài viết liên quan tại Blog 200Lab:
Bài viết liên quan
Grafana Loki là gì? So sánh Loki và Elasticsearch
Nov 16, 2024 • 6 min read
Webhook là gì? So sánh Webhook và API
Nov 15, 2024 • 8 min read
Two-Factor Authentication (2FA) là gì? Vì sao chỉ Mật khẩu thôi là chưa đủ?
Nov 13, 2024 • 7 min read
ELK là gì? So sánh hiệu suất giữa ELK và PLG
Nov 06, 2024 • 9 min read
Docker Best Practices: Tối ưu Dung lượng Docker Image
Oct 30, 2024 • 8 min read
SQL Injection là gì? Những cách phòng ngừa SQL Injection
Oct 25, 2024 • 10 min read