Ngày đăng: 18 tháng 3 năm 2025
Docker là một ứng dụng giúp chạy các quy trình ứng dụng trong một container, giống như máy ảo, nhưng dễ dàng và di động hơn, thân thiện với tài nguyên hơn và phụ thuộc nhiều hơn vào hệ điều hành máy chủ.
Có hai phương pháp để cài đặt Docker trên Ubuntu 16.04. Một phương pháp liên quan đến việc cài đặt nó trên một bản cài đặt hệ điều hành hiện có. Phương pháp còn lại liên quan đến việc khởi động một máy chủ bằng một công cụ có tên là Docker Machine để tự động cài đặt Docker trên đó.
Trong hướng dẫn này, bạn sẽ tìm hiểu cách cài đặt và sử dụng nó trên một bản cài đặt Ubuntu 16.04 hiện có.
Để làm theo hướng dẫn này, bạn sẽ cần những thứ sau:
Gói cài đặt Docker có trong kho lưu trữ Ubuntu 16.04 chính thức có thể không phải là phiên bản mới nhất. Để có phiên bản mới nhất này, hãy cài đặt Docker từ kho lưu trữ Docker chính thức. Phần này sẽ hướng dẫn bạn cách thực hiện điều đó.
Đầu tiên, để đảm bảo các bản tải xuống hợp lệ, hãy thêm khóa GPG cho kho lưu trữ 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 kho lưu trữ Docker vào 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 bằng các gói Docker từ kho lưu trữ mới được thêm vào:
- sudo apt-get update
Hãy đảm bảo rằng bạn sắp cài đặt từ kho lưu trữ Docker thay vì kho lưu trữ Ubuntu 16.04 mặc định:
- apt-cache policy docker-ce
Bạn sẽ thấy kết quả tương tự như sau:
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 ứng viên để cài đặt là từ kho lưu trữ Docker cho Ubuntu 16.04 (xenial).
Cuối cùng, hãy cài đặt Docker:
- sudo apt-get install -y docker-ce
Docker bây giờ sẽ được cài đặt, daemon đã được khởi động và quy trình đã được bật để khởi động khi khởi động. Kiểm tra xem nó có đang chạy không:
- sudo systemctl status docker
Đầu ra sẽ tương tự như sau, cho thấy dịch vụ đang hoạt động và chạy:
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
Cài đặt Docker ngay bây giờ không chỉ cung cấp cho bạn dịch vụ Docker (daemon) mà còn cả tiện ích dòng lệnh docker
hoặc máy khách Docker. Chúng ta sẽ khám phá cách sử dụng lệnh docker
sau trong hướng dẫn này.
Theo mặc định, việc chạy lệnh docker
yêu cầu quyền root — nghĩa là bạn phải thêm tiền tố sudo
vào lệnh. Người dùng trong nhóm docker cũng có thể chạy lệnh này, 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 tiền tố sudo
hoặc không nằm trong nhóm docker, bạn sẽ nhận được kết quả như sau:
Outputdocker: 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 phải nhập 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 tư cách thành viên nhóm mới, bạn có thể đăng xuất khỏi máy chủ rồi đăng nhập lại hoặc bạn có thể nhập lệnh sau:
- su - ${USER}
Bạn sẽ được nhắc nhập mật khẩu người dùng để tiếp tục. Sau đó, bạn có thể xác nhận rằng người dùng của bạn hiện đã được thêm vào nhóm docker
bằng cách nhập:
- id -nG
Outputsammy sudo docker
Nếu bạn cần thêm người dùng vào nhóm docker
mà bạn chưa đăng nhập, hãy khai báo tên người dùng đó 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ả định rằng bạn đang chạy lệnh docker
với tư cách là người dùng trong nhóm người dùng docker. Nếu bạn chọn không chạy, vui lòng thêm sudo
vào trước các lệnh.
Khi Docker đã được cài đặt và hoạt động, giờ là lúc làm quen với tiện ích dòng lệnh. Sử dụng docker
bao gồm việc truyền cho nó 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 sau:
- docker [option] [command] [arguments]
Để xem tất cả các lệnh phụ có sẵn, hãy nhập:
- docker
Tính đến Docker 18.06.1, danh sách đầy đủ các lệnh phụ khả dụng 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 công tắc 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
Các container Docker được chạy từ các image Docker. Theo mặc định, nó sẽ kéo các image này từ Docker Hub, một sổ đăng ký Docker do Docker quản lý, công ty đứng sau dự án Docker. Bất kỳ ai cũng có thể xây dựng và lưu trữ các image 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 chạy các container Docker đều có các image được lưu trữ trên Docker Hub.
Để kiểm tra xem bạn có thể truy cập và tải xuống các image từ Docker Hub hay không, hãy nhập:
- docker run hello-world
Trong kết quả đầu ra, bạn sẽ thấy thông báo sau, cho biết Docker đang 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 hình ảnh có sẵn trên Docker Hub bằng cách sử dụng lệnh docker
với lệnh phụ search
. Ví dụ, để tìm kiếm hình ảnh Ubuntu, hãy nhập:
- docker search ubuntu
Tập lệnh sẽ thu thập Docker Hub và trả về danh sách tất cả các hình ảnh có tên khớp với chuỗi tìm kiếm. Trong trường hợp này, đầu ra sẽ tương tự 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 một hình ảnh được xây dựng và hỗ trợ bởi công ty đằng sau dự án. Sau khi bạn đã xác định được hình ảnh mà bạn muốn sử dụng, bạn có thể tải xuống máy tính của mình bằng lệnh phụ pull
. Hãy thử điều này với image ubuntu
, như sau:
- docker pull ubuntu
Sau khi tải xuống một image, bạn có thể chạy một container bằng hình ảnh đã tải xuống với lệnh phụ run
. Nếu hình ảnh chưa được tải xuống khi docker
được thực thi với lệnh phụ run
, thì trước tiên, máy khách Docker sẽ tải xuống hình ảnh, sau đó chạy một container bằng cách sử dụng hình ảnh đó:
- docker run ubuntu
Để xem những hình ảnh đã được tải xuống máy tính của bạn, hãy nhập:
- docker images
Kết quả đầu ra sẽ trông tương tự như sau:
OutputREPOSITORY 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 sau trong hướng dẫn này, các hình ảnh mà bạn sử dụng để chạy container có thể được sửa đổi và sử dụng để tạo ra các hình ảnh mới, sau đó có thể được tải lên (đẩy (pushed ) là thuật ngữ kỹ thuật) lên Docker Hub hoặc các sổ đăng ký Docker khác.
Container hello-world
mà bạn đã chạy ở bước trước là một ví dụ về một container chạy và thoát sau khi phát ra thông báo kiểm tra. Container 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, chỉ thân thiện hơn với tài nguyên.
Ví dụ, hãy chạy một container bằng hình ảnh mới nhất của Ubuntu. Sự kết hợp của các công tắc -i
và -t
cung cấp cho bạn quyền truy cập shell tương tác vào container:
- docker run -it ubuntu
Lưu ý: Hành vi mặc định cho lệnh run
là khởi động một container mới. Sau khi bạn chạy lệnh trước đó, 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 thực tế là bạn hiện đang làm việc bên trong container và sẽ có dạng sau:
Outputroot@9b0db8a30ad1:/#
Lưu ý: Hãy nhớ id container trong dấu nhắc lệnh. Trong ví dụ trước, đó là 9b0db8a30ad1
. Bạn sẽ cần ID container đó sau này để xác định container khi bạn muốn xóa nó.
Bây giờ 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 phải thêm tiền tố sudo
vào bất kỳ lệnh nào, vì bạn đang hoạt động bên trong container với tư cách là root user:
- apt-get update
Sau đó cài đặt bất kỳ ứng dụng nào vào đó. Hãy cài đặt Node.js:
- apt-get install -y nodejs
Lệnh này cài đặt Node.js trong container từ kho lưu trữ Ubuntu chính thức. Khi quá trình cài đặt hoàn tất, hãy xác minh rằng Node.js đã được cài đặt:
- node -v
Bạn sẽ thấy số phiên bản được hiển thị trong thiết bị đầu cuối của mình:
Outputv8.10.0
Bất kỳ thay đổi nào bạn thực hiện bên trong container chỉ áp dụng cho container đó.
Để thoát khỏi container, hãy nhập exit tại dấu nhắc.
Tiếp theo, chúng ta hãy xem cách quản lý các container trên hệ thống của chúng ta.
Sau khi sử dụng Docker một thời gian, bạn sẽ có nhiều container đang hoạt động (running) và không hoạt động trên máy tính của mình. Để xem các container đang hoạt động, hãy sử dụng:
- docker ps
Bạn sẽ thấy kết quả tương tự như sau:
OutputCONTAINER 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
. Các container này không còn chạy nữa, nhưng chúng vẫn tồn tại trên hệ thống của bạn.
Để xem tất cả các container — đang hoạt động và không hoạt động — hãy chạy docker ps
với lệnh chuyển đổi -a
:
- docker ps -a
Bạn sẽ thấy kết quả tương tự như thế này:
OutputCONTAINER 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, hãy truyền lệnh -l
vào đó:
- docker ps -l
OutputCONTAINER 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 một container đã dừng, hãy sử dụng docker start
, theo sau là ID container hoặc tên container. Hãy khởi động container dựa trên Ubuntu với ID là 9b0db8a30ad1
:
- docker start 9b0db8a30ad1
Container sẽ khởi động và bạn có thể sử dụng docker ps
để xem trạng thái của nó:
OutputCONTAINER 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, hãy sử dụng docker stop
, theo sau là ID hoặc tên container. Lần này, chúng ta sẽ sử dụng tên mà Docker đã gán cho container, đó là 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
, một lần nữa sử dụng ID container hoặc tên. Sử dụng lệnh docker ps -a
để tìm ID container hoặc tên container được liên kết với hình ảnh hello-world
và xóa nó.
- docker rm youthful_roentgen
Bạn có thể khởi động một container mới và đặt tên cho nó bằng lệnh --name
. Bạn cũng có thể sử dụng lệnh --rm
để tạo một container tự xóa 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 này và các tùy chọn khác.
Container có thể được chuyển thành hình ảnh mà bạn có thể sử dụng để xây dựng container mới. Hãy cùng xem cách thức hoạt động của lệnh này.
Khi bạn khởi động image Docker, bạn có thể tạo, sửa đổi và xóa các tệp 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 container đó. Bạn có thể khởi động và dừng container, nhưng sau khi bạn hủy nó bằng lệnh docker rm
, những thay đổi sẽ bị mất vĩnh viễn.
Phần này hướng dẫn bạn cách lưu trạng thái của container dưới dạng image Docker mới.
Sau khi cài đặt Node.js bên trong container Ubuntu, giờ bạn có một container chạy từ một image, nhưng container này khác với image bạn đã sử dụng để tạo container. Nhưng bạn có thể muốn sử dụng lại container Node.js này làm cơ sở cho các image mới sau này.
Để thực hiện việc này, hãy cam kết các thay đổi vào một phiên bản image Docker mới bằng cách sử dụng 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
Công tắc -m dành cho thông báo cam kết giúp bạn và những người khác biết những thay đổi bạn đã thực hiện, trong khi -a được sử dụng để chỉ định tác giả. container ID
là ID bạn đã ghi chú trước đó trong hướng dẫn khi bạn bắt đầu phiên Docker tương tác. Trừ khi bạn đã tạo thêm kho lưu trữ trên Docker Hub, kho lưu trữ thường là tên người dùng Docker Hub của bạn.
Ví dụ, đối với người dùng sammy, với container ID là d9b100f2f636
, lệnh sẽ là:
- docker commit -m "added node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs
Lưu ý: Khi bạn commit một image, image mới sẽ được lưu cục bộ, tức là trên máy tính của bạn. Sau này trong hướng dẫn này, bạn sẽ học cách đẩy image lên sổ đăng ký Docker như Docker Hub để bạn và những người khác có thể đánh giá và sử dụng image đó.
Sau khi hoàn tất thao tác đó, việc liệt kê các image Docker hiện có trên máy tính của bạn sẽ hiển thị image mới cũng như image cũ mà image đó được lấy từ đó:
- docker images
Đầu ra sẽ tương tự như thế này:
OutputREPOSITORY 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 lấy từ image 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. Trong ví dụ này, thay đổi là Node.js đã được cài đặt. Lần tới khi bạn cần chạy một container bằng Ubuntu với Node.js được cài đặt sẵn, bạn chỉ cần sử dụng hình ảnh mới.
Bạn cũng có thể xây dựng image từ Dockerfile, cho phép bạn tự động cài đặt phần mềm trong một image 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ẻ image mới với những người khác để họ có thể tạo container từ image đó.
Bước hợp lý tiếp theo sau khi tạo image mới từ image hiện có là chia sẻ image đó với một số ít bạn bè của bạn, toàn thế giới trên Docker Hub hoặc sổ đăng ký Docker khác mà bạn có quyền truy cập. Để đẩy image lên Docker Hub hoặc bất kỳ sổ đăng ký Docker nào khác, bạn phải có tài khoản ở đó.
Phần này hướng dẫn bạn cách đẩy hình ảnh Docker lên Docker Hub. Để tìm hiểu cách tạo sổ đăng ký Docker riêng của bạn, hãy xem Cách thiết lập sổ đăng ký Docker riêng trên Ubuntu 14.04.
Để đẩy image 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 sẽ được nhắc xác thực bằng mật khẩu Docker Hub của mình. Nếu bạn chỉ định đúng mật khẩu, quá trình xác thực sẽ thành công.
Lưu ý: Nếu tên người dùng đăng ký Docker của bạn khác với tên người dùng cục bộ mà bạn đã sử dụng để tạo image, bạn sẽ phải gắn thẻ hình ảnh của mình bằng tên người dùng đăng ký. Đối với ví dụ được đưa ra ở bước cuối cùng, bạn sẽ nhập:
- docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs
Sau đó, bạn có thể đẩy image của mình bằng cách sử dụng:
- docker push docker-registry-username/ubuntu-nodejs
Để đẩy image ubuntu-nodejs
vào kho lưu trữ sammy, lệnh sẽ là:
- docker push sammy/ubuntu-nodejs
Quá trình này có thể mất một thời gian để hoàn tất khi tải image lên, nhưng khi hoàn tất, đầu ra sẽ trông như thế này:
OutputThe 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 vào sổ đăng ký, image đó sẽ được liệt kê trên bảng điều khiển tài khoản của bạn, giống như hình ảnh hiển thị bên dưới.
Nếu nỗ lực đẩy dẫn đến lỗi sau, có khả năng là bạn chưa đăng nhập:
OutputThe 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, sau đó lặp lại nỗ lực đẩy.
Trong hướng dẫn này, bạn đã học được những điều cơ bản để bắt đầu làm việc với Docker trên Ubuntu 16.04. Giống như hầu hết các dự án nguồn mở, Docker được xây dựng từ một cơ sở mã phát triển nhanh, vì vậy hãy tạo thói quen truy cập trang blog của dự án để biết thông tin mới nhất.