Docker là một công cụ mạnh mẽ giúp đơn giản hóa việc chạy các ứng dụng trong container, tương tự như máy ảo nhưng lại tiết kiệm tài nguyên, dễ di chuyển và phụ thuộc vào hệ điều hành chủ. Để hiểu rõ hơn về các thành phần trong Docker container, bạn có thể tham khảo bài viết Hệ sinh thái Docker: Giới thiệu các thành phần phổ biến.
Trên Ubuntu 16.04, có hai cách cài đặt Docker. Một là cài Docker trực tiếp trên hệ điều hành đã có sẵn, và cách còn lại là sử dụng Docker Machine, công cụ tự động cài đặt Docker trên một máy chủ mới.
Để triển khai Docker hiệu quả, bạn cần một môi trường ổn định như VPS Việt Nam. Với hạ tầng mạnh mẽ và hỗ trợ 24/7, VPS Việt Nam giúp bạn chạy container mượt mà, tối ưu hóa quy trình phát triển ứng dụng. Khám phá các gói VPS chất lượng ngay hôm nay!
DataOnline sẽ hướng dẫn bạn học cách cài đặt và sử dụng Docker trên một cài đặt Ubuntu 16.04 hiện có.
Yêu Cầu
Để theo dõi hướng dẫn này, bạn cần:
-
Một máy chủ Ubuntu 16.04 đã được thiết lập với một tài khoản không phải root có quyền sudo và có cấu hình tường lửa cơ bản, như đã được giải thích trong “Thiết lập máy chủ ban đầu với Ubuntu 16.4.”
-
Một tài khoản trên Docker Hub nếu bạn muốn tạo các image riêng và đẩy chúng lên Docker Hub, như được trình bày ở Bước 7 và Bước 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 16.04 có thể không phải là phiên bản mới nhất. Để có phiên bản mới nhất, bạn hãy cài đặt Docker từ kho chính thức của Docker. Phần này hướng dẫn cách thực hiện điều đó.
Trước tiên, để đảm bảo các tệp tải về là hợp lệ, thêm GPG key của kho chính thức Docker vào hệ thống của bạn:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Sau đó, thêm kho Docker vào các nguồn APT:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
Tiếp theo, cập nhật cơ sở dữ liệu gói với các gói Docker từ kho vừa thêm:
sudo apt-get update
Đảm bảo rằng bạn đang cài đặt từ kho Docker thay vì kho mặc định của Ubuntu 16.04 bằng cách kiểm tra:
apt-cache policy docker-ce
Bạn sẽ thấy đầu ra tương tự như sau:
Output of apt-cache policy docker-ce docker-ce: Installed: (none) Candidate: 18.06.1~ce~3-0~ubuntu Version table: 18.06.1~ce~3-0~ubuntu 500 500 https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
Lưu ý rằng docker-ce chưa được cài đặt, nhưng candidate để cài đặt là từ kho Docker dành cho Ubuntu 16.04 (xenial).
Cuối cùng, cài đặt Docker:
sudo apt-get install -y docker-ce
Docker bây giờ sẽ được cài đặt, daemon được khởi chạy và tiến trình sẽ được kích hoạt tự động khi khởi động hệ thống. Kiểm tra trạng thái hoạt động của Docker:
sudo systemctl status docker
Đầu ra sẽ trông tương tự 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 Thu 2018-10-18 20:28:23 UTC; 35s ago Docs: https://docs.docker.com Main PID: 13412 (dockerd) CGroup: /system.slice/docker.service ├─13412 /usr/bin/dockerd -H fd:// └─13421 docker-containerd --config /var/run/docker/containerd/containerd.toml
Việc cài đặt Docker không chỉ cung cấp dịch vụ Docker (daemon) mà còn cả tiện ích dòng lệnh docker
, hay còn gọi là Docker client. Chúng ta sẽ tìm hiểu cách sử dụng lệnh docker
ở các bước sau.
Bước 2 – Thực thi lệnh Docker không cần sudo
Mặc định, chạy lệnh docker
yêu cầu quyền root – tức là bạn phải thêm sudo
ở đầu lệnh. Ngoài ra, lệnh này cũng có thể được chạy bởi một người dùng thuộc nhóm docker, nhóm này được tạo tự động 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 thông báo như sau:
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 việc phải gõ sudo mỗi khi 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 thay đổi thành viên nhóm mới, bạn có thể đăng xuất rồi đăng nhập lại, hoặc chạy:
su - ${USER}
Bạn sẽ được yêu cầu nhập mật khẩu của người dùng. Sau đó, xác nhận rằng người dùng của bạn đã được thêm vào nhóm docker bằng lệnh:
id -nG
Output sammy sudo docker
Nếu bạn cần thêm một người dùng khác (không phải tài khoản đang đăng nhập) vào nhóm docker, hãy chỉ định rõ tên người dùng đó:
sudo usermod -aG docker username
Phần còn lại của bài viết này giả định 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 các lệnh.
Bước 3 – Sử dụng lệnh Docker
Sau khi cài đặt và cấu hình Docker, đã đến lúc làm quen với tiện ích dòng lệnh của nó. Việc sử dụng docker bao gồm việc truyền vào một chuỗi các tùy chọn 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 18.06.1, 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ố (switches) có sẵn cho một lệnh cụ thể, hãy gõ:
docker docker-subcommand --help
Để xem thông tin hệ thống về Docker, sử dụng:
docker info
Bước 4 – Làm việc với Docker Images
Các container Docker được khởi chạy từ các image Docker. Mặc định, Docker sẽ tải các image này từ Docker Hub – một kho Docker do Docker, công ty đứng sau dự án Docker quản lý. Bất cứ ai cũng có thể xây dựng và lưu trữ image Docker của mình trên Docker Hub, do đó hầu hết các ứng dụng và bản phân phối Linux bạn cần để chạy container đều có image được lưu trữ trên Docker Hub.
Để kiểm tra xem bạn có thể truy cập và tải các image từ Docker Hub hay không, hãy gõ:
docker run hello-world
Trong đầu ra, bạn sẽ thấy thông điệp sau, cho biết Docker hoạt động chính xác:
Output ... Hello from Docker! This message shows that your installation appears to be working correctly. ...
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 lệnh con search. Ví dụ, để tìm image Ubuntu, gõ:
docker search ubuntu
Script sẽ quét Docker Hub và trả về danh sách các image có tên phù hợp với chuỗi tìm kiếm. Trong trường hợp này, đầu ra sẽ giống như sau:
Output NAME DESCRIPTION STARS OFFICIAL AUTOMATED ubuntu Ubuntu is a Debian-based Linux operating sys… 8564 [OK] dorowu/ubuntu-desktop-lxde-vnc Ubuntu with openssh-server and NoVNC 230 [OK] rastasheep/ubuntu-sshd Dockerized SSH service, built on top of offi… 176 [OK] consol/ubuntu-xfce-vnc Ubuntu container with "headless" VNC session… 129 [OK] ansible/ubuntu14.04-ansible Ubuntu 14.04 LTS with ansible 95 [OK] ubuntu-upstart Upstart is an event-based replacement for th… 91 [OK] neurodebian NeuroDebian provides neuroscience research s… 54 [OK] 1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5 ubuntu-16-nginx-php-phpmyadmin-mysql-5 48 [OK] ubuntu-debootstrap debootstrap --variant=minbase --components=m… 39 [OK] nuagebec/ubuntu Simple always updated Ubuntu docker images w… 23 [OK] tutum/ubuntu Simple Ubuntu docker images with SSH access 18 i386/ubuntu Ubuntu is a Debian-based Linux operating sys… 14 1and1internet/ubuntu-16-apache-php-7.0 ubuntu-16-apache-php-7.0 13 [OK] ppc64le/ubuntu Ubuntu is a Debian-based Linux operating sys… 12 eclipse/ubuntu_jdk8 Ubuntu, JDK8, Maven 3, git, curl, nmap, mc, … 6 [OK] 1and1internet/ubuntu-16-nginx-php-5.6-wordpress-4 ubuntu-16-nginx-php-5.6-wordpress-4 6 [OK] codenvy/ubuntu_jdk8 Ubuntu, JDK8, Maven 3, git, curl, nmap, mc, … 4 [OK] darksheer/ubuntu Base Ubuntu Image -- Updated hourly 4 [OK] pivotaldata/ubuntu A quick freshening-up of the base Ubuntu doc… 2 1and1internet/ubuntu-16-sshd ubuntu-16-sshd 1 [OK] smartentry/ubuntu ubuntu with smartentry 1 [OK] ossobv/ubuntu Custom ubuntu image from scratch (based on o… 0 paasmule/bosh-tools-ubuntu Ubuntu based bosh-cli 0 [OK] 1and1internet/ubuntu-16-healthcheck ubuntu-16-healthcheck 0 [OK] pivotaldata/ubuntu-gpdb-dev Ubuntu images for GPDB development 0
Trong cột OFFICIAL, [OK] chỉ ra rằng 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 mà bạn muốn sử dụng, bạn có thể tải về máy của mình bằng cách sử dụng lệnh con pull
. Hãy thử với image ubuntu
, như sau:
docker pull ubuntu
Sau khi image đã được tải về, bạn có thể chạy một container sử dụng image đó bằng lệnh con run. Nếu image chưa được tải về khi chạy lệnh run, Docker client sẽ tự động tải image về rồi khởi chạy container:
docker run ubuntu
Để xem các image đã được tải về máy của bạn, gõ:
docker images
Đầu ra sẽ giống như sau:
Output REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest ea4c82dcd15a 16 hours ago 85.8MB hello-world latest 4ab4c602aa5e 5 weeks ago 1.84kB
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 làm cơ sở cho các image mới, sau đó có thể được tải lên (push là thuật ngữ kỹ thuật) lên Docker Hub hoặc các kho Docker khác.
Bước 5 – Chạy một Docker Container
Container hello-world
mà bạn chạy ở bước trước chỉ là một ví dụ về container chạy và thoát sau khi xuất ra một thông điệp thử nghiệm. Container có thể thực hiện nhiều chức năng hơn thế và có thể ở 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ố (tham số) -i
và -t
cho phép bạn truy cập shell tương tác vào bên trong container:
docker run -it ubuntu
Lưu ý: Hành vi mặc định của lệnh run là khởi tạo một container mới. Khi bạn chạy lệnh trên, bạn sẽ mở giao diện shell của một container ubuntu thứ hai.
Dấu nhắc lệnh của bạn sẽ thay đổi để phản ánh rằng bạn đang làm việc bên trong container, có dạng:
Output root@9b0db8a30ad1:/#
Lưu ý: Hãy nhớ lại container id được hiển thị trong dấu nhắc lệnh. Trong ví dụ trên, đó là
9b0db8a30ad1
. Bạn sẽ cần container ID này sau đó để nhận dạng container khi muốn xóa nó.
Giờ đây, 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. Bạn không cần thêm sudo
vì bạn đang vận hành bên trong container với quyền root:
apt-get update
Sau đó, cài đặt bất kỳ ứng dụng nào. Hãy cài đặt Node.js:
apt-get install -y nodejs
Lệnh trên cài đặt Node.js trong container từ kho chính thức của Ubuntu. Khi cài đặt hoàn tất, xác nhận rằng Node.js đã được cài bằng lệnh:
node -v
Bạn sẽ thấy số phiên bản được hiển thị trên terminal:
Output v8.10.0
Mọi thay đổi bạn thực hiện bên trong container chỉ áp dụng cho container đó.
Để thoát khỏi container, gõ exit
tại dấu nhắc lệnh.
Tiếp theo, chúng ta sẽ tìm hiểu cách quản lý các container trên hệ thống.
Bước 6 – Quản lý Docker Containers
Sau một thời gian sử dụng Docker, bạn sẽ có nhiều container đang hoạt động (running) và không hoạt động (inactive) trên máy của mình. Để xem các container đang chạy, gõ:
docker ps
Đầu ra sẽ hiển thị như sau:
Output CONTAINER ID IMAGE COMMAND CREATED
Trong hướng dẫn này, bạn đã khởi động ba container; một từ image hello-world và hai từ image ubuntu. Những container này có thể không còn chạy nhưng vẫn tồn tại trên hệ thống của bạn.
Để xem tất cả các container – cả đang chạy lẫn không chạy – sử dụng lệnh docker ps
với tham số -a
:
docker ps -a
Đầu ra sẽ hiển thị như sau:
Output CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9b0db8a30ad1 ubuntu "/bin/bash" 21 minutes ago Exited (0) About a minute ago xenodochial_neumann d7851eb12e23 ubuntu "/bin/bash" 24 minutes ago Exited (0) 24 minutes ago boring_chebyshev d54945b6510b hello-world "/hello" 32 minutes ago Exited (0) 32 minutes ago youthful_roentgen
Để xem container mới nhất bạn tạo, thêm tham số -l
:
docker ps -l
Output CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9b0db8a30ad1 ubuntu "/bin/bash" 22 minutes ago Exited (127) About a minute ago xenodochial_neumann
Để khởi động lại một container đã dừng, sử dụng lệnh docker start
theo sau bởi container ID hoặc tên của container. Ví dụ, để khởi động container dựa trên Ubuntu có ID 9b0db8a30ad1
:
docker start 9b0db8a30ad1
Container sẽ khởi động, và bạn có thể dùng docker ps
để kiểm tra trạng thái:
Output CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9b0db8a30ad1 ubuntu "/bin/bash" 23 minutes ago Up 11 seconds xenodochial_neumann
Để dừng một container đang chạy, sử dụng lệnh docker stop
theo sau container ID hoặc tên. Lần này, chúng ta sẽ dùng tên mà Docker gán cho container, ví dụ: xenodochial_neumann
:
docker stop xenodochial_neumann
Khi bạn quyết định không cần container nữa, hãy xóa nó bằng lệnh docker rm
, cũng sử dụng container ID hoặc tên. Ví dụ, để xóa container liên quan đến image hello-world:
docker rm youthful_roentgen
Bạn cũng có thể khởi tạo container mới và đặt tên cho nó bằng cách sử dụng tham số --name
. Ngoài ra, tham số --rm
cho phép tạo container tự xóa khi nó dừng lại. Xem lệnh docker run --help
để biết thêm các tùy chọn khác.
Container có thể được chuyển đổi thành image để bạn có thể sử dụng làm cơ sở cho các container mới. Hãy cùng tìm hiểu cách thực hiện điều đó.
Bước 7 – Cam kết các thay đổi trong Container thành một Docker Image
Khi bạn khởi động một image Docker, bạn có thể tạo, chỉnh sửa và xóa các tệp như khi sử dụng một máy ảo. Các thay đổi bạn thực hiện chỉ áp dụng cho container đó. Bạn có thể khởi động và dừng container, nhưng một khi đã hủy container bằng lệnh docker rm
, các thay đổi đó sẽ bị mất mãi mãi.
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 đang chạy từ một image, nhưng container đó đã khác so với image ban đầu được sử dụng để tạo ra nó. Có thể bạn muốn tái sử dụng container Node.js này làm cơ sở cho các image mới sau này.
Để làm điều đó, hãy commit các thay đổi vào một instance Docker image mới theo cấu trúc lệnh sau:
docker commit -m "What did you do to the image" -a "Author Name" container-id repository/new_image_name
-
Tham số
-m
dành cho thông điệp commit giúp bạn và người khác biết bạn đã thay đổi gì. -
Tham số
-a
được dùng để chỉ định tác giả. -
container-id
là ID container mà bạn đã ghi nhận khi bắt đầu phiên Docker tương tác. -
Nếu bạn chưa tạo kho lưu trữ 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 là d9b100f2f636
, lệnh sẽ là:
docker commit -m "added node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs
Lưu ý: Khi commit một image, image mới sẽ được lưu trữ cục bộ trên máy của bạn. Sau đó, bạn có thể đẩy (push) image này lên một Docker registry như Docker Hub để có thể sử dụng bởi bạn và người khác.
Sau khi hoàn tất, liệt kê các Docker images hiện có trên máy bằng lệnh:
docker images
Đầu ra sẽ giống như sau:
Output REPOSITORY TAG IMAGE ID CREATED SIZE sammy/ubuntu-nodejs latest 6a1784a63edf 2 minutes ago 170MB ubuntu latest ea4c82dcd15a 17 hours ago 85.8MB hello-world latest 4ab4c602aa5e 5 weeks ago 1.84kB
Trong ví dụ trên, ubuntu-nodejs
là image mới, được tạo từ image ubuntu gốc trên Docker Hub. Sự khác biệt về kích thước phản ánh các thay đổi (ở đây là cài đặt Node.js). Lần sau, khi cần chạy một container sử dụng Ubuntu với Node.js đã cài sẵn, bạn chỉ cần dùng image mới này.
Bạn cũng có thể xây dựng image từ một Dockerfile, cho phép tự động cài đặt phần mềm trong image mới. Tuy nhiên, chủ đề này vượt ngoài phạm vi của hướng dẫn này.
Giờ hãy cùng chia sẻ image mới với người khác để họ có thể tạo container từ image đó.
Bước 8 – Đẩy Docker Images lên một Docker Repository
Bước tiếp theo sau khi tạo image mới từ một image hiện có là chia sẻ nó với một số người bạn, với toàn thế giới trên Docker Hub hoặc trên một Docker registry khác mà bạn có quyền truy cập.
Để đẩy image lên Docker Hub hoặc bất kỳ Docker registry nào, bạn cần có một tài khoản tại đó.
Đầu tiên, 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 nhập đúng, quá trình xác thực sẽ thành công.
Lưu ý: Nếu tên người dùng trên Docker registry khác với tên người dùng cục bộ bạn đã dùng để tạo image, bạn sẽ phải gán (tag) image với tên người dùng trên registry. Ví dụ, với lệnh ở bước trước, bạn sẽ gõ:
docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs
Sau đó, đẩy image của bạn bằng lệnh:
docker push docker-registry-username/ubuntu-nodejs
Để đẩy image ubuntu-nodejs
vào kho của người dùng sammy
, lệnh sẽ là:
docker push sammy/ubuntu-nodejs
Quá trình này có thể mất một khoảng thời gian để hoàn tất khi image được tải lên, nhưng khi hoàn thành, đầu ra sẽ giống như sau:
Output The push refers to repository [docker.io/sammy/ubuntu-nodejs] 1aa927602b6a: Pushed 76c033092e10: Pushed 2146d867acf3: Pushed ae1f631f14b7: Pushed 102645f1cf72: Pushed latest: digest: sha256:2be90a210910f60f74f433350185feadbbdaca0d050d97181bf593dd85195f06 size: 1362
Sau khi đẩy image lên registry, nó sẽ được liệt kê trên dashboard tài khoản của bạn, như hình minh họa trong file gốc.
Nếu khi đẩy image, bạn gặp lỗi như sau, có khả năng là do bạn chưa đă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
Hãy đăng nhập lại, sau đó thử đẩy image lần nữa.
Kết luận
Trong bài hướng dẫn này, bạn đã tìm hiểu các bước cơ bản để cài đặt và bắt đầu sử dụng Docker trên hệ điều hành Ubuntu 16.04. Docker là một công cụ mạnh mẽ cho phép bạn triển khai và quản lý các ứng dụng trong các container, giúp tối ưu hóa hiệu suất và tính di động của các ứng dụng. Giống như hầu hết các dự án mã nguồn mở, Docker có một cộng đồng phát triển mạnh mẽ và liên tục cập nhật với các tính năng mới và sửa lỗi. Để tận dụng tối đa khả năng của Docker và duy trì sự cập nhật với những thay đổi trong môi trường Docker, bạn nên thường xuyên truy cập blog chính thức của dự án. Các bài viết cập nhật sẽ giúp bạn nắm bắt được các xu hướng mới, công cụ hỗ trợ và các phương pháp tối ưu để sử dụng Docker hiệu quả hơn trong các dự án của mình.
Nếu bạn muốn thử nghiệm Docker mà vẫn tiết kiệm chi phí, hãy chọn VPS giá rẻ. Các gói VPS giá rẻ cung cấp hiệu năng cao, phù hợp cho việc chạy container và phát triển ứng dụng. Tìm hiểu ngay để sở hữu VPS chất lượng với giá tốt nhất!