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à Docke
r 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 và -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
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.
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!