1 Star 0 Fork 1

Nousin / study-space

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
Docker.md 55.48 KB
一键复制 编辑 原始数据 按行查看 历史
Tang 提交于 2024-04-13 09:21 . Docker.md K8S.md kkFileView.md

概览

Docker 是一个开源的应用容器引擎,它允许开发者将应用及其依赖打包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上。Docker 基于 Go 语言开发,并遵从 Apache2.0 协议开源。它从 17.03 版本之后分为 CE(Community Edition,社区版)和 EE(Enterprise Edition,企业版),对于大多数用户来说,社区版已经足够使用。

优点

  1. 快速、一致地交付应用程序:Docker 允许开发人员使用本地容器在标准化环境中工作,简化了开发的生命周期。它非常适合持续集成和持续交付(CI/CD)工作流程。
  2. 响应式部署和扩展:Docker 容器可以在多种环境中运行,包括开发人员的本机、数据中心的物理或虚拟机、云服务上或混合环境中。这使得动态管理的工作负担变得轻松,并根据业务需求实时扩展或拆除应用程序和服务。
  3. 在同一硬件上运行更多工作负载:Docker 轻巧快速,为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案。

用途

  • 提供一次性的环境:例如本地测试他人的软件、持续集成时提供单元测试和构建的环境。
  • 提供弹性的云服务:由于 Docker 容器可以随开随关,很适合动态扩容和缩容。
  • 组建微服务架构:通过多个容器,一台机器可以运行多个服务,模拟出微服务架构。

基本概念

Docker 的基本概念主要涉及以下几个方面:

容器(Containers)

容器是 Docker 的核心概念之一。它是应用程序及其依赖的轻量级、可移植、自给自足的运行环境。容器内包含了运行应用程序所需的代码、运行时环境、系统工具、系统库等,它们在隔离的环境中运行,确保了应用程序的一致性和可移植性。

容器是从镜像创建的。镜像可以看作是容器的“源代码”,而容器则是“编译后的产物”。一个镜像可以创建多个容器实例,这些容器实例在隔离的环境中运行,彼此之间不会相互影响。

特性

  1. 轻量级:容器利用并共享宿主机的内核,不需要额外的操作系统,因此比虚拟机更轻量级。
  2. 快速启动:由于容器共享宿主机的内核,启动容器不需要引导整个操作系统,因此启动速度非常快。
  3. 隔离性:每个容器都在自己的文件系统中运行,具有独立的网络配置和进程空间,确保了应用程序之间的隔离。
  4. 可移植性:容器包含了运行应用程序所需的所有依赖和配置,因此可以在任何安装了 Docker 的系统上运行,实现“一次构建,到处运行”的目标。
  5. 可伸缩性:容器可以快速启动和销毁,非常适合动态扩容和缩容的场景,如云服务和微服务架构。
  6. 版本控制:通过 Docker 镜像和容器的生命周期管理,可以实现应用程序的版本控制和回滚。

创建和管理

容器的生命周期包括创建、启动、停止、重启、销毁等阶段。Docker 提供了一系列命令来管理容器的生命周期:

  • docker run:从镜像创建并启动一个新的容器。
  • docker start:启动一个已停止的容器。
  • docker stop:停止一个正在运行的容器。
  • docker restart:重启一个容器。
  • docker rm:删除一个或多个已停止的容器。
  • docker kill:强制停止一个正在运行的容器。

网络

Docker 容器的网络是容器化技术中的一个重要组成部分,它负责容器之间以及容器与外部世界之间的通信。Docker 提供了多种网络驱动类型,以支持不同的网络需求和拓扑结构。

Docker 容器默认使用桥接网络,每个容器都会获得一个独立的 IP 地址。Docker 还支持其他网络模式,如主机网络、容器网络和自定义网络,以满足不同的网络需求。下面是 Docker 容器网络的详细解释:

网络模式

Docker 支持以下几种网络模式:

  1. 桥接模式(Bridge)

    • 默认的网络模式。
    • 每个容器都会被分配一个独立的 IP 地址。
    • 容器之间可以通过网络别名(container_name)相互通信。
    • 容器与宿主机之间可以通过特殊的 DNS 解析进行通信。
  2. 主机模式(Host)

    • 容器共享宿主机的网络命名空间。
    • 容器的网络性能接近于宿主机的网络性能。
    • 容器使用宿主机的 IP 地址进行通信。
  3. 容器模式(Container)

    • 容器共享另一个容器的网络堆栈。
    • 两个容器之间可以直接通过 localhost 通信。
  4. 无网络模式(None)

    • 容器没有任何网络接口。
    • 适用于不需要网络连接的容器。
  5. 自定义网络(Custom)

    • 用户可以创建自定义网络,支持多种配置选项,如子网、网关、IP 范围等。
    • 支持多主机网络,容器可以在不同的宿主机上运行并相互通信。

创建和管理

用户可以通过 Docker 命令行工具创建和管理网络。以下是一些常用的网络命令:

  • docker network create:创建一个新的网络。
  • docker network ls:列出所有的网络。
  • docker network inspect:查看网络的详细信息。
  • docker network connect:将容器连接到网络。
  • docker network disconnect:从网络中断开容器。
  • docker network rm:删除网络。

代码示例:

# 创建一个名为 my_custom_network 的自定义网络
docker network create --driver bridge my_custom_network
# 列出所有 Docker 网络
docker network ls
# 查看特定网络的详细信息,例如 my_custom_network
docker network inspect my_custom_network
# 假设我们有一个名为 my_container 的容器,我们将其连接到 my_custom_network 网络
docker network connect my_custom_network my_container
# 从 my_custom_network 网络中断开 my_container 容器
docker network disconnect my_custom_network my_container
# 删除不再使用的 my_custom_network 网络
docker network rm my_custom_network

Docker 网络支持多种配置选项,包括:

  • 子网(Subnet):定义容器的 IP 地址范围。
  • 网关(Gateway):定义容器的默认网关。
  • IP 范围(IP Range):定义容器的 IP 地址分配范围。
  • DNS 服务器:定义容器使用的 DNS 服务器地址。
  • 别名(Aliases):为容器设置网络别名,方便容器间的通信。

容器间的通信

容器之间可以通过以下几种方式进行通信:

  • 网络别名:在桥接模式下,容器可以使用其他容器的名称作为网络别名进行通信。
  • IP 地址:容器可以直接使用其他容器的 IP 地址进行通信。
  • 端口映射:宿主机的端口可以映射到容器的端口,使得外部世界可以通过宿主机访问容器的应用程序。
  • 服务发现:在复杂的容器化环境中,容器可能需要动态发现和通信。这通常涉及到服务注册和发现机制,如 Consul、etcd 等。
