Docker基本使用

Docker 知识梳理

一、产生背景

随着云计算技术的发展,传统的应用部署方式面临诸多挑战,如环境配置复杂、依赖冲突、资源利用率低等问题。在多项目、多应用共存的场景下,为每个应用单独配置服务器和运行环境,不仅耗时费力,还造成资源浪费。Docker 应运而生,旨在解决这些问题,实现应用的快速部署、高效管理和资源的合理利用,为开发者和运维人员提供了更便捷的容器化解决方案。

二、容器化技术

容器共享主机内核,轻量、隔离且高效,不像虚拟机需要完整的操作系统。

1、传统应用部署的痛点

在传统的应用部署中,我们经常遇到以下问题:

  • 环境不一致:应用在开发环境运行正常,但在测试或生产环境出现问题
  • 依赖管理复杂:不同应用需要不同版本的运行时、库文件等
  • 资源利用率低:传统虚拟机需要完整的操作系统,占用大量资源
  • 部署复杂:需要手动配置环境、安装依赖,容易出错

2、容器化技术的解决方案

容器化技术通过以下方式解决了这些问题:

  • 环境标准化:将应用及其依赖打包在一起,确保在任何环境中都能一致运行
  • 轻量级:容器共享宿主机的操作系统内核,比虚拟机更轻量
  • 快速部署:容器可以在几秒内启动,大大提高了部署效率
  • 可移植性:一次构建,到处运行

3、容器化的核心理念

容器化遵循"不可变基础设施"的理念:

  • 应用和环境被打包成不可变的镜像
  • 每次部署都使用相同的镜像
  • 配置通过环境变量或配置文件注入
  • 问题修复通过重新构建镜像而非修改运行中的容器

三、基本概念

  1. 镜像(Image):Docker 镜像是一个只读的模板,包含了运行一个容器所需的所有文件系统和配置信息,如操作系统、应用程序及其依赖项等。它类似于虚拟机的镜像,但更轻量级,多个容器可以共享同一个镜像。
  2. 容器(Container):容器是基于镜像创建的运行实例,是镜像的运行时实体。容器之间相互隔离,每个容器都有自己独立的文件系统、进程空间等。容器可以被启动、停止、删除,是 Docker 实现应用部署和运行的基本单位。
  3. Dockerfile:文本文件,描述如何自动构建镜像(例如指定基础镜像、安装软件、复制文件等)。
  4. 仓库(Repository):仓库是用来存储镜像的地方,可以类比为代码的版本控制系统。Docker Hub 是 Docker 官方提供的公共仓库,用户可以在其中查找和下载各种公开的镜像,同时也可以将自己创建的镜像上传到 Docker Hub 或私有仓库中。私有仓库:企业内部搭建,用于存储私有镜像;官方仓库:由软件官方维护的镜像仓库,如 nginx、mysql。

四、应用场景与核心优势

  • 应用场景

    • 微服务架构:每个服务独立容器化,便于管理和扩展。

    • CI/CD流水线:与 Jenkins/GitLab CI 集成,实现自动化构建和测试。

    • 开发环境标准化:新成员一键启动全套依赖服务(如数据库、消息队列)。

    • 云原生基础:Kubernetes 等编排工具基于 Docker 管理容器集群。

  • 核心优势

    • 跨平台一致性:解决"在我机器上能跑"的问题,确保开发、测试、生产环境一致。

    • 资源高效:容器直接共享主机内核,无需虚拟化整个操作系统,节省内存和 CPU。

    • 快速部署:秒级启动容器,支持自动化扩缩容。

    • 隔离性:每个容器拥有独立的文件系统、网络和进程空间。

五、Docker 与 VM(虚拟机)的差别

  1. 资源占用
    • VM:虚拟机需要为每个实例分配独立的操作系统、硬件资源(如 CPU、内存、磁盘等),资源占用较大。
    • Docker:容器共享宿主机的操作系统内核,只需要包含应用及其依赖项,资源占用小,能够在相同硬件条件下运行更多的实例。
  2. 启动速度
    • VM:启动一个虚拟机通常需要几十秒到几分钟不等,因为需要加载完整的操作系统。
    • Docker:容器启动速度非常快,通常在秒级,因为不需要启动完整的操作系统,只需启动应用进程。
  3. 隔离性
    • VM:虚拟机通过硬件虚拟化实现隔离,每个虚拟机拥有独立的操作系统和硬件资源,隔离性强,但性能开销也较大。
    • Docker:容器基于操作系统内核的 Namespace 和 Cgroups 技术实现隔离,在同一宿主机上的容器共享内核,隔离性相对较弱,但能满足大多数应用场景,且性能更好。

