云原生--核心组件-容器篇-2-认识下Docker(三大核心之镜像,容器,仓库)

1、Docker基本概念

(1)、定义

Docker是一种开源的应用容器引擎,是基于操作系统级虚拟化技术。允许开发者将应用程序及其依赖项打包到一个可移植的容器中,然后发布到任何支持Docker的环境中运行。Docker容器是轻量级、独立且可执行的软件包,包含了运行所需的一切:代码、运行时、系统工具、系统库和设置。

(2)、核心目标

解决开发、测试、生产环境不一致的问题,实现"一次构建,随处运行"(Build Once, Run Anywhere)。

(3)、主要功能

  • 环境一致性:确保应用在不同环境中(开发、测试、生产)的行为一致。
  • 资源隔离:通过容器隔离不同应用,避免依赖冲突。
  • 快速部署:容器启动时间短(秒级),资源占用低。

(4)、主要特点

  1. 标准化:通过使用统一的标准来打包应用,确保应用可以在任何地方以相同的方式运行。
  2. 轻量化:由于容器共享宿主机的操作系统内核,相比虚拟机更加轻量,启动速度更快,资源消耗更少。
  3. 隔离性:每个容器都是相互隔离的,拥有自己的文件系统、网络接口等,提供了一定程度的安全性和稳定性。
  4. 版本控制:类似Git的工作流,可以对容器镜像进行版本控制,方便追踪变化、回滚到旧版本等。

2、Docker核心组件

(1)、镜像(Image)

  • 定义:只读的模板,包含运行应用程序所需的代码、依赖、库、配置文件等所有内容。例如,一个 Python Web 应用的镜像会包含 Python 解释器、应用代码以及所需的 Python 库。
  • 作用:用于创建容器。
  • 获取方式:
    • 从Docker Hub(公共仓库)或私有仓库拉取现成镜像(如docker pull ubuntu)。
    • 通过Dockerfile自定义构建镜像:
      示例 Dockerfile:
java 复制代码
FROM python:3.9-slim
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

解释:

构建镜像的文本文件,包含一系列指令(如 FROM, RUN, COPY)。自动化镜像构建过程,确保可重复性和一致性。

(2)、容器(Container)

  • 定义:镜像的运行实例,是动态的、可写入的沙箱环境。容器是一个独立的、隔离的环境,运行着应用程序。容器之间相互隔离,每个容器都有自己的文件系统、进程空间等。可以通过启动、停止、删除容器来管理应用程序的运行状态。对同一个应用的镜像,可以创建多个容器来运行多个实例,每个容器都是独立互相隔离运行的实例。。
  • 特性:
    • 轻量级:共享宿主机内核,仅隔离用户空间。
    • 独立性:容器间资源隔离(CPU、内存、文件系统等)。
    • 短暂性:容器停止后可删除,但数据可能丢失(需持久化存储)。
  • 操作命令:
    • 运行容器:docker run -it ubuntu bash
    • 查看容器:docker ps
    • 停止容器:docker stop <容器ID>

(3)、仓库(Repository)

  • 定义:存储和分发镜像的仓库,分为公共(如 Docker Hub)和私有(如企业内部仓库)。
    类似于代码仓库,它允许用户上传和下载镜像。公共仓库包含了大量的官方和社区提供的镜像,用户可以直接使用;同时,也可以搭建私有仓库来存储企业内部的镜像。
  • 常用操作:
    • 拉取镜像:docker pull <仓库地址>/<镜像名>:标签
    • 推送镜像:docker push <仓库地址>/<镜像名>:标签

3、Docker工作原理

(1)、组成原理

Docker是基于客户端/服务器(C/S)架构,主要组件包括Docker客户端(Docker Client)、Docker守护进程(Docker Daemon)和Docker注册表(Docker Registry)。

  • Docker客户端:是用户与Docker进行交互的接口,用户通过命令行工具(如docker run、docker build等)向Docker守护进程发送请求。
  • Docker守护进程:在后台运行,负责处理客户端的请求,如创建、运行、停止容器,构建和管理镜像等。它与底层的操作系统进行交互,利用Linux的内核特性(如命名空间和控制组)来实现容器的隔离和资源管理。
  • Docker注册表:用于存储和管理Docker镜像。当用户需要下载或上传镜像时,Docker客户端会与注册表进行通信。