# 网络别名:
# 假设我们有两个容器 containerA 和 containerB,它们都连接到了 my_custom_network 网络
# containerA 可以通过 containerB 的网络别名来访问 containerB
docker exec containerA curl http://containerB

# 容器的 IP:
# 获取 containerB 的 IP 地址
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' containerB
# 使用获取到的 IP 地址进行通信
docker exec containerA curl http://<containerB_IP_address>

# 宿主机的端口:
# 启动 containerB 并将其端口 80 映射到宿主机的端口 8080
docker run -d --name containerB -p 8080:80 --network my_custom_network some_image
# 从 containerA 或任何其他容器中通过宿主机的 IP 地址和端口 8080 访问 containerB
docker exec containerA curl http://宿主机_IP_address:8080

# 服务发现:
# 部署服务注册中心(例如 Consul)
docker run -d --name consul --network my_custom_network consul
# 在 containerB 中注册服务
docker exec containerB consul register -name my-service -port 80
# 在 containerA 中发现服务并进行通信
docker exec containerA consul catalog service my-service
docker exec containerA curl http://服务的IP地址:80

网络安全

Docker 网络也提供了一些安全特性:

  • 隔离:不同的网络之间默认是隔离的,容器只能访问同一网络内的其他容器。
  • 安全组:在创建自定义网络时,可以定义安全组规则,类似于虚拟机的防火墙规则。
  • 加密:对于敏感数据的传输,可以使用加密的通信通道。

Docker 容器网络提供了灵活的网络配置和管理能力,支持多种网络模式和拓扑结构,满足不同场景下的网络需求。通过合理配置和管理 Docker 网络,可以确保容器之间的通信高效、安全、可靠。理解 Docker 网络的工作原理和特性,对于构建和管理大规模的容器化应用程序至关重要。

数据持久化

容器的文件系统是非持久的,容器停止或删除后,其中的数据会丢失。为了实现数据持久化,Docker 提供了数据卷(Volumes)和绑定挂载(Bind Mounts)两种机制,可以将宿主机的文件或目录挂载到容器中,从而实现数据的持久化。

数据卷(Volumes)

Docker 数据卷(Volumes)是 Docker 提供的一种数据持久化和共享解决方案。数据卷允许您将数据独立于容器的生命周期进行存储和管理,这样即使容器被删除,数据也不会丢失。此外,数据卷可以在多个容器之间共享和重用,这使得数据迁移和备份变得更加容易。

数据卷的特点:

  1. 数据共享:数据卷可以在多个容器之间挂载和共享,实现数据的一致性和同步。
  2. 数据持久化:数据卷确保了容器数据的持久化存储,即使容器停止或重启,数据也不会丢失。
  3. 数据迁移和备份:数据卷可以被导出和导入,便于数据的迁移和备份。
  4. 性能优化:对于需要大量读写操作的应用程序,使用数据卷可以提高性能,因为数据不再频繁地在容器内部创建和销毁。
创建和管理

您可以通过 Docker 命令行工具创建和管理数据卷。以下是一些常用的数据卷命令:

  • docker volume create:创建一个新的数据卷。
  • docker volume ls:列出所有的数据卷。
  • docker volume inspect:查看数据卷的详细信息。
  • docker volume rm:删除一个或多个不再使用的数据卷。

数据卷可以在运行容器时通过 --mount 选项或 docker run 命令中的 -v 参数进行挂载。以下是一些示例:

  1. 挂载数据卷到容器
# 创建并挂载数据卷,`my_volume` 是数据卷的名称,`/path/in/container` 是容器内的挂载点。
docker run -d --name my_container --mount source=my_volume,target=/path/in/container my_image
  1. 使用已有的数据卷
# 如果数据卷已经存在,可以直接在运行容器时挂载:这将使得 `my_other_container` 能够访问和使用 `my_volume` 中的数据
docker run -d --name my_other_container --mount source=my_volume,target=/path/in/other_container my_image
备份和恢复

数据卷可以通过 docker volume exportdocker volume import 命令进行备份和恢复:

  • 备份数据卷
# 这个命令会将 `my_volume` 数据卷的内容导出到一个 tar 归档文件中。
docker volume export my_volume > my_volume_backup.tar
  • 恢复数据卷
# 首先创建一个新的数据卷:
docker volume create my_volume_backup

# 然后导入之前备份的数据卷内容:这将创建一个新的数据卷 `my_volume_backup`,其中包含从 `my_volume` 导出的数据。
docker volume import my_volume_backup < my_volume_backup.tar

对于需要频繁读写大量数据的应用程序,如数据库,使用数据卷可以提高性能。数据卷的读写操作直接在宿主机的文件系统上进行,不受容器层的影响。

Docker 数据卷是实现容器数据持久化和共享的重要特性。通过合理使用数据卷,您可以在容器化环境中有效地管理应用程序的数据,确保数据的安全性和一致性。理解数据卷的工作原理和最佳实践,对于构建高效、可靠的 Docker 应用程序至关重要。

绑定挂载(Bind Mounts)

绑定挂载(Bind Mounts)是 Docker 中实现数据持久化和共享的另一种方法。与数据卷(Volumes)相比,绑定挂载提供了更直接的宿主机文件系统访问,允许容器访问宿主机上的文件和目录。以下是绑定挂载的详细解释:

绑定挂载的特点:

  1. 直接访问宿主机文件系统:绑定挂载将宿主机上的文件或目录直接挂载到容器中,容器可以直接读写宿主机上的文件。
  2. 无需 Docker 管理:与数据卷不同,绑定挂载的生命周期不由 Docker 管理,它们的创建、删除和内容变更都直接反映在宿主机上。
  3. 灵活性:用户可以选择宿主机上任何可访问的文件或目录进行挂载,这为容器提供了更大的灵活性和控制力。
  4. 实时同步:由于绑定挂载直接访问宿主机文件,容器对文件的任何更改都会立即反映到宿主机上,实现实时同步。
配置与使用

绑定挂载可以在运行容器时通过 -v--mount 选项进行设置。以下是一些使用绑定挂载的示例:

  1. 挂载宿主机目录到容器
# 在这个例子中,`/宿主机/路径` 是宿主机上的目录路径,`/path/in/container` 是容器内的挂载点。
docker run -d --name my_container -v /宿主机/路径:/path/in/container my_image
  1. 挂载宿主机文件到容器
# 这将宿主机上的文件挂载到容器中,并在容器内的指定路径下作为文件使用。
docker run -d --name my_container -v /宿主机/文件路径:/path/in/container/file my_image
  1. 使用 --mount 选项进行更详细的挂载配置
docker run -d --name my_container --mount type=bind,source=/宿主机/路径,target=/path/in/container my_image

--mount 选项允许指定挂载类型(type),源路径(source)和目标路径(target),提供了更细粒度的控制。

