Docker exec进入容器命令的入门教程

发布于:2025-08-16 ⋅ 阅读:(19) ⋅ 点赞:(0)

1. 基础概念

docker exec 用于在已运行的容器中执行命令,是调试、维护和交互的核心工具。其语法结构为:

docker exec [选项] <容器ID/名称> <命令> [参数]
  • 容器ID/名称:可通过docker ps获取
  • 命令:在容器内执行的指令(如bashlscurl

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. 最佳实践

  1. 避免以root用户执行:使用--user参数限制权限
  2. 使用交互式终端调试:优先使用-it参数进入容器排查问题
  3. 定期清理临时容器
    # 删除已退出的容器
    docker container prune
    
  4. 备份关键数据:通过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'"

网站公告

今日签到

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