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:
- Một server Ubuntu 20.04 được cài đặt theo hướng dẫn cài đặt server ban đầu Ubuntu 20.04 , bao gồm user không phải root có quyền sudo và firewall.
- Một account trên Docker Hub nếu bạn muốn tạo images của riêng mình và đẩy chúng vào Docker Hub, như trong Bước 7 và 8.
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:
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:
● 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:
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
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:
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:
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:
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:
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:
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 và -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:
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:
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:
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ó:
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:
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:
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:
Nếu đẩy lên mà lỗi thuộc loại này, thì có thể bạn đã không đăng nhập:
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.
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