注意事项:

  • 权限问题:确保 Docker 进程有权限访问宿主机上的文件或目录,否则可能会导致挂载失败。
  • 文件系统类型:某些文件系统类型可能不支持绑定挂载,或者有特定的使用限制。
  • 数据一致性:由于绑定挂载直接操作宿主机文件,需要确保容器内的操作不会破坏宿主机上的数据结构。
  • 安全性:绑定挂载可能会增加安全风险,因为容器内的进程可以访问宿主机上的文件系统。确保不要挂载敏感数据,或者使用适当的安全措施,如 SELinux 标签。

绑定挂载为 Docker 容器提供了一种直接访问宿主机文件系统的方法,使得数据共享和持久化变得更加灵活和方便。理解绑定挂载的工作原理和最佳实践,可以帮助您在容器化环境中更有效地管理数据。在使用绑定挂载时,需要注意权限、文件系统类型、数据一致性和安全性等方面的问题,以确保系统的稳定性和数据的安全性。

最佳实践:

  • 选择合适的持久化方法:对于需要共享或迁移的数据,使用数据卷更为合适;如果需要将宿主机的特定文件或目录集成到容器中,使用绑定挂载。
  • 规划数据卷和绑定挂载的存储位置:合理规划数据存储位置,以便于管理和维护。
  • 使用数据卷插件:Docker 提供了多种数据卷插件,如 docker-volume-localrexrayflocker 等,它们可以提供额外的功能,如云存储集成、快照、复制等。
  • 备份和恢复:定期备份数据卷和绑定挂载中的数据,以防数据丢失或损坏。
  • 安全性:对于敏感数据,考虑使用加密的数据卷或绑定挂载,确保数据安全。

容器的数据持久化是确保应用程序数据持续性的关键。通过使用数据卷和绑定挂载,你可以在容器化环境中有效地管理数据。理解这些持久化方法的工作原理和最佳实践,对于构建可靠、可扩展的 Docker 应用程序至关重要。

日志管理

在容器化环境中,Docker 容器的日志管理是一项至关重要的任务。它对于监控应用程序的运行状态、排查故障、分析性能和保障安全性等方面都发挥着重要作用。

基本命令

Docker 提供了 docker logs 命令来查看和管理容器的日志。这个命令可以获取容器的标准输出(STDOUT)和标准错误(STDERR)。

# 查看容器日志:这个命令会显示容器到目前为止的日志输出。
docker logs container_id

# 查看最新的日志条目:使用 `--tail` 选项可以限制输出的日志条数,这对于快速查看最新的日志很有用。
docker logs --tail=10 container_id

# 实时查看容器日志:
docker logs -f container_id

高级功能

Docker 还提供了更高级的日志管理功能,如日志轮换和远程存储。这些功能可以通过配置 Docker 的日志驱动(logging driver)来实现。

  • 配置日志驱动: Docker 默认使用 json-file 作为日志驱动,它会将日志输出到 JSON 格式的文件中,便于进一步分析。如果需要更改日志驱动,可以在运行容器时使用 --log-driver 选项指定,例如:

    # 这里使用了 `syslog` 作为日志驱动。
    docker run --log-driver=syslog --name my_container my_image
  • 查看日志文件路径: Docker 的日志文件通常位于宿主机的 /var/lib/docker/containers/ 目录下。每个容器的日志文件都有一个唯一的标识符。可以通过 docker inspect 命令查看容器的详细信息,包括日志文件路径。

  • 日志驱动类型:

    • json-file:默认的日志驱动,将日志输出保存为 JSON 格式的文件。

    • none:禁用容器日志输出。

    • syslogjournald:Linux 上的日志管理服务。

    • awslogsplunkgcplogs:第三方日志托管服务。

    • gelffluentd:开源的日志管理方案。

资源限制

Docker 允许对容器的资源使用进行限制,如 CPU、内存、磁盘空间等。这可以通过在运行容器时指定相应的参数来实现,从而确保应用程序的资源使用不会影响宿主机或其他容器。

在容器化环境中,资源限制是一项关键特性,它确保了容器不会过度消耗宿主机的资源,从而影响其他容器和宿主机的性能。通过资源限制,管理员和开发者可以控制容器对 CPU、内存、网络带宽、磁盘 I/O 等资源的使用,以优化整个系统的性能和稳定性。

资源限制的重要性:

  1. 防止资源饥饿:资源限制可以防止单个容器消耗过多资源,导致其他容器或宿主机资源不足。
  2. 优先级控制:可以根据应用程序的重要性分配不同的资源配额和限制,确保关键任务获得足够的资源。
  3. 成本优化:通过合理分配资源,可以提高物理硬件的利用率,降低运行成本。
  4. 性能保障:资源限制有助于维持应用程序的性能水平,避免因资源争抢导致的性能波动。

CPU 限制

  • 配额:使用 --cpu-quota 选项为容器设置 CPU 配额,限制容器可以使用的 CPU 资源比例。
  • 周期:使用 --cpu-period 选项设置容器的 CPU 周期,与 --cpu-quota 配合使用,确定容器在每个周期内可以使用的 CPU 时间。
  • 共享:使用 --cpu-shares 选项设置容器的 CPU 权重,影响容器在 CPU 资源争抢时的优先级。
docker run -d --cpu-shares 512 --cpu-quota 50000 --cpu-period 100000 my_image

内存限制

  • 内存限制:使用 -m--memory 选项为容器设置内存限制。
  • 交换空间:可以设置容器的交换空间大小,限制容器使用交换空间的量。
docker run -d -m 1g ---memory-swap=1.5g my_image

网络带宽限制

  • 带宽限制:使用 docker network create 命令时,可以指定网络的带宽限制。
  • 流量控制:可以使用第三方工具如 tc(Traffic Control)来实现网络带宽的控制。

磁盘 I/O 限制

  • I/O 限制:使用 --blkio-weight 选项设置容器的磁盘 I/O 权重。
  • I/O 配额:使用 --blkio-weight-device 选项为特定设备设置 I/O 配额。
docker run -d --blkio-weight 500 my_image

资源限制是容器化环境中不可或缺的一部分,它有助于确保系统的稳定性和效率。通过合理配置 Docker 和 Kubernetes 中的资源限制,可以避免资源争抢和过度消耗,提高整个系统的性能和可靠性。随着容器化应用的不断增长,对资源限制的理解和应用将变得越来越重要。

安全性

Docker 提供了多种机制来增强容器的安全性,包括镜像安全扫描、容器隔离、最小化基础镜像、使用特权模式的谨慎等。

