Giới thiệu Docker
Docker là một công cụ đóng gói và quản lý container hỗ trợ cho việc phát triển, kiểm thử và triển khai ứng dụng. Nó cho phép bạn chạy một ứng dụng trong một container được đóng gói, với tất cả các thư viện và cấu hình cần thiết, mà không cần phải lo lắng về sự khác nhau về môi trường giữa các máy chủ khác nhau. Docker cung cấp một cách dễ dàng để chạy nhiều container trên một máy chủ và quản lý chúng một cách hiệu quả. Nó cũng hỗ trợ việc chia sẻ và tải xuống container từ kho lưu trữ công cộng Docker Hub. Với Docker, các nhà phát triển có thể tiết kiệm thời gian và tăng tốc quá trình phát triển và triển khai ứng dụng.
Để tìm hiểu thêm về Docker, bạn có thể tham khảo tài liệu tại Docker Documentation hoặc bài giới thiệu trên Ezidev: Ezidev - Introduction to Docker.
Prerequisites
Chuẩn bị trước khi bắt đầu cài đặt Docker:
- OS: Ubuntu 20.04
- User: sudo
- Cấu hình khuyến nghị: 8GB RAM trong trường hợp cài đặt trên Desktop.
- Tài khoản Docker Hub trong trường hợp cần tạo hoặc push containers/images lên Docker Hub.
Bước 1: Cài đặt Docker
Gói cài đặt Docker hiện có sẵn trên Repo chính thức của Ubuntu, tuy nhiên đây có thể không phải là phiên bản mới nhất. Để chắc chắn thiết bị của bạn có thể cài đặt phiên bản mới nhất, chúng ta sẽ thực hiện cài đặt từ Docker Repository. Để làm được điều này, chúng ta cần thêm mới package source, GPG Key của Docker để chắc chắn rằng có thể tải về gói cài đặt rồi sau đó mới cài đặt Docker. Các bước thực hiện như sau:
- Cập nhật package source của hệ thống:
sudo apt update
- Cài đặt một số gói cần thiết nhằm giúp apt có thể sử dụng package qua HTTPS:
sudo apt install apt-transport-https ca-certificates curl software-properties-common
- Thêm mới GPG Key của Docker:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
- Thêm mới Docker Repository vào APT:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
Bước này sẽ cũng thêm mới các Repo vào package database của hệ thống.
- Kiểm tra xem việc thay thế repo mới nhất với repo mặc định của hệ thông xem đã được thay thế chưa
apt-cache policy docker-ce
Kết quả trả về sẽ như sau, phiên bản Docker có thể thay đổi tùy vào thời điểm cài đặt:
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
Trong output trên, lưu ý rằng docker-ce chưa được cài đặt, nhưng đã có sẵn phiên bản 5:19.03.9~3-0~ubuntu-focal trong repo sẵn sàng để cài đặt.
- Cài đặt Docker:
sudo apt install docker-ce
Sau bước này, Docker sẽ được cài đặt, deamon sẽ được khởi động (Docker Service chạy ngầm) và process sẽ được thêm vào boot (khởi động cùng hệ thống). Để kiểm tra xem Docker Deamon đã được khởi động hay chưa, chúng ta sử dụng lệnh sau:
sudo systemctl status docker
Service khi hoạt động bình thường sẽ trả về kết quả như sau:
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
Trong trường hợp có lỗi xảy ra, giá trị Active
sẽ là failed.
Đối với các bản cài Docker hiện nay, gói cài đặt thường không chỉ bao gồm mỗi Docker Service (Deamon) mà sẽ bao gồm các tiện ích khác như Docker Command Line
hoặc Docker Client
để chúng ta có thể tương tác với Docker Service thông qua CLI. Trong các phần sau chúng ta sẽ tìm hiểu về cách sử dụng Docker Command Line để tương tác với Docker Service.
Bước 2: Thực thi Docker Command Line không cần sudo (Optional)
Mặc định Docker sẽ yêu cầu quyền quản trị viên (sudo) để thực thi các lệnh. Trong trường hợp câu lệnh được thực thi mà không có quyền sudo, Docker sẽ trả về lỗi như sau:
Output
docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
See 'docker run --help'.
Để thực thi Docker Command Line mà không cần sudo, chúng ta cần thêm user hiện tại vào nhóm docker:
sudo usermod -aG docker ${USER}
Sau khi thêm user hiện tại vào nhóm docker, chúng ta cần đăng xuất và đăng nhập lại để thay đổi có hiệu lực.
su - ${USER}
Câu lệnh này sẽ yêu cầu mật khẩu.
Để kiểm tra rằng user đã được thêm vào docker
group hay chưa:
groups
Kết quả trả ra như sau được coi là thành công:
Output
sammy sudo docker
Trong trường hợp cần thêm User khác vào docker
group:
sudo usermod -aG docker username
Trong đó username
là tên của user cần thêm vào docker
group.
Lưu ý: Các câu lệnh tiếp theo trong phần còn lại của post này sẽ mặc định user đang sử dụng có quyền quản trị viên, trong trường hợp chưa có, cần thêm sudo
vào trước mỗi câu lệnh
Buộc 3: Tìm hiểu về Docker Command
Cú pháp câu lệnh Docker:
docker [option] [command] [arguments]
Để kiểm tra các subcommand của Docker:
docker
Kể từ phiên bản Docker 19, kết quả trả về sẽ như sau:
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
Để kiểm tra các option của Docker:
docker docker-subcommand --help
Để kiểm tra các thông tin khác về Docker (Phiên bản, hệ thống,...)
docker info
Phần tiếp theo sẽ trình bày các câu lệnh thao tác với Image và Container.
Bước 4: Thao tác với Docker Image
Các container Docker được xây dựng từ các Docker Image. Mặc định, Docker sẽ 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 cứ ai cũng có thể lưu trữ Docker Image của mình trên Docker Hub, vì thế hầu hết Image của các ứng dụng và phiên bản Linux mà bạn cần có thể được tìm thấy tại đây. Để kiểm tra xem bạn có quyền truy cập Docker Hub không, sử dụng câu lệnh:
docker run hello-world
Kết quả trả về như sau có nghĩa là Docker đang hoạt động đúng tuy nhiên nó không thể tìm thấy Image hello-world
trên thiết bị của bạn, Image này cần được kéo về từ Docker Hub. Docker sau đó sẽ tự động kéo Image này về và chạy nó:
Output
Unable 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.
Để kiểm tra các Image có sẵn trên Docker Hub, sử dụng câu lệnh:
docker search ubuntu
Câu lệnh này sẽ lấy các dữ liệu phù hợp với từ khóa mà bạn search từ Docker Hub và hiển thị kết quả trên màn hình:
Output
NAME 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
...
Khi đã xác định được tên chính xác của Image (cột OFFICIAL hiện [OK] nghĩa là Image được build và hỗ trợ bởi chính công ty phát hành Docker) để sử dụng, bạn có thể kéo Image này về bằng câu lệnh pull
:
docker pull ubuntu
Kết quả trả về như sau:
Output
Using 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 kéo về, có thể sử dụng câu lệnh run
để chạy Image này. Trong trường hợp cảu Image hello-world
phía trên, khi Image không tồn tại, Docker sẽ tự động tìm và kéo về từ Docker Hub.
Để kiểm tra các Images đang có trên thiết bị của bạn, sử dụng câu lệnh:
docker images
Output sẽ tương tự như sau:
Output
REPOSITORY 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 trong phần sau của 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ể tải lên (push) lên Docker Hub hoặc các kho lưu trữ Docker khác (Docker registries).
Bước 5: Khởi chạy một Container
Container "hello-world" mà ta chạy trong bước trước là một ví dụ của một container chạy và thoát sau khi phát ra một thông điệp kiểm tra. Container hữu ích hơn nhiều so với điều đó và đặc biệt là chúng có thể tương tác. Sau tất cả, chúng tương tự như các máy ảo, chỉ có tài nguyên được tối ưu tốt hơn.
Ví dụ, chúng ta sẽ chạy một container sử dụng image mới nhất của Ubuntu. Kết hợp của các switch -i và -t cho phép bạn truy cập lệnh tương tác vào trong container.
docker run -it ubuntu
Câu lệnh này sẽ đưa chúng ta truy cập vào trong Container và cho phép thực thi trực tiếp câu lệnh trong đó. Output sẽ tương tự như sau:
Output
root@d9b100f2f636:/#
Cần để ý giá trị d9b100f2f636
, đây là ID của container. Giá trị này dùng để định danh duy nhất container, có thể sử dụng để thực thi các câu lệnh khác như stop
, start
, rm
và kill
...
Sau khi truy cập vào container, ta có thể thực thi các câu lệnh như trên một máy chủ linux thông thường. Tại đây cũng không cần sử dụng prefix sudo
vì mặc định quyền sudo đã được cấp.
- Ví dụ cần cài đặt Nodejs:
apt install nodejs
- Kiểm tra phiên bản Nodejs đã cài:
nodejs -v
Output sẽ tương tự như sau:
Output
v10.19.0
Các thay đổi mà bạn đã thực thi phía trên sẽ chỉ ảnh hưởng đến Container hiện hữu.
Để thoát khỏi container, sử dụng câu lệnh exit
.
Lưu ý rằng khi container bị xoá đi, các thay đổi sẽ mất đi. Để lưu lại các thay đổi, bạn cần commit chúng vào một Image mới.
Cú pháp để commit một container thành một Image mới như sau:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Ví dụ, để commit container vừa tạo thành một Image mới, ta sử dụng câu lệnh sau:
docker commit -a "Your Name" -m "Added some new features" abc123 myimage:v1
Câu lệnh này sẽ tạo 1 Image mới chứa toàn bộ các thay đổi mà bạn đã thực hiện với container hiện hữu và lưu nó trong local repository của bạn.
Bước 6: Quản lý Containers
Sau khi sử dụng Docker một thời gian, sẽ có rất nhiều container được tạo ra. Để quản lý chúng, ta sử dụng câu lệnh docker ps
. Câu lệnh này sẽ hiển thị danh sách các container đang chạy.
docker ps
Kết quả sẽ tương tự như sau:
Output
CONTAINER ID IMAGE COMMAND CREATED
Trong bài hướng dẫn này, chúng ta đã tạo ra 2 container tuy nhiên chúng đều không hoạt động.
Để kiểm tra chúng ta sử dụng câu lệnh docker ps -a
. Câu lệnh này sẽ hiển thị danh sách tất cả các container, bao gồm cả những container đã dừng hoạt động.
docker ps -a
Kết quả sẽ 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
Để kiểm tra container mới nhất vừa được tạo, ta sử dụng câu lệnh docker ps -l
. Câu lệnh này sẽ hiển thị thông tin về container mới nhất.
docker ps -l
Kết quả sẽ tương tự như sau:
Output
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 hoạt động, ta sử dụng câu lệnh docker start
. Cú pháp của câu lệnh như sau:
docker start 1c08a7a0d0e4
Để dừng một container đang chạy, ta sử dụng câu lệnh docker stop
. Cú pháp của câu lệnh như sau:
docker stop 1c08a7a0d0e4
Khi cảm thấy 1 container đã không còn cần thiết, có thể xóa nó bằng câu lệnh docker rm
. Cú pháp của câu lệnh như sau:
docker rm 1c08a7a0d0e4
Bước 7: Đẩy Image lên Docker Repository
Để đẩy Image lên Docker Hub hoặc bất kỳ kho lưu trữ Docker nào khác, bạn phải có tài khoản ở đó. Phần này sẽ hướng dẫn bạn cách đẩy một hình ảnh Docker lên Docker Hub. Đầu tiên, bạn phải đăng nhập vào Docker Hub bằng câu lệnh sau. bước này sẽ yêu cầu nhập mật khẩu:
docker login -u docker-registry-username
Lưu ý rằng nếu Docker registry username của bạn khác với local username, cần phải tag
image với registry username trước khi đẩy lên.
docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs
Push image lên Docker Hub bằng câu lệnh sau:
docker push docker-registry-username/docker-image-name
Sẽ mất thời gian để tải Image lên Docker Hub. Sau khi tải lên thành công, bạn có thể kiểm tra trên Docker Hub. Output sẽ tương tự như sau:
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 Image đã được tải thành công lên Docker Hub, bạn có thể tạo một container mới từ Image đó sử dụng câu lệnh docker pull ...
.
Giao diện Docker Hub sẽ tương tự như sau:
Tổng kết
Bài viết này đã cung cấp cho bạn các thông tin cần thiết để bắt đầu sử dụng Docker. Chúc may mắn!