Docker
本文记录 Docker 的学习笔记。官方文档见 Docker Docs。
Warning
若遇到网络问题请自行配置代理,这里不敢展开。
Docker 是一个开源的容器化平台,可以把应用程序和它需要的所有依赖打包在一起,形成一个标准化的单元,方便在不同环境中运行,解决了「在我电脑上能运行,为什么到你电脑上就不行了」这个经典问题。同时,Docker 让应用部署变得非常简单快速,不需要复杂的安装配置过程,直接启动容器就能运行应用。
与虚拟机需要包含完整操作系统且启动时间久、占用空间大不同,容器是在操作系统层面进行虚拟化。多个容器共享同一个操作系统内核,启动时间较短,占用空间较小。可以通俗地类比为租房的场景:虚拟机就是单独租了一间房,卧室、卫生间、厨房一应俱全;而容器就是合租,卫生间、厨房都要和别人共用,通过操作系统的调度,让你洗澡、做饭不和其他合租户冲突,看上去就像独租。
Docker 主要由镜像 (Image)、容器 (Container) 和仓库 (Registry) 三部分组成:
- 镜像 (Image) 是一个只读的应用模板,包含了运行应用所需的一切——代码、运行环境、系统工具、库文件等。为了保证环境的一致性,镜像一旦创建就不能修改,如果需要更新,就要重新构建一个新的镜像。同一个软件的所有镜像通过版本标签来管理,比如
nginx:1.21和nginx:latest代表 nginx 的不同版本。 - 容器 (Container) 是镜像运行起来后的实例(运行时,Runtime)。同一个镜像可以创建多个容器,它们互不干扰,各自拥有独立的文件系统和网络环境。
- 仓库 (Registry) 是集中存放镜像的地方,用来分发和管理各个用户或组织上传的镜像,类似于 GitHub 之于代码、应用商店之于软件。最常用的是 Docker Hub 官方仓库,企业也可以搭建私有仓库来存放内部的镜像。
最佳实践:
- 使用 .dockerignore 文件:排除不需要的文件,减小镜像体积;
- 最小化镜像层数:合并 RUN 命令,减少镜像大小;
- 使用多阶段构建:分离构建环境和运行环境;
- 不要在容器中存储重要数据:始终使用数据卷持久化;
- 使用健康检查:确保容器正常运行;
- 限制容器资源:避免单个容器占用过多资源;
- 定期更新镜像:保持安全性和稳定性;
- 使用标签管理镜像版本:避免使用 latest 标签。
安全建议:
- 不要以 root 用户运行容器;
- 定期扫描镜像漏洞;
- 使用官方或可信镜像;
- 限制容器权限(例如 --cap-drop);
- 使用网络隔离;
- 加密敏感数据(使用 Docker Secrets)。