关键领域

  1. 基础设施安全

    • 确保Docker版本及宿主机操作系统是最新的,以修复已知的安全漏洞。
    • 配置API和网络,限制对Docker守护进程的访问,并启用基于证书的身份验证。
    • 限制系统资源的使用,使用控制组(cgroups)限制容器资源消耗,防止单点故障。
  2. 镜像安全

    • 使用信任的镜像,仅从官方或可信的私有仓库获取基础镜像。
    • 定期扫描镜像以检测和修复安全漏洞。
    • 支持最小的基本镜像,减少攻击面和潜在的配置问题。
  3. 访问和认证管理

    • 实施最小特权原则,限制容器和用户权限,避免使用root用户运行容器。
    • 使用机密管理工具,不将敏感信息(如密码、密钥)硬编码或存储在Dockerfile中。
    • 限制对容器文件的直接访问,并启用加密通信。

最佳实践

  1. 保护Docker基础架构

    • 保持容器环境的清洁,定期清理未使用的容器和镜像。
    • 限制容器功能,删除不必要的特权和系统调用。
    • 保持主机隔离,避免在同一主机上运行安全要求不同的容器。
  2. 保护Docker镜像

    • 审核关键文件和目录,确保镜像中的软件包和依赖项是最新的。
    • 支持最小化的基础镜像,减少不必要的服务和应用程序。
  3. 访问和身份验证管理

    • 实施特权最小的用户策略,限制对Docker守护进程的访问。
    • 使用机密管理工具,安全地存储和管理敏感信息。
    • 限制对容器文件的直接访问,并启用加密通信。

容器漏洞管理

  1. 容器漏洞扫描

    • 使用专业的容器漏洞扫描工具,如Aqua Security,定期扫描容器和镜像,及时发现并修复漏洞。
    • 跟踪和响应已知的安全漏洞,及时更新镜像和运行时环境。
  2. 容器运行时安全

    • 监控容器的行为,使用如Open Policy Agent (OPA)等工具实施访问控制和安全策略。
    • 及时发现并响应异常行为,防止潜在的安全威胁。

容器安全性是容器化技术中的重要组成部分。通过上述的最佳实践和漏洞管理方法,可以有效提高容器环境的安全性。企业和技术团队应该重视容器安全,采取全面的安全措施,确保容器化应用的稳定和安全运行。随着技术的不断发展,持续关注和学习新的安全技术和实践是保障容器安全的关键。

镜像(Images)

Docker 镜像是容器化技术中的核心概念之一,它是容器运行的基础。Docker 镜像包含了运行应用程序所需的所有内容,包括代码、运行时环境、系统工具、系统库和配置文件等。镜像可以看作是容器的“源代码”,而容器则是“编译后的产物”,即镜像的运行实例。通常,开发者会基于某个基础镜像(如 Ubuntu、CentOS、Alpine 等)来构建自己的应用镜像。

Docker 镜像由多个层(Layers)组成,每一层代表 Dockerfile 中的一个指令。这些层被设计为共享和重用,以减少存储空间和提高构建效率。当修改镜像时,只有变化的部分会被创建为新的层,而不是整个镜像。

镜像标签(Tags)用于区分同一镜像的不同版本。如果不指定标签,Docker 默认使用 latest 标签。标签可以在拉取或推送镜像时指定:

# 这个命令会拉取 `my_image` 镜像的 `1.0` 版本
docker pull my_image:1.0

创建与管理

Docker 镜像可以通过多种方式创建:

  1. 基于现有镜像:可以使用 docker build 命令,根据 Dockerfile 指定的指令来创建新的镜像。Dockerfile 是一种文本文件,包含了创建镜像所需的步骤和配置。

    # 这个命令会在当前目录下查找 Dockerfile,并创建一个名为 `my_image` 的新镜像
    docker build -t my_image .
  2. 从 Docker Hub 或其他镜像仓库拉取:可以使用 docker pull 命令从公共或私有的 Docker 镜像仓库拉取现有的镜像。

    # 这个命令会拉取最新版本的 Ubuntu 镜像
    docker pull ubuntu:latest

Dockerfile

Dockerfile 是一个文本文件,它包含了一系列的指令和参数,用于定义如何构建 Docker 镜像。每一条指令都会在镜像中创建一个新的层,并为最终的镜像添加文件、运行命令或者设置配置。Dockerfile 的使用是构建 Docker 镜像的基础,它使得镜像的创建过程透明化、可复制和易于分享。

基本结构

一个典型的 Dockerfile 包含以下类型的指令:

  1. FROM:指定基础镜像,所有的更改都是基于这个镜像进行的。

    FROM ubuntu:18.04
  2. RUN:在镜像中执行命令。

    RUN apt-get update && apt-get install -y nginx
  3. CMD:设置容器启动时默认执行的命令,可以被 docker run 命令行中的参数覆盖。

    CMD ["nginx", "-g", "daemon off;"]
  4. COPYADD:将文件从构建上下文复制到镜像中,或者直接从 URL 添加文件。

    COPY . /app
    ADD https://example.com/app.tar.gz /app.tar.gz
  5. ENV:设置环境变量。

    ENV APP_HOME /app
  6. EXPOSE:声明容器监听的端口。

    EXPOSE 80
  7. ENTRYPOINT:设置容器启动时的入口点,通常用于执行应用程序。

    ENTRYPOINT ["python", "app.py"]
  8. VOLUME:创建一个数据卷,用于持久化或共享数据。

    VOLUME /tmp
  9. USER:指定运行容器时使用的用户。

    USER myuser
  10. WORKDIR:设置工作目录。

    WORKDIR /app
  11. ONBUILD:用于延迟构建,当其他镜像基于当前镜像构建时,这些指令才会执行。

    ONBUILD RUN npm install
  12. LABEL:允许用户为镜像添加键值对形式的元数据。这些元数据可以用于描述镜像、记录构建信息、指定维护者联系方式等。

    # 添加了一个名为 maintainer 的标签,其值为 example@example.com,表示镜像的维护者的电子邮件地址。
    LABEL maintainer="example@example.com"

代码示例:

# 以下是构建微服务 jar 的 Dockerfile 文件
# pigx-upms-biz
#  |-src
#  |-target
#  |-Dockerfile
#  |-pom.xml
FROM alibabadragonwell/dragonwell:17-anolis

MAINTAINER 

ENV TZ=Asia/Shanghai
ENV LANG C.UTF-8
ENV JAVA_OPTS="-Xms512m -Xmx1024m -Djava.security.egd=file:/dev/./urandom"

RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN mkdir -p /mall-upms

WORKDIR /mall-upms

EXPOSE 4000
# 添加Jar到工作目录
ADD ./target/mall-upms-biz.jar ./

CMD sleep 60;java $JAVA_OPTS -jar mall-upms-biz.jar

截至我的知识更新日期(2023年3月),MAINTAINER 指令已经不再推荐使用,并且在 Docker 的最新版本中已经被废弃。取而代之的是 LABEL 指令。