六、docker 架构

Docker 架构是基于客户端-服务器模式的,其中包括多个关键组件,确保容器化应用的高效构建、管理和运行。

Docker 的架构设计使得开发者能够轻松地将应用程序与其所有依赖封装在一个可移植的容器中,并在不同的环境中一致地运行。

  • Docker 客户端是用户与 Docker 守护进程交互的命令行界面(CLI)。它是用户与 Docker 系统的主要交互方式,用户通过 Docker CLI 发出命令,这些命令被发送到 Docker 守护进程,由守护进程执行相应的操作。
  • Docker 守护进程(通常是 dockerd)是 Docker 架构的核心,负责管理容器生命周期、构建镜像、分发镜像等任务。守护进程监听来自 Docker 客户端的请求,并且通过 Docker API 执行这些请求。守护进程将负责容器、镜像等 Docker 对象的管理,并根据请求的参数启动容器、删除容器、修改容器配置等。
  • Docker 引擎 API 是 Docker 提供的 RESTful 接口,允许外部客户端与 Docker 守护进程进行通信。通过这个 API,用户可以执行各种操作,如启动容器、构建镜像、查看容器状态等。API 提供了 HTTP 请求的接口,支持跨平台调用。
  • Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。通过 Compose,用户可以使用一个 docker-compose.yml 配置文件定义多个容器(服务),并可以通过一个命令启动这些容器。Docker Compose 主要用于开发、测试和部署多容器的应用。
  • Docker Swarm 是 Docker 提供的集群管理和调度工具。它允许将多个 Docker 主机(节点)组织成一个集群,并通过 Swarm 集群管理工具来调度和管理容器。Swarm 可以实现容器的负载均衡、高可用性和自动扩展等功能。
  • Docker 网络允许容器之间相互通信,并与外部世界进行连接。Docker 提供了多种网络模式来满足不同的需求,如 bridge 网络(默认)、host 网络和 overlay 网络等。
  • Docker 卷是一种数据持久化机制,允许数据在容器之间共享,并且独立于容器的生命周期。与容器文件系统不同,卷的内容不会随着容器的销毁而丢失,适用于数据库等需要持久存储的应用。

七、Docker Desktop

Docker 并非是一个通用的容器工具,它依赖于已存在并运行的 Linux 内核环境。

因此,Docker 必须部署在 Linux 内核的系统上。如果其他系统想部署 Docker 就必须安装一个虚拟 Linux 环境。

Docker 实质上是在已经运行的 Linux 下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的 Linux 主机。

Docker Desktop 是 Docker 官方推出的 本地容器化开发环境,用于在 macOS / Windows(以及部分 Linux) 上。

xml 复制代码
宿主系统(macOS / Windows)
 └── Docker Desktop
      └── Linux 虚拟机
           └── Docker Engine
                ├── Images
                ├── Containers
                └── Volumes

安装好后要配置镜像源,否则 docker pull 拉取会失败。

八、如何使用 Docker

  1. 安装 Docker:根据不同的操作系统(如 Linux、Windows、MacOS),从 Docker 官方网站下载对应的安装包进行安装。以 Ubuntu 为例,安装命令如下:
bash 复制代码
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
  1. 获取镜像 :使用 docker pull 命令从仓库中拉取镜像,例如拉取官方的 Ubuntu 镜像:
bash 复制代码
docker pull ubuntu
  1. 创建并运行容器 :使用 docker run 命令可以基于镜像创建并启动容器。例如,创建一个交互式的 Ubuntu 容器:
bash 复制代码
docker run -it ubuntu /bin/bash

其中,-i 表示以交互模式运行容器,-t 表示为容器分配一个伪终端,ubuntu 是镜像名称,/bin/bash 是在容器中要执行的命令。

  1. 停止和启动容器 :停止容器使用 docker stop 命令,例如:
