在同一台服务器上部署多个Docker容器是一种常见的做法,可以有效利用资源并实现服务隔离。以下是关键步骤和注意事项:
1. 规划与资源分配
- 资源限制:为每个容器设置CPU、内存限制(
--cpus,--memory)。docker run -d --name container1 --cpus 1 --memory 512m nginx - 端口映射:避免端口冲突,为每个服务分配不同端口。
docker run -d --name web1 -p 8080:80 nginx docker run -d --name web2 -p 8081:80 nginx
2. 网络配置
- 默认网络:容器默认在
bridge网络中,可通过IP互通。 - 自定义网络:创建隔离网络,提升安全性和可管理性。
docker network create my_network docker run -d --name app1 --network my_network app1_image docker run -d --name app2 --network my_network app2_image
3. 数据管理
- 卷(Volumes):持久化数据,避免容器删除后丢失。
docker volume create db_data docker run -d --name db -v db_data:/var/lib/mysql mysql - 绑定挂载:直接挂载主机目录(开发环境常用)。
docker run -d --name app -v /host/path:/container/path app_image
4. 容器编排(可选)
- Docker Compose:通过YAML文件定义多容器应用。
version: '3' services: web: image: nginx ports: ["8080:80"] db: image: mysql volumes: ["db_data:/var/lib/mysql"]启动命令:
docker-compose up -d - Kubernetes:适合大规模集群管理(单机可用
minikube)。
5. 监控与日志
- 日志查看:
docker logs -f container_name - 资源监控:
docker stats - 第三方工具:Prometheus + Grafana 或 cAdvisor。
6. 安全建议
- 非root用户运行:在Dockerfile中使用
USER指令。 - 定期更新镜像:避免安全漏洞。
docker pull nginx:latest - 限制权限:避免使用
--privileged。
7. 常见问题
- 端口冲突:确保主机端口不重复。
- 资源竞争:合理分配CPU/内存,避免单个容器耗尽资源。
- 启动顺序:依赖服务(如数据库)需先启动,可使用
depends_on(Compose)或健康检查。
示例:部署Web+DB应用
# 创建网络
docker network create app_net
# 启动MySQL容器
docker run -d --name mysql_db
--network app_net
-v mysql_data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=secret
mysql:5.7
# 启动Web应用(连接MySQL)
docker run -d --name web_app
--network app_net
-p 8000:80
-e DB_HOST=mysql_db
web_app_image
通过合理规划网络、资源和存储,单台服务器可以高效运行多个容器。对于复杂场景,建议使用Docker Compose或Kubernetes简化管理。
云服务器