Docker 基础命令怎么用:容器、镜像、卷、日志和 ENTRYPOINT

7次阅读
没有评论

Docker 最常见的价值不是“把系统变高级”,而是把应用和依赖打包到一个更容易迁移、复现和部署的环境里。平时本地起 Redis、MySQL、Kafka,或者把 Java、Python、Node 服务打成镜像,都会用到它。

这篇按日常使用顺序整理:先判断适不适合用 Docker,再看容器、镜像、卷、日志排查和 ENTRYPOINT / CMD 的区别。

Docker 适合解决什么问题

Docker 主要解决“环境一致性”和“交付方式”的问题。

常见场景有几个:

  • 本地临时启动依赖服务,比如 Redis、MySQL、Kafka。
  • 把应用服务和运行时依赖打包成镜像。
  • 在服务器上隔离多个项目。
  • 用 Compose 管理多容器本地环境。

不建议把所有东西塞进一个大镜像。比如 MySQL、Nginx、应用服务最好拆成不同容器。这样日志、升级、重启和数据挂载都更清楚,也更符合官方镜像的使用方式。

Docker 和 OpenStack 的边界

Docker 和 OpenStack 都和云计算、虚拟化有关,但管理对象不同。

OpenStack 更像基础设施管理平台,用来管理虚拟机、网络、块存储和镜像等资源。Docker 更像应用交付和运行平台,用来管理容器、镜像、卷、网络和 Compose 编排。

可以把 Docker 跑在 OpenStack 管理的虚拟机里。简单理解就是:OpenStack 管机器和基础设施,Docker 管应用怎么打包和运行。

容器常用命令

启动一个后台容器:

docker run -itd --name ubuntu-test ubuntu

进入容器:

docker exec -it ubuntu-test bash

查看运行中的容器:

docker ps

查看所有容器,包括已经退出的:

docker ps -a

停止容器:

docker stop ubuntu-test

删除容器:

docker rm -f ubuntu-test

这里最容易混的是“停止”和“删除”。docker stop 只是让容器停下来,容器记录还在;docker rm 才是删除容器。镜像不会因为容器被删除而自动删除。

镜像常用命令

查看本地镜像:

docker images

拉取镜像:

docker pull image_name:tag

删除镜像:

docker rmi image_name:tag

从容器提交一个新镜像:

docker commit -m "update image" -a "zcq" container_id image_name:v1

导出镜像:

docker save image_name:tag > image_name.tar

导入镜像:

docker load < image_name.tar

镜像更新后不生效,通常不是 Docker 没拉到新镜像,而是旧容器还在跑。更稳的流程是:

  1. docker pull image_name:tag 拉取新镜像。
  2. 停止并删除旧容器。
  3. 必要时删除旧镜像。
  4. 用同一套启动参数重新创建容器。
  5. docker ps -a --no-truncdocker inspect 核对实际镜像、环境变量和挂载。

日志与排查

看日志:

docker logs container_name

实时跟日志:

docker logs -f container_name

看资源占用:

docker stats container_name

看容器完整配置、环境变量、端口和挂载:

docker inspect container_name

看完整启动命令:

docker ps -a --no-trunc

排查容器问题时,我一般按这个顺序看:

  1. 容器是否还在运行:docker ps -a
  2. 日志有没有明显报错:docker logs
  3. 端口是否映射正确:docker inspect
  4. 卷挂载路径是否存在、权限是否正确。
  5. 启动命令和环境变量是否和预期一致。

不要只盯着应用日志。很多问题是端口、路径、权限、环境变量和启动参数不一致导致的。

卷和路径映射

路径映射用于把宿主机目录挂到容器里。比如 Redis 挂载数据目录和配置文件:

docker run -d \
  --name redis \
  -p 6379:6379 \
  --restart=always \
  -v /data/redis/data:/data \
  -v /data/redis/redis.conf:/etc/redis/redis.conf \
  redis redis-server /etc/redis/redis.conf

这里的 -v /host/path:/container/path 表示:把宿主机路径挂到容器路径。

需要注意:

  • 宿主机路径最好提前创建。
  • 容器里看到的是映射后的路径,不是宿主机完整文件系统。
  • 数据库这类有状态服务要明确数据目录挂载位置。
  • 不要随手把敏感目录、Docker socket 或整块磁盘挂进容器。

如果容器需要管理宿主机 Docker,挂载 /var/run/docker.sock 很方便,但权限也很大。生产环境要谨慎控制访问。

ENTRYPOINT 和 CMD 怎么区分

ENTRYPOINT 定义容器启动时的主命令,通常用来固定这个镜像要跑什么程序。

CMD 定义默认参数或默认命令,可以被 docker run 后面的参数覆盖。

一个最小例子:

FROM ubuntu:latest
ENTRYPOINT ["echo"]
CMD ["Hello, World!"]

直接运行:

docker run your_image

输出:

Hello, World!

传入新参数:

docker run your_image Goodbye

输出:

Goodbye

实践上可以这样记:

  • 镜像只做一件事时,用 ENTRYPOINT 固定主程序。
  • 允许用户覆盖默认参数时,把参数放到 CMD
  • Java 服务常见写法是 ENTRYPOINT ["java", "-jar", "app.jar"]

Portainer 使用提醒

Portainer 适合临时管理 Docker,可视化查看容器、镜像、卷和日志。

示例:

docker run -d --restart=always --name portainer \
  -p 12000:9000 -p 11000:8000 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /usr/local/portainer/data:/data \
  portainer/portainer

但要特别注意访问控制。Portainer 能管理 Docker,权限边界很高。历史文档里曾经出现过企业版密钥,这类内容应该放到私密笔记或本机私有配置,不要写进公开文章、公共仓库或镜像默认配置。

小结

Docker 基础可以先抓这几组命令:

  • 容器生命周期:docker rundocker psdocker stopdocker rm
  • 镜像管理:docker pulldocker imagesdocker rmidocker savedocker load
  • 排查:docker logsdocker statsdocker inspectdocker ps -a --no-trunc
  • 数据挂载:-v 宿主机路径:容器路径
  • 启动语义:ENTRYPOINT 固定主程序,CMD 提供默认参数。

先把这些用熟,再去看 Compose、镜像构建和服务部署,会顺很多。

正文完
 0
bdspAdmin
版权声明:本站原创文章,由 bdspAdmin 于2026-06-22发表,共计2875字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)