Skip to main content

2. Cài đặt Docker

Mục lục​


Biết vì sao container ra đời và Docker là ai rồi, giờ mới tới lúc có Docker chạy trên máy. Docker cài được theo rất nhiều cách và ở rất nhiều nơi: Windows, Mac, Linux, trên cloud, on-premises, ngay trên laptop cá nhân; cài thủ công, cài bằng script, cài bằng wizard... Đừng để danh sách đó làm bạn ngợp, nhìn chung tất cả đều dễ. Phần này đi qua 4 cách cài phổ biến nhất: Docker for Windows, Docker for Mac, cài trên Linux (server), và cài trên Windows Server 2016.

Các bước và output lệnh dưới đây phản ánh đúng quy trình tại thời điểm sách gốc phát hành (2017, Docker bản 17.05/17.03). Giao diện cài đặt Docker Desktop và cấu trúc trang docker.com hiện tại đã thay đổi khá nhiều so với mô tả này. Nên đọc phần này để nắm khái niệm (Docker for Windows/Mac chạy daemon trong 1 Linux VM ẩn, sự khác biệt CE/EE, cách verify cài đặt...) hơn là làm theo từng bước y hệt để cài Docker mới nhất.


1. Docker for Windows (DfW)​

Nếu máy đang dùng là laptop/desktop Windows 10, đây là con đường ngắn nhất để có Docker chạy được: không cần tự tay dựng VM, không cần biết gì về kernel Linux. Docker, Inc. đóng gói sẵn toàn bộ thành 1 installer duy nhất, gọi là Docker for Windows (DfW), dựng sẵn 1 môi trường Docker single-engine ngay trên máy.

Đổi lại sự tiện lợi đó là 2 giới hạn cần biết trước khi cài:

  • Đây là bản Community Edition (CE), nhắm tới máy cá nhân để học/dev, không nhắm tới workload production.
  • Có thể có độ trễ tính năng (feature-lag) so với công nghệ mới nhất, vì Docker, Inc. ưu tiên ổn định trước, tính năng sau với sản phẩm desktop này.

Nói gọn lại: cài nhanh, dùng dễ, nhưng đừng mang lên production.

Yêu cầu trước khi cài (prerequisite)​

Nhìn qua giống yêu cầu phần cứng thông thường, nhưng 3 trong 4 điều dưới đây tồn tại chỉ vì đúng 1 lý do: Windows không có sẵn Linux kernel, nên Docker phải tự dựng 1 VM ẩn phía sau để mượn kernel đó chạy container. Hyper-V và ảo hóa phần cứng chính là nền để dựng VM ẩn ấy (phần "Hình dung" bên dưới sẽ giải thích rõ hơn ngay sau khi cài xong). Thiếu 1 trong 4 điều kiện sau, installer sẽ dừng lại ngay từ bước đầu:

  • Windows 10 Pro / Enterprise / Education (bản cập nhật November 2015 trở lên, build 10586+).
  • Phải là hệ điều hành 64-bit.
  • Tính năng Hyper-V và Containers phải được bật trong Windows.
  • Hỗ trợ ảo hóa phần cứng (hardware virtualization) phải được bật trong BIOS.

Các bước cài đặt​

3 bước dưới đây phải đi đúng thứ tự này: bật tính năng OS trước, vì tải installer về mà máy chưa bật Hyper-V/Containers, wizard sẽ báo thiếu tính năng và dừng cài giữa chừng.

  1. Bật tính năng Hyper-V và Containers: chuột phải nút Start → Apps and Features → Programs and Features → Turn Windows features on or off → tick chọn Hyper-V và Containers → OK. Có thể cần khởi động lại máy. (Tính năng Containers chỉ khả dụng từ bản Windows 10 Anniversary Update, build 14393, trở lên.)
  2. Vào www.docker.com, chọn Get Docker → Windows trong mục Desktop → Download from Docker Store (Docker Store sau này đã sáp nhập vào Docker Hub, xem Nguồn tham khảo) → chọn 1 trong các link tải (có cả bản stable và bản edge, bản edge có tính năng mới hơn nhưng có thể chưa ổn định).
  3. Chạy file InstallDocker.msi vừa tải, đi theo wizard, nhập quyền admin cục bộ để hoàn tất. Docker sẽ tự khởi động như 1 system service, xuất hiện icon cá voi Moby Dock trên khay hệ thống (notification tray).

