Docker基础命令:镜像拉取、容器运行、进入容器、日志查看
刚接触 Docker 那会儿,我总把几个基础命令搞混。明明只是拉个镜像,结果跑去 run 了一堆容器,日志也不知道去哪里看。折腾几次后,我自己总结了一套“三板斧”,今天分享给你。
说白了,Docker 的日常操作就围绕四个动作:拉镜像 → 跑容器 → 进容器 → 看日志。下面我们一个一个说。
1. 拉取镜像:从仓库拿到“施工图纸”
镜像就是容器的模板。你需要的环境、依赖、配置都打包在里面。拉取镜像用 docker pull。
docker pull nginx:latest
docker pull ubuntu:22.04
docker pull python:3.11-slim
我习惯在拉镜像前先搜一下版本,避免拉到不兼容的 tag。用这条命令查仓库里的 tag:
docker search nginx --limit 10
# 或者直接去 hub.docker.com 看更直观
小技巧: 拉取时指定具体版本号,别用 latest 一条道走到黑。我曾在生产环境因 latest 突然升级导致服务异常,从那以后我只用固定 tag。
镜像拉下来后用 docker images 查看本地存储:
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest abc123def456 2 weeks ago 187MB
ubuntu 22.04 xyz789ghi012 3 weeks ago 77.8MB
嗯,注意 IMAGE ID 是唯一标识,以后操作容器时偶尔会用上。
2. 运行容器:从图纸变成真正的“毛坯房”
镜像准备好了,下一步就是创建并启动容器。核心命令是 docker run。参数很多,但最常用的是这几个:
| 参数 | 作用 | 举例 |
|---|---|---|
-d | 后台运行(detach) | docker run -d nginx |
--name | 给容器起名字 | docker run --name myweb -d nginx |
-p | 端口映射 宿主机:容器 | docker run -p 8080:80 nginx |
-v | 挂载卷(持久化数据) | docker run -v /data:/app/data nginx |
--rm | 容器退出后自动删除 | docker run --rm ubuntu echo hello |
举个例子,启动一个 Nginx 并映射到本机 8080 端口:
docker run -d --name nginx-web -p 8080:80 nginx:latest
运行后用 docker ps 查看:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1b2c3d4e5f6 nginx:latest "/docker-entrypoint.…" 10 seconds ago Up 10 seconds 0.0.0.0:8080->80/tcp nginx-web
踩坑提醒: 我曾经忘记加 -d,结果运行一个长期任务时终端被阻塞,还以为卡死了。除非你要看实时输出,否则跑后台服务一定要加 -d。
3. 进入容器:像 SSH 一样操作内部环境
容器运行起来了,想进去看看配置文件、调试程序,怎么办?用 docker exec。
docker exec -it 容器名或ID /bin/bash
-it 是组合参数:-i 保持交互,-t 分配伪终端。举个例子:
docker exec -it nginx-web /bin/bash
# 进去之后就能像在普通 Linux 里操作了
ls /etc/nginx/
exit
如果容器里没有 bash,试试 /bin/sh(比如 Alpine 镜像)。
我的习惯: 进去后第一件事跑 cat /etc/os-release 确认系统版本,避免命令不兼容。有一次我在基于 Alpine 的镜像里用了 apt-get,折腾半天才发现包管理器是 apk。
还有个实用命令——把容器里的文件拷贝出来:
docker cp nginx-web:/etc/nginx/nginx.conf ./nginx_backup.conf
4. 查看日志:定位问题的第一站
容器出问题了,第一反应就是看日志。用 docker logs。
docker logs nginx-web
docker logs --tail 50 nginx-web # 只看最近50行
docker logs -f nginx-web # 实时跟踪输出(类似 tail -f)
如果你是用 -d 后台运行的容器,日志默认打到了标准输出。docker logs 抓的就是 stdout 和 stderr。
举个例子,启动一个会报错的容器:
docker run --rm --name test-error python:3.11-slim python -c "print('hello');1/0"
# 再用 logs(不过这个容器已经退出了)
docker logs test-error # 会看到 ZeroDivisionError
重点: 如果日志太长,搭配 --since 和 --until 过滤时间范围,我排查线上问题时经常用:docker logs --since "2025-04-01T10:00:00" my-container
5. 把这些串起来:一张图看清命令关系
下面这张图总结了刚才讲的四个核心命令之间的关系:
6. 实战小案例:一条龙走一遍
我把这几个命令串成一个完整例子,你可以直接在终端里跑:
# 1. 拉取一个轻量级 Python 镜像
docker pull python:3.11-alpine
# 2. 运行一个容器,执行一段脚本并保持运行
docker run -d --name py-test python:3.11-alpine python -c "import time; [print(i) for i in range(5)]; time.sleep(60)"
# 3. 查看日志
docker logs py-test
# 4. 进入容器(需要容器内进程还在运行)
docker exec -it py-test /bin/sh
# 进去后可以执行 ls /usr/local/bin/python3.11
# 然后 exit 退出
# 5. 清理容器
docker stop py-test
docker rm py-test
注意: 如果容器里进程执行完就退出了(比如上面的 python -c 不 sleep),容器状态会变为 Exited,此时无法 exec 进入。只有正在运行的容器才支持 exec。
好了,这四个基础命令掌握好,日常开发基本够用了。记得多敲几次,肌肉记忆比背参数管用。