找回密码
 立即注册
首页 业界区 业界 Docker 基础入门:核心概念与架构原理

Docker 基础入门:核心概念与架构原理

褥师此 昨天 17:50
在云计算与容器化技术飞速发展的今天,Docker 已经成为开发者必备的工具之一。无论是本地开发环境的一致性保障、持续集成/持续部署(CI/CD)的自动化落地,还是服务器资源的高效利用,Docker 都发挥着不可替代的作用。对于刚接触容器技术的新手而言,想要快速上手 Docker,首先需要理清其核心概念与底层架构,这也是后续深入学习 Docker 进阶用法、解决实际问题的基础。本文将从 Docker 的起源与价值出发,详细拆解核心概念,剖析底层架构,并搭配实用代码示例,帮助大家从零入门 Docker,真正理解其工作原理与使用逻辑。

一、Docker 简介:什么是 Docker,为什么要用它?

1.1 Docker 的定义

Docker 是一个开源的应用容器引擎,基于 Go 语言开发,遵循 Apache 2.0 开源协议。它能够将应用程序及其依赖项打包到一个可移植的容器中,然后发布到任何支持 Docker 的操作系统上,实现“一次打包,到处运行”的效果。与传统的虚拟机技术不同,Docker 容器不依赖于底层操作系统的虚拟化,而是共享宿主机的内核,因此具有启动速度快、资源占用少、可移植性强等优势。1.2 Docker 的核心价值

在 Docker 出现之前,开发者常常面临“开发环境能跑,生产环境跑不起来”的困境,核心原因在于开发环境、测试环境、生产环境的配置不一致,以及依赖项版本冲突等问题。Docker 的出现,正是为了解决这些痛点,其核心价值主要体现在以下几个方面:

  • 环境一致性:将应用及其依赖(如编程语言、库、配置文件等)打包成容器,容器在任何支持 Docker 的环境中运行时,都能保持一致的运行效果,彻底解决“环境不一致”问题。
  • 资源高效利用:Docker 容器共享宿主机内核,不需要像虚拟机那样占用独立的内存、CPU 和操作系统资源,启动时间通常在秒级,资源利用率远高于虚拟机。
  • 可移植性强:容器可以在本地、服务器、云平台之间自由迁移,只要目标环境支持 Docker,就能直接运行,无需修改任何配置。
  • 简化部署与运维:通过 Docker 可以快速部署应用,实现自动化运维,减少人工操作,降低部署失误的概率,同时便于应用的扩容与缩容。
  • 隔离性良好:每个容器都是独立的运行环境,容器之间相互隔离,不会相互影响,避免了应用之间的冲突,提高了系统的稳定性和安全性。
1.3 Docker 与虚拟机的区别

很多新手会将 Docker 与虚拟机混淆,但两者在底层实现、资源占用、启动速度等方面有本质区别,具体对比如下表所示:对比维度Docker 容器虚拟机(VM)底层实现共享宿主机内核,基于容器化技术虚拟化底层硬件,运行独立操作系统资源占用占用资源少,轻量级占用资源多,重量级启动速度秒级启动分钟级启动隔离性进程级隔离,隔离性较弱系统级隔离,隔离性强可移植性强,可跨平台迁移弱,依赖虚拟化软件和底层系统简单来说,虚拟机是“模拟一个完整的操作系统”,而 Docker 容器是“模拟一个应用的运行环境”,两者的定位不同,适用场景也不同。在实际开发中,通常会结合两者的优势,比如用虚拟机提供底层环境,用 Docker 容器部署应用。二、Docker 核心概念:吃透这5个概念,入门就成功了一半

Docker 有5个核心概念,分别是:镜像(Image)、容器(Container)、仓库(Repository)、Dockerfile、Docker Compose。这5个概念是理解 Docker 工作流程的关键,下面逐一详细讲解,并搭配代码示例,帮助大家快速掌握。2.1 镜像(Image):容器的“模板”

2.1.1 镜像的定义

