Thứ ba, 09/06/2020 | 00:00 GMT+7

Cài đặt 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 tiến trình ứng dụng trong containers. Containers cho phép bạn chạy các ứng dụng trong các tiến trình cô lập về tài nguyên. Chúng tương tự như máy ảo, nhưng containers cơ động hơn, thân thiện với tài nguyên và phụ thuộc nhiều hơn vào hệ điều hành server.

Chi tiết hơn về các thành phần khác nhau của containers Docker có trong Hệ sinh thái Docker: Giới thiệu về các thành phần chung .

Trong hướng dẫn này, bạn sẽ cài đặt và sử dụng Docker Community Edition (CE) trên Ubuntu 20.04, làm việc với các containers và images và push images vào Repository Docker.

Yêu cầu

Để làm theo hướng dẫn này, bạn cần các thành phần sau:

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

Gói cài đặt Docker có sẵn trong repository Ubuntu chính thức có thể không phải là version mới nhất. Đảm bảo ta nhận được version mới nhất, ta sẽ cài đặt Docker từ repository Docker chính thức. Để làm điều đó, ta sẽ thêm một nguồn gói mới, thêm khóa GPG từ Docker đảm bảo download hợp lệ, sau đó cài đặt gói.

Trước tiên, hãy cập nhật danh sách gói hiện có của bạn:

  • sudo apt update

Tiếp theo, cài đặt một vài gói yêu cầu 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 khóa GPG cho repository Docker chính thức vào hệ thống của bạn:

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

Thêm repository Docker vào các nguồn APT:

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

Tiếp theo, cập nhật database gói với các gói Docker từ repo mới được thêm vào:

  • sudo apt update

Đảm bảo bạn sắp cài đặt từ kho Docker thay vì kho mặc định của Ubuntu:

  • apt-cache policy docker-ce

Bạn sẽ thấy kết quả như thế này, mặc dù số version cho Docker có thể khác:

Kết quả của docker-ce chính sách apt-cache
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 ý docker-ce chưa được cài đặt, nhưng thành phần để cài đặt là từ repository Docker cho Ubuntu 20.04 ( focal ).

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

  • sudo apt install docker-ce

Docker bây giờ sẽ được cài đặt, service được chạy và được kích hoạt để bắt đầu khi khởi động. Kiểm tra xem nó đang chạy:

  • sudo systemctl status docker

Kết quả phải giống như sau, cho thấy rằng dịch vụ đang hoạt động và đang chạy:

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 

Việc cài đặt Docker giờ đây cung cấp cho bạn không chỉ dịch vụ Docker (daemon) mà còn cả tiện ích dòng lệnh docker hoặc ứng dụng client Docker. Ta sẽ khám phá cách sử dụng lệnh docker ở phần sau.

Bước 2 - Thực thi 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 user root hoặc bởi user trong group docker , lệnh này được tạo tự động trong quá trình cài đặt của Docker. Nếu bạn cố gắng chạy docker lệnh mà không đặt trước sudo hoặc không trong group Docker, bạn sẽ nhận được một kết quả như thế này:

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 nhập sudo khi nào bạn chạy lệnh docker , hãy thêm tên user vào group docker :

  • sudo usermod -aG docker ${USER}

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

  • su - ${USER}

Bạn cần nhập password của user để tiếp tục.

Xác nhận user hiện đã được thêm vào group docker bằng lệnh:

  • id -nG
Output
sammy sudo docker 

Nếu bạn cần thêm user vào group docker mà bạn chưa đăng nhập, hãy khai báo tên user đó 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ả sử bạn đang chạy lệnh docker với quyền là user trong group docker . Nếu không hãy thêm vào trước lệnh sudo .

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

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

Docker sẽ có một số tùy chọn lệnh. Cú pháp có dạng sau:

  • docker [option] [command] [arguments]

Để xem tất cả các tùy chọn có sẵn, hãy nhập:

  • docker

Kể từ Docker 19, 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ể, hãy nhập:

  • docker docker-subcommand --help

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

  • docker info

Hãy cùng khám phá một số lệnh này. Ta sẽ bắt đầu bằng cách làm việc với images.

Bước 4 - Làm việc với Docker Images

Docker container được xây dựng từ images Docker. Theo mặc định, Docker kéo những images này từ Docker Hub , một nơi đăng ký 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ữ images Docker 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ó images được lưu trữ ở đó.

Để kiểm tra xem bạn có thể truy cập và download images từ Docker Hub hay không, hãy nhập:

  • docker run hello-world

Kết quả kết quả sẽ chỉ ra rằng Docker hoạt động chính xác:

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.  ...  

Docker ban đầu không thể tìm thấy images hello-world local, vì vậy nó đã download images từ Docker Hub, đây là repository mặc định. Sau khi images được download, Docker đã tạo một containers từ images và ứng dụng trong containers được thực thi, hiển thị thông báo.

