Docker Machine là công cụ mạnh mẽ giúp bạn dễ dàng triển khai và quản lý nhiều Docker hosts từ xa, ngay trên máy tính cá nhân của mình. Những máy chủ này, hay còn gọi là Dockerized hosts, cho phép bạn chạy các Docker containers một cách hiệu quả.
Mặc dù Docker Machine có thể được cài đặt cả trên hệ thống cục bộ hoặc từ xa, nhưng phương pháp phổ biến nhất là cài đặt nó trên máy tính cá nhân (có thể là cài đặt trực tiếp hoặc trên máy ảo) và sử dụng nó để triển khai các máy chủ Dockerized từ xa.
Nếu bạn muốn triển khai Docker Machine hiệu quả, việc thuê VPS chất lượng cao là lựa chọn tối ưu. VPS giúp đảm bảo tài nguyên ổn định, hỗ trợ quản lý Docker Hosts từ xa mượt mà. Khám phá các gói thuê VPS phù hợp để nâng cao hiệu suất dự án của bạn ngay hôm nay!
Docker Machine hỗ trợ cài đặt trên nhiều hệ điều hành, bao gồm các bản phân phối Linux, Mac OS X và Windows. Trong hướng dẫn này, chúng ta sẽ cùng nhau cài đặt Docker Machine trên một máy cục bộ chạy Ubuntu 16.04 và sử dụng nó để triển khai các Droplets từ DataOnline.
Yêu cầu
Để theo dõi bài hướng dẫn này, bạn sẽ cần:
-
Một máy cục bộ chạy Ubuntu 16.04 với Docker được cài đặt (xem hướng dẫn Cách Cài Đặt và Sử Dụng Docker trên Ubuntu 16.04 để biết thêm chi tiết).
-
Khi tạo token, hãy đảm bảo nó có phạm vi read-write. Đây là mặc định, nên nếu bạn không thay đổi gì khi tạo, token sẽ có khả năng đọc-ghi. Để tiện sử dụng trên dòng lệnh, hãy gán token cho một biến như được hướng dẫn trong bài viết.
Bước 1 – Cài đặt Docker Machine trên máy tính cục bộ
Trong bước này, chúng ta sẽ tiến hành cài đặt Docker Machine trên máy cục bộ chạy Ubuntu 16.04.
Để tải và cài đặt binary của Docker Machine, gõ lệnh sau:
wget https://github.com/docker/machine/releases/download/v0.14.0/docker-machine-$(uname -s)-$(uname -m)
Tên file tải về sẽ là docker-machine-Linux-x86_64
. Hãy đổi tên file đó thành docker-machine
để dễ sử dụng hơn:
mv docker-machine-Linux-x86_64 docker-machine
Làm cho file có quyền thực thi:
chmod +x docker-machine
Di chuyển hoặc sao chép file vào thư mục /usr/local/bin
để có thể sử dụng như một lệnh hệ thống:
sudo mv docker-machine /usr/local/bin
Kiểm tra phiên bản để xác nhận đã cài đặt đúng:
docker-machine version
Kết quả xuất ra sẽ tương tự:
Output docker-machine version 0.14.0, build 89b8332
Bước 2 – Cài đặt các Script bổ sung cho Docker Machine
Có ba script bash trong kho lưu trữ GitHub của Docker Machine, được thiết kế để tạo điều kiện thuận lợi cho việc sử dụng các lệnh docker
và docker-machine
. Chúng cung cấp tính năng hoàn thành lệnh (command completion) và tùy biến prompt cho bash.
Trong bước này, chúng ta sẽ cài đặt ba script này trên máy cục bộ. Chúng sẽ được tải về và cài đặt vào thư mục /etc/bash_completion.d
.
Script đầu tiên cho phép bạn thấy máy đang hoạt động từ prompt bash. Điều này hữu ích khi bạn làm việc với và chuyển đổi giữa nhiều máy chủ Dockerized. Script này có tên là docker-machine-prompt.bash
. Để tải về, gõ lệnh:
sudo wget https://raw.githubusercontent.com/docker/machine/master/contrib/completion/bash/docker-machine-prompt.bash -O /etc/bash_completion.d/docker-machine-prompt.bash
Để hoàn tất cài đặt file trên, bạn sẽ cần thiết lập một giá trị tùy chỉnh cho biến PS1 trong file .bashrc
của bạn. Mở file đó bằng nano (PS1 là biến đặc biệt dùng để tùy chỉnh prompt của bash):
nano ~/.bashrc
Trong file đó, có ba dòng bắt đầu bằng PS1. Chúng nên giống như sau:
~/.bashrc PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
Với mỗi dòng, chèn $(__docker_machine_ps1 " [%s]")
vào cuối để chúng trở thành:
~/.bashrc PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]$(__docker_machine_ps1 " [%s]")\$ ' PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w$(__docker_machine_ps1 " [%s]")\$ ' PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$(__docker_machine_ps1 " [%s]")$PS1
Lưu và đóng file.
Script thứ hai có tên là docker-machine-wrapper.bash
. Nó thêm một subcommand use
cho lệnh docker-machine, giúp dễ dàng chuyển đổi giữa các Docker Machines. Để tải về, gõ:
sudo wget https://raw.githubusercontent.com/docker/machine/master/contrib/completion/bash/docker-machine-wrapper.bash -O /etc/bash_completion.d/docker-machine-wrapper.bash
Script thứ ba có tên là docker-machine.bash
. Nó thêm tính năng hoàn thành lệnh cho các lệnh của docker-machine. Tải về bằng lệnh:
sudo wget https://raw.githubusercontent.com/docker/machine/master/contrib/completion/bash/docker-machine.bash -O /etc/bash_completion.d/docker-machine.bash
Để áp dụng các thay đổi vừa thực hiện, hãy đóng rồi mở lại terminal. Nếu bạn đăng nhập qua SSH, hãy thoát phiên làm việc và đăng nhập lại. Tính năng hoàn thành lệnh cho các lệnh docker và docker-machine bây giờ sẽ hoạt động.
Bước 3 – Triển khai một Dockerized Host sử dụng Docker Machine
Sau khi đã cài đặt Docker và Docker Machine trên máy cục bộ, bạn có thể triển khai một Droplet Dockerized trên tài khoản DataOnline của bạn bằng lệnh docker-machine create
của Docker Machine. Nếu bạn chưa làm, hãy gán DataOnline API token cho một biến bash bằng lệnh:
export DOTOKEN=your-api-token
Lưu ý: Bài hướng dẫn này sử dụng DOTOKEN làm tên biến bash cho token API của DataOnline. Tên biến không nhất thiết phải là DOTOKEN và không nhất thiết phải viết hoa toàn bộ.
Để biến này có hiệu lực vĩnh viễn, hãy thêm nó vào file ~/.bashrc
. Bước này là tùy chọn nhưng cần thiết nếu bạn muốn giá trị này được lưu qua các phiên làm việc của terminal.
Mở file đó bằng nano:
nano ~/.bashrc
Thêm một dòng như sau vào bất kỳ đâu trong file:
~/.bashrc export DOTOKEN=your-api-token
Để kích hoạt biến ngay trong phiên làm việc hiện tại, gõ:
Để gọi lệnh docker-machine create
thành công, bạn phải chỉ định (ít nhất) driver, API token (hoặc biến chứa giá trị token) và một tên duy nhất cho máy. Để tạo máy đầu tiên, gõ:
docker-machine create --driver digitalocean --digitalocean-access-token $DOTOKEN machine-name
Quá trình tạo máy sẽ xuất ra một phần kết quả. Trong quá trình này, tên máy được tạo là ubuntu1604-docker
:
Output ... Installing Docker... Copying certs to the local machine directory... Copying certs to the remote machine... Setting Docker configuration on the remote daemon... Checking connection to Docker... Docker is up and running! To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env ubuntu1604-docker
Một cặp SSH key được tạo ra cho máy mới để docker-machine có thể truy cập từ xa. Droplet được triển khai với hệ điều hành mong muốn, và Docker được cài đặt trên hệ thống. Khi lệnh hoàn tất, Droplet Docker của bạn đã hoạt động.
Để xem máy mới được tạo từ dòng lệnh, gõ:
docker-machine ls
Kết quả xuất ra sẽ tương tự:
Output NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS ubuntu1604-docker - digitalocean Running tcp://203.0.113.71:2376 v18.05.0-ce
Bước 4 – Chỉ định hệ đIều hành cơ sở khi tạo Dockerized Host
Theo mặc định, hệ điều hành cơ sở được sử dụng khi tạo Dockerized host với Docker Machine là Ubuntu LTS mới nhất. Tuy nhiên, tại thời điểm xuất bản bài viết này, lệnh docker-machine create
vẫn sử dụng Ubuntu 16.04 LTS làm hệ điều hành cơ sở, mặc dù Ubuntu 18.04 là bản LTS mới nhất. Vì vậy, nếu bạn cần chạy Ubuntu 18.04 trên máy mới được triển khai, bạn sẽ phải chỉ định Ubuntu kèm theo phiên bản mong muốn bằng cách truyền tham số --digitalocean-image
cho lệnh docker-machine create
.
Ví dụ, để tạo máy sử dụng Ubuntu 18.04, gõ:
docker-machine create --driver digitalocean --digitalocean-image ubuntu-18-04-x64 --digitalocean-access-token $DOTOKEN machine-name
Bạn không bị giới hạn ở Ubuntu. Bạn có thể tạo máy sử dụng bất kỳ hệ điều hành nào được DataOnline hỗ trợ. Ví dụ, để tạo máy sử dụng Debian 8, gõ:
docker-machine create --driver digitalocean --digitalocean-image debian-8-x64 --digitalocean-access-token $DOTOKEN machine-name
Để triển khai Dockerized host sử dụng CentOS 7 làm hệ điều hành cơ sở, chỉ định tên image là centos-7-0-x64
như sau:
docker-machine create --driver digitalocean --digitalocean-image centos-7-0-x64 --digitalocean-access-token $DOTOKEN centos7-docker
Ngoài việc chọn hệ điều hành cơ sở, bạn còn có thể chỉ định kích thước của Droplet. Theo mặc định, nó là Droplet nhỏ nhất với 1 GB RAM, 1 CPU và ổ SSD 25 GB.
Tìm kích thước Droplet mà bạn muốn sử dụng bằng cách tra cứu slug tương ứng trong tài liệu API của DataOnline.
Ví dụ, để triển khai máy với 2 GB RAM, 2 CPU và ổ SSD 60 GB, sử dụng slug s-2vcpu-2gb
:
docker-machine create --driver digitalocean --digitalocean-size s-2vcpu-2gb --digitalocean-access-token $DOTOKEN machine-name
Để xem tất cả các tham số (flags) cụ thể khi tạo Docker Machine sử dụng driver của DataOnline, gõ:
docker-machine create --driver digitalocean -h
Tip: Nếu bạn làm mới trang Droplet trong bảng điều khiển DataOnline, bạn sẽ thấy các máy mới được tạo bằng lệnh
docker-machine
.
Bước 5 – Thực thi các lệnh Docker Machine bổ sung
Bạn đã thấy cách triển khai Dockerized host sử dụng lệnh create
. Bạn cũng đã biết cách liệt kê các máy Docker Machine có sẵn bằng lệnh ls
. Trong bước này, bạn sẽ học thêm một số subcommand của docker-machine.
Để lấy thông tin chi tiết về một Dockerized host, sử dụng lệnh inspect
, gõ:
docker-machine inspect machine-name
Kết quả xuất ra sẽ bao gồm các dòng như sau. Dòng “Image” cho biết phiên bản của bản phân phối Linux được sử dụng và dòng “Size” chỉ ra slug kích thước:
Output ... { "ConfigVersion": 3, "Driver": { "IPAddress": "203.0.113.71", "MachineName": "ubuntu1604-docker", "SSHUser": "root", "SSHPort": 22, ... "Image": "ubuntu-16-04-x64", "Size": "s-1vcpu-1gb", ... }, ---
Để in cấu hình kết nối của một host, gõ:
docker-machine config machine-name
Kết quả xuất ra sẽ tương tự:
Output --tlsverify --tlscacert="/home/kamit/.docker/machine/certs/ca.pem" --tlscert="/home/kamit/.docker/machine/certs/cert.pem" --tlskey="/home/kamit/.docker/machine/certs/key.pem" -H=tcp://203.0.113.71:2376
Dòng cuối cùng của kết quả lệnh docker-machine config
cho biết địa chỉ IP của host, nhưng bạn cũng có thể lấy thông tin này bằng cách gõ:
docker-machine ip machine-name
Nếu cần tắt máy chủ từ xa, bạn có thể dùng docker-machine để dừng nó:
docker-machine stop machine-name
Kiểm tra lại trạng thái máy:
docker-machine ls
Trạng thái máy sẽ thay đổi:
Ouput NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS ubuntu1604-docker digitalocean Timeout
Để khởi động lại:
docker-machine start machine-name
Kiểm tra lại:
docker-machine ls
Bạn sẽ thấy trạng thái máy hiện là Running
:
Ouput NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS ubuntu1604-docker - digitalocean Running tcp://203.0.113.71:2376 v18.05.0-ce
Sau đó, bạn có thể xóa máy bằng:
docker-machine rm machine-name
Droplet sẽ bị xóa kèm với SSH key được tạo bởi docker-machine. Bây giờ, khi liệt kê các Dockerized hosts, máy vừa xóa sẽ không còn hiển thị nữa:
docker-machine ls
Bước 6 – Thực thi các lệnh trên Dockerized Host qua SSH
Tới thời điểm này, bạn đã có thông tin về các máy, nhưng bạn còn có thể thực hiện nhiều thao tác hơn. Ví dụ, bạn có thể thực thi các lệnh Linux gốc trên một Docker host bằng cách sử dụng subcommand ssh
của docker-machine
từ máy cục bộ. Phần này giải thích cách thực hiện lệnh ssh qua docker-machine
cũng như cách mở phiên SSH tới Dockerized host.
Giả sử bạn đã triển khai một máy với hệ điều hành Ubuntu, hãy thực thi lệnh sau từ máy cục bộ để cập nhật cơ sở dữ liệu gói trên Docker host:
docker-machine ssh machine-name apt-get update
Bạn thậm chí có thể áp dụng các bản cập nhật có sẵn bằng:
docker-machine ssh machine-name apt-get upgrade
Không chắc Docker host từ xa của bạn đang sử dụng kernel nào? Gõ lệnh:
docker-machine ssh machine-name uname -r
Ngoài việc sử dụng subcommand ssh
để thực thi các lệnh trên Docker host từ xa, bạn cũng có thể dùng nó để đăng nhập vào máy chủ. Chỉ cần gõ:
Prompt của bạn sẽ thay đổi để phản ánh việc bạn đã đăng nhập vào máy chủ từ xa:
Output root@machine-name#
Để thoát khỏi máy chủ từ xa, gõ:
exit
Bước 7 – Kích hoạt Dockerized Host
Kích hoạt một Docker host sẽ kết nối Docker client cục bộ của bạn với hệ thống đó, giúp bạn có thể thực thi các lệnh docker thông thường trên máy từ xa. Để kích hoạt một Docker host, gõ lệnh sau:
eval $(docker-machine env machine-name)
Ngoài ra, bạn có thể kích hoạt nó bằng lệnh:
docker-machine use machine-name
Tip: Khi làm việc với nhiều Docker hosts, lệnh
docker-machine use
là cách dễ nhất để chuyển đổi giữa các máy.
Sau khi gõ một trong những lệnh trên, prompt bash của bạn sẽ thay đổi để cho thấy Docker client đang trỏ tới Docker host từ xa. Nó sẽ có dạng, với tên của host được hiển thị ở cuối prompt:
username@localmachine:~ [machine-name]$
Bây giờ, bất kỳ lệnh docker nào bạn gõ tại prompt này sẽ được thực thi trên máy từ xa.
Nếu có một host đang hoạt động trên terminal mà lệnh docker-machine ls
được chạy, dấu sao (*) dưới cột ACTIVE sẽ cho biết đó là host đang hoạt động:
Output NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS ubuntu1604-docker * digitalocean Running tcp://203.0.113.71:2376 v18.05.0-ce
Để thoát khỏi Docker host từ xa, gõ:
docker-machine use -u
Bạn sẽ trở lại prompt của máy cục bộ.
Bây giờ, hãy tạo các container trên máy từ xa.
Bước 8 – Tạo Docker Containers trên Dockerized Host từ xa
Cho đến nay, bạn đã triển khai một Droplet Dockerized trên tài khoản DataOnline và đã kích hoạt nó – tức là, Docker client của bạn đang trỏ tới máy đó. Bước tiếp theo hợp lý là khởi tạo các container trên máy đó. Ví dụ, hãy thử chạy container Nginx chính thức.
Sử dụng lệnh docker-machine use
để chọn máy từ xa của bạn:
docker-machine use machine-name
Sau đó, thực thi lệnh sau để chạy một container Nginx trên máy đó:
docker run -d -p 8080:80 --name httpserver nginx
Trong lệnh này, chúng ta đang ánh xạ cổng 80
trong container Nginx sang cổng 8080
trên Dockerized host để có thể truy cập trang Nginx mặc định từ bất cứ đâu.
Nếu lệnh được thực thi thành công, bạn có thể truy cập trang Nginx mặc định bằng cách mở trình duyệt Web và truy cập:http://docker_machine_ip:8080
Trong khi Docker host vẫn đang được kích hoạt (như được hiển thị bởi tên trong prompt), bạn có thể liệt kê các image trên máy đó:
docker images
Kết quả xuất ra sẽ bao gồm image Nginx bạn vừa sử dụng, cùng với các image khác mà bạn đã tải về trước đó:
Output REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest ae513a47849c 3 weeks ago 109MB
Bạn cũng có thể liệt kê các container đang chạy trên máy:
docker ps
Nếu container Nginx bạn chạy trong bước này là container duy nhất đang hoạt động, kết quả sẽ như sau:
Output CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4284f9d25548 nginx "nginx -g 'daemon of…" 20 minutes ago Up 20 minutes 0.0.0.0:8080->80/tcp httpserver
Để thoát khỏi prompt của máy từ xa (lệnh này cũng sẽ đóng terminal):
exit
Lưu ý: Nếu bạn có ý định tạo container trên máy từ xa, Docker client của bạn phải đang trỏ tới máy đó – tức là, nó phải là máy đang hoạt động trong terminal bạn đang sử dụng. Nếu không, container sẽ được tạo trên máy cục bộ. Hãy để prompt của bạn là người hướng dẫn.
Bước 9 – Vô hiệu hóa báo cáo lỗi
Theo mặc định, bất cứ khi nào có nỗ lực triển khai một Dockerized host bằng Docker Machine thất bại hoặc Docker Machine gặp sự cố, một số thông tin chẩn đoán sẽ tự động được gửi tới một tài khoản Docker trên Bugsnag. Nếu bạn không thoải mái với điều này, bạn có thể vô hiệu hóa báo cáo bằng cách tạo một file rỗng có tên no-error-report
trong thư mục .docker/machine
của bạn.
Để tạo file, gõ:
touch ~/.docker/machine/no-error-report
Kiểm tra file để xem thông báo lỗi nếu việc triển khai thất bại hoặc Docker Machine gặp sự cố.
Kết luận
Bài hướng dẫn này đã chỉ ra cách cài đặt và sử dụng Docker Machine để triển khai nhiều Docker Droplets từ xa chỉ với một máy cục bộ. Giờ đây, bạn có thể dễ dàng triển khai các Dockerized hosts trên tài khoản DataOnline của mình, tùy theo yêu cầu của dự án.
Để quản lý Docker Hosts từ xa với Docker Machine, một hệ thống mạnh mẽ là cần thiết. Mua VPS với cấu hình tùy chỉnh sẽ giúp bạn tối ưu hóa quy trình triển khai. Tìm hiểu các tùy chọn mua VPS để sở hữu giải pháp lưu trữ đáng tin cậy cho dự án của bạn!
Để tìm hiểu thêm về Docker Machine, bạn có thể tham khảo tài liệu chính thức trên trang web của Docker Machine. Ba script Bash được sử dụng trong bài viết này cũng đã được lưu trữ trên trang GitHub để bạn có thể tham khảo và sử dụng.