CyStack logo
  • Sản phẩm & Dịch vụ
  • Giải pháp
  • Bảng giá
  • Công ty
  • Tài liệu
Vi

vi

Trang chủHướng dẫnHướng dẫn chi tiết cách cài đặt Docker trên Debian

Hướng dẫn chi tiết cách cài đặt Docker trên Debian

CyStack blog 13 phút để đọc
CyStack blog15/09/2025
Locker Avatar

Chris Pham

Technical Writer

Locker logo social
Reading Time: 13 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 các ứng dụng của mình trong các tiến trình được cô lập về tài nguyên. Chúng tương tự như các máy ảo, nhưng container có tính di động cao hơn, thân thiện với tài nguyên hơn và phụ thuộc nhiều hơn vào hệ điều hành của máy chủ.

Hướng dẫn cài đặt Docker trên Debian

Trong hướng dẫn này, bạn sẽ cài đặt Docker trên Debian 10. Bạn sẽ cài đặt Docker, làm việc với các container và image, và push một image lên một Docker Repository.

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

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

  • Một máy chủ Debian 10 được thiết lập theo hướng dẫn thiết lập máy chủ Debian 10 ban đầu, bao gồm một người dùng không phải root có quyền sudo và một tường lửa (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 Bước 7 và 8.

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

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

Đầu tiên, cập nhật danh sách các gói hiện có của bạn:

sudo apt update

Tiếp theo, cài đặt một vài gói cần thiết để apt có thể sử dụng các gói qua HTTPS:

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

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

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

Thêm kho lưu trữ Docker vào APT sources:

sudo add-apt-repository "deb [arch=amd64] <https://download.docker.com/linux/debian> $(lsb_release -cs) stable"

Tiếp theo, cập nhật cơ sở dữ liệu gói với các gói Docker từ kho lưu trữ mới được thêm vào:

sudo apt update

Kiểm tra để đảm bảo bạn sẽ cài đặt từ kho lưu trữ Docker thay vì kho lưu trữ Debian mặc định:

apt-cache policy docker-ce

Bạn sẽ thấy kết quả tương tự như sau, 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:20.10.12~3-0~debian-buster
  Version table:
     5:20.10.12~3-0~debian-buster 500
        500 <https://download.docker.com/linux/debian> buster/stable amd64 Packages

Lưu ý rằng docker-ce chưa được cài đặt, nhưng gói đề xuất để cài đặt là từ kho lưu trữ Docker cho Debian 10 (buster).

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

sudo apt install docker-ce

Docker hiện đã được cài đặt, daemon đã được khởi động và tiến trình đã được kích hoạt để chạy khi khởi động. Kiểm tra xem nó có đang chạy không:

sudo systemctl status docker

Kết quả sẽ tương tự như sau, cho thấy dịch vụ đ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 Mon 2019-07-08 15:11:19 UTC; 58s ago
     Docs: <https://docs.docker.com>
 Main PID: 5709 (dockerd)
    Tasks: 8
   Memory: 31.6M
   CGroup: /system.slice/docker.service
           └─5709 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Việc cài đặt Docker không chỉ cung cấp dịch vụ Docker (daemon) mà còn cung cấp tiện ích 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 sau trong hướng dẫn này.

Bước 2: Chạy lệnh Docker mà không cần Sudo (Tùy chọn)

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 trong nhóm docker, nhóm này được tự động tạo 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 kết quả như sau:

Output
docker: 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 gõ sudo mỗi khi 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 quyền thành viên nhóm mới, hãy đăng xuất khỏi máy chủ và đăng nhập lại, hoặc gõ lệnh sau:

su - ${USER}

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

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

id -nG

Output
sammy sudodocker

Nếu bạn 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 khai báo tên người dùng đó 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 bạn đang chạy lệnh docker với tư cách là người dùng trong nhóm docker. Nếu bạn không muốn, vui lòng thêm sudo vào trước các lệnh.

Tiếp theo, chúng ta hãy khám phá lệnh docker.

Bước 3: Sử dụng lệnh Docker

Sử dụng docker bao gồm việc truyền một chuỗi các tùy chọn 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, gõ:

docker

Từ Docker 18 trở đi, danh sách đầy đủ các lệnh con 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 tùy chọn có sẵn cho một lệnh cụ thể, gõ:

docker docker-subcommand --help

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

docker info

Bây giờ, chúng ta hãy khám phá một số lệnh này. Chúng ta sẽ bắt đầu bằng cách làm việc với image.

Bước 4: Làm việc với Docker Image

Các container của Docker được xây dựng từ các Docker image. Theo mặc định, Docker kéo các image này từ Docker Hub, một kho lưu trữ Docker được quản lý bởi Docker, công ty đứng sau dự án Docker. Bất kỳ ai cũng có thể lưu trữ các 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 lưu trữ ở đó.

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

docker run hello-world

Kết quả sẽ cho biết Docker đang hoạt động chính xác:

Output
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:41a65640635299bab090f783209c1e3a3f11934cf7756b09cb2f1e02147c6ed8
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 thể tìm thấy image hello-world cục bộ, vì vậy nó đã tải xuống image từ Docker Hub, kho lưu trữ mặc định. Sau khi image được tải xuống, Docker đã tạo một container từ image đó và ứng dụng bên trong container đã chạy, hiển thị thông báo.

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 lệnh con search. Ví dụ, để tìm kiếm image Ubuntu, gõ:

docker search ubuntu

Lệnh sẽ quét Docker Hub và trả về một 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ả sẽ tương tự như sau:

Output
NAME                                                      DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
ubuntu                                                    Ubuntu is a Debian-based Linux operating sys…   9704                [OK]
dorowu/ubuntu-desktop-lxde-vnc                            Docker image to provide HTML5 VNC interface …   319                                     [OK]
rastasheep/ubuntu-sshd                                    Dockerized SSH service, built on top of offi…   224                                     [OK]
consol/ubuntu-xfce-vnc                                    Ubuntu container with "headless" VNC session…   183                                     [OK]
ubuntu-upstart                                            Upstart is an event-based replacement for th…   99                  [OK]
ansible/ubuntu14.04-ansible                               Ubuntu 14.04 LTS with ansible                   97                                      [OK]
neurodebian                                               NeuroDebian provides neuroscience research s…   57                  [OK]
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5      ubuntu-16-nginx-php-phpmyadmin-mysql-5          50                                      [OK]
ubuntu
...

Trong cột OFFICIAL, OK cho biết mộ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 mà bạn muốn sử dụng, bạn có thể tải nó xuống máy tính của mình bằng lệnh con pull.

Chạy lệnh sau để tải xuống image chính thức ubuntu về máy tính của bạn:

docker pull ubuntu

Bạn sẽ thấy kết quả sau:

Output
Using default tag: latest
latest: Pulling from library/ubuntu
5b7339215d1d: Pull complete
14ca88e9f672: Pull complete
a31c3b1caad4: Pull complete
b054a26005b7: Pull complete
Digest: sha256:9b1702dcfe32c873a770a32cfd306dd7fc1c4fd134adfb783db68defc8894b3c
Status: Downloaded newer image for ubuntu:latest

Sau khi một image đã được tải xuống, bạn có thể chạy một container bằng cách sử dụng image đã tải xuống với lệnh con run. Như bạn đã thấy với ví dụ hello-world, nếu một image chưa được tải xuống khi lệnh docker được thực thi với lệnh con run, Docker client sẽ tải xuống image trước, sau đó chạy một container bằng cách sử dụng nó.

Để xem các image đã được tải xuống máy tính của bạn, gõ:

docker images

Kết quả sẽ trông tương tự như sau:

Output
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              4c108a37151f        2 weeks ago         64.2MB
hello-world         latest              fce289e99eb9        6 months ago        1.84kB

Như bạn sẽ thấy sau trong hướng dẫn này, các image mà bạn sử dụng để chạy container có thể được sửa đổi và sử dụng để tạo ra các image mới, sau đó có thể được tải lên (push là thuật ngữ chuyên môn) Docker Hub hoặc các kho lưu trữ Docker khác.

Bây giờ, chúng ta hãy xem chi tiết hơn về cách chạy container.

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ề một container chạy và thoát sau khi phát ra một tin nhắn kiểm tra. Container có thể hữu ích hơn nhiều so với thế, và chúng có thể tương tác. Rốt cuộc, chúng tương tự như máy ảo, chỉ nhẹ hơn.

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

docker run -it ubuntu

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

Output
root@d9b100f2f636:/#

Lưu ý id container trong dấu nhắc lệnh. Trong ví dụ này, nó là d9b100f2f636. Bạn sẽ cần id container đó sau này để nhận dạng container khi bạn 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ụ, chúng ta hãy cập nhật cơ sở dữ liệu gói bên trong container. Bạn không cần thêm sudo vào trước bất kỳ lệnh nào, vì bạn đang hoạt động bên trong container với tư cách là người dùng root:

apt update

Sau đó, cài đặt bất kỳ ứng dụng nào trong đó. Chúng ta hãy cài đặt Node.js:

apt install nodejs

Việc này sẽ cài đặt Node.js trong container từ kho lưu trữ Ubuntu chính thức. Khi quá trình cài đặt kết thúc, hãy xác minh 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 của mình:

Output
v10.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, gõ exit tại dấu nhắc.

Tiếp theo, chúng ta hãy xem 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 Container

Sau khi sử dụng Docker một thời gian, bạn sẽ có nhiều container đang hoạt động (đang chạy) và không hoạt động trên máy tính của mình. Để xem các container đang hoạt động, sử dụng:

docker ps

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

Output
CONTAINER ID        IMAGE               COMMAND             CREATED

Trong 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 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ả các container — đang hoạt động và không hoạt động, chạy docker ps với tùy chọn -a:

docker ps -a

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

CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                      PORTS               NAMES
d42d0bbfbd35        ubuntu              "/bin/bash"         About a minute ago   Exited (0) 20 seconds ago                       friendly_volhard
0740844d024c        hello-world         "/hello"            3 minutes ago        Exited (0) 3 minutes ago                        elegant_neumann

Để xem container mới nhất bạn đã tạo, truyền tùy chọn -l:

docker ps -l

CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                      PORTS               NAMES
d42d0bbfbd35        ubuntu              "/bin/bash"         About a minute ago   Exited (0) 34 seconds ago                       friendly_volhard

Để khởi động một container đã dừng, sử dụng docker start, theo sau là ID container hoặc tên của container. Chúng ta hãy khởi động container dựa trên Ubuntu với ID là d9b100f2f636:

docker start d42d0bbfbd35

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

CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
d42d0bbfbd35        ubuntu              "/bin/bash"         About a minute ago   Up 8 seconds                            friendly_volhard

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

docker stop friendly_volhard

Khi bạn đã quyết định không cần một container nữa, hãy xóa nó bằng lệnh docker rm, một lần nữa sử dụng ID container hoặc tên. Sử dụng lệnh docker ps -a để tìm ID hoặc tên của container liên quan đến image hello-world và xóa nó.

docker rm elegant_neumann

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

Các container có thể được biến thành image mà bạn có thể sử dụng để xây dựng các container mới. Chúng ta hãy xem điều đó hoạt động như thế nào.

Bước 7: Áp dụng các thay đổi trong một Container vào một Docker Image

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

Phần này cho bạn thấy cách lưu 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 đang chạy từ một image, nhưng container đó khác với image mà bạn đã sử dụng để tạo ra nó. Nhưng bạn có thể muốn tái sử dụng container Node.js này làm cơ sở cho các image mới sau này.

Sau đó, áp dụng các thay đổi vào một Docker image instance mới bằng cách sử dụ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 dành cho thông báo commit giúp bạn và những người khác biết bạn đã thực hiện những thay đổi gì, trong khi -a được sử dụng để chỉ định tác giả. container_id là id bạn đã ghi chú trước đó trong hướng dẫn khi bạn bắt đầu phiên Docker tương tác. Trừ khi bạn đã tạo các kho lưu trữ bổ sung trên Docker Hub, repository thường là tên người dùng Docker Hub của bạn.

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

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

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

Liệt kê lại các Docker image sẽ hiển thị image mới, cũng như image cũ mà nó được tạo ra:

docker images

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

Output
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
sammy/ubuntu-nodejs   latest              d441c62350b4        10 seconds ago      152MB
ubuntu                latest              4c108a37151f        2 weeks ago         64.2MB
hello-world           latest              fce289e99eb9        6 months ago        1.84kB

Trong ví dụ này, ubuntu-nodejs là image mới, được tạo ra từ image ubuntu hiện 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. Và trong ví dụ này, thay đổi là NodeJS đã được cài đặt. Vì vậy, lần sau khi bạn cần chạy một container sử dụng Ubuntu có cài đặt sẵn NodeJS, bạn chỉ cần sử dụng image mới.

Bạn cũng có thể xây dựng Image từ một Dockerfile, cho phép bạn tự động hóa việc cài đặt phần mềm trong một image mới. Tuy nhiên, điều đó nằm ngoài phạm vi của hướng dẫn này.

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

Bước 8: Push Docker Image lên một Docker Repository

Bước hợp lý tiếp theo sau khi tạo một image mới từ một image hiện có là chia sẻ nó với một vài người bạn, cả thế giới trên Docker Hub, hoặc một registry Docker 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 Docker nào khác, bạn phải có một tài khoản ở đó.

Phần này cho bạn thấy cách đẩy một Docker image lên Docker Hub. Để tìm hiểu cách tạo registry Docker riêng tư của riêng bạn, hãy xem How To Set Up a Private Docker Registry on Ubuntu 18.04.

Để đẩy 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 tên người dùng registry Docker của bạn khác với tên người dùng cục bộ mà bạn đã sử dụng để tạo image, bạn sẽ phải gắn thẻ (tag) cho image của mình với tên người dùng registry của bạn. Đối với ví dụ được đưa ra trong bước cuối cùng, bạn sẽ gõ:

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

Sau đó bạn có thể đẩy image của mình bằng cách sử dụng:

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

Để đẩy image ubuntu-nodejs lên kho lưu trữ 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 thành khi nó tải lên các image, nhưng khi hoàn thành, kết quả sẽ trông như thế này:

Output
The 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 một image lên một registry, nó sẽ được liệt kê trên trang tổng quan tài khoản của bạn, như được hiển thị trong hình ảnh dưới đây.

Docker

Nếu một lần thử đẩy dẫn đến lỗi loại này, thì có khả năng bạn chưa đăng nhập:

Output
The 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

Đăng nhập bằng docker login và lặp lại lần thử đẩy. Sau đó, xác minh rằng nó tồn tại trên trang kho lưu trữ Docker Hub của bạn.

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

Kết luận

Trong hướng dẫn này, bạn đã cài đặt Docker, làm việc với image và container, và đẩy một image đã sửa đổi lên Docker Hub.

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