Bạn có thể tìm kiếm các images 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 images Ubuntu, hãy nhập:

  • docker search ubuntu

Tập lệnh sẽ thu thập dữ liệu Docker Hub và trả về danh sách tất cả các images có tên trùng 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…   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 chỉ ra một images được xây dựng và hỗ trợ bởi tổ chức đứng sau dự án. Khi bạn đã xác định được images mà bạn muốn sử dụng, bạn có thể tải nó xuống máy tính của bạn bằng cách sử dụng lệnh con pull .

Thực thi lệnh sau để tải images ubuntu chính thức xuống 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 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 một images đã được download, bạn có thể chạy containers bằng cách sử dụng images đã download với lệnh con run . Như bạn đã thấy với ví dụ hello-world , nếu một images chưa được download khi docker được thực thi với lệnh con run , thì ứng dụng client Docker trước tiên sẽ download images, sau đó chạy một containers bằng cách sử dụng nó.

Để xem các images đã được download máy tính của bạn, hãy nhập:

  • docker images

Kết quả trông 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ư ta thấy ở phần sau của hướng dẫn này, images mà bạn sử dụng để chạy containers có thể được sửa đổi và sử dụng để tạo images mới, sau đó có thể được tải lên (được push) lên Docker Hub hoặc các tổ chức đăng ký Docker khác.

Ta hãy xem xét cách chạy containers chi tiết hơn.

Bước 5 - Chạy Docker Container

Containers hello-world bạn đã chạy ở bước trước là một ví dụ về containers thử nghiệm. Các containers có thể hữu ích hơn thế nhiều và chúng có thể tương tác. Xét cho cùng, chúng tương tự như máy ảo, khác là thân thiện hơn với tài nguyên.

Ví dụ, hãy chạy một containers bằng images mới nhất của Ubuntu. Sự kết hợp của các lựa chọn -i-t cho phép bạn truy cập shell tương tác vào containers:

  • docker run -it ubuntu

Dấu nhắc lệnh của bạn sẽ thay đổi để cho biết là bạn hiện đang làm việc bên trong containers và sẽ có dạng sau:

Output
root@d9b100f2f636:/# 

Lưu ý id containers trong dấu nhắc lệnh. Trong ví dụ này, nó là d9b100f2f636 . Sau này, bạn cần ID containers đó để xác định containers khi muốn xóa nó.

Đến đây bạn có thể chạy bất kỳ lệnh nào bên trong containers. Ví dụ: hãy cập nhật hệ điều hành trong containers. Bạn không cần đặt trước bất kỳ lệnh nào với sudo , vì bạn đang hoạt động bên trong containers với quyền là user root :

  • apt update

Sau đó cài đặt bất kỳ ứng dụng nào trong đó. Ví dụ cài đặt Node.js:

  • apt install nodejs

Điều này sẽ cài đặt Node.js trong containers từ repository chính thức của Ubuntu. Khi quá trình cài đặt kết thúc, hãy xác minh Node.js đã được cài đặt:

  • node -v

Bạn sẽ thấy số version được hiển thị trong terminal:

Output
v10.19.0 

Mọi thay đổi bạn thực hiện bên trong containers chỉ áp dụng cho containers đó.

Để thoát khỏi containers, hãy nhập exit tại dấu nhắc.

Tiếp theo hãy xem xét việc quản lý các containers trên hệ thống .

Bước 6 - Quản lý containers Docker

Sau khi sử dụng Docker một thời gian, bạn sẽ có nhiều containers hoạt động (đang chạy) và không hoạt động trên máy tính của bạn. Để xem những containers đang hoạt động , hãy 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 đã bắt đầu hai containers; một từ images hello-world và một từ images ubuntu . Cả hai containers không còn chạy nữa, nhưng chúng vẫn tồn tại trên hệ thống.

Để xem tất cả các containers - đang hoạt động và không hoạt động, hãy chạy docker ps bằng lựa chọn -a :

  • docker ps -a

Bạn sẽ thấy kết quả 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  

Để xem containers mới nhất bạn đã tạo, hãy dùng lựa chọn -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
  •  

Để bắt đầu một containers đã dừng, hãy sử dụng docker start , theo sau là ID containers hoặc tên của containers. Hãy bắt đầu containers dựa trên Ubuntu với ID là 1c08a7a0d0e4 :

  • docker start 1c08a7a0d0e4

Containers sẽ bắt đầu và bạn có thể sử dụng docker ps để xem trạng thái của nó:

Output
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES 1c08a7a0d0e4        ubuntu              "/bin/bash"         3 minutes ago       Up 5 seconds                            quizzical_mcnulty  

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

  • docker stop quizzical_mcnulty

Khi bạn không cần containers nữa, hãy xóa nó bằng lệnh docker rm , sử dụng ID containers hoặc tên. Sử dụng lệnh docker ps -a để tìm ID containers hoặc tên cho containers được liên kết với images hello-world và xóa nó.

  • docker rm youthful_curie

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

