Cách Thiết Lập và Sử Dụng Docker trên Ubuntu 20.04 Chi Tiết Nhất

Thiết Lập và Sử Dụng Docker trên Ubuntu 20.04

Docker là một ứng dụng giúp đơn giản hóa quá trình quản lý các quy trình ứng dụng bên trong container. Container cho phép bạn chạy ứng dụng dưới dạng các quy trình được cách ly về tài nguyên. Chúng tương tự như máy ảo, 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.

Để tìm hiểu chi tiết về các thành phần khác nhau của một container Docker, hãy xem tài liệu Hệ Sinh Thái Docker: Giới Thiệu Các Thành Phần Phổ Biến

Để triển khai Docker hiệu quả, bạn cần một môi trường mạnh mẽ như VPS Việt Nam. Với VPS chất lượng cao, bạn có thể dễ dàng cài đặt và chạy các container, đảm bảo hiệu suất tối ưu. Khám phá các giải pháp VPS Việt Nam để hỗ trợ dự án của bạn ngay hôm nay!

DataOnline sẽ chỉ cho bạn cách cài đặt và sử dụng Docker Community Edition (CE) trên Ubuntu 20.04. Bạn sẽ cài đặt Docker, làm việc với các container và image, và đẩy một image lên một Docker Repository.Docker Website

Yêu cầu tiên quyết

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

● Một server Ubuntu 20.04 được thiết lập theo hướng dẫn khởi tạo server Ubuntu 20.04, bao gồm cả một tài khoản người dùng không phải root có quyền sudo và một firewall.
● Một tài khoản trên Docker Hub nếu bạn muốn tạo image riêng và đẩy chúng lên Docker Hub (theo như các bước 7 và 8).

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

Gói cài đặt Docker có sẵn trong kho chính thức của Ubuntu có thể không phải là phiên bản mới nhất. Để đảm bảo nhận được phiên bản mới nhất, chúng ta sẽ cài đặt Docker từ kho chính thức của Docker. Để làm điều đó, ta sẽ thêm một nguồn gói mới, thêm GPG key của Docker để đảm bảo rằng các gói tải xuống là hợp lệ, và sau đó cài đặt gói.

Cập nhật danh sách các gói đã cài đặt:

sudo apt update

Tiếp theo, cài đặt một vài gói tiên quyết cho phép apt sử dụng các gói qua HTTPS:

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

Sau đó, thêm GPG key cho kho chính thức của Docker vào hệ thống của bạn:

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

Thêm kho Docker vào nguồn APT:

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

Lệnh này cũng sẽ cập nhật cơ sở dữ liệu gói của chúng ta với các gói Docker từ repo mới thêm vào.

Kiểm tra xem bạn sắp cài đặt từ kho của Docker thay vì kho mặc định của Ubuntu:

apt-cache policy docker-ce

Bạn sẽ thấy đầu ra như sau (số phiên bản của Docker có thể khác):

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 phiên bản ứng viên được cài đặt đến từ kho Docker cho Ubuntu 20.04 (focal).

Cuối cùng, 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 này được cấu hình để khởi động cùng hệ thống (on boot).

Kiểm tra xem Docker có đang chạy hay không:

sudo systemctl status docker

Đầu ra sẽ giống như sau, cho thấy dịch vụ đang hoạt động:

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 giờ đây không chỉ cung cấp dịch vụ Docker mà còn công cụ dòng lệnh docker, hay còn gọi là Docker client. Chúng ta sẽ khám phá cách sử dụng lệnh docker ở các phần tiếp theo của bài hướng dẫn này.

Bước 2 – Thực thi lệnh Docker mà không cần Sudo

Theo mặc định, lệnh docker chỉ có thể được chạy bởi người dùng root hoặc bởi một người dùng nằm trong nhóm docker – nhóm này được tự động tạo ra trong quá trình cài đặt Docker. Nếu bạn cố gắng chạy lệnh docker mà không thêm sudo hoặc không thuộc nhóm docker, bạn sẽ nhận được đầu ra 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 lần chạy lệnh docker, hãy thêm tên người dùng của bạn vào nhóm docker:

sudo usermod -aG docker ${USER}

Để áp dụng thành viên nhóm mới, hãy đăng xuất khỏi server và đăng nhập lại, hoặc gõ:

su - ${USER}

Bạn sẽ được yêu cầu nhập mật khẩu người dùng của mình.

Xác nhận rằng người dùng của bạn đã được thêm vào nhóm docker:

groups

Ví dụ đầu ra:

Outputsammy sudo docker

Nếu cần thêm một người dùng khác vào nhóm docker mà bạn không đăng nhập, hãy chỉ định tên người dùng đó cụ thể:

sudo usermod -aG docker username

Phần còn lại của bài hướng dẫn này giả định rằng bạn đang chạy lệnh docker với tư cách là người dùng thuộc nhóm docker. Nếu không, hãy nhớ thêm sudo vào trước các lệnh.

Bước 3 – Sử dụng Lệnh Docker