COPY

在 Dockerfile 中,COPY 指令用于从构建上下文(build context)中复制文件或目录到镜像中。构建上下文是指在执行 docker build 命令时,Dockerfile 所在目录及其子目录中的所有内容COPY 指令是 Docker 镜像构建过程中非常常用的指令之一,它使得开发者能够将本地的项目文件、配置文件、资源等添加到镜像中。

COPY <源路径> <目标路径>
  • 源路径:可以是构建上下文中的相对路径或绝对路径。如果是相对路径,它相对于构建上下文的根目录。
  • 目标路径:是容器文件系统中的路径,即你希望文件被复制到容器内的位置。

COPY 指令的使用示例:

假设你有一个简单的 web 应用程序,它的源代码位于本地的 /app 目录中,你希望将这些文件复制到 Docker 镜像中的相同目录下:

# 设置工作目录
WORKDIR /app
# 复制本地的 app 目录下的所有文件到容器的 /app 目录下
COPY . /app

在这个示例中,COPY . /app 指令会将构建上下文(通常是 Dockerfile 所在目录)中的所有文件和子目录复制到容器的 /app 目录下。

COPY 指令与 ADD 指令的区别:

虽然 COPYADD 指令都可以用来将文件添加到镜像中,但它们有一些区别:

  • COPY:仅用于从构建上下文中复制文件。它的功能比较简单,易于理解。
  • ADD:除了具有 COPY 的功能外,还可以从 URL 或 tar 存档中提取文件到镜像中。ADD 指令更灵活,但也更复杂。

COPY 指令的最佳实践:

  1. 明确指定源路径和目标路径:确保源路径和目标路径的准确性,避免复制错误或遗漏文件。
  2. 使用相对路径:尽量使用相对路径而非绝对路径,这样可以确保 Dockerfile 在不同环境下的一致性。
  3. 避免复制不必要的文件:只复制应用程序运行所必需的文件,减少镜像大小,提高构建速度。
  4. 利用构建缓存:合理安排 COPY 指令的位置,可以有效地利用 Docker 的构建缓存,加速构建过程。

COPY 指令是 Dockerfile 中用于文件复制的重要工具。通过正确使用 COPY 指令,可以将本地的项目文件和其他必要资源添加到 Docker 镜像中,为创建容器化应用程序打下基础。理解 COPY 指令的工作原理和使用方式,对于编写高效、可靠的 Dockerfile 至关重要。

Dockerfile 的最佳实践:

  1. 使用官方镜像作为基础:这有助于确保基础镜像的安全性和稳定性。
  2. 保持 Dockerfile 简洁:避免不必要的复杂性,使得 Dockerfile 更易于理解和维护。
  3. 利用多阶段构建:使用多阶段构建可以减小最终镜像的大小,提高构建效率。
  4. 避免在 Dockerfile 中暴露敏感信息:不要在 Dockerfile 中直接包含敏感信息,如密码和密钥。
  5. 优化镜像层:合理安排 Dockerfile 中的指令顺序,减少不必要的层和缓存。
  6. 清理不必要的文件:在构建过程中及时清理临时文件和缓存,减少镜像大小。
  7. 使用标签:为 Dockerfile 中的指令指定标签,便于跟踪和管理。
  8. 文档化:在 Dockerfile 中添加注释,解释每个指令的作用和目的,提高可读性。

Dockerfile 是构建 Docker 镜像的蓝图,它定义了镜像的内容和结构。通过遵循最佳实践和优化技巧,可以创建高效、安全且易于维护的 Docker 镜像。理解 Dockerfile 的工作原理和指令集,对于容器化应用程序的开发和部署至关重要。

存储和共享

Docker 镜像可以存储在本地机器上,也可以推送到 Docker Hub 或其他镜像仓库进行共享。推送镜像到仓库时,需要先对镜像进行标签化,并确保 Docker 客户端已经登录到目标仓库:

docker tag my_image:latest my_username/my_image:latest
docker push my_username/my_image:latest

这些命令会将本地的 my_image 镜像标记为 my_username/my_image,然后推送到 Docker Hub 上。

镜像的优化

为了减少镜像的大小和提高构建速度,可以采取以下优化措施:

  1. 最小化基础镜像:使用最小化的基础镜像,如 alpine,减少不必要的文件和依赖。
  2. 多阶段构建:使用 Docker 的多阶段构建功能,只保留最终产物,减少中间产物的存储。
  3. 清理不必要的文件:在 Dockerfile 中使用 RUN 指令清理不必要的缓存和文件。

镜像安全是容器安全的重要组成部分。应该始终从可信的源获取镜像,并定期扫描镜像以检测潜在的安全漏洞。此外,避免在镜像中包含敏感信息,如密码和密钥。

Docker 镜像是容器化应用的基石,它封装了应用程序及其运行环境。通过理解镜像的创建、组成、存储和优化,可以更有效地管理和使用 Docker 镜像。同时,关注镜像的安全性,确保使用可信和无漏洞的镜像,对于保障容器化环境的安全至关重要。

Docker Hub

Docker Hub 是 Docker 的官方镜像仓库,它提供了一个中心化的位置来查找、分享和存储 Docker 镜像。Docker Hub 支持公共和私有仓库,允许用户和组织构建、测试和部署 Docker 化应用程序。以下是 Docker Hub 的详细功能和使用方法。

功能:

  1. 公共仓库:Docker Hub 拥有大量的公共仓库,用户可以搜索和使用由社区成员和官方认证的供应商提供的镜像。

  2. 私有仓库:用户可以创建私有仓库来存储自己的镜像,确保只有授权的用户可以访问。

  3. 自动构建:Docker Hub 支持与 GitHub 或 Bitbucket 集成,实现代码变更后自动触发镜像构建的 CI/CD 工作流程。

  4. 镜像管理:用户可以推送(push)、拉取(pull)和管理自己的镜像,以及查看镜像的历史版本和详细信息。

  5. 用户认证:Docker Hub 提供用户认证机制,确保私有仓库的安全性。

  6. 社区协作:用户可以与团队成员协作,共享镜像和构建策略,提高开发和部署的效率。