(2)、虚拟化技术

  • 与虚拟机的区别:
  • 关键技术:
    • 命名空间(Namespaces):实现进程、网络、文件系统等隔离(如UTS, PID, NET)。
    • 控制组(cgroups):限制和监控容器资源(CPU、内存、磁盘等)。

(3)、容器存储

  • 数据持久化方案:
    • 卷(Volume):独立于容器的持久化存储,由Docker管理(如docker volume create myvol)。
    • 绑定挂载(Bind Mount):将宿主机目录挂载到容器内(如 -v /host/path:/container/path)。
    • 容器层(Writable Layer):容器启动时添加的可写层,容器删除后数据丢失。

4、工作流程

  • 编写 Dockerfile:定义如何构建镜像的文本文件,包括基础镜像、安装的软件包、复制的文件等内容。
  • 构建镜像:通过docker build命令根据Dockerfile构建镜像。
  • 运行容器:使用docker run启动容器,指定所需的参数如端口映射、卷挂载等。
  • 管理容器:通过一系列命令如docker ps, docker stop, docker rm等来查看、停止或删除容器。

5、Docker安装与基础使用

(1)、安装步骤(以Ubuntu为例)

bash示例:

java 复制代码
# 更新包列表
sudo apt-get update

# 安装 Docker Engine
sudo apt-get install -y docker.io

# 启动 Docker 服务
sudo systemctl start docker

# 设置开机自启
sudo systemctl enable docker

# 验证安装(输出版本信息)
docker --version

(2)、常用命令示例

bash示例:

java 复制代码
# 拉取镜像:
docker pull nginx:latest

# 查看本地镜像列表
docker images
  
# 运行容器:
docker run -d -p 80:80 --name my-nginx nginx:latest   # 映射宿主机80端口到容器80端口
  
# 查看运行中的容器:
docker ps
  
# 停止容器:
docker stop my-nginx

# 构建一个自定义镜像 (假设当前目录下有一个Dockerfile)
docker build -t myapp:1.0 .

# 推送镜像到 Docker Hub
docker push myapp:1.0

6、Docker的优势与适用场景

(1)、优势

  1. 轻量高效:

    • 资源占用低,启动快,适合大规模部署。与传统的虚拟机相比,Docker容器共享宿主机的内核,不需要额外的操作系统开销,因此启动速度快、占用资源少,能够在相同的硬件资源上运行更多的应用实例。
  2. 环境一致性:

    • 通过将应用及其依赖打包成镜像,Docker确保了应用在不同环境(开发、测试、生产)中的一致性,避免了"在我的机器上能运行,在你的机器上不行"的问题。
  3. 快速交付:

    • 通过镜像快速部署应用,缩短开发到生产的时间。
  4. 微服务支持:

    • 每个服务独立打包为容器,每个容器都是独立的运行环境,相互之间不会产生干扰,提高了应用的安全性和稳定性。便于解耦和扩展。
  5. 生态丰富:

    • Docker Compose(多容器编排)、Docker Swarm(集群管理)、Docker Hub(镜像仓库)等工具完善。

(2)、适用场景

  1. 开发测试:开发人员可以使用Docker快速搭建一致的开发环境,避免因环境差异导致的问题。不同的项目可以使用不同的Docker容器,互不影响。

  2. 持续集成/持续交付(CI/CD):Docker可以将应用打包成镜像,通过镜像自动化部署。方便在不同的阶段进行部署和测试。例如,每次代码提交后,自动构建Docker镜像并进行测试,然后部署到生产环境。

  3. 微服务架构:Docker容器非常适合微服务架构,每个微服务可以打包成独立的容器,实现独立开发、部署和扩展。通过容器编排工具(如Kubernetes),可以方便地管理大量的微服务容器。

  4. 多环境一致性:确保应用在开发、测试和生产环境的一致性,减少"这段代码在我的机器上能跑"的问题。

  5. 云原生应用:与Kubernetes结合,实现容器编排和弹性伸缩。云原生应用强调容器化、微服务和自动化,Docker作为容器化技术的代表,是云原生应用开发的基础工具。

  6. 数据科学:隔离复杂依赖(如Python 环境、深度学习框架)。

