Reading Time: 20 minutes

Docker là một ứng dụng giúp đơn giản hóa quá trình quản lý các tiến trình ứng dụng trong container. Container cho phép bạn chạy ứng dụng trong các tiến trình tách biệt về tài nguyên. Chúng tương tự như virtual machine, nhưng container có tính di động cao hơn, tiết kiệm tài nguyên hơn, và phụ thuộc nhiều hơn vào hệ điều hành của host.

 cài đặt và sử dụng Docker trên Ubuntu

Trong hướng dẫn này, bạn sẽ cài đặt và sử dụng Docker Community Edition (CE) trên Ubuntu. Bạn sẽ cài đặt Docker, làm việc với container và image, cũng như push một image lên Docker Repository.

Lưu ý: Bài viết này sẽ hướng dẫn bạn cách cài đặt Docker trên một Ubuntu server. Nếu bạn muốn có một cách triển khai ứng dụng Docker lên server thực tế chỉ với 1-click, hãy tham khảo DigitalOcean App Platform.

Điều kiện tiên quyết

Để làm theo hướng dẫn này, bạn cần có:

  • Một Ubuntu server đã được thiết lập theo Hướng dẫn thiết lập ban đầu cho Ubuntu Server, bao gồm một sudo non-root user và một firewall.
  • Một tài khoản trên Docker Hub nếu bạn muốn tạo image của riêng mình và push chúng lên Docker Hub, như được trình bày trong Step 7Step 8.

Cách cài đặt và sử dụng Docker trên Ubuntu

Bước 1 – Cài đặt Docker

Gói cài đặt Docker có sẵn trong official Ubuntu repository có thể không phải là phiên bản mới nhất. Để đảm bảo chúng ta nhận được phiên bản mới nhất, chúng ta sẽ cài đặt Docker từ official Docker repository.

Để làm điều đó, chúng ta sẽ thêm một package source mới, thêm GPG key từ Docker để đảm bảo các tệp tải xuống là hợp lệ, và sau đó tiến hành cài đặt gói.

Trước tiên, hãy cập nhật danh sách package hiện có của bạn:

sudo apt update

Tiếp theo, hãy cài đặt một vài prerequisite package cho phép apt sử dụng các package qua HTTPS:

sudo apt install apt-transport-https ca-certificates curl software-properties-common

Sau đó, hãy thêm GPG key cho official Docker repository vào hệ thống của bạn:

curl -fsSL <https://download.docker.com/linux/ubuntu/gpg> | sudo apt-key add -

Thêm Docker repository vào APT sources:

sudo add-apt-repository "deb [arch=amd64] <https://download.docker.com/linux/ubuntu> focal stable"

Điều này cũng sẽ cập nhật cơ sở dữ liệu package của chúng ta với các Docker package từ repo vừa được thêm.

Hãy đảm bảo rằng bạn sắp cài đặt từ Docker repo thay vì từ default Ubuntu repo:

apt-cache policy docker-ce

Bạn sẽ thấy output như thế này, mặc dù số phiên bản của Docker có thể khác:

Output of apt-cache policy docker-ce
docker-ce:
  Installed: (none)
  Candidate: 5:19.03.9~3-0~ubuntu-focal
  Version table:
     5:19.03.9~3-0~ubuntu-focal 500
        500 <https://download.docker.com/linux/ubuntu> focal/stable amd64 Packages

Lưu ý rằng docker-ce chưa được cài đặt, nhưng gói candidate để cài đặt là từ kho lưu trữ Docker dành cho Ubuntu (focal).

Cuối cùng, hãy cài đặt Docker:

sudo apt install docker-ce

Docker bây giờ đã được cài đặt, daemon đã được khởi động, và quá trình đã được bật để tự động chạy khi boot. Hãy kiểm tra để chắc chắn rằng nó đang chạy:

sudo systemctl status docker

Output sẽ tương tự như sau, cho thấy rằng service đang hoạt động và chạy:

Output
● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2020-05-19 17:00:41 UTC; 17s ago
TriggeredBy: ● docker.socket
       Docs: <https://docs.docker.com>
   Main PID: 24321 (dockerd)
      Tasks: 8
     Memory: 46.4M
     CGroup: /system.slice/docker.service
             └─24321 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Cài đặt Docker bây giờ không chỉ cung cấp cho bạn Docker service (daemon) mà còn cả docker command line utility, hay còn gọi là Docker client. Chúng ta sẽ tìm hiểu cách sử dụng docker command sau trong tutorial này.

Bước 2 – Thực thi Docker Command mà không cần Sudo (Tùy chọn)