如何使用

  1. 注册和登录:首先,需要在 Docker Hub 网站注册一个账户,并通过电子邮件验证激活。登录后,用户可以使用 Docker 命令行工具或 Docker Hub 网页界面来管理镜像和仓库。

  2. 搜索镜像:用户可以使用 Docker Hub 的搜索功能或者 docker search 命令来查找公共仓库中的镜像。

    docker search ubuntu
  3. 拉取和运行镜像:找到需要的镜像后,可以使用 docker pull 命令来拉取镜像到本地,并使用 docker run 命令来创建和启动容器。

    docker pull ubuntu
    docker run -it ubuntu bash
  4. 构建和推送镜像:用户可以在本地构建自己的镜像,并使用 docker push 命令将其推送到 Docker Hub 的私有仓库。

    docker build -t my-ubuntu .
    docker push my-ubuntu
  5. 创建和管理私有仓库:在 Docker Hub 的网页界面中,用户可以创建新的私有仓库,并设置访问权限。

  6. 使用自动构建:用户可以配置自动构建策略,将 GitHub 或 Bitbucket 的仓库与 Docker Hub 仓库关联,实现代码更新后自动构建和推送镜像。

搭建私有仓库

创建私有 Docker 仓库(也称为私有注册中心)可以让你在组织内部安全地存储和管理 Docker 镜像。以下是创建私有仓库的步骤和方法:

  1. 搭建私有仓库

    私有仓库可以通过 Docker 官方提供的 registry 镜像来搭建。以下是搭建过程的简要说明:

    • 环境部署

      • 准备一台服务器,可以是物理机或虚拟机,并确保已安装 Docker。

      • 安装并启动 Docker 服务。

    • 自建仓库

      • 从 Docker Hub 拉取 registry 镜像:

        docker pull registry:2
      • 运行 registry 镜像创建私有仓库容器,并映射宿主机端口(例如 5000):

        docker run -d --restart=always -p 5000:5000 --name my-registry registry:2

        这里 --restart=always 确保容器在停止后自动重启,-p 5000:5000 将容器的 5000 端口映射到宿主机的 5000 端口。

    • 使用 TLS 证书

      • 生成 TLS 证书以启用 HTTPS 访问,提高安全性。

      • 创建带有 TLS 认证的仓库容器,并配置证书和密钥:

        docker run -d --restart=always -p 5000:5000 --name my-registry-tls \
          -e REGISTRY_HTTP_TLS_CERTIFICATE=/path/to/cert.pem \
          -e REGISTRY_HTTP_TLS_KEY=/path/to/key.pem \
          -v /path/to/cert.pem:/path/to/cert.pem \
          -v /path/to/key.pem:/path/to/key.pem \
          registry:2

        这里 -e 设置环境变量,-v 挂载证书文件到容器中。

    • 基本身份验证

      • 配置基本身份验证,以防止未授权访问。

      • 创建用户密码文件,并运行仓库容器时指定 TLS 证书与身份验证目录:

        docker run -d --restart=always -p 5000:5000 --name my-registry-authenticated \
          -e REGISTRY_AUTH_TOKEN_REALM=https://my-registry.example.com/v2/ \
          -e REGISTRY_AUTH_TOKEN_SERVICE=My Service \
          -e REGISTRY_AUTH_TOKEN_ISSUER=My Issuer \
          -e REGISTRY_AUTH_TOKEN_ROOTCERTBUNDLE=/path/to/bundle.pem \
          -v /path/to/auth.json:/auth.json \
          -v /path/to/cert.pem:/path/to/cert.pem \
          -v /path/to/key.pem:/path/to/key.pem \
          registry:2
  2. 推送和拉取镜像

    • 推送镜像到私有仓库前,需要先登录:

      docker login -u [USERNAME] -p [PASSWORD] my-registry.example.com
    • 推送镜像:

      docker tag [LOCAL_IMAGE] [my-registry.example.com]/[REMOTE_IMAGE]
      docker push [my-registry.example.com]/[REMOTE_IMAGE]
    • 拉取镜像:

      docker pull [my-registry.example.com]/[REMOTE_IMAGE]
  3. 可视化私有仓库

    • 为了更方便地管理私有仓库,可以使用可视化工具,如 hyper/Docker-registry-web

    • 运行可视化工具并连接到私有仓库:

      docker run -d --restart=always -p 8080:8080 --name registry-web \
        --link=my-registry:registry \
        -e REGISTRY_URL=http://my-registry:5000 \
        -e REGISTRY_NAME=My Private Registry \
        hyper/Docker-registry-web
    • 访问可视化界面(例如 http://[SERVER_IP]:8080),查看和管理私有仓库中的镜像。

搭建私有 Docker 仓库可以让你在组织内部安全地存储和管理 Docker 镜像,同时提供身份验证和 HTTPS 加密等功能以确保安全性。通过上述步骤,你可以创建一个功能完善的私有 Docker 仓库,并使用可视化工具来管理它。

守护进程(Docker Daemon)

Docker 守护进程,也称为 Docker 引擎或 Dockerd,是 Docker 架构的核心组件。它是一个长时间运行的后台服务,负责处理 Docker 容器的整个生命周期,包括构建、分发、运行和监控容器。Docker 守护进程监听 Docker API 的请求,并根据这些请求执行相应的操作,如创建、启动、停止、删除容器等。

工作原理

  1. 启动和配置:Docker 守护进程在宿主机上启动时,会读取配置文件(如 /etc/docker/daemon.json)和命令行参数,以确定其运行配置,例如存储驱动、日志级别、TLS 认证等。

  2. 监听 Docker API 调用:Docker 守护进程通过 Unix 套接字或 TCP 端口监听 Docker API 调用。当 Docker 客户端(如 Docker CLI 或 Docker SDK)发送命令时,守护进程会解析这些命令并执行相应的操作。

  3. 管理容器生命周期:Docker 守护进程负责容器的创建、启动、停止、重启、销毁等操作。它还负责容器的网络配置、数据卷挂载、资源限制等高级功能。

  4. 与存储驱动交互:Docker 守护进程与存储驱动(如 OverlayFS、AUFS、Device Mapper 等)交互,管理镜像和容器的文件系统层。

  5. 日志管理:Docker 守护进程负责收集和转发容器的标准输出和标准错误流。它还可以根据配置将日志写入文件或发送到远程日志服务。

  6. 插件和扩展:Docker 守护进程支持第三方插件和扩展,如网络插件、存储插件和密钥管理服务等。

配置和管理

  • 配置文件:Docker 守护进程的默认配置文件位于 /etc/docker/daemon.json。你可以编辑这个文件来更改守护进程的默认行为,例如设置默认的日志驱动、日志级别、存储驱动等。

  • 命令行参数:在启动 Docker 守护进程时,可以通过命令行参数来临时覆盖配置文件中的设置。例如,使用 --insecure-registry 参数可以添加不安全的镜像仓库。

  • 重启和停止:可以通过 systemctl(在 systemd 系统上)或其他系统管理工具来重启或停止 Docker 守护进程。例如:

    sudo systemctl restart docker
    sudo systemctl stop docker
  • 查看状态:使用 docker infodocker system df 命令可以查看 Docker 守护进程的状态和资源使用情况。

Docker 守护进程是 Docker 容器化技术的核心,它负责处理 Docker 容器的所有操作。了解 Docker 守护进程的工作原理和配置方法,对于管理和优化 Docker 环境非常重要。通过合理配置和维护 Docker 守护进程,可以确保 Docker 容器的高效运行和稳定性。

容器编排(Orchestration)

随着容器数量的增加,管理和协调这些容器变得更加复杂。容器编排工具(如 Docker Swarm、Kubernetes)应运而生,它们提供了自动化部署、扩展、负载均衡、服务发现等功能。

关键特性:

  1. 自动化部署:自动化地部署容器,确保应用程序的快速迭代和持续交付。
  2. 服务发现:容器和服务的自动发现,使得应用程序可以动态地找到并连接到所需的服务。
  3. 负载均衡:自动分配网络流量到多个容器实例,提高应用程序的可用性和扩展性。
  4. 自我修复:当容器失败时,自动重启容器;替换和重新调度那些不满足用户定义的健康检查的容器。
  5. 水平扩展:根据负载或预定策略自动增加或减少容器实例的数量。
  6. 版本控制和回滚:管理应用程序的不同版本,并在出现问题时快速回滚到之前的版本。
  7. 安全性:确保容器和集群的安全性,包括网络隔离、访问控制和秘密管理。

编排工具

  1. Kubernetes:由 Google 开发的开源容器编排平台,是目前最流行的容器编排工具。它提供了丰富的功能和强大的生态系统。
  2. Docker Swarm:Docker 原生的集群和容器编排工具,与 Docker 引擎紧密集成,提供了简单的集群管理功能。
  3. Apache Mesos:一个开源的集群管理器,可以运行多种不同的工作负载,包括容器。
  4. Nomad:由 HashiCorp 开发的简单且灵活的工作调度平台,支持容器和非容器化应用程序。
  5. Rancher:一个开源的多集群管理平台,可以管理 Kubernetes、Docker Swarm 和 Mesos 等容器编排工具。

容器编排是现代云原生应用开发和运维的关键组成部分。通过使用容器编排工具,团队可以更高效地管理复杂的容器环境,提高应用程序的可靠性和可扩展性。Kubernetes 作为目前最流行的容器编排平台,提供了丰富的功能和强大的生态系统,是学习和使用容器编排技术的重要选择。

Kubernetes

Kubernetes(通常简称为 K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它最初由 Google 设计并捐赠给 Cloud Native Computing Foundation(CNCF)来维护。Kubernetes 成为了云原生技术中最受欢迎和最广泛使用的工具之一,它支持在私有云、公有云或混合云环境中运行。

核心概念

  1. Pods:Kubernetes 的最小部署单元,每个 Pod 包含一个或多个容器(通常是紧密协作的)。
  2. ReplicaSets:确保指定数量的 Pod 副本始终处于运行状态。
  3. Deployments:提供声明式更新,用于管理 ReplicaSets 和 Pod 模板。
  4. Services:定义一组 Pod 和访问它们的策略,通常用于负载均衡和服务发现。
  5. Volumes:提供数据持久化,与 Pod 生命周期独立。
  6. Namespaces:提供隔离的环境,每个命名空间可以运行一组资源。
  7. ConfigMapsSecrets:管理配置信息和敏感数据。
  8. Labels:用于组织和选择资源的键值对。
  9. Selectors:根据标签选择器找到一组资源。
  10. Ingress:管理外部访问到集群内服务的 HTTP 路由。
  11. Horizontal Pod Autoscaler (HPA):根据 CPU 使用率或其他指标自动扩展 Pod 数量。

Kubernetes 集群由以下主要组件组成:

  1. Master Node:控制平面组件的所在地,包括 API 服务器、调度器、控制器管理器和 etcd。
  2. Worker Nodes:运行应用程序容器的节点。
  3. etcd:一个分布式键值存储,用于存储所有集群数据。
  4. Kubelet:在每个节点上运行的守护进程,负责维护容器的生命周期。
  5. Kube-proxy:在每个节点上运行的网络代理,用于服务发现和负载均衡。

工作流程

  1. 定义资源:通过 YAML 或 JSON 文件定义所需的资源,如 Pods、Deployments、Services 等。
  2. 应用资源:使用 kubectl apply 命令将定义的资源应用到集群中。
  3. 监控和管理:使用 kubectl 命令行工具或其他 Kubernetes 客户端工具来监控和管理资源。
  4. 自动化:通过设置适当的控制器和自动化规则,Kubernetes 可以自动执行滚动更新、故障恢复和扩展等操作。

Kubernetes 的优势:

  1. 自动化:自动化应用程序的部署、扩展和运维任务。
  2. 可扩展性:可以根据需求轻松地扩展或缩减资源。
  3. 高可用性:通过自我修复和自动替换失败的容器来确保应用程序的持续运行。
  4. 灵活性和可移植性:支持多种容器运行时和云提供商,提供一致的运行环境。
  5. 强大的生态系统:拥有庞大的社区支持和丰富的第三方工具和服务。

Kubernetes 是一个功能强大的容器编排平台,它通过提供自动化、可扩展性和高可用性等特性,极大地简化了容器化应用程序的管理。Kubernetes 的灵活性和强大的生态系统使其成为企业级容器化策略的理想选择。随着云原生技术的发展,Kubernetes 将继续在现代化基础设施和应用程序部署中发挥关键作用。

Docker Swarm

Docker Swarm 是 Docker 的原生集群和容器编排功能,它允许用户将多个 Docker 主机转换成一个虚拟主机,以便在集群中运行和管理容器。Swarm 模式提供了一种简单、可扩展的方式来部署和管理跨多个主机的容器化应用程序。

关键特性

  1. 服务发现:Swarm 模式允许服务自动发现和负载均衡,无需复杂的网络配置。
  2. 可扩展性:可以通过添加更多的 Docker 主机来轻松扩展 Swarm 集群。
  3. 高可用性:Swarm 集群可以配置为高可用性模式,确保服务持续运行。
  4. 安全性:Swarm 集群使用 TLS 加密来保护节点之间的通信,并且支持 Raft 算法来保证集群状态的一致性。
  5. 多主机网络:Swarm 支持创建覆盖网络,使得不同主机上的容器可以像在同一网络中一样通信。
  6. 存储管理:Swarm 允许定义和管理卷,这些卷可以是本地的,也可以是第三方存储解决方案。
  7. 任务调度:Swarm 可以自动将服务的任务调度到集群中的任何节点上,根据资源使用情况和用户定义的策略进行优化。

工作原理

  1. 初始化 Swarm 集群:首先,需要初始化一个 Docker 主机作为 Swarm 集群的管理者(Manager)节点。
  2. 添加节点:然后,可以将其他 Docker 主机添加到集群中,作为工作节点(Worker)。
  3. 创建服务:在 Swarm 模式下,用户可以创建服务(Services),每个服务由多个容器实例组成,这些实例可以跨多个主机运行。
  4. 调度任务:Swarm 根据集群状态和定义的策略自动调度容器任务到不同的节点上。
  5. 负载均衡和服务发现:Swarm 内置了负载均衡器,可以自动将流量分发到服务的各个实例。同时,服务发现机制允许容器自动找到并连接到其他服务。

如何使用

  1. 初始化 Swarm 模式

    docker swarm init --advertise-addr <MANAGER-IP>

    使用 docker swarm init 命令初始化一个新的 Swarm 集群,并指定管理节点的 IP 地址。

  2. 添加工作节点

    docker swarm join --token <WORKER-TOKEN> <MANAGER-IP>:2377

    使用 docker swarm join 命令将工作节点添加到集群中。

  3. 创建服务

    docker service create --name my-service -p 80:80 my-image

    使用 docker service create 命令创建一个新的服务,并指定服务名称、端口映射和镜像。

  4. 管理 Swarm 集群: Docker 提供了一系列命令来管理 Swarm 集群,例如 docker node ls 查看节点、docker service ls 查看服务、docker service scale 扩展服务等。

Docker Swarm 提供了一种简单而强大的方式来管理跨多个 Docker 主机的容器。通过 Swarm 模式,用户可以轻松地创建和管理服务,实现负载均衡和服务发现,同时保持集群的高可用性和可扩展性。对于希望利用 Docker 进行容器编排的用户来说,Swarm 是一个值得考虑的选项。

微服务架构

微服务架构是一种软件开发风格,它将应用程序分解为一组小型、松耦合的服务。每个服务运行在自己的容器中,可以独立部署、扩展和维护。Docker 非常适合实现微服务架构,因为它简化了服务的打包、分发和运行。

持续集成/部署(CI/CD)

Docker 可以与 CI/CD 工具(如 Jenkins、GitLab CI、CircleCI 等)集成,自动化软件开发的构建、测试和部署过程。通过 Docker,开发人员可以在本地构建镜像,然后将它们推送到 Docker Hub 或私有仓库,并在生产环境中部署。

虚拟化技术

虚拟化技术允许在单个物理服务器上运行多个虚拟机(VMs),每个虚拟机都有自己的操作系统。Docker 容器与传统的虚拟机相比,具有更少的资源开销和更快的启动时间,因为它们共享宿主机的操作系统内核,而不是完整的操作系统。

工作流程

Docker 的工作流程涉及多个步骤,从创建 Dockerfile 到部署容器化应用程序。以下是 Docker 工作流程的详细步骤:

  1. 编写 Dockerfile

    Dockerfile 是一个文本文件,包含了构建 Docker 镜像所需的指令。它通常包括以下指令:

    • FROM:指定基础镜像。

    • RUN:在镜像中执行命令。

    • CMD:设置容器启动时默认执行的命令。

    • COPYADD:将文件从构建上下文复制到镜像中。

    • ENV:设置环境变量。

    • EXPOSE:声明容器监听的端口。

    • ENTRYPOINT:设置容器启动时的入口点。

    • VOLUME:创建数据卷,用于数据持久化。

  2. 构建镜像

    使用 docker build 命令根据 Dockerfile 构建镜像。构建过程会在 Dockerfile 所在目录(构建上下文)中执行,并将结果保存为新的镜像。

    docker build -t my_image .
  3. 推送镜像到仓库(可选)

    将构建好的镜像推送到 Docker Hub 或其他容器仓库,以便在其他环境中使用或共享。

    docker push my_image
  4. 运行容器

    使用 docker run 命令从镜像中启动一个新的容器。可以指定端口映射、卷挂载、环境变量等参数。

    docker run -d --name my_container -p 8080:80 my_image
  5. 管理容器

    使用 Docker 命令行工具管理运行中的容器,包括启动、停止、重启、查看日志等。

    • 启动容器:docker start my_container

    • 停止容器:docker stop my_container

    • 重启容器:docker restart my_container

    • 查看容器日志:docker logs my_container

  6. 网络和数据管理

    配置容器网络和数据卷,以实现容器间通信和数据持久化。

    • 创建自定义网络:docker network create my_network

    • 挂载数据卷:docker run -v /host/path:/container/path my_image

  7. 容器编排(可选)

    在复杂的部署场景中,可以使用容器编排工具(如 Docker Compose、Docker Swarm 或 Kubernetes)来管理多个容器和相关服务。

    • 使用 Docker Compose:通过 docker-compose.yml 文件定义和运行多容器应用程序。

    • 使用 Docker Swarm:创建 Swarm 集群并部署服务。

    • 使用 Kubernetes:管理大规模容器化应用程序的部署、扩展和运维。

  8. 持续集成/持续部署(CI/CD)

    • 集成 CI/CD 工具,如 Jenkins、GitLab CI 或 CircleCI,自动化构建、测试和部署流程。

Docker 的工作流程从编写 Dockerfile 开始,通过构建镜像、推送到仓库、运行容器、管理容器生命周期、配置网络和数据卷,到使用容器编排工具和 CI/CD 流程,为开发者和运维人员提供了一套完整的容器化解决方案。这套流程不仅简化了应用程序的部署和管理,还提高了开发和运维的效率和可靠性。

使用

Docker 是一个开源的商业产品,有两个版本:社区版(CE)和企业版(EE)。对于个人开发者,通常使用社区版。安装 Docker CE 请参考官方文档。

常用命令

  • docker versiondocker info:查看 Docker 版本信息。
  • docker image ls:列出本机的所有 image 文件。
  • docker image rm [imageName]:删除 image 文件。
  • docker container ls:列出本机正在运行的容器。
  • docker container ls --all:列出本机所有容器,包括终止运行的容器。
  • docker container rm [containerID]:删除终止运行的容器文件。
  • docker image pull [imageName]:从 Docker Hub 抓取 image 文件到本地。
  • docker image push [username]/[repository]:[tag] 命令可以将本地的 image 文件推送到 Docker Hub。
  • docker container run [imageName]:从 image 文件生成容器。
  • docker container start [containerID]:启动已经生成、已经停止运行的容器文件。
  • docker container stop [containerID]:终止容器运行。
  • docker container logs [containerID]:查看 docker 容器的输出。
  • docker container exec -it [containerID] /bin/bash:进入一个正在运行的 docker 容器。

实践案例

hello world

通过运行最简单的 image 文件 "hello world" 来感受 Docker。可以通过 docker image pull library/hello-world 命令将 image 文件从仓库抓取到本地,然后运行容器。

Java
1
https://gitee.com/nousin/study-space.git
git@gitee.com:nousin/study-space.git
nousin
study-space
study-space
master

搜索帮助