+3

Hướng dẫn cài đặt và sử dụng Docker trên Ubuntu 20.04

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.

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 Image được quản lý bởi Docker Inc, 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ủa 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, rmkill... 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:

Docker Hub

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!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí