在 linux 中实现开机自动启动 Docker 并自动运行特定镜像的容器

发布于:2025-06-20 ⋅ 阅读:(11) ⋅ 点赞:(0)

在 CentOS 7 中实现开机自动启动 Docker 并自动运行特定镜像的容器,有以下两种推荐方法:

方法 1:使用 Docker 的 --restart 策略(简单高效,推荐)

这是最简洁直接的方案,利用 Docker 内置的重启策略来实现:

  1. 确保 Docker 开机启动​:

    sudo systemctl enable docker
  2. 启动容器时添加重启策略​:

    docker run -d \
      --name my-container \
      --restart=unless-stopped \  # 关键参数!
      nginx:latest
  3. (可选)如果容器已存在,更新配置:

    docker update --restart=unless-stopped my-container
重启策略 行为
unless-stopped 除非手动停止,否则系统重启后自动运行(推荐)
always 总是重启(即使手动停止后也会自动重启)
on-failure 仅当容器非正常退出时重启

方法 2:使用 Systemd 服务(更精细控制)

当需要更复杂的启动顺序或参数时使用:

  1. 创建服务文件​:

    sudo vi /etc/systemd/system/docker-myapp.service
  2. 添加以下内容​(替换为你的镜像和参数):

    [Unit]
    Description=My Docker Container Service
    After=docker.service  # 确保在 Docker 启动后运行
    Requires=docker.service
    
    [Service]
    Type=simple
    # 确保先移除旧容器(清理)
    ExecStartPre=-/usr/bin/docker rm -f my-container
    # 启动新容器
    ExecStart=/usr/bin/docker run \
      --name my-container \
      -p 80:80 \
      nginx:latest
    # 停止命令
    ExecStop=/usr/bin/docker stop my-container
    # 清理命令
    ExecStopPost=/usr/bin/docker rm my-container
    TimeoutStartSec=90
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
  3. 启用服务​:

    sudo systemctl daemon-reload
    sudo systemctl enable docker-myapp.service
    sudo systemctl start docker-myapp.service

🔍 常见镜像启动示例

1. 启动 MySQL 容器
docker run -d \
  --name mysql-db \
  --restart=unless-stopped \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -p 3306:3306 \
  -v /data/mysql:/var/lib/mysql \
  mysql:8.0
2. 启动 Nginx 容器
docker run -d \
  --name web-server \
  --restart=unless-stopped \
  -p 80:80 \
  -p 443:443 \
  -v /path/to/html:/usr/share/nginx/html \
  -v /path/to/nginx.conf:/etc/nginx/nginx.conf \
  nginx:alpine
3. 启动自定义应用
docker run -d \
  --name my-app \
  --restart=unless-stopped \
  -p 8080:3000 \
  -e ENV=production \
  my-registry.com/my-custom-image:v1.2

⚠️ 重要注意事项

  1. 安全加固​:

    # 限制容器权限
    --security-opt="no-new-privileges" \
    --read-only \
    --cap-drop=ALL
  2. 资源限制​:

    --cpus="1.0" \
    --memory="512m" \
    --memory-swap="1g"
  3. 日志管理​:

    --log-opt max-size=10m \
    --log-opt max-file=3
  4. 健康检查​:

    docker inspect --format='{{json .State.Health}}' my-container

🧪 验证和调试

  1. 检查服务状态​:

    systemctl status docker-myapp.service
  2. 查看容器日志​:

    docker logs -f my-container
  3. 测试重启​:

    sudo reboot
    # 重启后验证
    docker ps
    curl http://localhost
  4. 诊断启动问题​:

    journalctl -u docker-myapp.service -b -n 100 --no-pager

✅ 最佳实践建议

  1. 使用 Docker Compose(生产推荐)​​:

    version: '3'
    services:
      web:
        image: nginx:alpine
        restart: unless-stopped
        ports:
          - "80:80"
      db:
        image: mysql:8.0
        restart: unless-stopped
        environment:
          MYSQL_ROOT_PASSWORD: secret

    然后设置 systemd 启动 compose:

    ExecStart=/usr/local/bin/docker-compose -f /path/to/docker-compose.yml up
  2. 版本控制​:

    • 始终指定容器标签(如 nginx:1.23-alpine 而非 nginx:latest
    • 在 Dockerfile 或 compose 文件中固化版本
  3. 数据持久化​:

    -v mysql_data:/var/lib/mysql  # 使用命名卷

通过以上方法,您可以确保 CentOS 7 启动时自动运行 Docker 并启动指定的容器镜像。对于大多数场景,方法 1 的 --restart=unless-stopped 是最简单可靠的解决方案。


网站公告

今日签到

点亮在社区的每一天
去签到