Các containers có thể được chuyển thành images mà bạn có thể sử dụng để xây dựng các containers mới. Hãy xem nó hoạt động như thế nào.

Bước 7 - Commit (xác nhận) các thay đổi trong containers thành images Docker

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

Phần này hướng dẫn bạn cách lưu trạng thái của containers dưới dạng images Docker mới.

Sau khi cài đặt Node.js bên trong containers Ubuntu, bây giờ bạn có một containers đang chạy trên một images, nhưng khác với images bạn đã sử dụng để tạo nó. Nhưng bạn có thể muốn sử dụng lại containers Node.js này làm cơ sở cho các images sau này.

Commit các thay đổi đối với version images Docker 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

Lựa 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 nào, trong khi -a được sử dụng để ghi tác giả. container_id là ta đã lưu ý trước đó khi bắt đầu phiên Docker. Trừ khi bạn tạo thêm repository trên Docker Hub, repository thường là tên user Docker Hub của bạn.

Ví dụ: đối với sammy user, với ID containers là d9b100f2f636 , lệnh sẽ là:

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

Khi bạn commit một images, images mới sẽ được lưu local trên máy tính của bạn. Phần sau của hướng dẫn này, bạn sẽ học cách push images vào register Docker như Docker Hub để những người khác có thể truy cập vào nó.

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

  • docker images

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

Output
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE sammy/ubuntu-nodejs   latest              7c1f35226ca6        7 seconds ago       179MB ...  

Trong ví dụ này, ubuntu-nodejs là images mới, được lấy từ images ubuntu hiện có từ Docker Hub. Sự khác biệt về kích thước phản ánh những 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 tới khi bạn cần chạy một containers bằng Ubuntu có cài đặt sẵn NodeJS, bạn chỉ có thể sử dụng images mới.

Bạn cũng có thể tạo images từ Dockerfile , cho phép bạn tự động cài đặt phần mềm trong một images 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ờ hãy chia sẻ images mới với những người khác để họ có thể tạo containers từ nó.

Bước 8 - Push images Docker vào repository Docker

Bước hợp lý tiếp theo sau khi tạo một images mới từ một images hiện có là chia sẻ nó với một vài người  bạn muốn, hoặc cả thế giới  Docker Hub hay nơi lưu Docker nào khác bạn có quyền truy cập. Để push một images lên Docker Hub hoặc tổ chức đăng ký Docker nào khác, bạn phải có account ở đó.

Phần này hướng dẫn bạn cách push images (upload images) Docker lên Docker Hub. Để push images 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 cần xác thực bằng password Docker Hub.

Lưu ý: Nếu tên user đăng ký Docker của bạn khác với tên user local mà bạn đã sử dụng để tạo images, bạn sẽ phải gắn thẻ images bằng tên user đăng ký của bạn. Đối với ví dụ ở trên, bạn sẽ nhập:

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

Sau đó, bạn có thể push images của riêng mình bằng:

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

Để push images ubuntu-nodejs vào repository sammy , lệnh sẽ là:

  • docker push sammy/ubuntu-nodejs

Quá trình này có thể mất chút thời gian tải images lên, khi hoàn tất, kết quả trông 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 push images vào register, images đó sẽ được liệt kê trên trang tổng quan account của bạn, giống như hiển thị trong images sau:

Danh sách hình ảnh Docker mới trên Docker Hub

Nếu đẩy lên mà lỗi thuộc loại này, thì có thể bạn đã không đă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 việc push. Sau đó, xác minh nó tồn tại trên trang repository Docker Hub của bạn.

Đến đây bạn có thể sử dụng docker pull sammy / ubuntu-nodejs để kéo images sang một máy mới và sử dụng nó để chạy một containers 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 images và containers cũng như push một images đã sửa đổi vào Docker Hub. Đến đây bạn đã biết những điều cơ bản, chúc bạn sáng tạo nhiều thứ với Docker.


Tags:

Các tin trước

Cài đặt Node.js trên Ubuntu 20.04 2020-05-08
Cài đặt và cấu hình VNC trên Ubuntu 18.04 2020-05-07
Cài đặt Java với Apt trên Ubuntu 20.04 2020-05-07
Cài đặt Java bằng apt trên Ubuntu 18.04 2020-05-07
Cài đặt Nginx trên Ubuntu 18.04 2020-05-06
Cài đặt và bảo mật phpMyAdmin trên Ubuntu 20.04 2020-05-04
Cài đặt và bảo mật Redis trên Ubuntu 18.04 2020-04-30
Bảo mật apache với let-s-encrypt trên Ubuntu 20.04 2020-04-29
Cài đặt Linux Apache MySQL PHP (LAMP) trên Ubuntu 20 04 2020-04-29
Cài đặt LEMP Linux Nginx MySQL PHP (LEMP ) trên Ubuntu 20 04 2020-04-29