Sử dụng docker bao gồm việc truyền cho nó một chuỗi các tham số và lệnh, theo sau là các đối số. Cú pháp có dạng:

docker [option] [command] [arguments]

Để xem tất cả các lệnh con có sẵn, hãy gõ:

docker

Tính đến Docker 19, danh sách đầy đủ các lệnh con 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 tham số của một lệnh cụ thể, gõ:

docker docker-subcommand --help

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

docker info

Chúng ta sẽ khám phá một số lệnh này. Bắt đầu với việc làm việc với các image Docker.

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

Các container Docker được xây dựng từ các image Docker. Theo mặc định, Docker sẽ kéo các image này từ Docker Hub – một registry Docker do Docker, công ty đứng sau dự án Docker, quản lý.

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

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

docker run hello-world

Đầu ra sẽ cho biết Docker 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.
...

Docker ban đầu không tìm thấy image hello-world cục bộ, nên nó tải image từ Docker Hub – repository mặc định. Sau khi image được tải về, Docker tạo một container từ image đó và ứng dụng bên trong container 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 sử dụng lệnh docker với subcommand search. Ví dụ, để tìm image Ubuntu, gõ:

docker search ubuntu

Script sẽ duyệt Docker Hub và trả về danh sách các image có tên khớp với chuỗi tìm kiếm. Đầu ra sẽ giống 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, “OK” cho biết image được xây dựng 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 xuống máy tính của mình bằng subcommand pull:

docker pull ubuntu

Đầu ra sẽ 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 image được tải về, bạn có thể chạy một container sử dụng image đã tải với subcommand run. Như bạn đã thấy với ví dụ hello-world, nếu image chưa được tải về khi lệnh docker run được thực thi, Docker client sẽ tải image trước, sau đó chạy container.

Để xem các image đã được tải về trên máy tính của bạn, gõ:

docker images

Đầu ra sẽ giống 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 bài hướng dẫn, các image mà bạn sử dụng để chạy container có thể được sửa đổi và dùng để tạo ra image mới, sau đó có thể được tải lên Docker Hub hoặc các registry khác.

Chúng ta hãy xem cách chạy container chi tiết hơn.

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

Container hello-world bạn chạy ở bước trước là ví dụ của một container chạy và thoát sau khi hiển thị thông điệp thử nghiệm. Container có thể hữu ích hơn thế, và chúng có thể hoạt động dưới chế độ tương tác. Rốt cuộc, chúng tương tự như máy ảo nhưng tiết kiệm tài nguyên hơn.

Ví dụ, hãy chạy một container sử dụng image Ubuntu mới nhất. Sự kết hợp của các tham số -i-t sẽ cho bạn quyền truy cập shell tương tác vào container:

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

Prompt của bạn sẽ thay đổi, cho thấy rằng bạn đang làm việc bên trong container, ví dụ:

Outputroot@d9b100f2f636:/#

Lưu ý ID của container trong prompt. Trong ví dụ này, ID là d9b100f2f636. Bạn sẽ cần ID này sau này để nhận dạng 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 cơ sở dữ liệu gói bên trong container (không cần thêm sudo vì bạn đang làm việc với tư cách root):

apt update

Sau đó cài đặt một ứng dụng nào đó, ví dụ cài đặt Node.js:

apt install nodejs

Lệnh này sẽ cài đặt Node.js trong container từ kho chính thức của Ubuntu. Sau khi cài đặt xong, xác nhận Node.js đã được cài đặt bằng:

node -v

Bạn sẽ thấy số phiên bản được hiển thị, ví dụ:

Outputv10.19.0

Bất kỳ thay đổi nào bạn thực hiện bên trong container chỉ áp dụng cho container đó.

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

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

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 và không chạy trên máy của bạn. Để xem các container đang chạy, sử dụng:

docker ps

Đầu ra sẽ giống như sau:

OutputCONTAINER ID        IMAGE               COMMAND             CREATED

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

Để xem tất cả các container – cả đang chạy và không chạy, chạy lệnh docker ps với tham số -a:

docker ps -a

Đầu ra sẽ giống 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 bạn tạo, dùng tham số -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, sử dụng lệnh docker start theo sau là ID hoặc tên container. Ví dụ, khởi động container dựa trên Ubuntu với ID 1c08a7a0d0e4:

docker start 1c08a7a0d0e4

Container sẽ khởi động và bạn có thể dùng docker ps để xem trạng thái:

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, dùng lệnh docker stop theo sau là ID hoặc tên container. Ví dụ, dừng container có tên quizzical_mcnulty:

docker stop quizzical_mcnulty

Khi bạn quyết định rằng một container không còn cần thiết nữa, hãy xóa nó bằng lệnh docker rm, sử dụng ID hoặc tên container. Ví dụ, xóa container liên quan đến image hello-world:

docker rm youthful_curie

Bạn cũng có thể khởi tạo một container mới và đặt tên cho nó bằng cách sử dụng tham số --name. Ngoài ra, bạn có thể sử dụng tham số --rm để tạo một container tự xóa khi nó dừng. Xem lệnh docker run --help để biết thêm thông tin về các tùy chọn này.