Theo mặc định, docker command chỉ có thể được chạy bởi root user hoặc bởi một user nằm trong docker group, nhóm này được tạo tự động trong quá trình cài đặt Docker. Nếu bạn cố gắng chạy docker command mà không thêm tiền tố sudo hoặc không thuộc docker group, bạn sẽ nhận được output như sau:

Outputdocker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
See 'docker run --help'.

Nếu bạn muốn tránh phải gõ sudo mỗi khi chạy docker command, hãy thêm username của bạn vào docker group:

sudo usermod -aG docker ${USER}

Để áp dụng group membership mới, hãy đăng xuất khỏi server và đăng nhập lại, hoặc gõ lệnh sau:

su - ${USER}

Bạn sẽ được yêu cầu nhập password của user để tiếp tục.

Xác nhận rằng user của bạn đã được thêm vào docker group bằng cách gõ lệnh:

groups
Output
sammy sudo docker

Nếu bạn cần thêm một user vào docker group mà bạn không đăng nhập bằng user đó, hãy khai báo username một cách rõ ràng bằng cách sử dụng:

sudo usermod -aG docker username

Phần còn lại của bài viết này giả định rằng bạn đang chạy docker command với tư cách là một user trong docker group. Nếu bạn chọn không làm vậy, vui lòng thêm tiền tố sudo trước các command.

Tiếp theo, chúng ta hãy tìm hiểu docker command.

Bước 3 – Sử dụng Docker Command

Việc sử dụng docker bao gồm việc truyền cho nó một chuỗi option và command kèm theo argument. Cú pháp có dạng như sau:

docker [option] [command] [arguments]

Để xem tất cả các subcommand có sẵn, hãy gõ:

docker

Kể từ Docker 19, danh sách đầy đủ các subcommand có sẵn bao gồm:

Output  attach      Attach local standard input, output, and error streams to a running container
  build       Build an image from a Dockerfile
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff        Inspect changes to files or directories on a container's filesystem
  events      Get real time events from the server
  exec        Run a command in a running container
  export      Export a container's filesystem as a tar archive
  history     Show the history of an image
  images      List images
  import      Import the contents from a tarball to create a filesystem image
  info        Display system-wide information
  inspect     Return low-level information on Docker objects
  kill        Kill one or more running containers
  load        Load an image from a tar archive or STDIN
  login       Log in to a Docker registry
  logout      Log out from a Docker registry
  logs        Fetch the logs of a container
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  ps          List containers
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  rmi         Remove one or more images
  run         Run a command in a new container
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  search      Search the Docker Hub for images
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  version     Show the Docker version information
  wait        Block until one or more containers stop, then print their exit codes

Để xem các lựa chọn có sẵn cho một command cụ thể, hãy gõ:

docker docker-subcommand --help

Để xem thông tin toàn hệ thống về Docker, hãy sử dụng:

docker info

Hãy cùng tìm hiểu một số command này. Chúng ta sẽ bắt đầu với việc làm việc với image.

Bước 4 – Làm việc với Docker Images

Docker container được xây dựng từ Docker image. Theo mặc định, Docker sẽ pull các image này từ Docker Hub, một Docker registry được quản lý bởi Docker, công ty đứng sau dự án Docker.

Bất kỳ ai cũng có thể host Docker image của họ trên Docker Hub, vì vậy hầu hết các ứng dụng và bản phân phối Linux mà bạn cần sẽ có image được host tại đó.

Để kiểm tra xem bạn có thể truy cập và tải về image từ Docker Hub hay không, hãy gõ:

docker run hello-world

Kết quả hiển thị sẽ cho thấy rằng Docker đang hoạt động đúng cách:

OutputUnable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:6a65f928fb91fcfbc963f7aa6d57c8eeb426ad9a20c7ee045538ef34847f44f1
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.
...

Ban đầu Docker không tìm thấy image hello-world trong máy, nên nó đã tải image này từ Docker Hub, vốn là kho lưu trữ mặc định. Sau khi tải xong, Docker tạo một container từ image đó và ứng dụng bên trong container được thực thi, hiển thị thông điệp.”

Bạn có thể tìm kiếm các image có sẵn trên Docker Hub bằng cách dùng lệnh docker với subcommand search. Ví dụ, để tìm image của Ubuntu, hãy gõ:

docker search ubuntu

Script sẽ crawl Docker Hub và trả về danh sách tất cả các image có tên khớp với chuỗi tìm kiếm. Trong trường hợp này, kết quả hiển thị sẽ tương tự như sau:

