Docker 基础入门:10 分钟跑通第一个容器
这是 Docker 系列第一篇。假设你已具备 Linux 基础(参考 Linux 系列),本篇带你建立容器思维:它解决什么问题、核心概念是什么、日常高频命令有哪些。
一、为什么需要容器
软件部署的经典痛点:"在我机器上是好的"。根源是应用依赖运行环境——库版本、系统配置、环境变量。容器把应用和它的全部依赖打包成一个标准单元,做到"一次构建,处处运行"。
容器 vs 虚拟机,一句话说清本质:
虚拟机:虚拟出一整套硬件 + 完整客户操作系统(GB 级,分钟级启动)
容 器:共享宿主机内核,只隔离进程视图(MB 级,秒级启动)
容器本质上是宿主机上被隔离和限制的进程(Linux 的 Namespace 提供隔离,Cgroups 提供资源限制),所以它快、轻,但只能跑与宿主机内核兼容的系统(这就是 Docker Desktop 在 Windows/macOS 上要先起一个 Linux 虚拟机的原因)。
二、安装与验证
# Ubuntu:使用 Docker 官方 apt 仓库安装
sudo apt-get update
sudo apt-get install -y docker.io docker-compose-v2
sudo usermod -aG docker $USER # 免 sudo(重新登录生效)
docker --version && docker compose version
国内拉取镜像较慢时,可在 /etc/docker/daemon.json 配置镜像加速器,然后 sudo systemctl restart docker 生效:
{ "registry-mirrors": ["https://docker.m.daocloud.io"] }
三、三个核心概念
- 镜像(Image):只读模板,类似"安装光盘",采用分层存储;
- 容器(Container):镜像的运行实例,类似"装好的系统",在镜像只读层上叠加一个可写层;
- 仓库(Registry):存镜像的地方,Docker Hub 之于容器,如同 GitHub 之于代码。
理解分层:多个容器共享同一份镜像的只读层,各自只有可写层不同——所以镜像省空间、容器启动快。容器删除时可写层随之丢弃(重要:容器内不要存持久数据,下一篇讲数据卷)。
四、高频命令:以 nginx 为例
docker run -d -p 8080:80 --name web nginx
# │ │ │ └ 镜像名(默认拉取 nginx:latest)
# │ │ └ 容器名(便于管理,不指定则随机)
# │ └ 端口映射:宿主机 8080 → 容器 80
# └ -d 后台运行(不加则占住终端)
docker ps # 运行中的容器(-a 含已停止)
docker logs -f web # 看日志(-f 跟踪,--tail 100 最近100行)
docker exec -it web bash # 进入容器(exit 退出,容器不停止)
docker inspect web # 全部元数据(IP、挂载、环境变量,排障利器)
docker stats # 实时资源占用
docker stop web && docker rm web # 停止并删除
浏览器访问 http://服务器IP:8080 看到 nginx 欢迎页——恭喜,你的第一个容器跑通了。
五、容器内的数据:易失性
做一个实验,理解"容器数据易失":
docker run -it --name exp ubuntu bash
# 容器内:echo hello > /root/data.txt && exit
docker rm exp # 删除容器
docker run -it ubuntu bash # 新容器里 /root/data.txt 不存在了
容器最佳实践由此而来:容器无状态,数据放外部(数据卷/宿主机目录,下一篇详解)。
镜像与容器的日常管理:
docker images # 本地镜像列表
docker rmi nginx # 删除镜像(有容器引用时需先删容器)
docker pull redis:7-alpine # 拉指定版本(务必带 tag,别裸用 latest)
docker system df # docker 占了多少磁盘
docker system prune # 清理停止的容器/悬空镜像(-a 更彻底,慎用)
六、动手练习
- 用
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=你的密码 mysql:8起一个 MySQL,docker logs等到 "ready for connections",docker exec -it进去连一下试试。 - 故意把端口映射写冲突(两个容器都映射 8080),观察报错,理解端口占用的含义。
docker inspect你的 web 容器,找到它的容器 IP 和镜像分层信息。
下一篇预告
会跑容器只是开始。下一篇《Docker 进阶实战》解决"怎么把自己的应用容器化":手写 Dockerfile、理解构建缓存、玩转容器网络与数据卷、用 Compose 编排多容器应用。
我的恒园天地