bash 复制代码
docker stop <容器 ID 或名称>

启动已停止的容器使用 docker start 命令:

bash 复制代码
docker start <容器 ID 或名称>
  1. 删除容器 :使用 docker rm 命令删除容器,例如:
bash 复制代码
docker rm <容器 ID 或名称>

注意:删除容器前需要先停止容器。

  1. 构建自定义镜像 :在项目目录下创建一个 Dockerfile,定义镜像的基础环境、安装应用及其依赖等操作。例如,一个简单的 Dockerfile 用于构建一个基于 Python 的 Web 应用镜像:
Dockerfile 复制代码
# 使用官方 Python 镜像作为基础镜像
FROM python:3.8

# 设置工作目录
WORKDIR /app

# 将当前目录下的所有文件复制到容器的 /app 目录
COPY. /app

# 安装项目依赖
RUN pip install -r requirements.txt

# 暴露应用运行的端口
EXPOSE 5000

# 定义容器启动时要执行的命令
CMD ["python", "app.py"]

然后在 Dockerfile 所在目录执行 docker build 命令构建镜像:

bash 复制代码
docker build -t my-python-app.

其中,-t 用于指定镜像的标签(名称和版本),最后的 . 表示当前目录。

九、常用命令

  1. 镜像相关命令
    • 拉取镜像docker pull <镜像名称[:标签]>,例如 docker pull ubuntu:latest,如果不指定标签,默认拉取 latest 标签的镜像。
    • 查看本地镜像docker images
    • 删除镜像docker rmi <镜像 ID 或名称[:标签]>,例如 docker rmi ubuntu:latest
    • 构建镜像docker build -t <镜像名称[:标签]> <上下文路径>,例如 docker build -t my - app.,上下文路径为 . 表示当前目录。
  2. 容器相关命令
    • 运行容器docker run [选项] <镜像名称[:标签]> [命令],常用选项有 -d(后台运行)、-p(端口映射)、-v(卷挂载)等。例如 docker run -d -p 8080:80 nginx,将容器的 80 端口映射到宿主机的 8080 端口并在后台运行 Nginx 容器。
    • 查看运行中的容器docker ps
    • 查看所有容器(包括已停止的)docker ps -a
    • 进入正在运行的容器docker exec -it <容器 ID 或名称> <要执行的命令>,例如 docker exec -it my - ubuntu - container /bin/bash,进入名为 my - ubuntu - container 的容器并启动一个交互式的 bash 会话。
    • 停止容器docker stop <容器 ID 或名称>
    • 启动容器docker start <容器 ID 或名称>
    • 删除容器docker rm <容器 ID 或名称>
  3. 仓库相关命令
    • 登录到 Docker Hubdocker login,输入用户名和密码进行登录。
    • 推送镜像到仓库docker push <镜像名称[:标签]>,例如 docker push my - username/my - app:latest,将镜像推送到 Docker Hub 上指定用户名下的仓库。

通过以上对 Docker 相关知识的梳理,希望能帮助你全面了解和使用 Docker 进行应用的容器化部署与管理。

相关推荐
I_Jln.2 小时前
Docker:快速构建、运行、管理应用的工具
运维·docker·容器
式5163 小时前
RAG检索增强生成基础(二)RAG项目实战之Milvus Docker环境配置
运维·docker·容器
Yeats_Liao3 小时前
容器化部署:基于Docker的推理环境隔离与迁移
运维·docker·容器
阿里巴巴P8资深技术专家3 小时前
Docker一站式部署:RustFS、GoFastDFS、Gitea与PostgreSQL实战指南
docker·postgresql·gitea
用什么都重名3 小时前
【Dify 实战踩坑】工作流可运行但 MCP 服务部署失败(503)的问题定位与彻底解决
人工智能·docker·dify·mcp服务
可爱又迷人的反派角色“yang”3 小时前
K8s(六)
linux·运维·云原生·容器·kubernetes
好学且牛逼的马12 小时前
【工具配置|docker】
运维·docker·容器
运维小贺13 小时前
Kubernetes之Deployment无状态控制器
云原生·容器·kubernetes
yeflx15 小时前
解决Ubuntu22.04宿主机docker容器中nvidia-smi偶发失效问题
运维·docker·容器