Ubuntu環境下Docker容器編排的常用方法
在Ubuntu系統中,容器編排主要通過Docker Compose(輕量級多容器管理)和Kubernetes(生產級大規模編排)實現,以下是具體操作步驟:
Docker Compose通過docker-compose.yml文件定義多容器服務,簡化了多容器應用的啟動、停止和管理流程。
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
sudo systemctl enable --now docker # 啟動Docker并設置開機自啟
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
驗證安裝:docker-compose --version # 輸出版本號即表示成功
在項目目錄下創建docker-compose.yml文件,定義服務、鏡像、端口、環境變量等配置。例如,部署一個包含Nginx(Web服務)和PostgreSQL(數據庫)的應用:
version: '3.8' # 指定Compose文件格式版本
services:
web: # Web服務(Nginx)
image: nginx:latest # 使用官方Nginx鏡像
ports:
- "80:80" # 將主機80端口映射到容器80端口
volumes:
- ./html:/usr/share/nginx/html # 掛載主機./html目錄到容器內Nginx默認網頁目錄
depends_on:
- db # 依賴db服務(Nginx啟動前需確保db服務已啟動)
db: # 數據庫服務(PostgreSQL)
image: postgres:15-alpine # 使用輕量級Alpine版PostgreSQL
environment:
POSTGRES_DB: mydb # 創建數據庫名
POSTGRES_USER: admin # 創建用戶名
POSTGRES_PASSWORD: 123456 # 設置密碼
volumes:
- postgres_data:/var/lib/postgresql/data # 持久化數據庫數據到卷
volumes:
postgres_data: # 定義數據卷(用于持久化數據)
docker-compose.yml所在目錄運行以下命令,后臺啟動所有服務:docker-compose up -d
docker-compose ps # 查看運行中的服務
docker-compose logs -f web # 查看web服務的實時日志
docker-compose down # 停止并刪除所有容器、網絡;保留數據卷(若需徹底刪除卷,添加`-v`參數)
docker-compose up -d --scale web=3
volumes配置實現數據持久化(如數據庫數據),避免容器刪除后數據丟失。environment配置傳遞敏感信息(如數據庫密碼),避免硬編碼。depends_on定義服務啟動順序(僅保證啟動順序,不保證服務就緒,需結合健康檢查使用)。Kubernetes(簡稱K8s)是開源的容器編排平臺,提供自動化部署、擴展、負載均衡等功能,適合管理大規模容器集群。
sudo swapoff -a # 臨時禁用
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab # 永久禁用(注釋掉fstab中的Swap行)
sudo modprobe overlay
sudo modprobe br_netfilter
sudo tee /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
EOF
sudo sysctl --system # 生效配置
sudo apt update
sudo apt install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl # 鎖定版本(避免自動升級)
--pod-network-cidr指定Pod網絡CIDR,需與后續網絡插件匹配):sudo kubeadm init --pod-network-cidr=10.244.0.0/16
初始化完成后,會輸出配置kubectl和加入Worker節點的命令(需保存)。mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl apply -f https://docs.projectcalico.org/manifests/tigera-operator.yaml
kubectl apply -f https://docs.projectcalico.org/manifests/custom-resources.yaml
驗證網絡插件是否運行:kubectl get pods -n calico-system # 所有Pod狀態應為Running
kubeadm join 192.168.1.100:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxx
在Worker節點上運行該命令,即可將節點加入集群。Ready:kubectl get nodes
nginx-deployment.yaml文件:apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3 # 創建3個Pod副本
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
app: nginx
spec:
type: NodePort # 暴露為NodePort類型(外部可通過節點IP訪問)
ports:
- port: 80
targetPort: 80
nodePort: 30080 # 節點端口(范圍30000-32767)
selector:
app: nginx
應用配置:kubectl apply -f nginx-deployment.yaml
驗證部署:kubectl get pods # 查看Pod狀態(應為Running)
kubectl get svc # 查看Service狀態(NodePort為30080)
訪問應用:在瀏覽器輸入http://<Master節點IP>:30080,即可看到Nginx歡迎頁面。kubectl get pods(Pod)、kubectl get svc(Service)、kubectl get nodes(節點)。kubectl describe pod <pod-name>(查看Pod詳情)、kubectl logs <pod-name>(查看Pod日志)。kubectl delete -f nginx-deployment.yaml(刪除指定配置的資源)、kubectl delete pod <pod-name>(刪除Pod)。kubectl scale deployment nginx-deployment --replicas=5(將Nginx副本數擴展到5個)。docker-compose.yml文件簡化配置,支持服務依賴、數據卷、環境變量等功能。根據應用場景選擇合適的編排工具:小型項目推薦Docker Compose,大型生產環境推薦Kubernetes。