OutputNAME                                                      DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
ubuntu                                                    Ubuntu is a Debian-based Linux operating sys…   10908               [OK]
dorowu/ubuntu-desktop-lxde-vnc                            Docker image to provide HTML5 VNC interface …   428                                     [OK]
rastasheep/ubuntu-sshd                                    Dockerized SSH service, built on top of offi…   244                                     [OK]
consol/ubuntu-xfce-vnc                                    Ubuntu container with "headless" VNC session…   218                                     [OK]
ubuntu-upstart                                            Upstart is an event-based replacement for th…   108                 [OK]
ansible/ubuntu14.04-ansible                               Ubuntu 14.04 LTS with
...

Trong cột OFFICIAL, giá trị OK **cho biết đây là image được build và hỗ trợ bởi công ty đứng sau dự án đó. Khi bạn đã xác định được image muốn sử dụng, bạn có thể tải nó về máy tính bằng cách dùng subcommand pull.

Hãy chạy lệnh sau để tải official image của ubuntu về máy tính:

docker pull ubuntu

Bạn sẽ thấy kết quả hiển thị như sau:

OutputUsing default tag: latest
latest: Pulling from library/ubuntu
d51af753c3d3: Pull complete
fc878cd0a91c: Pull complete
6154df8ff988: Pull complete
fee5db0ff82f: Pull complete
Digest: sha256:747d2dbbaaee995098c9792d99bd333c6783ce56150d1b11e333bbceed5c54d7
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

Sau khi một image đã được tải về, bạn có thể chạy container từ image đó bằng subcommand run. Như bạn đã thấy với ví dụ hello-world, nếu image chưa được tải về khi chạy docker với subcommand run, Docker client sẽ tải image trước, rồi mới chạy container từ image đó.

Để xem các image đã được tải về máy tính, hãy gõ:

docker images

Kết quả hiển thị sẽ trông tương tự như sau:

OutputREPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              1d622ef86b13        3 weeks ago         73.9MB
hello-world         latest              bf756fb1ae65        4 months ago        13.3kB

Như bạn sẽ thấy ở phần sau của tutorial này, các image mà bạn dùng để chạy containers có thể được chỉnh sửa và dùng để tạo ra các image mới, sau đó có thể được upload (push là thuật ngữ kỹ thuật) lên Docker Hub hoặc các Docker registry khác.”

Bây giờ, hãy tìm hiểu chi tiết hơn về cách chạy containers.

Bước 5 – Chạy một Docker Container

Container hello-world mà bạn đã chạy ở bước trước là một ví dụ về container chạy xong và thoát sau khi in ra một test message. Containers có thể hữu ích hơn nhiều, và thậm chí có thể tương tác được. Xét cho cùng, chúng khá giống virtual machines, chỉ khác là nhẹ hơn và tiết kiệm tài nguyên hơn.

Ví dụ, hãy thử chạy một container dùng image Ubuntu mới nhất. Sự kết hợp của các tùy chọn -i-t sẽ cho phép bạn truy cập vào interactive shell bên trong container:

docker run -it ubuntu

Dấu nhắc lệnh (command prompt) của bạn sẽ thay đổi để phản ánh việc bạn hiện đang làm việc bên trong container và sẽ có dạng như sau:

Outputroot@d9b100f2f636:/#

Hãy chú ý đến container ID trong command prompt. Trong ví dụ này, đó là d9b100f2f636. Bạn sẽ cần container ID này sau để xác định container khi muốn xóa nó.

Bây giờ bạn có thể chạy bất kỳ lệnh nào bên trong container. Ví dụ, hãy cập nhật package database trong container. Bạn không cần phải thêm tiền tố sudo cho bất kỳ lệnh nào, vì bạn đang thao tác trong container với quyền root user:

apt update

Sau đó, bạn có thể cài đặt bất kỳ ứng dụng nào trong container. Ví dụ, hãy cài đặt Node.js:

apt install nodejs

Lệnh này sẽ cài đặt Node.js trong container từ Ubuntu repository chính thức. Khi quá trình cài đặt hoàn tất, hãy kiểm tra để xác nhận rằng Node.js đã được cài đặt:

node -v

Bạn sẽ thấy số phiên bản được hiển thị trong terminal:

Output
v10.19.0

Mọi thay đổi bạn thực hiện bên trong container chỉ áp dụng cho container đó mà thôi.

Để thoát khỏi container, hãy gõ exit tại dấu nhắc lệnh.

Tiếp theo, hãy cùng tìm hiểu cách quản lý các container trên hệ thống của chúng ta.

Bước 6 – Quản lý Docker Containers

Sau một thời gian sử dụng Docker, bạn sẽ có nhiều container đang chạy (active) và đã dừng (inactive) trên máy tính. Để xem các container đang chạy, hãy dùng lệnh:

docker ps

Bạn sẽ thấy kết quả hiển thị tương tự như sau:

OutputCONTAINER ID        IMAGE               COMMAND             CREATED

Trong tutorial này, bạn đã khởi chạy hai container: một từ image hello-world và một từ image ubuntu. Cả hai container hiện không còn chạy nữa, nhưng chúng vẫn tồn tại trên hệ thống của bạn.

Để xem tất cả containers – cả đang chạy lẫn đã dừng, hãy chạy lệnh docker ps với tùy chọn -a:

docker ps -a

Bạn sẽ thấy kết quả hiển thị tương tự như sau:

1c08a7a0d0e4        ubuntu              "/bin/bash"         2 minutes ago       Exited (0) 8 seconds ago                       quizzical_mcnulty
a707221a5f6c        hello-world         "/hello"            6 minutes ago       Exited (0) 6 minutes ago                       youthful_curie

Để xem container mới nhất mà bạn đã tạo, hãy dùng thêm tùy chọn -l:

docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
1c08a7a0d0e4        ubuntu              "/bin/bash"         2 minutes ago       Exited (0) 40 seconds ago                       quizzical_mcnulty

Để khởi động lại một container đã dừng, hãy dùng lệnh docker start, theo sau là container ID hoặc tên của container. Ví dụ, hãy khởi động lại container dựa trên Ubuntu với ID 1c08a7a0d0e4:

docker start 1c08a7a0d0e4

Container sẽ được khởi động, và bạn có thể dùng lệnh docker ps để xem trạng thái của nó:

OutputCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
1c08a7a0d0e4        ubuntu              "/bin/bash"         3 minutes ago       Up 5 seconds                            quizzical_mcnulty

Để dừng một container đang chạy, hãy dùng lệnh docker stop, theo sau là container ID hoặc tên của container. Lần này, chúng ta sẽ dùng tên mà Docker đã gán cho container, đó là quizzical_mcnulty:

docker stop quizzical_mcnulty

Khi bạn đã quyết định không còn cần đến một container nữa, hãy xóa nó bằng lệnh docker rm, có thể dùng container ID hoặc tên. Hãy chạy lệnh docker ps -a để tìm container ID hoặc tên của container được tạo từ image hello-world và xóa nó.

docker rm youthful_curie

Bạn có thể khởi chạy một container mới và đặt tên cho nó bằng tùy chọn --name. Bạn cũng có thể dùng tùy chọn --rm để tạo một container sẽ tự động xóa khi nó dừng. Hãy xem lệnh docker run --help để biết thêm thông tin về các tùy chọn này và nhiều tùy chọn khác.

Containers có thể được chuyển thành images mà bạn có thể dùng để build các container mới. Hãy cùng tìm hiểu cách hoạt động của quá trình này.

Bước 7 – Commit các thay đổi trong Container thành Docker Image

Khi bạn khởi chạy một Docker image, bạn có thể tạo, chỉnh sửa hoặc xóa file giống như khi làm việc với một virtual machine. Tuy nhiên, các thay đổi đó chỉ áp dụng cho container đó. Bạn có thể start và stop nó, nhưng một khi bạn xóa nó bằng lệnh docker rm, thì mọi thay đổi sẽ bị mất hoàn toàn.

Phần này sẽ hướng dẫn bạn cách lưu lại trạng thái của một container dưới dạng một Docker image mới.

Sau khi cài đặt Node.js bên trong container Ubuntu, bạn hiện có một container được tạo từ một image, nhưng container này đã khác so với image gốc mà bạn dùng để tạo nó. Có thể bạn sẽ muốn tái sử dụng container Node.js này làm nền tảng để tạo các image mới sau này.

Hãy commit các thay đổi thành một Docker image mới bằng lệnh sau:

docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name

Tùy chọn -m được dùng để ghi commit message, giúp bạn và người khác biết được những thay đổi đã thực hiện, trong khi -a được dùng để chỉ định tác giả. container_id là ID mà bạn đã ghi chú trước đó trong tutorial khi bắt đầu phiên Docker interactive. Trừ khi bạn đã tạo thêm repository trên Docker Hub, repository mặc định thường sẽ là username Docker Hub của bạn.

Ví dụ, với user sammy, container ID là d9b100f2f636, thì lệnh sẽ như sau:

docker commit -m "added Node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs

Khi bạn commit một image, image mới sẽ được lưu cục bộ (locally) trên máy tính của bạn. Ở phần sau của tutorial này, bạn sẽ học cách push một image lên Docker registry như Docker Hub để người khác có thể truy cập.

Khi liệt kê lại các Docker images, bạn sẽ thấy image mới cùng với image gốc mà nó được tạo ra từ đó:

docker images

Bạn sẽ thấy kết quả hiển thị như sau:

OutputREPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
sammy/ubuntu-nodejs   latest              7c1f35226ca6        7 seconds ago       179MB
...

Trong ví dụ này, ubuntu-nodejs là image mới, được tạo ra từ image ubuntu có sẵn trên Docker Hub. Sự khác biệt về kích thước phản ánh các thay đổi đã được thực hiện. Và trong ví dụ này, thay đổi chính là việc cài đặt Node.js. Vì vậy, lần sau khi bạn cần chạy một container sử dụng Ubuntu với Node.js đã được cài sẵn, bạn chỉ cần dùng image mới này.

Bạn cũng có thể build Images từ một Dockerfile, cho phép tự động hóa quá trình cài đặt phần mềm trong một image mới. Tuy nhiên, nội dung này nằm ngoài phạm vi của tutorial này.

Bây giờ hãy chia sẻ image mới với người khác để họ có thể tạo container từ đó.”

Bước 8 – Push Docker Images lên Docker Repository

Bước hợp lý tiếp theo sau khi tạo một image mới từ một image có sẵn là chia sẻ nó – có thể chỉ với một vài người bạn, hoặc với cả thế giới trên Docker Hub, hoặc một Docker registry khác mà bạn có quyền truy cập. Để push một image lên Docker Hub hay bất kỳ Docker registry nào khác, bạn cần phải có tài khoản ở đó.

Phần này sẽ hướng dẫn bạn cách push một Docker image lên Docker Hub. Nếu bạn muốn biết cách tạo Docker registry riêng tư, hãy tham khảo tài liệu Cách thiết lập một Private Docker Registry trên Ubuntu.

Để push image của bạn, trước tiên hãy đăng nhập vào Docker Hub.

docker login -u docker-registry-username

Bạn sẽ được yêu cầu xác thực bằng mật khẩu Docker Hub của mình. Nếu bạn nhập đúng mật khẩu, quá trình xác thực sẽ thành công.

Lưu ý: Nếu username trên Docker registry của bạn khác với username cục bộ mà bạn đã dùng để tạo image, bạn sẽ cần phải tag image bằng username của registry. Với ví dụ ở bước trước, bạn sẽ gõ:

docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs

Sau đó, bạn có thể push image của mình bằng lệnh:

docker push docker-registry-username/docker-image-name

Để push image ubuntu-nodejs lên repository của sammy, lệnh sẽ là:

docker push sammy/ubuntu-nodejs

Quá trình này có thể mất một chút thời gian để hoàn tất vì cần tải lên các hình ảnh, upload các image, nhưng khi xong, kết quả hiển thị sẽ trông giống như sau:

OutputThe push refers to a repository [docker.io/sammy/ubuntu-nodejs]
e3fbbfb44187: Pushed
5f70bf18a086: Pushed
a3b5c80a4eba: Pushed
7f18b442972b: Pushed
3ce512daaf78: Pushed
7aae4540b42d: Pushed
...

Sau khi push một image lên registry, nó sẽ được liệt kê trong bảng điều khiển (dashboard) của tài khoản của bạn, giống như hình minh họa bên dưới.

ec2vX3Z.png

Nếu một lần push gặp lỗi như thế này, thì rất có thể là bạn chưa đăng nhập:

OutputThe push refers to a repository [docker.io/sammy/ubuntu-nodejs]
e3fbbfb44187: Preparing
5f70bf18a086: Preparing
a3b5c80a4eba: Preparing
7f18b442972b: Preparing
3ce512daaf78: Preparing
7aae4540b42d: Waiting
unauthorized: authentication required

Hãy đăng nhập bằng lệnh docker login và thử push lại. Sau đó, hãy kiểm tra để xác nhận rằng image đã tồn tại trong trang repository của bạn trên Docker Hub.

Bây giờ, bạn có thể dùng docker pull sammy/ubuntu-nodejs để tải image này về một máy mới và dùng nó để chạy một container mới.

Docker vs Docker Compose

Trong khi Docker cho phép bạn build và chạy containers, thì việc quản lý các ứng dụng nhiều container chỉ với Docker có thể khá tốn công. Đây chính là lúc Docker Compose phát huy tác dụng.

Docker Compose là một công cụ để định nghĩa và chạy các ứng dụng Docker nhiều container bằng cách sử dụng file YAML. Thay vì phải chạy thủ công từng container riêng lẻ cho web server, database và caching layer, bạn có thể định nghĩa tất cả chúng trong một file docker-compose.yml và chạy bằng lệnh:

docker-compose up

