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 没拉到新镜像,而是旧容器还在跑。更稳的流程是:
docker pull image_name:tag拉取新镜像。- 停止并删除旧容器。
- 必要时删除旧镜像。
- 用同一套启动参数重新创建容器。
- 用
docker ps -a --no-trunc和docker inspect核对实际镜像、环境变量和挂载。
日志与排查
看日志:
docker logs container_name
实时跟日志:
docker logs -f container_name
看资源占用:
docker stats container_name
看容器完整配置、环境变量、端口和挂载:
docker inspect container_name
看完整启动命令:
docker ps -a --no-trunc
排查容器问题时,我一般按这个顺序看:
- 容器是否还在运行:
docker ps -a。 - 日志有没有明显报错:
docker logs。 - 端口是否映射正确:
docker inspect。 - 卷挂载路径是否存在、权限是否正确。
- 启动命令和环境变量是否和预期一致。
不要只盯着应用日志。很多问题是端口、路径、权限、环境变量和启动参数不一致导致的。
卷和路径映射
路径映射用于把宿主机目录挂到容器里。比如 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 run、docker ps、docker stop、docker rm。 - 镜像管理:
docker pull、docker images、docker rmi、docker save、docker load。 - 排查:
docker logs、docker stats、docker inspect、docker ps -a --no-trunc。 - 数据挂载:
-v 宿主机路径:容器路径。 - 启动语义:
ENTRYPOINT固定主程序,CMD提供默认参数。
先把这些用熟,再去看 Compose、镜像构建和服务部署,会顺很多。