Cài xong không có nghĩa là daemon đã sống. Cách chắc chắn nhất để biết là mở Command Prompt hoặc PowerShell, gõ thử:

C:\> docker version
# Output minh họa
Client: Docker Engine - Community
Version: 17.06.0-ce
OS/Arch: windows/amd64

Server: Docker Engine - Community
Engine:
Version: 17.06.0-ce
OS/Arch: linux/amd64

(Output minh họa: cấu trúc và tên field đúng theo lệnh thật, số version cụ thể chỉ mang tính ví dụ.)

Kết quả mặc định cho thấy phần Client chạy OS/Arch: windows/amd64, nhưng phần Server lại chạy OS/Arch: linux/amd64, vì mặc định daemon Docker được cài bên trong 1 Linux VM nhẹ chạy trên Hyper-V. Ở chế độ đó, bạn chỉ chạy được Linux container trên Docker for Windows.

💡 Hình dung: container luôn cần cắm vào đúng "ổ điện" Linux kernel mới chạy được. Windows và macOS không có sẵn loại ổ điện đó, nên Docker phải giấu 1 bộ chuyển đổi điện áp phía sau (chính là Linux VM ẩn) để container vẫn cắm vào và chạy bình thường. Linux server thì đã có sẵn đúng ổ điện đó, nên cắm thẳng, không cần bộ chuyển đổi nào cả.

4 cách cài Docker: qua VM ẩn hay chạy trực tiếp?Windows DesktopMac DesktopLinux ServerWindows ServerContainersContainersContainersContainersDocker daemonDocker daemonDocker daemonDocker daemonHidden Linux VMHidden Linux VMchạy trực tiếp(không qua VM)chạy trực tiếp(không qua VM)Windows 10macOSLinux kernelWindows Server= cần 1 lớp VM ẩn phía sau= chạy thẳng trên kernel, không cần VMDocker container luôn cần kernel Linux — thiếu sẵn thì phải mượn qua 1 VM ẩn

Muốn chạy Windows container gốc, chuột phải icon cá voi trên khay hệ thống, chọn Switch to Windows containers..., hoặc chạy lệnh tương đương từ dòng lệnh:

C:\Program Files\Docker\Docker>dockercli -SwitchDaemon

Lệnh này chạy ngầm, không in output gì ra màn hình. Cách duy nhất để xác nhận đã chuyển thành công là chạy lại docker version và nhìn giá trị OS/Arch phần Server. Sau khi chuyển, phần Server sẽ hiện OS/Arch: windows/amd64, nghĩa là daemon giờ chạy trực tiếp trên kernel Windows, và từ đây chỉ chạy được Windows container.

Kiểm tra channel đang chạy (stable/edge) bằng dockercli -Version (nằm ở C:\Program Files\Docker\Docker).

Một lần cài DfW thực chất mang về nhiều công cụ cùng lúc: Docker Engine, Docker Compose, Docker Machine, Notary CLI. Mỗi thứ là 1 binary riêng, tự mang version riêng, không nhất thiết tăng version đồng bộ với nhau.

💡 Hình dung: giống 1 bộ dụng cụ đa năng (multi-tool), cả hộp bán chung 1 lần, nhưng mỗi lưỡi bên trong lại có số hiệu sản xuất riêng. Muốn biết chắc "lưỡi kéo" (Compose) có đúng bản mong muốn hay không, phải hỏi riêng nó; hỏi cả hộp không cho ra câu trả lời đó.

Vì vậy đừng chỉ tin đúng 1 lệnh docker version. Muốn chắc từng thành phần đã cài đúng, kiểm tra riêng bằng docker --version, docker-compose --version, docker-machine --version, notary version; còn docker info cho thêm số liệu vận hành (container/image hiện có, cấu hình engine...) chứ không chỉ là version.


2. Docker for Mac (DfM)​

Docker for Mac cũng là sản phẩm đóng gói sẵn từ Docker, Inc., dựa trên bản Community Edition: không cần biết gì về kernel engineering, không cần hack phức tạp gì để chạy Docker trên Mac. Nếu từng biết tới boot2docker, Docker for Mac chính là phiên bản mượt mà, đơn giản, ổn định hơn hẳn mà bạn từng mong boot2docker trở thành.