Container có thể được chuyển thành image, sau đó dùng để tạo container mới. Hãy xem cách thực hiện điều đó.

Bước 7 – Cam kết thay đổi trong một Container thành Docker Image

Khi bạn khởi động một image Docker, bạn có thể tạo mới, chỉnh sửa và xóa các file giống như làm việc với máy ảo. Những thay đổi bạn thực hiện chỉ áp dụng cho container đó. Bạn có thể khởi động và dừng nó, nhưng khi bạn xóa nó bằng lệnh docker rm, các thay đổi sẽ bị mất vĩnh viễn.

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

Sau khi cài đặt Node.js bên trong container Ubuntu, bạn có một container chạy từ một image, nhưng container đã có thay đổi so với image ban đầu. Bạn có thể muốn sử dụng container Node.js này làm cơ sở để tạo image mới cho các lần sử dụng sau.

Sau đó, cam kết các thay đổi vào 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

Tham số -m dùng để ghi chú (commit message) mô tả những thay đổi bạn đã thực hiện. Tham số -a dùng để chỉ định tác giả container_id là ID của container mà bạn đã lưu ý ở bước trước khi khởi động phiên làm việc Docker tương tác.Nếu bạn chưa tạo repository riêng trên Docker Hub, repository thường là tên người dùng Docker Hub của bạn.

Ví dụ, với người dùng sammy và container ID d9b100f2f636, lệnh sẽ là:

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

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

Chạy lại lệnh docker images để xem image mới cũng như image gốc:

docker images

Đầu ra sẽ giống 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 gốc từ Docker Hub. Sự khác biệt về kích thước phản ánh các thay đổi đã được thực hiện (trong trường hợp này là cài đặt Node.js). Lần tới, nếu bạn cần chạy container với Ubuntu có sẵn Node.js, bạn chỉ cần sử dụng image mới này.

Bạn cũng có thể tạo image từ một Dockerfile, cho phép tự động hóa quá trình cài đặt phần mềm trong image mới. Tuy nhiên, điều đó vượt quá phạm vi của bài hướng dẫn 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ừ nó.

Bước 8 – Đẩy Docker Images lên Docker Repository

Bước tiếp theo sau khi tạo ra một image mới từ image cũ là chia sẻ nó với một số bạn bè, với cả thế giới trên Docker Hub, hoặc với một Docker registry khác mà bạn có quyền truy cập. Để đẩy một image lên Docker Hub hoặc bất kỳ registry nào khác, bạn cần có một tài khoản tại đó.

Phần này hướng dẫn bạn cách đẩy Docker image lên Docker Hub. Để tìm hiểu cách tạo Docker registry riêng tư, hãy xem Cách Thiết Lập Docker Registry Riêng Tư Trên Ubuntu 18.04

Đầu tiên, để đẩy image, 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 mật khẩu đúng, quá trình xác thực sẽ thành công.

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

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

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

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

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

docker push sammy/ubuntu-nodejs

Quá trình đẩy image có thể mất một thời gian vì image được tải lên, nhưng khi hoàn tất, đầu ra sẽ 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 đẩy image lên registry, image đó sẽ được liệt kê trên dashboard tài khoản của bạn.

Thiet ke chua co ten 50

Nếu lệnh đẩy gặp lỗi như sau, có khả năng 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 lại bằng lệnh docker login và thử đẩy lại. Sau đó, kiểm tra xem image đã tồn tại trên trang repository Docker Hub của bạn chưa.

Bây giờ, bạn có thể dùng lệnh docker pull sammy/ubuntu-nodejs để kéo image về máy mới và sử dụng nó để chạy container mới.

Kết luận

Trong bài hướng dẫn này, bạn đã hoàn tất việc cài đặt Docker, làm quen với các image và container, cũng như đẩy một image đã được chỉnh sửa lên Docker Hub. Với những kiến thức cơ bản đã nắm vững, bạn có thể tiếp tục phát triển kỹ năng Docker của mình. Để khám phá thêm các tính năng nâng cao và các ứng dụng thực tiễn của Docker, đừng quên tham khảo thêm các bài viết và hướng dẫn chuyên sâu khác từ cộng đồng DataOnline. Những tài nguyên này sẽ giúp bạn hiểu rõ hơn về cách sử dụng Docker trong các môi trường phức tạp, từ việc triển khai các ứng dụng đến tối ưu hóa hiệu suất và tự động hóa quy trình làm việc.

Khi sử dụng Docker trên Ubuntu 20.04, việc thuê máy chủ VPS sẽ giúp bạn quản lý tài nguyên linh hoạt và tiết kiệm chi phí. Các dịch vụ thuê máy chủ VPS cung cấp cấu hình mạnh mẽ, phù hợp cho ứng dụng container hóa. Tìm hiểu thêm về cách thuê VPS để tối ưu hóa dự án!

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *