理解 Docker 镜像与容器之间的关系

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本教程全面介绍了 Docker 镜像与容器之间的关系。它涵盖了构建、存储和管理 Docker 镜像的关键概念,以及创建、运行和监控 Docker 容器的方法。你将学习如何利用网络、卷和 Docker Compose 来构建和部署多容器应用程序。通过本指南的学习,你将深入了解 Docker 镜像和容器如何协同工作,以简化应用程序的部署和管理流程。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker(("Docker")) -.-> docker/NetworkOperationsGroup(["Network Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ls("List Containers") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/start("Start Container") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ContainerOperationsGroup -.-> docker/create("Create Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/NetworkOperationsGroup -.-> docker/network("Manage Networks") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/run -.-> lab-393100{{"理解 Docker 镜像与容器之间的关系"}} docker/ls -.-> lab-393100{{"理解 Docker 镜像与容器之间的关系"}} docker/ps -.-> lab-393100{{"理解 Docker 镜像与容器之间的关系"}} docker/start -.-> lab-393100{{"理解 Docker 镜像与容器之间的关系"}} docker/stop -.-> lab-393100{{"理解 Docker 镜像与容器之间的关系"}} docker/create -.-> lab-393100{{"理解 Docker 镜像与容器之间的关系"}} docker/pull -.-> lab-393100{{"理解 Docker 镜像与容器之间的关系"}} docker/network -.-> lab-393100{{"理解 Docker 镜像与容器之间的关系"}} docker/build -.-> lab-393100{{"理解 Docker 镜像与容器之间的关系"}} end

Docker 简介:什么是 Docker 以及为何使用它?

Docker 是一个强大的开源平台,使开发者和 IT 专业人员能够以一致且高效的方式构建、部署和管理应用程序。它提供了一种标准化的软件打包和分发方式,让跨不同环境开发、测试和部署应用程序变得更加容易。

什么是 Docker?

Docker 是一个容器化平台,它允许你将应用程序及其依赖项打包成一个轻量级、可移植且自包含的单元,称为 Docker 容器。这些容器可以轻松地进行部署、扩展和管理,确保你的应用程序在从开发到生产的不同环境中都能一致地运行。

为何使用 Docker?

使用 Docker 有几个关键优势:

  1. 一致性和可重复性:Docker 确保你的应用程序及其依赖项以相同的方式进行打包和部署,无论底层基础设施如何。这有助于消除“在我的机器上能运行”的问题,即一个应用程序在一个系统上运行良好,但在另一个系统上却不行。

  2. 可扩展性和灵活性:Docker 容器轻量级,可以轻松地向上或向下扩展,从而更轻松地应对应用程序需求的波动。此外,Docker 的模块化设计使你能够轻松替换或更新应用程序的各个组件,而不会影响系统的其他部分。

  3. 提高开发者生产力:Docker 通过为构建、测试和运行应用程序提供一致、隔离的环境,简化了开发和部署过程。这有助于减少设置和维护开发及生产环境所需的时间和精力。

  4. 高效资源利用:Docker 容器共享主机操作系统的内核,这意味着它们可以快速启动和停止,并且比传统虚拟机使用更少的资源。这可以提高计算资源的使用效率并降低基础设施成本。

  5. 可移植性和部署灵活性:Docker 容器可以轻松地在不同环境之间移动,从开发者的笔记本电脑到生产服务器,而无需担心底层基础设施的差异。这使得在各种环境中部署和管理应用程序变得更加容易,包括本地、云端或混合环境。

要开始使用 Docker,你需要在系统上安装 Docker 引擎。在本教程中,我们将使用 Ubuntu 22.04 作为主机操作系统。你可以通过以下步骤在 Ubuntu 22.04 上安装 Docker:

sudo apt-get update
sudo apt-get install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker

安装完 Docker 后,你可以通过运行以下命令来验证安装:

docker version

这应该会显示你系统上安装的 Docker 版本。

理解 Docker 镜像:构建、存储和拉取镜像

Docker 镜像是 Docker 容器的基础。它们是用于创建容器的只读模板。在本节中,我们将探讨如何构建、存储和拉取 Docker 镜像。

构建 Docker 镜像

要构建 Docker 镜像,你需要创建一个 Dockerfile,这是一个文本文件,其中包含构建镜像的指令。以下是一个使用 Nginx 创建简单 Web 服务器的 Dockerfile 示例:

FROM nginx:latest
COPY index.html /usr/share/nginx/html/
EXPOSE 80

你可以使用以下命令构建此镜像:

docker build -t my-nginx-image.

此命令将根据 Dockerfile 中的指令创建一个名为 my-nginx-image 的新镜像。

存储 Docker 镜像

Docker 镜像可以存储在 Docker 注册表中,这是一个用于 Docker 镜像的集中式存储库。最流行的公共注册表是 Docker Hub,但你也可以设置自己的私有注册表。

要将镜像推送到 Docker Hub,你首先需要登录到你的 Docker Hub 账户:

docker login

然后,你可以使用你的 Docker Hub 用户名标记你的镜像并将其推送到注册表:

docker tag my-nginx-image username/my-nginx-image:latest
docker push username/my-nginx-image:latest

拉取 Docker 镜像

要从注册表中拉取 Docker 镜像,你可以使用 docker pull 命令。例如,要从 Docker Hub 拉取最新的 Nginx 镜像:

docker pull nginx:latest

你也可以通过指定注册表 URL 从私有注册表中拉取镜像:

docker pull private-registry.example.com/my-image:latest

一旦你有了一个镜像,就可以使用它来创建一个 Docker 容器,我们将在下一节中介绍。

创建和管理 Docker 容器:运行、停止和监控容器

既然我们对 Docker 镜像有了基本的了解,接下来探讨如何创建和管理 Docker 容器。

运行 Docker 容器

要从 Docker 镜像创建一个新容器,可以使用 docker run 命令。例如,要从 nginx:latest 镜像创建一个新的 Nginx 容器:

docker run -d -p 80:80 --name my-nginx-container nginx:latest

此命令将:

  • -d:以分离模式(在后台)运行容器
  • -p 80:80:将主机上的端口 80 映射到容器内的端口 80
  • --name my-nginx-container:为容器分配名称“my-nginx-container”
  • nginx:latest:使用 nginx:latest 镜像创建容器

停止和移除容器

要停止正在运行的容器,可以使用 docker stop 命令:

docker stop my-nginx-container

要移除已停止的容器,可以使用 docker rm 命令:

docker rm my-nginx-container

监控容器

可以使用 docker ps 命令监控容器的状态。这将显示所有正在运行的容器列表:

docker ps

要查看正在运行的容器的日志,可以使用 docker logs 命令:

docker logs my-nginx-container

还可以使用 docker stats 命令查看容器的实时资源使用情况:

docker stats my-nginx-container

通过了解如何创建、管理和监控 Docker 容器,你可以使用 Docker 平台有效地部署和管理应用程序。

容器网络与连接:暴露端口、链接容器及网络模式

Docker 提供了一个灵活的网络系统,使你能够在容器之间、容器与主机系统以及外部网络之间进行连接和通信。在本节中,我们将探讨如何在 Docker 中管理网络。

暴露端口

当你运行一个容器时,可以使用 -p--publish 标志将其内部端口暴露给主机系统。这允许外部系统访问容器内运行的服务。

例如,要运行一个 Nginx 容器并在主机系统上暴露端口 80:

docker run -d -p 80:80 nginx:latest

这会将主机系统上的端口 80 映射到容器内的端口 80。

链接容器

Docker 还允许你将容器链接在一起,使它们能够相互通信。当你有多个需要交互的容器时,比如一个 Web 应用程序和一个数据库,这会很有用。

要链接两个容器,可以在运行容器时使用 --link 标志:

docker run -d --name my-db-container postgres:latest
docker run -d --name my-app-container --link my-db-container:db my-app-image

在这个例子中,my-app-container 可以使用主机名 db 来访问 my-db-container

网络模式

Docker 支持几种网络模式,这些模式决定了容器如何连接到网络:

  1. 桥接(Bridge):这是默认的网络模式,容器连接到一个虚拟桥接网络,并且可以相互通信以及与主机系统通信。
  2. 主机(Host):在这种模式下,容器共享主机系统的网络栈,有效地消除了容器与主机之间的网络隔离。
  3. 无(None):此模式禁用容器的网络功能,使其与网络隔离。
  4. 覆盖网络(Overlay):此模式允许容器跨多个 Docker 主机进行通信,从而能够创建多主机分布式应用程序。

你可以在运行容器时使用 --network 标志来指定网络模式:

docker run -d --network host nginx:latest

通过了解 Docker 的网络功能,你可以有效地在容器之间以及与外部系统之间进行连接和通信。

使用 Docker 卷持久化数据:在容器中存储和管理数据

默认情况下,存储在 Docker 容器内的数据是临时的,这意味着当容器停止或移除时数据会丢失。为了持久化数据,Docker 提供了一个名为卷(volumes)的功能,它允许你将主机系统中的一个目录挂载到容器中。

什么是 Docker 卷?

Docker 卷是一种在容器的文件系统之外存储和管理数据的方式。卷可用于存储应用程序数据、配置文件或任何其他需要在容器生命周期之外持久化的数据。

卷可以使用 docker volume 命令来创建和管理。例如,要创建一个新卷:

docker volume create my-data-volume

在容器中挂载卷

要在容器中挂载卷,可以在运行 docker run 命令时使用 -v--mount 标志。例如,要运行一个 Nginx 容器并将一个卷挂载到 /usr/share/nginx/html 目录:

docker run -d -p 80:80 -v my-data-volume:/usr/share/nginx/html nginx:latest

在这个例子中,my-data-volume 卷被挂载到容器内的 /usr/share/nginx/html 目录。写入此目录的任何数据都将存储在卷中,并且即使容器停止或移除也会持久化。

管理卷

你可以使用 docker volume ls 命令列出系统上的所有卷:

docker volume ls

要检查特定卷的详细信息,可以使用 docker volume inspect 命令:

docker volume inspect my-data-volume

如果你不再需要某个卷,可以使用 docker volume rm 命令将其移除:

docker volume rm my-data-volume

通过使用 Docker 卷,你可以确保应用程序数据在单个容器的生命周期之外持久化,从而更轻松地管理和扩展应用程序。

Dockerfile 与镜像优化:构建高效的 Docker 镜像

Dockerfile 是构建 Docker 镜像的基础。它包含创建 Docker 镜像的指令,包括基础镜像、应用代码以及任何必要的依赖项。在本节中,我们将探讨如何编写高效的 Dockerfile 并优化 Docker 镜像。

理解 Dockerfile

Dockerfile 是一个文本文件,其中包含一系列用于构建 Docker 镜像的指令。Dockerfile 中的每条指令都对应最终镜像中的一层。以下是一个 Dockerfile 示例:

FROM ubuntu:22.04
RUN apt-get update && apt-get install -y nginx
COPY index.html /usr/share/nginx/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

此 Dockerfile 基于 ubuntu:22.04 基础镜像创建一个新镜像,安装 Nginx,将 index.html 文件复制到 Nginx 的网页根目录,暴露端口 80,并设置启动 Nginx 服务器的默认命令。

镜像优化技巧

为了构建高效的 Docker 镜像,你可以使用以下优化技巧:

  1. 使用最小化基础镜像:从最小化的基础镜像(如 alpinescratch)开始,以减小最终镜像的大小。
  2. 利用多阶段构建:使用多阶段构建来分离构建环境和运行时环境,从而减小最终镜像的大小。
  3. 优化层缓存:安排 Dockerfile 指令以利用 Docker 的层缓存,这可以显著加快构建过程。
  4. 避免不必要的软件包:仅安装应用运行所需的软件包和依赖项,并在使用后将其移除。
  5. 使用.dockerignore:创建一个 .dockerignore 文件,以从构建上下文排除不必要的文件和目录,减少需要发送到 Docker 守护进程的数据量。
  6. 压缩构建工件:在将大型构建工件(如源代码或依赖项)复制到镜像之前对其进行压缩。

通过遵循这些最佳实践,你可以创建高效且经过优化的 Docker 镜像,这些镜像体积更小,构建和部署速度更快。

Docker Compose:定义和运行多容器应用程序

Docker Compose 是一个工具,可让你定义和运行多容器应用程序。它通过提供一种声明式方式来定义应用程序的服务、网络和卷,简化了管理和编排多个 Docker 容器的过程。

什么是 Docker Compose?

Docker Compose 是一个基于 YAML 的配置文件,用于描述构成应用程序的服务。它使你能够定义不同容器之间的关系以及它们应如何部署和管理。

以下是一个 docker-compose.yml 文件示例,它定义了一个包含 Web 服务器和数据库的简单 Web 应用程序:

version: "3"
services:
  web:
    build:.
    ports:
      - "80:80"
    depends_on:
      - db
  db:
    image: postgres:12
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
    volumes:
      - db-data:/var/lib/postgresql/data
volumes:
  db-data:

此配置定义了两个服务:webdbweb 服务从当前目录中的 Dockerfile 构建,并在主机上暴露端口 80。db 服务使用 postgres:12 镜像,并设置一个具有特定数据库名称、用户和密码的 PostgreSQL 数据库。它还挂载一个卷以持久化数据库数据。

使用 Docker Compose

要使用 Docker Compose,请执行以下步骤:

  1. 在项目目录中创建一个 docker-compose.yml 文件。
  2. 在 YAML 文件中定义服务及其配置。
  3. 运行 docker-compose up 命令启动应用程序。
docker-compose up -d

这将在后台启动 docker-compose.yml 文件中定义的所有服务。

你还可以使用其他 Docker Compose 命令来管理应用程序,例如:

  • docker-compose down:停止并移除容器、网络和卷。
  • docker-compose ps:列出正在运行的容器。
  • docker-compose logs:查看正在运行的容器的日志。

通过使用 Docker Compose,你可以轻松管理和部署复杂的多容器应用程序,使其成为 Docker 工具库中的一个强大工具。

总结

在本教程中,你已经了解了 Docker 镜像和容器之间的基本区别与关系。你现在明白了如何构建、存储和拉取 Docker 镜像,以及如何创建、运行和管理 Docker 容器。你还探索了网络、卷以及 Docker Compose,以构建和部署多容器应用程序。有了这些知识,你可以有效地利用 Docker 的强大功能来简化应用程序部署和管理工作流程。