Docker容器操作指南:执行命令与设置开机自启

一、连接并操作正在运行的Docker容器

1. 查看容器信息

直接获取需操作的容器ID或名称(无需额外权限):

docker ps

命令会列出所有运行中容器,重点关注两列信息:

列名示例值
CONTAINER ID212cfc09b7ed
NAMES1Panel-php7-3T4d

2. 连接到容器

通过docker exec以交互式方式进入容器,方便后续操作:

docker exec -it <容器ID或名称> /bin/sh
  • 说明:-it确保交互式连接(可输入命令);<容器ID或名称>替换为实际标识(如212cfc09b7ed1Panel-php7-3T4d);/bin/sh为容器默认shell(部分容器需用/bin/bash)。

二、在容器中执行PHP任务(以彩虹聚合DNS为例)

1. 方法一:通过脚本执行(适合需延迟/复杂逻辑)

  1. 在宿主机目标目录创建脚本文件(如dns.sh):

    vi /www/sites/dns/index/dns.sh
  2. 写入脚本内容(延迟20秒确保数据库启动,无需可删除):

    sleep 20  # 适配彩虹聚合DNS依赖的数据库启动时间
    cd /www/sites/dns/index/ && php think dmtask
  3. 给脚本添加执行权限:

    chmod +x /www/sites/dns/index/dns.sh
  4. 让容器执行脚本:

    docker exec -it <容器ID或名称> /bin/sh /www/sites/dns/index/dns.sh

2. 方法二:直接执行PHP命令(简化操作)

无需创建脚本,直接在容器内运行PHP任务,支持后台执行:

docker exec <容器ID或名称> sh -c "php /www/sites/dns/index/think dmtask"
  • 优势:省略脚本步骤,docker会自动后台运行,退出终端不影响任务执行。

三、设置开机自启动(用cron @reboot 实现)

通过cron@reboot选项,让系统重启后自动执行容器内的PHP任务,比rc.local更灵活稳定。

1. 编辑当前用户的crontab配置

执行以下命令打开crontab编辑界面:

crontab -e
  • 首次编辑会提示选择编辑器(如nanovi),按提示选择常用编辑器即可(如输入2选择vi)。

2. 添加开机自启任务

在crontab文件末尾添加以下内容(根据实际场景选择命令):

场景1:直接执行PHP命令(推荐)

@reboot sleep 20; docker exec <容器ID或名称> sh -c "php /www/sites/dns/index/think dmtask"
  • 示例(用容器名称1Panel-php7-3T4d,更稳定):

    @reboot sleep 20; docker exec 1Panel-php7-3T4d sh -c "php /www/sites/dns/index/think dmtask"

场景2:执行脚本文件

若用之前创建的dns.sh脚本,可添加:

@reboot docker exec <容器ID或名称> /bin/sh /www/sites/dns/index/dns.sh
  • 说明:若脚本内已包含sleep 20,此处无需重复添加延迟。

3. 保存并退出crontab

  • 若用vi编辑器:按Esc,输入:wq回车保存退出;
  • 若用nano编辑器:按Ctrl+O回车保存,再按Ctrl+X退出。

4. 验证crontab配置

执行以下命令查看当前用户的crontab任务,确认配置已生效:

crontab -l

若输出中包含刚才添加的@reboot任务,说明配置成功。

四、注意事项

  1. 容器标识选择:优先用容器名称(如1Panel-php7-3T4d),而非容器ID——容器重建后ID会变化,名称通常不变,避免频繁修改配置。
  2. 延迟时间调整sleep 20(20秒)需根据实际环境调整,确保系统重启后,docker服务、容器及依赖的数据库完全启动后,再执行PHP任务(可根据实际启动速度改为3040秒)。
  3. 权限问题:若执行docker命令提示权限不足,需确认当前用户已加入docker用户组(可联系管理员执行usermod -aG docker 用户名添加,添加后需重新登录生效)。
  4. 日志排查:若开机后任务未执行,可查看cron日志排查问题(Debian/Ubuntu系统日志路径:/var/log/syslog,搜索关键词CRON;CentOS系统日志路径:/var/log/cron)。