Docker exec进入容器命令的入门教程
1. 基础概念
docker exec
用于在已运行的容器中执行命令,是调试、维护和交互的核心工具。其语法结构为:
docker exec [选项] <容器ID/名称> <命令> [参数]
- 容器ID/名称:可通过
docker ps
获取 - 命令:在容器内执行的指令(如
bash
、ls
、curl
)
2. 常用参数详解
参数 | 示例 | 用途 |
---|---|---|
-it | docker exec -it web bash | 交互式终端(-i 保持输入开放,-t 分配伪终端) |
-d /--detach | docker exec -d web touch /tmp/test | 后台执行命令,不占用终端 |
-e /--env | docker exec -e ENV=prod web sh -c "echo $ENV" | 设置环境变量 |
--user /-u | docker exec -u 1000 web id | 指定执行命令的用户(避免root权限) |
-w /--workdir | docker exec -w /app web pwd | 指定工作目录 |
3. 基础操作示例
进入交互式终端
# 进入Nginx容器的bash shell
docker exec -it web bash# 进入MySQL容器执行SQL
docker exec -it mysql mysql -uroot -p
后台执行命令
# 在容器内创建文件(不占用终端)
docker exec -d web touch /tmp/backup.log
设置环境变量
# 传递环境变量到容器内命令
docker exec -e DEBUG=true web sh -c "echo \$DEBUG"
指定用户执行
# 以非root用户运行命令
docker exec -u 1000:1000 web id
挂载卷(临时)
# 将主机文件复制到容器内
docker exec -w /app web sh -c "cat > /app/data.txt" < /host/data.txt
4. 高级用法
资源限制
# 限制命令的内存使用(需Docker 19.03+)
docker exec --memory 512m web sh -c "free -m"
安全配置
# 以只读方式挂载文件系统
docker exec --read-only web sh -c "echo 'test' > /tmp/test"
网络调试
# 在容器内检查网络连接
docker exec web curl -v http://example.com
进程管理
# 查看容器内运行进程
docker exec web ps aux# 终止容器内进程
docker exec web kill 1234 # 替换为实际PID
5. 验证命令执行
检查命令输出
# 直接查看命令结果
docker exec web ls /tmp# 将输出保存到主机文件
docker exec web ls /tmp > /host/tmp_files.txt
验证文件修改
# 检查容器内文件是否更新
docker exec web sh -c "cat /tmp/test"# 比较主机与容器文件差异
diff /host/data.txt <(docker exec web cat /app/data.txt)
查看容器日志
# 监控容器日志(实时)
docker exec -it web tail -f /var/log/nginx/access.log
6. 常见问题解决
问题1:容器未运行
Error response from daemon: Container <ID> is not running
解决方案:
- 启动容器:
docker start <ID>
- 检查容器状态:
docker ps -a | grep <ID>
问题2:权限不足
Error: failed to exec in container: Operation not permitted
解决方案:
- 以非root用户执行:
docker exec -u 1000:1000 web id
- 检查容器内用户权限:
docker exec web whoami
问题3:命令不存在
Error: exec: "python3": executable file not found in $PATH
解决方案:
- 确认镜像包含所需命令:
docker run --rm web which python3
- 安装依赖(需容器有包管理器):
docker exec web sh -c "apt update && apt install -y python3"
问题4:终端乱码
������ ��� ���
解决方案:
- 设置终端编码:
docker exec -e LANG=C.UTF-8 -it web bash
7. 最佳实践
- 避免以root用户执行:使用
--user
参数限制权限 - 使用交互式终端调试:优先使用
-it
参数进入容器排查问题 - 定期清理临时容器:
# 删除已退出的容器 docker container prune
- 备份关键数据:通过
exec
导出容器数据到主机:docker exec web sh -c "tar czf - /data" > /host/data.tar.gz
8. 示例流程
# 1. 进入MySQL容器修改配置
docker exec -it mysql bash
# 在容器内执行:
mysql -uroot -psecret -e "ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'newpass';"# 2. 备份WordPress容器数据
docker exec -w /var/www/html web sh -c "tar czf - ." > /host/backup/web_$(date +%Y%m%d).tar.gz# 3. 检查Redis容器状态
docker exec redis sh -c "redis-cli INFO | grep 'used_memory'"