镜像(Image)是 Docker 中最基础的概念,它是一个只读的模板,包含了运行应用程序所需的所有文件、依赖项、配置信息和操作系统内核。可以把镜像理解为“容器的模板”,一个镜像可以创建多个容器,就像一个类可以实例化多个对象一样。例如,一个 Nginx 镜像,就包含了 Nginx 服务器的安装文件、配置文件、依赖的库文件等,通过这个镜像,我们可以快速创建多个 Nginx 容器,每个容器都是独立运行的 Nginx 服务。2.1.2 镜像的核心特性


  • 只读性:镜像一旦创建,就无法修改,只能通过创建新的镜像来实现更新。
  • 分层存储:Docker 镜像采用分层存储技术,每一层都是一个独立的文件系统,层与层之间相互依赖。这种分层结构可以实现镜像的复用,减少存储空间的占用。例如,多个镜像可能共享同一个基础层(如 Ubuntu 系统层),只需要存储一次基础层,就能被多个镜像复用。
  • 可继承性:可以基于一个已有的镜像,通过添加新的层,创建一个新的镜像。例如,基于 Ubuntu 镜像,安装 Python 环境,就能创建一个 Python 镜像。
2.1.3 镜像相关常用命令(代码示例)

下面是镜像操作的常用命令,所有命令均在 Linux 终端(或 Windows Docker Desktop 终端)中执行,大家可以直接复制执行,感受镜像的操作流程。
  1. # 1. 拉取镜像(从 Docker Hub 拉取官方镜像)
  2. # 拉取最新版 Nginx 镜像
  3. docker pull nginx:latest
  4. # 拉取指定版本的 Nginx 镜像(如 1.24.0)
  5. docker pull nginx:1.24.0
  6. # 2. 查看本地所有镜像
  7. docker images
  8. # 输出示例:
  9. # REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
  10. # nginx        latest    605c77e624dd   2 weeks ago    142MB
  11. # nginx        1.24.0    08393e824c32   2 months ago   141MB
  12. # 3. 查看镜像详细信息
  13. docker inspect nginx:latest
  14. # 4. 给镜像打标签(便于区分镜像版本)
  15. docker tag nginx:latest my-nginx:v1.0
  16. # 5. 删除本地镜像
  17. # 删除指定标签的镜像
  18. docker rmi nginx:1.24.0
  19. # 强制删除镜像(如果镜像已被容器使用)
  20. docker rmi -f nginx:latest
  21. # 6. 保存镜像为本地文件(便于迁移)
  22. docker save -o nginx.tar nginx:latest
  23. # 7. 加载本地镜像文件
  24. docker load -i nginx.tar
复制代码
 
说明:Docker Hub 是 Docker 官方的镜像仓库,包含了大量官方和第三方的镜像,我们可以通过 docker pull 命令直接拉取镜像,无需自己手动构建。2.2 容器(Container):镜像的“实例”

2.2.1 容器的定义

容器(Container)是基于镜像创建的可运行实例,是 Docker 中用于运行应用程序的载体。如果说镜像是“模板”,那么容器就是“模板实例化后的对象”,它可以被启动、停止、重启、删除,并且容器之间相互隔离,拥有独立的运行环境。容器与镜像的关系,就像进程与程序的关系:程序是静态的代码和资源,进程是程序的运行实例;镜像也是静态的模板,容器是镜像的运行实例。2.2.2 容器的核心特性


  • 可运行性:容器是基于镜像创建的,包含了应用程序的运行环境,能够直接启动并运行应用。
  • 可写性:容器在运行过程中,会在镜像的只读层之上添加一个可写层,所有对容器的修改(如创建文件、修改配置)都会保存在这个可写层中,不会影响原始镜像。
  • 隔离性:每个容器都有自己独立的网络、进程、文件系统,与其他容器和宿主机隔离,避免相互干扰。
  • 轻量级:容器共享宿主机内核,不需要占用独立的操作系统资源,启动速度快,资源占用少。
2.2.3 容器相关常用命令(代码示例)