Cũng giống Docker for Windows, Docker for Mac không chạy Docker Engine trực tiếp trên kernel Darwin của macOS. Phía sau, daemon Docker chạy bên trong 1 Linux VM nhẹ, rồi expose daemon/API đó ra môi trường Mac. Vì bản chất vẫn là Docker chạy trên Linux, nó chỉ chạy được container Linux, nhưng đó cũng chính là nơi phần lớn "hành động" của container diễn ra nên không phải vấn đề lớn.

Docker for Mac dùng HyperKit để hiện thực 1 hypervisor cực nhẹ (HyperKit dựa trên hypervisor xhyve, chạy trên Hypervisor.framework của macOS), tận dụng thêm tính năng từ DataKit, và chạy 1 bản Linux distro được tinh chỉnh riêng tên Moby, dựa trên nền Alpine Linux.

Các bước cài đặt​

5 bước sau đều thao tác qua UI, không đụng dòng lệnh nào, đúng tinh thần "cài xong quên luôn" mà Docker for Mac hướng tới:

  1. Vào www.docker.com → Get Docker → Mac trong mục Desktop → Download from Docker Store (nay đã là Docker Hub) → chọn link tải (stable hoặc edge).
  2. Mở file Docker.dmg vừa tải, kéo-thả icon cá voi Moby Dock vào thư mục Applications.
  3. Mở Applications, double-click icon Docker để khởi động (có thể cần xác nhận vì app tải từ internet).
  4. Nhập password để installer tạo các thành phần cần quyền cao hơn (như networking).
  5. Docker daemon khởi động: icon cá voi hoạt hình xuất hiện trên status bar, ngừng hoạt hình khi daemon khởi động xong. Click vào icon để restart daemon, check update, hoặc mở UI.

Cũng như bên Windows, cài xong chưa chắc daemon đã sống. Mở terminal và thử ngay:

$ docker version
# Output minh họa
Client: Docker Engine - Community
Version: 17.06.0-ce
OS/Arch: darwin/amd64

Server: Docker Engine - Community
Engine:
Version: 17.06.0-ce
OS/Arch: linux/amd64
Experimental: true

(Output minh họa: cấu trúc và tên field đúng theo lệnh thật, số version cụ thể chỉ mang tính ví dụ.)

Tương tự Windows, phần Server hiện OS/Arch: linux/amd64 (daemon chạy trong Linux VM ẩn), còn phần Client là app Mac chạy trực tiếp trên kernel Darwin (OS/Arch: darwin/amd64). Nếu đang chạy channel edge, output còn hiện Experimental: true.

Chạy thêm docker info để xem thống kê container/image hiện có. Giống bên Windows, DfM cũng cài kèm nhiều thành phần cùng lúc (Docker Engine, Compose, Machine, Notary), mỗi thứ mang version riêng, nên verify riêng từng cái bằng:

$ docker --version
$ docker-compose --version
$ docker-machine --version
$ notary version
# Output minh họa (mỗi dòng ứng với đúng 1 lệnh gọi phía trên, theo thứ tự)
Docker version 17.06.0-ce, build 02c1d87
docker-compose version 1.14.0, build c7bdf9e
docker-machine version 0.12.0, build 2929ea9
notary version 0.5.0 (sha1: 26cbf51 go1.8.1 linux/amd64)

(Output minh họa: số version cụ thể chỉ mang tính ví dụ.)


3. Cài Docker trên Linux​

Không như 2 phần trên, ở đây không có VM ẩn nào để dựng cả. Linux server vốn đã có sẵn đúng "ổ điện" Linux kernel, nên Docker cắm thẳng, không cần bộ chuyển đổi nào. Đây cũng là lý do cài Docker trên Linux vừa phổ biến nhất vừa khá dễ, khó khăn thường gặp nhất chỉ là khác biệt nhỏ giữa các distro (Ubuntu vs CentOS...). Ví dụ dưới đây dùng Ubuntu nhưng cũng chạy được trên CentOS và các bản fork upstream/downstream của cả hai. Máy Linux là server vật lý trong data center riêng, ở nửa vòng trái đất trên public cloud, hay chỉ là 1 VM trên laptop đều được, miễn máy chạy Linux và truy cập được https://get.docker.com.

Trước khi cài cần chọn edition. Community Edition (CE) miễn phí, và là bản dùng trong ví dụ này. Enterprise Edition (EE) giống CE nhưng kèm hỗ trợ thương mại và quyền truy cập các sản phẩm khác như Docker Trusted Registry, Universal Control Plane. Cách chia 2 bản này chỉ đúng trong giai đoạn sách được viết; mảng Enterprise sau đó đã tách khỏi Docker, Inc. (xem Nguồn tham khảo).

