Hello hello, xin chào tất cả ae. Chào mừng ae đã quay lại với kênh Viblo của mình. Ae đã vào đây thì thả một comment chào nhau cái cho vui nhé.
Overview
Hồi mới dùng Docker, mình muốn thao tác gì đó trên server đều phải chạy lệnh SSH để access vào server. Mình để ý thấy rất rất nhiều anh em dev cũng giống như mình! Dù đã tìm hiểu, biết cách sử dụng Docker để dựng môi trường phát triển nhưng lại vô tình bỏ qua một tính năng cực kỳ hữu ích. Đó chính là docker context
.
Case study
Trước hết hãy xem qua một số ví dụ sử dụng docker context phổ biến nhé.
1. Remote Docker Context qua SSH
Mình sẽ tạo context có tên myvps như sau:
docker context create myvps --docker "host=ssh://nguyen.huu.kim@myvps"
Sau đó, sử dụng context trên để chạy lệnh Docker CLI ngay dưới local mà không phải truy cập vào server nữa:
docker context use myvps myvps
Current context is now "myvps"
2. Remote Docker Context với Kubernetes
Thí dụ mình sẽ tạo Context để kết nối Docker CLI tới Docker Host là K8s Node chạy Docker. Ở đây mình sử dụng Minikube làm ví dụ minh họa.
docker context create minikube --default-stack-orchestrator=kubernetes --kubernetes config-file=/home/nguyen.huu.kim/.kube/config --docker host=tcp://172.17.0.2:2376
Sử dụng context vừa tạo trên sẽ giúp mình chạy lệnh Docker CLI trên máy local mà không phải truy cập SSH vào server nữa. Vậy Docker Context là gì? Hãy cùng mình tìm hiểu nhé!
Docker Context là gì?
Ảnh 1: Docker Architecture - Nguồn: Docker
Chúng ta thao tác với Docker bằng cách lệnh chạy trên terminal thông qua bộ command gọi là Docker CLI. Docker CLI sẽ chuyển đổi command lại thành các lời gọi API tương ứng tới Docker daemon
. Tất cả những thông tin mô tả về cách kết nối tới tới API (hay docker host) được tập hợp lại trong một thành phần gọi là Docker Context.
Thông tin được lưu trữ
Các thông tin được nắm giữ bởi một Docker Context gồm:
- Name: Tên của context
- Description: Mô tả về context
- Docker Endpoint: URL để kết nối tới Docker daemon (bao gồm cả thông tin về TLS)
- Kubernetes Endpoint: URL để kết nối tới Kubernetes cluster (trong trường hợp dùng k8s)
- Orchestrator: Loại kiến trúc đang chạy trên nền Docker, có 2 giá trị lựa chọn:
swarm
vàkubernetes
NAME DESCRIPTION DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATOR
default Current DOCKER_HOST based configuration unix:///var/run/docker.sock swarm
Mặc định, sau khi cài đặt Docker trên Linux. Một cấu hình context có tên là default
sẽ được thiết lập. Docker CLI sẽ đọc thông tin từ context để có thông tin kết nối.
Nếu không được add thêm các context khác, thì ngầm hiểu Docker CLI sẽ chỉ tương tác được với Docker daemon trên cùng một máy chủ. Tức Docker máy nào thì chỉ máy đó truy cập được theo context default
.
Câu lệnh thường dùng
Liệt kê context đang có
- Dùng để xem tất cả các context đã được lưu trên máy
- Các tham số thường ít cần dùng đến, chỉ cần nhớ
docker context ls
là được
Command line
Usage: docker context ls [OPTIONS] List contexts Aliases: ls, list Options: --format string Pretty-print contexts using a Go template -q, --quiet Only show context names
Ví dụ
NAME DESCRIPTION DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATOR
default Current DOCKER_HOST based configuration unix:///var/run/docker.sock swarm
1. Thêm context mới
- Dùng để tạo mới một context trên máy
Command line
docker context create [OPTIONS] CONTEXT Create a context Docker endpoint config: NAME DESCRIPTION
from Copy named context's Docker endpoint configuration
host Docker endpoint on which to connect
ca Trust certs signed only by this CA
cert Path to TLS certificate file
key Path to TLS key file
skip-tls-verify Skip TLS certificate validation Kubernetes endpoint config: NAME DESCRIPTION
from Copy named context's Kubernetes endpoint configuration
config-file Path to a Kubernetes config file
context-override Overrides the context set in the kubernetes config file
namespace-override Overrides the namespace set in the kubernetes config file Example: $ docker context create my-context --description "some description" --docker "host=tcp://myserver:2376,ca=~/ca-file,cert=~/cert-file,key=~/key-file" Options: --default-stack-orchestrator string Default orchestrator for stack operations to use with this context (swarm|kubernetes|all) --description string Description of the context --docker stringToString set the docker endpoint (default []) --from string create context from a named context --kubernetes stringToString set the kubernetes endpoint (default [])
Trong đó có 2 phần cấu hình endpoint khác nhau tùy theo orchestrator mà chúng ta đang cấu hình:
- Docker endpoint config - Các thông tin cần khi cấu hình theo Swarm
- Kubernetes endpoint config - Các thông tin cần khi cấu hình theo Kubernetes
Ví dụ
Mình sẽ để cập cụ thể cách tạo context với mỗi loại trong phần tiếp theo (bên dưới).
2. Sửa một context
- Dùng để chỉnh sửa, cập nhật thông tin cho một context đã tồn tại trên máy
- Các tham số giống hệt với lệnh
docker context create
Command line
Usage: docker context update [OPTIONS] CONTEXT Update a context Docker endpoint config: NAME DESCRIPTION
from Copy named context's Docker endpoint configuration
host Docker endpoint on which to connect
ca Trust certs signed only by this CA
cert Path to TLS certificate file
key Path to TLS key file
skip-tls-verify Skip TLS certificate validation Kubernetes endpoint config: NAME DESCRIPTION
from Copy named context's Kubernetes endpoint configuration
config-file Path to a Kubernetes config file
context-override Overrides the context set in the kubernetes config file
namespace-override Overrides the namespace set in the kubernetes config file Example: $ docker context update my-context --description "some description" --docker "host=tcp://myserver:2376,ca=~/ca-file,cert=~/cert-file,key=~/key-file" Options: --default-stack-orchestrator string Default orchestrator for stack operations to use with this context (swarm|kubernetes|all) --description string Description of the context --docker stringToString set the docker endpoint (default []) --kubernetes stringToString set the kubernetes endpoint (default [])
Ví dụ
Cập nhật lại description
cho context có tên là minikube
:
docker context update minikube --description "Docker Host for Minikube"
Output:
minikube
Successfully updated context "minikube"
3. Xóa một context
- Dùng để xóa bỏ một context đã tồn tại trên máy
- Cách tham số đi kèm thường ít cần dùng, chỉ cần nhờ
docker context rm
là được
Command line
Usage: docker context rm CONTEXT [CONTEXT...] Remove one or more contexts Aliases: rm, remove Options: -f, --force Force the removal of a context in use
Ví dụ
docker context rm minikube
Output:
minikube
Successfully deleted context "minikube"
4. Chuyển context
- Dùng để kích hoạt context từ inactive -> active (không dùng -> đang dùng)
- Tại một thời điểm chỉ một context được sử dụng
Command line
Usage: docker context use CONTEXT Set the current docker context
Ví dụ
docker context use minikube
Output:
minikube
Current context is now "minikube"
5. Others
Ngoài ra còn có một số command khác nhưng ít khi phải dùng, các bạn có thể nghiên cứu thêm:
- docker context import
- docker context export
- docker context inspect