Skip to content

容器基本操作

Docker 日常操作围绕镜像和容器展开。镜像是只读模板,容器是镜像运行起来后的实例。拉镜像、创建容器、查看日志、进入容器、停止删除、排查退出码,这些动作是后面 Compose、Harbor、Kubernetes 之前最基础的操作面。

容器操作看起来像在管理一台小机器,但本质上还是在管理宿主机上的进程、namespace、cgroup、网络和挂载。排查时既要看容器内部日志,也要看 Docker daemon 和宿主机状态。

一、镜像拉取和查看

bash
# 固定版本标签,避免 latest 指向变化导致环境不可追溯
docker pull nginx:1.26

# 查看本地已有镜像
docker images nginx

# 查看镜像元数据,包含入口命令、环境变量、架构、digest 等
docker image inspect nginx:1.26

# 搜索远端仓库里的镜像
docker search nginx

生产环境不适合依赖 latest。今天拉到的 latest 和一个月后拉到的可能不是同一个内容,故障回滚时也很难判断当时运行的是哪一版。

二、启动一个容器

启动一个 Nginx 容器:

bash
docker run -d \
  --name web \
  -p 8080:80 \
  nginx:1.26
参数含义
-d后台运行
--name web指定容器名,后面查日志和进入容器都靠它定位
-p 8080:80宿主机 8080 映射到容器 80
nginx:1.26使用的镜像和版本

-p 8080:80 默认绑定所有地址。只给本机访问时写成 127.0.0.1:8080:80

bash
docker run -d \
  --name web-local \
  -p 127.0.0.1:8080:80 \
  nginx:1.26

验证:

bash
docker ps
curl -I http://127.0.0.1:8080/
docker logs web

docker ps 只显示运行中的容器。容器启动后立刻退出时,要用 docker ps -a 看历史状态和退出码。

三、进入容器和执行命令

bash
# 打开交互 shell,适合临时查看文件和进程
docker exec -it web sh

# 执行一次性命令,不打开交互终端
docker exec web nginx -t

# 查看容器内进程列表
docker top web

很多精简镜像只有 sh,没有 bashcurlvim。进入容器后缺工具不是异常,而是镜像被刻意裁剪了。排查需要工具时,可以使用临时 debug 镜像,或者在 Kubernetes 里用 ephemeral container。

四、生命周期命令

bash
docker stop web      # 发送 SIGTERM,等待容器主进程退出
docker start web     # 启动已停止的容器,原可写层仍然保留
docker restart web   # 停止后再启动
docker rm web        # 删除已停止容器
docker rm -f web     # 强制删除运行中的容器
docker ps -a         # 查看所有容器,包括已停止的

停止和删除是两步。容器停止后,可写层、挂载关系、网络配置还在;删除容器才会清理可写层。数据写在 volume 还是容器内部,决定了 docker rm 会不会造成数据丢失。

五、环境变量和挂载

bash
docker run -d \
  --name app \
  -e APP_ENV=prod \
  -e LOG_LEVEL=info \
  -v app-data:/data \
  -p 8080:8080 \
  registry.example.com/ops/app:1.0
配置说明
-e注入环境变量
-v app-data:/data使用 Docker volume 持久化数据
-p 8080:8080暴露端口

密码、密钥这类敏感信息不适合长期裸写在命令行里。命令会进入 shell history,也可能被进程列表、审计系统或工单记录保存。单机 Docker 可以用 env file 降低暴露面,Kubernetes 里通常使用 Secret 或外部密钥系统。

六、资源限制和重启策略

bash
docker run -d \
  --name app \
  --cpus "2" \
  --memory "1g" \
  --pids-limit 512 \
  --restart unless-stopped \
  registry.example.com/ops/app:1.0
参数说明
--cpus "2"最多使用约 2 个 CPU 核
--memory "1g"内存硬上限,超过后可能 OOM
--pids-limit 512限制容器内进程数量
--restart unless-stopped异常退出后自动拉起,手工停止后不再自动启动

资源限制是运行期边界,不是性能调优本身。Java、Node.js、Go 这类运行时还要根据容器内存限制调整自身参数,否则可能按宿主机内存估算,最后被 cgroup 杀掉。

七、常用排查命令

命令用途
docker ps -a看容器状态和退出码
docker logs <容器>看标准输出和标准错误
docker inspect <容器>看配置、网络、挂载、健康状态等元数据
docker events看容器创建、停止、OOM 等事件
docker stats实时资源使用
journalctl -u dockerDocker daemon 日志

容器启动失败时,常见顺序是:

bash
# 看状态和退出码
docker ps -a --filter name=app

# 看应用输出
docker logs --tail 100 app

# 看镜像入口命令、环境变量、挂载、网络和健康状态
docker inspect app

# 应用日志为空时,看 daemon 层面是否有挂载、网络、运行时错误
journalctl -u docker -n 100 --no-pager

退出码 137 常见于 OOM 或收到 SIGKILL,退出码 126/127 常见于命令不可执行或命令不存在。不同语言框架还会把自身错误码带出来,结合日志判断更准确。