一台ubuntu部署多个docker服务?

在一台 Ubuntu 服务器上部署多个 Docker 服务是非常常见且推荐的做法,Docker 的设计初衷就是支持在同一台主机上运行多个隔离的应用服务。下面是一个详细的步骤指南,帮助你在一台 Ubuntu 上部署多个 Docker 服务。


🧱 基本概念

  • Docker 容器:每个服务可以运行在一个或多个容器中。
  • Docker Compose:推荐用于管理多个服务(微服务架构、Web + DB 等)。
  • 端口映射:确保不同服务使用不同的端口,避免冲突。
  • 网络隔离:可使用自定义 Docker 网络来让服务之间通信。

✅ 步骤一:安装 Docker 和 Docker Compose

# 安装依赖
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common

# 添加 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 添加 Docker 仓库
echo "deb [arch=$(dpkg --print-architecture) 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

# 安装 Docker 引擎
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io

# 安装 Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# 验证安装
docker --version
docker-compose --version

📁 步骤二:为每个服务创建独立目录结构

建议每个服务都单独一个目录,便于维护:

~/projects/
├── web-app/
│   └── Dockerfile
│   └── docker-compose.yml
├── backend-api/
│   └── Dockerfile
│   └── docker-compose.yml
├── mysql-db/
│   └── docker-compose.yml
└── redis-cache/
    └── docker-compose.yml

🐳 示例:部署多个服务(Nginx、Node.js API、MySQL)

1. 创建项目目录

mkdir -p ~/projects/myapp/{web,api,db}
cd ~/projects/myapp

2. 编写 docker-compose.yml

# docker-compose.yml
version: '3.8'

services:
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./web:/usr/share/nginx/html
    restart: unless-stopped

  node-api:
    build: ./api
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
    restart: unless-stopped

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: mydb
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
    restart: unless-stopped

volumes:
  mysql_data:

3. 创建 Node.js 应用示例

./api/Dockerfile:

FROM node:18-alpine
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]

./api/server.js(简单示例):

const http = require('http');
http.createServer((req, res) => {
  res.write("Hello from Node.js API");
  res.end();
}).listen(3000);

▶️ 启动所有服务

docker-compose up -d

查看状态:

docker-compose ps

停止服务:

docker-compose down

🔒 注意事项

  • 端口冲突:确保各服务映射的宿主机端口不冲突(如 Nginx 占用了 80,其他服务就不能再用)。
  • 资源限制:可以通过 resources 字段限制 CPU/内存。
  • 日志管理:使用 docker logs <container> 或集中日志系统(如 ELK、Fluentd)。
  • 安全性:生产环境应考虑使用非 root 用户运行容器、启用 AppArmor/SELinux 等安全策略。

🧩 可选功能增强

  • 使用 .env 文件管理环境变量:

    MYSQL_ROOT_PASSWORD=rootpass
  • 使用共享网络(服务间通过服务名访问):

    networks:
    - app-network
    
    services:
    api:
      networks:
        - app-network
    db:
      networks:
        - app-network

✅ 总结

你可以在一台 Ubuntu 上轻松部署多个 Docker 服务,只需遵循以下原则:

项目 推荐做法
每个服务 独立目录和 docker-compose.yml
多个服务协同 使用 docker-compose 统一编排
端口管理 明确映射宿主机端口,避免冲突
数据持久化 使用卷挂载数据库等数据目录
网络互通 使用自定义 Docker 网络

如果你有具体的几个服务需要部署(比如 WordPress + MySQL + Redis),我可以帮你写完整的 docker-compose.yml 示例。

是否需要我为你生成一个?