容器的操作是 Docker 日常使用中最频繁的,下面的命令涵盖了容器的创建、启动、停止、删除、进入等常用操作,建议大家实际操作一遍,加深理解。
  1. # 1. 基于镜像创建并启动容器
  2. # 格式:docker run [选项] 镜像名:标签 [容器内执行的命令]
  3. # 示例1:启动 Nginx 容器,后台运行,映射宿主机80端口到容器80端口
  4. docker run -d -p 80:80 --name my-nginx nginx:latest
  5. # 选项说明:
  6. # -d:后台运行容器(守护进程模式)
  7. # -p 80:80:将宿主机的80端口映射到容器的80端口(宿主机端口:容器端口)
  8. # --name my-nginx:给容器命名为 my-nginx,便于后续操作
  9. # 示例2:启动 Ubuntu 容器,进入交互模式(可以在容器内执行命令)
  10. docker run -it --name my-ubuntu ubuntu:latest /bin/bash
  11. # 选项说明:
  12. # -it:交互模式(-i 保持标准输入打开,-t 分配伪终端)
  13. # /bin/bash:容器启动后执行的命令,进入 bash 终端
  14. # 2. 查看正在运行的容器
  15. docker ps
  16. # 查看所有容器(包括已停止的)
  17. docker ps -a
  18. # 3. 启动、停止、重启容器
  19. # 启动已停止的容器
  20. docker start my-nginx
  21. # 停止正在运行的容器
  22. docker stop my-nginx
  23. # 重启容器
  24. docker restart my-nginx
  25. # 4. 进入正在运行的容器(交互模式)
  26. # 方法1:exec 命令(推荐,不会影响容器的运行状态)
  27. docker exec -it my-nginx /bin/bash
  28. # 方法2:attach 命令(进入容器后,退出会导致容器停止)
  29. docker attach my-nginx
  30. # 5. 查看容器日志(用于排查问题)
  31. docker logs my-nginx
  32. # 实时查看日志(类似 tail -f)
  33. docker logs -f my-nginx
  34. # 6. 查看容器详细信息
  35. docker inspect my-nginx
  36. # 7. 删除容器(需先停止容器,或强制删除)
  37. # 删除已停止的容器
  38. docker rm my-nginx
  39. # 强制删除正在运行的容器
  40. docker rm -f my-nginx
  41. # 8. 容器与宿主机之间复制文件
  42. # 宿主机文件复制到容器内:docker cp 宿主机路径 容器名:容器内路径
  43. docker cp /home/test.txt my-nginx:/usr/share/nginx/html
  44. # 容器内文件复制到宿主机:docker cp 容器名:容器内路径 宿主机路径
  45. docker cp my-nginx:/usr/share/nginx/html/index.html /home
  46. 实操验证:执行 docker run -d -p 80:80 --name my-nginx nginx:latest 命令后,打开浏览器,访问 http://localhost,如果能看到 Nginx 的默认欢迎页面,说明容器启动成功,端口映射生效。
复制代码
 
2.3 仓库(Repository):镜像的“仓库”

2.3.1 仓库的定义

