引言
Docker极大简化了应用的构建与部署流程,但初学者在学习Docker时,常常被繁杂的术语困扰。你可能频繁听到“镜像”“容器”“卷”等词汇,却不清楚它们之间的关联。本文将帮你理清入门必备的Docker核心概念。
让我们即刻开始。
1. Docker镜像(Docker Image)
Docker镜像是一个包含应用运行所需全部资源的归档包,包括代码、运行时环境、依赖库、环境变量及配置文件。
镜像具有不可变性——一旦创建,便无法修改。这一特性确保应用在你的笔记本、同事的设备及生产环境中运行效果完全一致,彻底消除环境差异导致的Bug。
可通过Dockerfile构建镜像,Dockerfile本质是一份定义镜像构建规则的“配方”,构建命令如下:
docker build -t my-python-app:1.0 .
其中,-t参数用于为镜像添加名称和版本标签;末尾的“.”表示Docker从当前目录查找Dockerfile。镜像构建完成后,将作为应用的可复用模板。
2. Docker容器(Docker Container)
容器是运行镜像后得到的实例,是应用实际执行的隔离环境。
docker run -d -p 8000:8000 my-python-app:1.0
-d参数表示让容器在后台运行;-p 8000:8000将主机的8000端口映射到容器的8000端口,使应用可通过localhost:8000访问。
可基于同一个镜像运行多个容器,且容器间相互独立。这一特性支持你同时测试不同版本的应用,或通过运行10个相同应用实例实现水平扩展。
容器具备轻量特性:与虚拟机不同,它无需启动完整操作系统,仅需数秒即可启动,且共享主机内核资源。
3. Dockerfile
Dockerfile是包含镜像构建指令的文本文件,明确告知Docker如何配置应用运行环境。
以下是一个Flask应用的Dockerfile示例:
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["python", "app.py"]
逐一拆解各指令作用:
FROM python:3.11-slim:基于已安装Python 3.11的基础镜像构建,“slim”变体比标准镜像体积更小。
WORKDIR /app:设置工作目录为/app,后续所有指令均在此目录下执行。
COPY requirements.txt .:先复制依赖清单文件,而非全部代码(优化构建效率)。
RUN pip install --no-cache-dir -r requirements.txt:安装Python依赖,--no-cache-dir参数减少镜像体积。
COPY . .:复制剩余的应用代码至工作目录。
EXPOSE 8000:声明应用占用8000端口(仅为文档说明,不实际映射)。
CMD ["python", "app.py"]:定义容器启动时执行的命令。
指令顺序对构建速度至关重要,这就需要理解镜像层的概念。
4. 镜像层(Image Layers)
Dockerfile中的每条指令都会创建一个新的镜像层,这些层叠加形成最终镜像。
Docker会缓存每个镜像层。当重新构建镜像时,Docker会检查各层是否需要更新:若内容无变化,则复用缓存层,无需重新构建。
这也是先复制requirements.txt再复制代码的原因——依赖的变更频率远低于业务代码。当仅修改app.py时,Docker会复用依赖安装对应的缓存层,仅重构代码复制及后续层,大幅提升构建速度。
上述Dockerfile对应的镜像层结构如下:
基础Python镜像(FROM指令)
设置工作目录(WORKDIR指令)
复制requirements.txt(COPY指令)
安装依赖(RUN指令)
复制应用代码(COPY指令)
端口元数据(EXPOSE指令)
默认启动命令(CMD指令)
若仅修改Python代码,Docker仅重构5-7层,1-4层直接复用缓存。掌握镜像层原理可优化Dockerfile编写:将频繁变更的文件放在指令末尾,稳定依赖放在开头。
5. Docker卷(Docker Volumes)
容器具有临时性——删除容器时,内部所有数据(包括应用生成的文件)都会丢失。
Docker卷可解决这一问题,它是独立于容器文件系统的目录,即使容器被删除,数据仍能持久化保存。
docker run -d \
-v postgres-data:/var/lib/postgresql/data \
postgres:15
该命令创建名为postgres-data的命名卷,并将其挂载到容器内的/var/lib/postgresql/data目录,数据库文件可在容器重启、删除后保留。
也可挂载主机目录(适用于开发场景):
docker run -d \
-v $(pwd):/app \
-p 8000:8000 \
my-python-app:1.0
将主机当前目录挂载到容器的/app目录,主机文件的修改会实时同步至容器,实现热开发,无需反复重构镜像。
Docker支持三种挂载类型:
命名卷(postgres-data:/path):由Docker管理,适用于生产环境数据存储。
绑定挂载(/host/path:/container/path):挂载主机任意目录,适用于开发场景。
tmpfs挂载:数据仅存储在内存中,适用于临时文件。
6. Docker Hub
Docker Hub是公开的镜像仓库,用于共享Docker镜像。当执行FROM python:3.11-slim时,Docker会从Docker Hub拉取该基础镜像。
搜索镜像命令:
docker search redis
拉取镜像至本地:
docker pull redis:7-alpine
也可将本地镜像推至Docker Hub,供他人共享或部署至服务器:
docker tag my-python-app:1.0 username/my-python-app:1.0
docker push username/my-python-app:1.0
Docker Hub提供PostgreSQL、Redis、Nginx、Python等热门软件的官方镜像,由软件开发者维护,遵循最佳实践。
针对私有项目,可在Docker Hub创建私有仓库,或使用替代仓库如亚马逊弹性容器仓库(ECR)、谷歌容器仓库(GCR)、 Azure容器仓库(ACR)。
7. Docker Compose
实际应用往往依赖多个服务,例如一个Web应用通常包含Python后端、PostgreSQL数据库、Redis缓存及任务进程。
Docker Compose支持通过单个YAML文件定义所有服务,并统一管理。
创建docker-compose.yml文件:
version: '3.8'
services:
web:
build: .
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgresql://postgres:secret@db:5432/myapp
- REDIS_URL=redis://cache:6379
depends_on:
- db
- cache
volumes:
- .:/app
db:
image: postgres:15-alpine
volumes:
- postgres-data:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=secret
- POSTGRES_DB=myapp
cache:
image: redis:7-alpine
volumes:
postgres-data:
通过一条命令启动整个应用栈:
docker-compose up -d
该命令启动web、db、cache三个容器,Docker Compose自动配置网络:web服务可通过主机名db访问PostgreSQL,通过cache访问Redis。
停止所有服务:
docker-compose down
代码变更后重构并重启:
docker-compose up -d --build
Docker Compose是开发环境的必备工具——无需在本地安装PostgreSQL、Redis,仅需一条命令即可通过容器启动所有依赖服务。
8. 容器网络(Container Networks)
运行多个容器时,服务间需相互通信,Docker通过虚拟网络实现容器互联。
默认情况下,Docker Compose会为yml文件中的所有服务创建专属网络,容器可通过服务名作为主机名通信。例如上述示例中,web容器通过db:5432访问PostgreSQL,正是因为db是数据库服务的名称。
也可手动创建自定义网络:
docker network create my-app-network
docker run -d --network my-app-network --name api my-python-app:1.0
docker run -d --network my-app-network --name cache redis:7
此时api容器可通过cache:6379访问Redis服务。Docker提供多种网络驱动,常用的有:
bridge(桥接网络):单主机容器的默认网络。
host(主机网络):容器直接使用主机网络,无网络隔离。
none(无网络):容器无网络访问权限。
网络具备隔离性,不同网络中的容器无法通信(除非手动关联),这一特性可提升安全性,例如将前端、后端、数据库部署在不同网络中。
查看所有网络:
docker network ls
查看网络详情及关联容器:
docker network inspect my-app-network
9. 环境变量与Docker密钥(Environment Variables and Docker Secrets)
硬编码配置存在极大风险:开发与生产环境的数据库密码不应一致,API密钥更不能嵌入代码库。
Docker通过环境变量传递配置,运行时通过-e或--env参数注入,容器可获取所需配置,无需将值嵌入镜像。
Docker Compose可简化配置管理:通过.env文件存储配置(避免纳入版本控制),部署时替换为.env.production;非敏感配置也可直接定义在compose文件中。
Docker密钥为生产环境(尤其Swarm模式)提供更安全的方案:与环境变量不同(可能出现在日志或进程列表中),密钥在传输和存储时均加密,以文件形式挂载到容器,仅授权服务可访问。适用于密码、令牌、证书等敏感数据,可防止泄露导致严重后果。
核心原则:代码与配置分离。普通配置用环境变量,敏感数据用密钥。
10. 容器仓库(Container Registry)
Docker Hub适用于公开镜像,但企业应用镜像不应公开。容器仓库是私有Docker镜像的存储服务,主流选项包括:
Docker Hub(私有仓库,提供免费额度)
亚马逊ECR
谷歌GCR
微软ACR
自托管仓库(如Harbor、GitLab容器仓库)
各类仓库的镜像发布、拉取流程类似,以ECR为例说明:
本地机器或CI/CD系统先向ECR完成身份验证,确保Docker可安全访问私有仓库;为本地构建的镜像添加全限定名称,包含AWS账号仓库地址、仓库名称及镜像版本,明确镜像在ECR中的存储位置;随后将镜像上传至ECR私有仓库,实现镜像的集中存储、版本管理及授权访问。
生产服务器通过身份验证从ECR拉取镜像并运行,确保部署流程高效安全——无需在生产服务器构建镜像(速度慢且需代码访问权限),实现“一次构建、多处部署”。
多数CI/CD系统(如GitHub Actions)可与容器仓库集成,例如通过工作流自动构建镜像、推至ECR,再由Kubernetes集群自动拉取部署。
总结
以上10个概念构成了Docker的核心基础,典型工作流如下:
编写Dockerfile定义应用构建规则,基于Dockerfile构建镜像;
基于镜像运行容器;
使用卷实现数据持久化;
通过环境变量和密钥管理配置与敏感数据;
编写docker-compose.yml管理多服务应用,利用容器网络实现服务互联;
将镜像推至仓库,在任意环境拉取并运行。
入门建议:从容器化简单Python脚本开始,通过requirements.txt管理依赖,再用Docker Compose引入数据库服务,逐步叠加知识点。掌握这些基础后,Docker并不复杂——它只是一款实现应用一致打包、隔离运行的工具。
祝你探索愉快!
推荐学习书籍 《CDA一级教材》适合CDA一级考生备考,也适合业务及数据分析岗位的从业者提升自我。完整电子版已上线CDA网校,累计已有10万+在读~ !



雷达卡





京公网安备 11010802022788号