7、Docker生态工具

(1)、Docker Compose

  • 作用:定义和运行多容器应用,通过docker-compose.yml文件管理。
    yaml示例:
java 复制代码
  version: '3'
  services:
    web:
      image: nginx:latest
      ports:
        - "80:80"
    db:
      image: mysql:5.7
      environment:
        MYSQL_ROOT_PASSWORD: example

bash示例:

java 复制代码
docker-compose up     # 启动所有服务
docker-compose down    # 停止并删除服务

(2)、Docker Hub

  • 功能:
    • 存储和共享镜像(如官方镜像、社区镜像)。
    • 自动构建镜像(与GitHub/GitLab集成)。
      bash示例:
java 复制代码
  docker login   # 登录 Docker Hub
  docker push jeffmaury/myapp:1.0   # 推送镜像到仓库

(3)、Docker Swarm

  • 作用:轻量级容器集群管理工具,实现多节点容器编排。
  • 对比Kubernetes:
    • Swarm:简单易用,适合中小规模集群。
    • Kubernetes:功能更强大,适合复杂场景。

8、Docker的局限性

(1)、不支持32位系统:仅支持64位Linux/Windows/macOS。

(2)、存储问题:

  • 容器默认数据不持久化,需依赖卷或绑定挂载。
  • 跨主机数据共享需额外工具(如分布式存储)。
    (3)、安全性:
  • 容器共享宿主机内核,存在潜在安全风险(需严格权限控制)。
    (4)、复杂应用管理:
  • 大规模集群需结合 Kubernetes 等工具。

9、使用示例

(1)、检查Docker环境

bash示例:

java 复制代码
systemctl status docker   # 检查服务状态
docker --version        # 查看版本
docker compose version    # 确保Compose版本 ≥ 2.0

(2)、拉取镜像

bash示例:

java 复制代码
docker pull registry.cn-hangzhou.aliyuncs.com/jeson/homebox:latest

(3)、创建并运行容器

bash示例:

java 复制代码
docker run -d -p 8080:80 --name homebox registry.cn-hangzhou.aliyuncs.com/jeson/homebox:latest

(4)、访问应用

访问 http://<宿主机IP>:8080,正常访问系统。

10、总结

  • Docker是容器化技术的基石,通过轻量级虚拟化实现应用的快速部署、隔离和扩展。
  • 核心价值:标准化开发环境、提升资源利用率、简化运维流程。
  • 未来趋势:与云原生技术(如Kubernetes)深度整合,推动边缘计算、Serverless等场景发展。

Docker不仅改变了应用的打包和部署方式,也促进了DevOps文化的发展,使得开发者和运维人员之间的协作更加紧密。随着云原生技术的发展,Docker与其他技术如Kubernetes的结合使用,已经成为现代应用开发不可或缺的一部分。

逆风前行,Dare To Be!!!

相关推荐
竹木一54027 分钟前
Docker拉取镜像代理配置实践与经验分享
经验分享·docker·容器
小余吃大鱼27 分钟前
CentOS中在线安装Docker(超详细)
linux·docker·centos
破 风2 小时前
Docker启动mysql容器时找不到 mysqlx.sock 和 mysqld.sock
mysql·docker·容器
阿里云云原生2 小时前
SAE 实现应用发布全过程可观测
云原生
zeron12 小时前
DolPhinScheduler在docker swarm环境下的启动:网卡问题
docker
鱼饼6号3 小时前
Jenkins Pipeline 构建 CI/CD 流程
linux·运维·服务器·ci/cd·容器·jenkins
Ares-Wang4 小时前
kubernetes》》k8s》》Heml
云原生·容器·kubernetes
阿里云大数据AI技术4 小时前
千万级数据秒级响应!碧桂园基于 EMR Serverless StarRocks 升级存算分离架构实践
大数据·云原生·serverless
容器魔方5 小时前
Bilibili、中电信人工智能科技、商汤科技、联通云等正式加入Volcano社区用户组
云原生·容器·云计算
努力的IT小胖子5 小时前
Docker 镜像下载太慢?手把手教你修改镜像源,速度起飞!
后端·docker·容器