Nên đảm bảo hệ thống đã cập nhật đủ package và bản vá bảo mật mới nhất trước khi cài.

Các bước cài đặt​

Về bản chất chỉ có 3 việc phải làm: lấy Docker về máy, cho phép user hiện tại dùng Docker mà không cần gõ sudo trước mỗi lệnh, rồi verify lại.

  1. Mở shell trên máy Linux.
  2. Dùng wget gọi shell script cài Docker CE:
$ wget -qO- https://get.docker.com/ | sh
# Output minh họa (rút gọn)
+ sh -c apt-get update -qq >/dev/null
+ sh -c apt-get install -y -qq apt-transport-https ca-certificates curl >/dev/null
+ sh -c 'apt-get install -y -qq docker-ce >/dev/null'
Client: Docker Engine - Community
Version: 24.0.7
Server: Docker Engine - Community
Engine:
Version: 24.0.7

If you would like to use Docker as a non-privileged user, you should now consider
adding your user to the "docker" group with something like:

sudo usermod -aG docker your-user

(Output minh họa: rút gọn, các bước cài package trên thực tế dài hơn nhiều; số version cụ thể chỉ mang tính ví dụ.)

Script này do chính Docker, Inc. duy trì và vẫn còn hoạt động, nhưng chỉ khuyến nghị dùng cho test/dev. Với hệ thống production, Docker khuyến nghị cài qua package manager theo hướng dẫn chính thức từng distro (xem Nguồn tham khảo).

  1. Nên chỉ dùng non-root user khi làm việc với Docker, bằng cách thêm user vào group docker cục bộ:
$ sudo usermod -aG docker <tên-user>
$ cat /etc/group | grep docker
docker:x:999:<tên-user>

Nếu đang đăng nhập bằng chính user vừa thêm, cần logout rồi login lại để quyền group có hiệu lực.

  1. Verify cài đặt:
$ docker --version
$ docker info
# Output minh họa (rút gọn)
Docker version 24.0.7, build afdd53b

Client:
Context: default
Debug Mode: false

Server:
Containers: 0
Images: 0
Server Version: 24.0.7
Storage Driver: overlay2
Kernel Version: 5.15.0-91-generic
Operating System: Ubuntu 22.04.3 LTS
Architecture: x86_64
CPUs: 2
Total Memory: 3.822GiB
Docker Root Dir: /var/lib/docker
Registry: https://index.docker.io/v1/

(Output minh họa: rút gọn, cấu trúc và tên field đúng theo lệnh thật, số liệu cụ thể chỉ mang tính ví dụ.)

docker info giống 1 bảng tổng kiểm sức khỏe của daemon, gói gọn trong đúng 1 lệnh thay vì phải tra từng nơi: số container/image hiện có, kernel version, hệ điều hành, kiến trúc CPU, tổng RAM, Docker root dir (/var/lib/docker), chế độ debug, registry mặc định...

Nếu quy trình trên không hợp với distro đang dùng, có thể vào trang Docker Docs, chọn đúng distro để theo hướng dẫn chính thức (thường dùng package manager, nhiều bước hơn cách get.docker.com ở trên).

⚠️ Lưu ý: nếu cài Docker từ nguồn khác ngoài repository chính thức, có thể vô tình cài phải bản fork tùy biến riêng của vendor/distro, không tương thích ngược lên project Docker gốc. Nếu không chủ đích làm vậy, các bản vá/sửa lỗi từ vendor có thể không bao giờ được merge ngược về project chính thức, và những cài đặt kiểu này sẽ không được Docker, Inc. hay đối tác hỗ trợ thương mại chính thức.


4. Cài Docker trên Windows Server 2016​

Trên Windows Server không có UI cài đặt mượt như bản desktop, mọi thứ đi qua PowerShell và Server Manager. Đổi lại, đây là bản Enterprise Edition (EE) chạy thẳng lên kernel Windows, không phải mượn qua VM ẩn như Docker for Windows/Mac vừa nói ở trên. 3 bước chính: cài tính năng Windows Containers, cài Docker, verify cài đặt.

Trước tiên đảm bảo hệ thống đã cập nhật mới nhất (dùng lệnh sconfig, chọn option 6 để cài update, có thể cần restart).

Bước 1 — Cài tính năng Containers​

