温馨提示×

Docker在Ubuntu上如何进行容器编排

小樊
37
2025-10-16 07:47:46
栏目: 智能运维

Docker在Ubuntu上的容器编排方法
容器编排是管理多容器应用的核心技术,能解决服务依赖、扩展、高可用等问题。在Ubuntu上,常用的编排工具包括Docker Compose(单机/轻量级多容器)Docker Swarm(Docker原生集群编排)Kubernetes(生产级复杂编排),以下是具体操作指南:

一、Docker Compose:单机多容器编排(推荐新手)

Docker Compose通过YAML文件定义多容器应用,适合开发、测试或单机部署场景,操作简单且功能强大。

1. 准备工作:安装Docker & Docker Compose

  • 卸载旧版本(避免冲突):
    sudo apt-get remove -y docker docker-engine docker.io containerd runc 
  • 安装Docker Engine(官方源,稳定):
    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 
  • 安装Docker Compose插件(Docker v20.10+内置,无需单独安装旧版):
    sudo apt-get install -y docker-compose-plugin 
  • 验证安装
    docker --version # 查看Docker版本 docker compose version # 查看Compose版本(注意是“compose”,不是“docker-compose”) 

2. 编写docker-compose.yml文件

在项目目录下创建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: 

3. 常用命令

  • 启动服务(后台运行):
    docker compose up -d 
  • 查看运行中的服务
    docker compose ps 
  • 查看日志(实时输出):
    docker compose logs -f 
  • 停止服务
    docker compose down # 停止并删除容器、网络、卷 
  • 扩展服务(如增加Nginx实例):
    docker compose up -d --scale web=3 

4. 优势

  • 简化部署:一个命令启动所有服务,无需手动管理每个容器。
  • 依赖管理:通过depends_on定义服务启动顺序。
  • 数据持久化:通过volumes挂载卷,避免容器重启数据丢失。
  • 环境隔离:通过environment配置环境变量,适配不同环境。

二、Docker Swarm:Docker原生集群编排

Docker Swarm是Docker官方提供的集群管理工具,将多台Ubuntu主机组成一个虚拟集群,支持服务的高可用、负载均衡和自动扩展。

1. 准备工作

  • 至少2台Ubuntu主机(1台管理节点,1台或多台工作节点)。
  • 所有主机安装Docker Engine(步骤同上)。
  • 管理节点和工作节点之间网络互通(开放2377/tcp、7946/tcp/udp、4789/udp端口)。

2. 初始化Swarm集群

管理节点上运行以下命令:

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(用于工作节点加入集群)。

3. 加入工作节点

工作节点上运行管理节点输出的docker swarm join命令:

docker swarm join --token SWMTKN-1-xxxxxxxxxxxxx <管理节点IP>:2377 
  • 验证节点是否加入:
    docker node ls # 查看集群节点列表(管理节点为“Leader”,工作节点为“Reachable”) 

4. 部署服务到Swarm

使用docker service create命令部署服务,示例如下:

docker service create --name my-web --replicas 3 -p 80:80 nginx:latest 
  • --name:服务名称(自定义)。
  • --replicas:副本数(3个Nginx容器)。
  • -p:端口映射(主机:容器)。
  • nginx:latest:使用的镜像。

5. 管理Swarm服务

  • 查看服务状态
    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 

6. 优势

  • 高可用:管理节点故障时,自动选举新Leader。
  • 负载均衡:自动将请求分发到多个副本。
  • 弹性扩展:根据负载动态调整副本数。
  • 原生集成:与Docker Engine无缝协作,无需额外组件。

三、Kubernetes:生产级复杂编排(可选)

Kubernetes是开源的容器编排平台,适合大规模、复杂应用,提供更强大的自动化管理能力(如自动修复、滚动更新、服务网格等)。但配置较复杂,适合有一定经验的用户。

1. 准备工作

  • 至少3台Ubuntu主机(1台主节点,2台工作节点)。
  • 所有主机安装Docker Engine(步骤同上)。
  • 主节点和工作节点之间网络互通(开放6443/tcp、10250/tcp等端口)。

2. 安装kubeadm、kubelet、kubectl

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 # 锁定版本,防止升级 

3. 初始化主节点

主节点上运行:

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)。

4. 部署网络插件(如Flannel)

Kubernetes需要网络插件实现Pod间通信,常用Flannel:

kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml 

5. 部署应用

创建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 
  • 查看Pod状态:
    kubectl get pods -w 
  • 查看Service信息:
    kubectl get svc 

6. 优势

  • 自动化管理:自动修复故障Pod、滚动更新、回滚。
  • 弹性扩展:支持HPA(Horizontal Pod Autoscaler)根据CPU/内存自动扩展。
  • 服务发现:内置DNS,服务间通过名称访问。
  • 负载均衡:Service自动分发请求到多个Pod。
  • 可扩展性:支持自定义资源、Operator等高级功能。

选择建议

  • 开发/测试:优先选Docker Compose,简单易用。
  • 小型集群/高可用:选Docker Swarm,原生集成,配置简单。
  • 大型生产环境:选Kubernetes,功能强大,适合复杂应用。

以上步骤覆盖了Ubuntu上Docker容器编排的主要方法,可根据实际需求选择合适的工具。

0