Để có hướng dẫn chi tiết về cách sử dụng Docker Compose, bao gồm cách thiết lập các ứng dụng nhiều container phức tạp và quản lý cấu hình của chúng, hãy xem tutorial Cách cài đặt và sử dụng Docker Compose trên Ubuntu. Hướng dẫn này sẽ đưa bạn qua từng bước để tạo và quản lý ứng dụng nhiều container với Docker Compose, từ các thiết lập cơ bản đến cấu hình phức tạp hơn.

Tính năng Docker CLI Docker Compose
Cách sử dụng Thao tác trên từng container Điều phối nhiều container cùng lúc
Cấu hình Lệnh CLI File cấu hình YAML
Xử lý dependencies Thủ công Tự động xử lý các dịch vụ liên kết
Trường hợp tốt nhất Kiểm thử các container riêng lẻ Phát triển local và môi trường staging

Để biết thêm chi tiết, hãy xem Cách cài đặt và sử dụng Docker Compose trên Ubuntu.

Xử lý sự cố thường gặp khi cài đặt Docker

Vấn đề: docker: command not found

Cách khắc phục: Docker CLI không có trong biến môi trường $PATH. Hãy cài đặt lại Docker hoặc đảm bảo rằng thư mục /usr/bin đã được thêm vào.

sudo apt install docker-ce docker-ce-cli containerd.io

Sự cố: Cannot connect to the Docker daemon Khắc phục: Docker không chạy hoặc người dùng của bạn không nằm trong nhóm docker.

sudo systemctl start docker
sudo usermod -aG docker $USER

Sau đó hãy log out và log in lại.

Vấn đề: GPG key hoặc lỗi repository

Cách khắc phục: Nếu keyserver hoặc Docker GPG key thay đổi, hãy tham khảo tài liệu chính thức của Docker để có các bước cập nhật key và repository mới nhất. Nếu bạn đang dùng Ubuntu 22.04, hãy xem hướng dẫn Cách cài đặt và sử dụng Docker trên Ubuntu 22.04 để có chỉ dẫn cụ thể cho phiên bản này. Để cài đặt tự động và tránh các lỗi trên, bạn có thể tham khảo hướng dẫn Cách sử dụng Ansible để cài đặt và thiết lập Docker trên Ubuntu.

Docker Desktop trên Ubuntu (Beta)

Docker Desktop hiện đã có sẵn ở phiên bản beta cho các bản phân phối Linux như Ubuntu. Nó cung cấp giao diện đồ họa (GUI), đi kèm Docker Engine và hỗ trợ Kubernetes.

Để cài đặt Docker Desktop trên Ubuntu:

sudo apt install ./docker-desktop-<version>-<arch>.deb

Tham khảo tài liệu Docker Desktop for Linux để biết các yêu cầu cần thiết (prerequisites) và liên kết tải về.

Lưu ý: Docker Desktop phù hợp cho môi trường phát triển (development environments). Với các cài đặt trên server, hãy sử dụng Docker CE.

Cài đặt Docker bằng Dockerfile

Đối với các môi trường tự động (automated environments), hãy cài đặt Docker bằng Dockerfile. Sau đây là một ví dụ:

FROM ubuntu:20.04

RUN apt-get update && \\
    apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release && \\
    curl -fsSL <https://download.docker.com/linux/ubuntu/gpg> | apt-key add - && \\
    add-apt-repository \\
   "deb [arch=amd64] <https://download.docker.com/linux/ubuntu> focal stable" && \\
    apt-get update && \\
    apt-get install -y docker-ce docker-ce-cli containerd.io

Để tự động hóa nâng cao hơn, bạn cũng có thể sử dụng Ansible để cài đặt và cấu hình Docker. Hãy tham khảo hướng dẫn Cách sử dụng Ansible để cài đặt và thiết lập Docker trên Ubuntu. Cách này đặc biệt hữu ích nếu bạn cần quản lý việc cài đặt Docker trên nhiều server hoặc muốn duy trì cấu hình đồng nhất trong hạ tầng của mình.”

Cách gỡ cài đặt Docker trên Ubuntu

Để xóa Docker khỏi hệ thống, hãy chạy lệnh:

sudo apt purge docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

Câu hỏi thường gặp

1. Cách tốt nhất để cài đặt Docker trên Ubuntu là gì?

Cách được khuyến nghị và đáng tin cậy nhất để cài đặt Docker trên Ubuntu là sử dụng repository chính thức của Docker. Cách này đảm bảo bạn luôn nhận được phiên bản stable mới nhất, đi kèm với các bản vá bảo mật và cập nhật trực tiếp từ Docker. Để thực hiện, trước tiên bạn cần cập nhật package index và cài đặt các gói cần thiết như apt-transport-https, ca-certificates, curl, gnupg, và lsb-release. Tiếp theo, bạn thêm GPG key chính thức của Docker và thiết lập repository stable. Sau khi cập nhật lại package index, bạn có thể cài đặt Docker Engine và các thành phần liên quan bằng

