在一台 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 示例。
是否需要我为你生成一个?
PHPWP博客