仓库(Repository)是用于存储和管理 Docker 镜像的地方,类似于代码仓库(如 GitHub),我们可以将自己构建的镜像推送到仓库,也可以从仓库拉取别人上传的镜像。仓库分为公有仓库和私有仓库:

  • 公有仓库:对外开放,所有人都可以拉取镜像,最常用的是 Docker Hub(https://hub.docker.com/),包含了大量官方镜像和第三方镜像。
  • 私有仓库:仅对特定用户或团队开放,用于存储企业内部的镜像,避免敏感镜像泄露,常用的私有仓库有 Docker Registry、Harbor 等。
2.3.2 仓库相关常用命令(代码示例)
  1. # 1. 登录 Docker Hub(需先注册 Docker Hub 账号)
  2. docker login
  3. # 输入用户名和密码,登录成功后,即可推送镜像到 Docker Hub
  4. # 2. 推送镜像到 Docker Hub(需先给镜像打标签,标签格式:用户名/镜像名:标签)
  5. # 示例:给本地 Nginx 镜像打标签,推送至自己的 Docker Hub 仓库
  6. docker tag nginx:latest your-username/my-nginx:v1.0
  7. docker push your-username/my-nginx:v1.0
  8. # 3. 从 Docker Hub 拉取自己推送的镜像
  9. docker pull your-username/my-nginx:v1.0
  10. # 4. 退出 Docker Hub 登录
  11. docker logout
  12. # 5. 私有仓库相关操作(以 Docker Registry 为例)
  13. # 拉取私有仓库镜像(需先登录私有仓库)
  14. docker login private-registry-url:port
  15. docker pull private-registry-url:port/my-nginx:v1.0
  16. # 推送镜像到私有仓库
  17. docker tag nginx:latest private-registry-url:port/my-nginx:v1.0
  18. docker push private-registry-url:port/my-nginx:v1.0
复制代码
 
2.4 Dockerfile:构建镜像的“脚本”

2.4.1 Dockerfile 的定义

Dockerfile 是一个文本文件,包含了一系列的指令(Instruction),用于描述如何构建一个 Docker 镜像。通过 Dockerfile,我们可以自定义镜像的内容,比如安装特定的软件、配置环境变量、复制文件等,实现镜像的自动化构建。Dockerfile 的核心作用是“标准化镜像构建流程”,只要有 Dockerfile,任何人都可以按照相同的步骤构建出相同的镜像,避免了手动构建镜像的繁琐和误差。2.4.2 Dockerfile 常用指令

Dockerfile 中的指令有固定的格式,通常以大写字母开头,后面跟随具体的参数,常用指令如下:

  • FROM:指定基础镜像,是 Dockerfile 的第一个指令,用于指定构建镜像的基础模板。例如 FROM ubuntu:latest,表示基于最新版的 Ubuntu 镜像构建新镜像。
  • WORKDIR:指定容器运行时的工作目录,后续的指令(如 RUN、COPY)都会在这个目录下执行。例如 WORKDIR /app,表示工作目录为 /app。
  • COPY:将宿主机的文件或目录复制到镜像中。例如 COPY ./app.py /app,表示将宿主机当前目录下的 app.py 文件复制到镜像的 /app 目录下。
  • ADD:与 COPY 类似,也用于复制文件,但支持解压压缩文件和从 URL 下载文件。例如 ADD ./app.tar.gz /app,表示将宿主机的 app.tar.gz 压缩文件复制到镜像的 /app 目录,并自动解压。
  • RUN:在构建镜像时执行命令,用于安装软件、配置环境等。例如 RUN apt update && apt install -y python3,表示更新软件源并安装 Python3。
  • ENV:设置环境变量,在镜像构建和容器运行时都生效。例如 ENV PYTHONPATH=/app,表示设置 Python 的环境变量。
  • EXPOSE:声明容器运行时监听的端口,只是一个声明,不会自动映射端口,需要在 docker run 时使用 -p 选项进行端口映射。例如 EXPOSE 8080,表示容器监听 8080 端口。
  • CMD:指定容器启动时执行的命令,一个 Dockerfile 中只能有一个 CMD 指令,若有多个,只有最后一个生效。例如 CMD ["python3", "app.py"],表示容器启动时执行 python3 app.py 命令。
  • ENTRYPOINT:与 CMD 类似,也用于指定容器启动时执行的命令,但 ENTRYPOINT 的命令不会被 docker run 后面的命令覆盖,而 CMD 会被覆盖。例如 ENTRYPOINT ["python3"],如果执行docker run -it my-image app.py,则容器启动时执行 python3 app.py。
2.4.3 Dockerfile 构建镜像示例(代码示例)

下面我们通过一个实际案例,使用 Dockerfile 构建一个 Python 应用镜像,步骤如下:

  • 创建一个工作目录,新建 Dockerfile 文件和 Python 应用文件(app.py)。
  • 编写 Dockerfile 指令,定义镜像的构建流程。
  • 使用 docker build 命令构建镜像。
  • 基于构建好的镜像启动容器,验证应用是否能正常运行。
[code]# 1. 创建工作目录并进入mkdir python-app && cd python-app# 2. 新建 app.py 文件(简单的 Python Web 应用,使用 Flask 框架)cat > app.py  Dockerfile  docker-compose.yml

相关推荐

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