Docker 基础入门:10 分钟跑通第一个容器

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 更彻底,慎用)

六、动手练习

  1. 用 docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=你的密码 mysql:8 起一个 MySQL,docker logs 等到 "ready for connections",docker exec -it 进去连一下试试。
  2. 故意把端口映射写冲突(两个容器都映射 8080),观察报错,理解端口占用的含义。
  3. docker inspect 你的 web 容器,找到它的容器 IP 和镜像分层信息。

下一篇预告

会跑容器只是开始。下一篇《Docker 进阶实战》解决"怎么把自己的应用容器化":手写 Dockerfile、理解构建缓存、玩转容器网络与数据卷、用 Compose 编排多容器应用。

评论(0)

0 / 2000
还没有评论,来抢沙发