sudo apt install docker-ce docker-ce-cli containerd.io

Phương pháp này được ưu tiên hơn so với việc sử dụng repository mặc định của Ubuntu, vì các repository đó có thể chứa phiên bản đã lỗi thời. Bằng cách làm theo hướng dẫn cài đặt chính thức của Docker, bạn sẽ đảm bảo khả năng tương thích với các tính năng mới nhất, bản sửa lỗi, và các bản vá bảo mật – giúp trải nghiệm Docker trên Ubuntu vừa mạnh mẽ vừa an toàn.

2. Tôi có cần dùng sudo để chạy các lệnh Docker không?

Theo mặc định, Docker yêu cầu quyền root để chạy các lệnh của nó, nghĩa là bạn phải thêm tiền tố sudo trước mỗi lệnh Docker. Tuy nhiên, bạn có thể tránh điều này bằng cách thêm user của mình vào nhóm docker, nhóm này cho phép chạy các lệnh Docker mà không cần sudo. Để thực hiện, hãy chạy:

sudo usermod -aG docker $USER

…và sau đó log out rồi log in lại để thay đổi có hiệu lực. Bước này sẽ chỉnh sửa nhóm (group) mà user của bạn thuộc về, cho phép bạn chạy Docker với tư cách non-root user. Lưu ý rằng việc thêm user vào nhóm docker sẽ cấp quyền truy cập ở mức root tới Docker daemon, vì vậy chỉ nên thêm những user đáng tin cậy. Nếu bạn bỏ qua bước này, bạn sẽ gặp lỗi permission khi chạy lệnh Docker mà không có sudo. Vì lý do bảo mật và tiện lợi, tốt nhất bạn nên thêm user của mình vào nhóm docker nếu bạn sử dụng Docker thường xuyên.

3. Làm thế nào để kiểm tra xem Docker có đang chạy đúng hay không?

Để xác nhận rằng Docker đã được cài đặt và chạy đúng trên hệ thống Ubuntu của bạn, bạn có thể sử dụng một vài lệnh đơn giản. Đầu tiên, hãy chạy:

docker info

Lệnh này sẽ hiển thị thông tin chi tiết về cài đặt Docker, bao gồm phiên bản server, storage driver, và các container đang chạy. Nếu Docker đang hoạt động, lệnh này sẽ trả về rất nhiều thông tin; nếu không, bạn sẽ thấy một thông báo lỗi. Một cách kiểm tra phổ biến khác là chạy

docker run hello-world

Lệnh này sẽ tải một test image từ Docker Hub và chạy nó trong một container. Nếu mọi thứ được thiết lập đúng, bạn sẽ thấy một thông báo cho biết Docker đang hoạt động như mong đợi. Nếu gặp lỗi, hãy kiểm tra xem dịch vụ Docker có đang chạy hay không bằng lệnh:

sudo systemctl status docker

và xem lại bất kỳ thông báo lỗi nào để khắc phục sự cố. Những bước này sẽ giúp đảm bảo Docker của bạn hoạt động bình thường và sẵn sàng để sử dụng.

4. Tôi có thể cài đặt một phiên bản cụ thể của Docker không?

Có, bạn hoàn toàn có thể cài đặt một phiên bản cụ thể của Docker trên Ubuntu. Điều này rất hữu ích nếu bạn cần đảm bảo tính tương thích với một số ứng dụng nhất định hoặc muốn tránh những thay đổi mới nhất. Trước tiên, hãy liệt kê tất cả các phiên bản Docker có sẵn trong repository bằng lệnh

apt-cache madison docker-ce

Lệnh này sẽ hiển thị danh sách các chuỗi phiên bản. Sau khi bạn xác định được phiên bản mong muốn, hãy cài đặt nó bằng cách chạy

sudo apt install docker-ce=<VERSION_STRING>

Thay thế <VERSION_STRING> bằng số phiên bản chính xác (ví dụ: 5:20.10.7~3-0~ubuntu-focal). Cách này giúp bạn kiểm soát chính xác phiên bản Docker trên hệ thống của mình. Hãy nhớ cũng cần chỉ định phiên bản tương ứng cho

docker-ce-cli

containerd.io

nếu cần. Việc cố định (pin) một phiên bản cụ thể có thể giúp duy trì sự ổn định trong môi trường production hoặc khi làm việc với các dự án cũ cần một bản Docker nhất định.

5. Sự khác biệt giữa Docker và Docker Compose là gì?

