Docker在Ubuntu上的容器编排方法
容器编排是管理多容器应用的核心技术,能解决服务依赖、扩展、高可用等问题。在Ubuntu上,常用的编排工具包括Docker Compose(单机/轻量级多容器)、Docker Swarm(Docker原生集群编排)和Kubernetes(生产级复杂编排),以下是具体操作指南:
Docker Compose通过YAML文件定义多容器应用,适合开发、测试或单机部署场景,操作简单且功能强大。
sudo apt-get remove -y docker docker-engine docker.io containerd runc
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
sudo apt-get install -y docker-compose-plugin
docker --version # 查看Docker版本
docker compose version # 查看Compose版本(注意是“compose”,不是“docker-compose”)
在项目目录下创建docker-compose.yml,定义服务、镜像、端口、环境变量等。示例如下:
version: "3.8" # Compose文件格式版本
services: # 定义服务(容器)
web: # 服务名称(自定义)
image: nginx:latest # 使用的镜像
ports: # 端口映射(主机:容器)
- "80:80"
volumes: # 卷挂载(持久化数据)
- ./html:/usr/share/nginx/html
depends_on: # 服务依赖(web依赖db启动)
- db
db: # 数据库服务
image: postgres:13
environment: # 环境变量(配置数据库)
POSTGRES_PASSWORD: example
POSTGRES_DB: mydb
volumes: # 数据卷(持久化数据库文件)
- db-data:/var/lib/postgresql/data
volumes: # 定义卷(可选,但推荐用于持久化)
db-data:
docker compose up -d
docker compose ps
docker compose logs -f
docker compose down # 停止并删除容器、网络、卷
docker compose up -d --scale web=3
depends_on定义服务启动顺序。volumes挂载卷,避免容器重启数据丢失。environment配置环境变量,适配不同环境。Docker Swarm是Docker官方提供的集群管理工具,将多台Ubuntu主机组成一个虚拟集群,支持服务的高可用、负载均衡和自动扩展。
在管理节点上运行以下命令:
docker swarm init --advertise-addr <管理节点IP>
输出示例:
Swarm initialized: current node (abc123) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-xxxxxxxxxxxxx <管理节点IP>:2377
--token(用于工作节点加入集群)。在工作节点上运行管理节点输出的docker swarm join命令:
docker swarm join --token SWMTKN-1-xxxxxxxxxxxxx <管理节点IP>:2377
docker node ls # 查看集群节点列表(管理节点为“Leader”,工作节点为“Reachable”)
使用docker service create命令部署服务,示例如下:
docker service create --name my-web --replicas 3 -p 80:80 nginx:latest
--name:服务名称(自定义)。--replicas:副本数(3个Nginx容器)。-p:端口映射(主机:容器)。nginx:latest:使用的镜像。docker service ls # 查看所有服务
docker service ps my-web # 查看指定服务的任务(容器)状态
docker service scale my-web=5 # 将my-web服务的副本数扩展到5
docker service update --image nginx:1.25 my-web
docker service rm my-web
Kubernetes是开源的容器编排平台,适合大规模、复杂应用,提供更强大的自动化管理能力(如自动修复、滚动更新、服务网格等)。但配置较复杂,适合有一定经验的用户。
sudo apt-get update && sudo apt-get 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-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl # 锁定版本,防止升级
在主节点上运行:
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
--pod-network-cidr:指定Pod网络CIDR(需与后续网络插件匹配)。Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl(将admin.conf复制到~/.kube/config)。Kubernetes需要网络插件实现Pod间通信,常用Flannel:
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
创建Deployment YAML文件(如my-web-deployment.yaml):
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-web
spec:
replicas: 3
selector:
matchLabels:
app: my-web
template:
metadata:
labels:
app: my-web
spec:
containers:
- name: web
image: nginx:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: my-web-service
spec:
selector:
app: my-web
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer # 外部访问类型(集群内可用ClusterIP)
kubectl apply -f my-web-deployment.yaml
kubectl get pods -w
kubectl get svc
以上步骤覆盖了Ubuntu上Docker容器编排的主要方法,可根据实际需求选择合适的工具。