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容器编排的主要方法,可根据实际需求选择合适的工具。