Docker và Docker Compose có liên quan với nhau nhưng phục vụ những mục đích khác nhau. Docker là một nền tảng cho phép bạn build, ship, và chạy các container riêng lẻ, mỗi container đóng gói một ứng dụng và các dependencies của nó. Docker rất phù hợp để chạy các dịch vụ hoặc ứng dụng đơn lẻ trong môi trường cách ly. Docker Compose, ngược lại, là một công cụ được thiết kế để định nghĩa và quản lý các ứng dụng nhiều container. Với Compose, bạn sử dụng một file YAML (docker-compose.yml) để chỉ định cách nhiều container sẽ tương tác với nhau, cấu hình của chúng, network và volumes. Điều này giúp dễ dàng điều phối (orchestrate) các ứng dụng phức tạp bao gồm nhiều dịch vụ liên kết, chẳng hạn như web server, database và cache. Trong khi Docker một mình là đủ cho các trường hợp đơn giản, thì Docker Compose giúp đơn giản hóa việc quản lý nhiều container, khiến quá trình phát triển, kiểm thử, và triển khai các ứng dụng phức tạp trở nên hiệu quả và dễ tái tạo hơn.”

6. Làm thế nào để gỡ Docker khỏi hệ thống?

Để gỡ hoàn toàn Docker khỏi hệ thống Ubuntu của bạn, bạn cần xóa các gói Docker và dọn sạch toàn bộ dữ liệu liên quan. Bắt đầu bằng cách chạy lệnh

sudo apt purge docker-ce docker-ce-cli containerd.io

để gỡ Docker Engine, CLI, và container runtime. Lệnh này sẽ xóa các gói đã cài đặt nhưng vẫn giữ lại các file cấu hình và thư mục dữ liệu. Để dọn sạch hoàn toàn, hãy xóa các thư mục dữ liệu của Docker bằng lệnh:

sudo rm -rf /var/lib/docker

sudo rm -rf /var/lib/containerd

Các thư mục này lưu trữ images, containers, volumes và các dữ liệu persistent khác. Nếu bạn đã thêm user của mình vào nhóm docker, bạn cũng có thể muốn xóa nhóm này bằng lệnh

sudo groupdel docker

Sau những bước này, Docker và toàn bộ dữ liệu liên quan sẽ được gỡ khỏi hệ thống của bạn. Hãy luôn sao lưu dữ liệu quan trọng trước khi gỡ cài đặt để tránh mất mát ngoài ý muốn.

7. Docker Desktop có sẵn cho Ubuntu không, và tôi có nên sử dụng nó?

Có, Docker Desktop hiện đã có bản beta cho các bản phân phối Linux, bao gồm cả Ubuntu. Docker Desktop cung cấp giao diện đồ họa (GUI) để quản lý containers, images, volumes và networks, giúp dễ dàng hơn cho những người dùng không muốn làm việc hoàn toàn qua command line. Nó cũng đi kèm Docker Engine và hỗ trợ Kubernetes tích hợp, rất hữu ích cho môi trường phát triển và kiểm thử. Để cài đặt Docker Desktop trên Ubuntu, hãy tải gói .deb phù hợp từ trang web chính thức của Docker và cài đặt bằng lệnh:

sudo apt install ./docker-desktop-<version>-<arch>.deb

Tuy nhiên, Docker Desktop chủ yếu được thiết kế cho môi trường phát triển và không được khuyến nghị sử dụng trên các server production. Với môi trường server-side hoặc headless, tốt hơn hết là sử dụng Docker Engine Community Edition (CE) thông qua command line. Trước khi tiến hành cài đặt, hãy luôn kiểm tra tài liệu chính thức của Docker để nắm các yêu cầu (prerequisites) và hướng dẫn cài đặt mới nhất.

Kết luận

Trong hướng dẫn này, bạn đã cài đặt thành công Docker trên Ubuntu, nắm vững các kiến thức cơ bản về quản lý container, và học cách làm việc với Docker images cũng như containers. Bạn cũng đã có trải nghiệm thực hành với Docker Hub bằng cách push một image đã chỉnh sửa lên registry.

Những kỹ năng này tạo nên nền tảng vững chắc cho việc phát triển và triển khai dựa trên container. Để nâng cao chuyên môn Docker hơn nữa, chúng tôi khuyến khích bạn khám phá thêm các tutorial khác trong DigitalOcean Community, nơi bạn sẽ tìm thấy các chủ đề nâng cao như bộ chứa điều phối, kết nối mạng và các phương pháp hay nhất về bảo mật.

0 Bình luận

Đăng nhập để thảo luận

Chuyên mục Hướng dẫn

Tổng hợp các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.

Đăng ký nhận Newsletter

Nhận các nội dung hữu ích mới nhất