楼主: CDA网校
58 0

[每天一个数据分析师] 10分钟掌握10个Docker核心概念 [推广有奖]

管理员

已卖:189份资源

泰斗

4%

还不是VIP/贵宾

-

威望
3
论坛币
122792 个
通用积分
11377.9151
学术水平
278 点
热心指数
286 点
信用等级
253 点
经验
229942 点
帖子
7021
精华
19
在线时间
4395 小时
注册时间
2019-9-13
最后登录
2026-1-30

初级热心勋章

楼主
CDA网校 学生认证  发表于 2026-1-29 11:50:56 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

引言

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对应的镜像层结构如下:

  1. 基础Python镜像(FROM指令)

  2. 设置工作目录(WORKDIR指令)

  3. 复制requirements.txt(COPY指令)

  4. 安装依赖(RUN指令)

  5. 复制应用代码(COPY指令)

  6. 端口元数据(EXPOSE指令)

  7. 默认启动命令(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的核心基础,典型工作流如下:

  1. 编写Dockerfile定义应用构建规则,基于Dockerfile构建镜像;

  2. 基于镜像运行容器;

  3. 使用卷实现数据持久化;

  4. 通过环境变量和密钥管理配置与敏感数据;

  5. 编写docker-compose.yml管理多服务应用,利用容器网络实现服务互联;

  6. 将镜像推至仓库,在任意环境拉取并运行。

入门建议:从容器化简单Python脚本开始,通过requirements.txt管理依赖,再用Docker Compose引入数据库服务,逐步叠加知识点。掌握这些基础后,Docker并不复杂——它只是一款实现应用一致打包、隔离运行的工具。

祝你探索愉快!

推荐学习书籍 《CDA一级教材》适合CDA一级考生备考,也适合业务及数据分析岗位的从业者提升自我。完整电子版已上线CDA网校,累计已有10万+在读~ !

免费加入阅读:https://edu.cda.cn/goods/show/3151?targetId=5147&preview=0

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:doc 心概念 Requirements Requirement environment

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-31 00:01