1. 为什么Docker是开发者的必备工具?

第一次接触Docker时,我完全被它"一次构建,到处运行"的理念吸引了。想象一下,你开发了一个Python应用,在本地跑得好好的,但部署到服务器上就各种报错。这种"在我机器上能跑"的问题,Docker用容器技术完美解决了。

Docker的核心是镜像和容器。简单来说,镜像就像安装软件的ISO文件,而容器则是运行起来的软件实例。比如你下载了MySQL镜像,运行起来就是一个MySQL容器。最神奇的是,这个容器在任何安装了Docker的机器上表现完全一致,彻底告别了"环境差异"这个老冤家。

我在团队协作中就深有体会。以前新同事入职,光配开发环境就要花一整天。现在只需要把写好的Dockerfile和docker-compose.yml文件给他,几分钟就能把全套环境跑起来。这种效率提升,用过就再也回不去了。

2. 镜像管理:从下载到清理

2.1 获取镜像就像网购

刚开始用Docker时,docker pull是我用得最多的命令。它就像在应用商店下载软件,只不过这里下载的是各种开发环境和服务。比如要获取最新版Nginx镜像:

docker pull nginx:latest

这里有个实用技巧:总是指定版本标签。有次我在生产环境直接用了latest标签,结果半夜自动更新导致服务崩溃。后来我都用明确版本,比如nginx:1.25-alpine

下载完镜像,用docker images查看本地库存:

docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    2bdc49f2f8d1   2 weeks ago    187MB
redis        6.2       a4d3716dbb72   3 months ago   113MB

2.2 镜像清理的智慧

镜像很占空间,特别是当你频繁测试不同版本时。我常用的清理组合拳:

# 删除特定镜像
docker rmi nginx:1.23

# 清理所有悬空镜像(不再被任何容器引用的镜像)
docker image prune

# 彻底大扫除(慎用!会删除所有未被使用的镜像)
docker system prune -a

有次我手滑用了-a参数,把基础镜像都删了,结果第二天所有服务都启动不了。现在我会先用docker system df查看磁盘使用情况,再决定清理策略。

3. 容器生命周期管理实战

3.1 让容器跑起来

docker run绝对是使用频率最高的命令。它就像电脑上的"双击运行",但功能强大得多。一个典型的前端项目启动命令:

docker run -d -p 8080:80 -v $(pwd):/usr/share/nginx/html --name my-web nginx

这个命令做了几件事:

  • -d:后台运行(detached模式)
  • -p 8080:80:把主机的8080端口映射到容器的80端口
  • -v $(pwd):/usr/share/nginx/html:把当前目录挂载到容器内的Nginx默认网站目录
  • --name my-web:给容器起个有意义的名字

我刚开始总忘记加--name,结果容器多了就分不清谁是谁。现在养成了个好习惯:每个容器都必须有语义化名称

3.2 优雅地停止容器

直接关机可能会丢数据,容器也一样。docker stop会给容器发送SIGTERM信号,让它有机会完成收尾工作。比如:

docker stop my-web

如果容器30秒内没停止,Docker会强制终止。你可以用-t参数调整这个超时时间:

docker stop -t 60 my-web  # 给60秒宽限期

遇到卡死的容器时,我会先用docker stop,实在不行才用docker kill这个"强制关机"命令。

4. 容器日志查看技巧

4.1 基础日志查看

docker logs是我调试容器时的第一选择。比如查看Nginx容器的访问日志:

docker logs my-web

-f参数可以实时跟踪日志,相当于tail -f

docker logs -f my-web

4.2 高级日志技巧

生产环境中,我常用这些组合命令:

# 查看最近100行日志
docker logs --tail 100 my-web

# 查看特定时间段的日志
docker logs --since 2023-08-01T00:00:00 --until 2023-08-02T00:00:00 my-web

# 把日志输出到文件
docker logs my-web > web.log 2>&1

有次线上事故,我就是用--since参数快速定位到了问题发生时间点的日志。建议把这些命令记在小本本上,关键时刻能救命。

5. 容器清理与最佳实践

5.1 安全删除容器

用完的容器要及时清理,不然会占用磁盘和内存。删除前确保容器已停止:

docker stop my-web
docker rm my-web

如果想一步到位,可以用-f强制删除运行中的容器:

docker rm -f my-web

但我不建议这样做,可能会引起数据不一致。更安全的做法是先停止再删除。

5.2 批量管理技巧

当你有几十个容器需要处理时,这些命令特别有用:

# 停止所有运行中的容器
docker stop $(docker ps -q)

# 删除所有已停止的容器
docker container prune

# 删除所有容器(慎用!)
docker rm -f $(docker ps -aq)

我曾经不小心把同事的测试容器全删了...现在执行批量操作前,一定会先用docker ps -a确认要操作的容器列表。

6. 真实项目中的经验分享

在实际项目中,我总结出几个Docker使用原则:

  1. 镜像版本固定化:永远不要依赖latest标签,生产环境必须使用明确版本号
  2. 容器命名规范化:按"项目-服务-环境"的格式命名,比如ecom-api-prod
  3. 日志持久化:重要日志一定要挂载到主机或发送到日志系统
  4. 资源限制:运行容器时加上--memory--cpus限制,防止单个容器耗尽资源
  5. 定期维护:设置每周清理悬空镜像和停止的容器

有次我们的测试服务器磁盘被Docker占满,就是因为没人定期清理。现在我写了个简单的Shell脚本放在crontab里自动维护:

#!/bin/bash
# 每周日凌晨3点清理
docker system prune -f
docker volume prune -f

把这些基础命令用熟了,再结合docker-compose和Kubernetes,就能搭建出健壮的容器化应用架构。记住,Docker就像乐高积木,掌握基础组件的用法,才能搭建出稳固的城堡。

更多推荐