如何在Ubuntu服务器上同时运行多个Docker容器?

在Ubuntu服务器上同时运行多个Docker容器有多种方法,以下是主要方案:

1. 直接使用Docker命令

# 分别启动多个容器
docker run -d --name container1 nginx:latest
docker run -d --name container2 redis:latest
docker run -d --name container3 mysql:latest

# 查看所有运行中的容器
docker ps

# 批量停止/启动
docker stop container1 container2 container3
docker start container1 container2 container3

2. 使用Docker Compose(推荐)

创建 docker-compose.yml 文件:

version: '3.8'
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
    networks:
      - app-network

  redis:
    image: redis:alpine
    networks:
      - app-network

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

volumes:
  mysql-data:

运行所有服务:

# 安装Docker Compose(如果未安装)
sudo apt update
sudo apt install docker-compose

# 启动所有容器
docker-compose up -d

# 查看状态
docker-compose ps

# 停止所有容器
docker-compose down

3. 使用Docker Swarm(集群管理)

# 初始化Swarm
docker swarm init

# 部署服务栈
docker stack deploy -c docker-compose.yml myapp

# 查看服务
docker service ls

4. 使用脚本批量管理

创建管理脚本 manage_containers.sh

#!/bin/bash
containers=("web" "api" "db" "cache")

case "$1" in
    start)
        for container in "${containers[@]}"; do
            docker start $container
        done
        ;;
    stop)
        for container in "${containers[@]}"; do
            docker stop $container
        done
        ;;
    restart)
        for container in "${containers[@]}"; do
            docker restart $container
        done
        ;;
    *)
        echo "用法: $0 {start|stop|restart}"
        exit 1
esac

5. 最佳实践建议

资源管理

# 限制容器资源
docker run -d --name app 
  --memory="512m" 
  --cpus="1.0" 
  --cpu-shares=512 
  nginx:latest

网络配置

# 创建自定义网络
docker network create my-network

# 容器加入同一网络
docker run -d --name container1 --network my-network nginx
docker run -d --name container2 --network my-network redis

监控和日志

# 查看所有容器状态
docker stats

# 查看所有容器日志
docker-compose logs -f

# 设置日志轮转
docker run --log-driver=json-file 
  --log-opt max-size=10m 
  --log-opt max-file=3 
  nginx:latest

自动重启策略

# 容器崩溃时自动重启
docker run -d --restart=always --name web nginx:latest

# 重启策略选项:
# no - 不自动重启(默认)
# on-failure[:max-retries] - 失败时重启
# always - 总是重启
# unless-stopped - 除非手动停止

6. 使用systemd管理(生产环境)

创建 /etc/systemd/system/docker-app.service

[Unit]
Description=My Docker Application
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/myapp
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target

选择建议

  • 少量容器:直接使用 docker run 命令
  • 开发/测试环境:使用 Docker Compose
  • 生产环境多容器:Docker Compose + systemd 或 Docker Swarm
  • 大规模集群:考虑 Kubernetes 或 Docker Swarm

注意事项

  1. 确保有足够的内存和CPU资源
  2. 配置适当的容器重启策略
  3. 使用数据卷持久化重要数据
  4. 设置合理的日志轮转策略
  5. 为不同容器配置独立的网络命名空间
  6. 定期更新容器镜像和安全补丁

通过以上方法,您可以在Ubuntu服务器上高效地管理和运行多个Docker容器。

云服务器