Chuột phải nút Start → Programs and Features (mở Server Manager) → Dashboard → Add Roles and Features → đi qua wizard tới trang Features → tick Containers → hoàn tất wizard (có thể cần restart).

Bước 2 — Cài Docker (qua PowerShell)​

> Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
> Install-Package -Name docker -ProviderName DockerMsftProvider
# Output minh họa
Name Version Source Summary
---- ------- ------ -------
Docker 17.06.0-ce DockerDefault Contains Docker EE...

(Output minh họa: cấu trúc và tên cột đúng theo lệnh thật, số version cụ thể chỉ mang tính ví dụ.)

Xác nhận cài package khi được hỏi. Sau khi cài xong, restart hệ thống.

Bước 3 — Verify​

> docker version
> docker info
# Output minh họa (rút gọn)
Client: Docker Engine - Enterprise
Version: 17.06.2-ee-6
OS/Arch: windows/amd64

Server: Docker Engine - Enterprise
Engine:
Version: 17.06.2-ee-6
OS/Arch: windows/amd64

(Output minh họa: cấu trúc và tên field đúng theo lệnh thật, số version cụ thể chỉ mang tính ví dụ; docker info trả về thêm rất nhiều dòng chi tiết khác, không liệt kê hết ở đây.)

docker version hiện cả Client và Server đều chạy OS/Arch: windows/amd64 (vì đây là bản EE chạy trực tiếp trên Windows Server, không qua Linux VM như bản desktop). Sau bước này, Docker đã sẵn sàng để bắt đầu chạy Windows container.


Danh sách lệnh chính​

LệnhCông dụng
docker versionXem version + kiến trúc (OS/Arch) của cả Client và Server — cách nhanh nhất để biết daemon đang chạy trực tiếp trên kernel hay qua VM ẩn
docker infoXem thông tin chi tiết hệ thống: số container/image, kernel version, OS, RAM, Docker root dir...
docker --version / docker-compose --version / docker-machine --version / notary versionVerify từng thành phần đã cài đúng, kèm số version cụ thể
dockercli -SwitchDaemon (Windows)Chuyển qua lại giữa chế độ Linux container và Windows container trên Docker for Windows
dockercli -Version (Windows)Kiểm tra channel đang chạy (stable/edge)
wget -qO- https://get.docker.com/ | sh (Linux)Script cài Docker CE nhanh, dùng thay cho cài qua package manager thủ công
sudo usermod -aG docker <user> (Linux)Thêm user vào group docker để chạy lệnh Docker không cần sudo
Install-Package -Name docker -ProviderName DockerMsftProvider (Windows Server, PowerShell)Cài Docker EE trên Windows Server qua package provider

Theo kinh nghiệm vận hành thực tế, dù đang cài trên nền tảng nào, việc đầu tiên nên làm ngay sau khi cài xong luôn là chạy docker version và docker info để xác nhận daemon sống và biết chính xác mình đang chạy Linux container hay Windows container. Rất nhiều lỗi "container không chạy được" ban đầu chỉ là nhầm chế độ này.

Cài xong rồi thì bên trong Docker Engine thực chất gồm những gì, và điều gì xảy ra phía sau mỗi lần gõ docker container run? Đó là chủ đề phần tiếp theo.


Nguồn tham khảo​

Nguồn gốc: Bài viết lấy cảm hứng từ sách "Docker Deep Dive" — tác giả Nigel Poulton (bản phát hành version 4, 3/10/2017), Part 1: The Big Picture Stuff — chapter 3 "Installing Docker". Nội dung được viết lại theo cách hiểu riêng, không sao chép nguyên văn hay dịch sát nguyên bản. Muốn đọc bản đầy đủ hoặc ủng hộ tác giả, có thể mua sách tại leanpub.com/dockerdeepdive.

Đính chính/cập nhật (fact-check):

  • HyperKit (Docker for Mac) dựa trên hypervisor xhyve (không phải "xhive") — port của bhyve lên macOS, chạy trên Hypervisor.framework — moby/hyperkit
  • Docker Store đã sáp nhập vào Docker Hub — 2019, Docker Blog — The New Docker Hub
  • Script cài đặt get.docker.com vẫn do Docker, Inc. duy trì, nhưng chính thức khuyến nghị chỉ dùng cho test/dev, không dùng cho production — docker/docker-install
  • Mảng Enterprise của Docker (Docker Trusted Registry, Universal Control Plane, Docker Engine Enterprise) đã được bán cho Mirantis — 11/2019, Mirantis press release