前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >五分钟学SRE系列<六> - 深入浅出docker端口映射与存储卷

五分钟学SRE系列<六> - 深入浅出docker端口映射与存储卷

原创
作者头像
五分钟学SRE
发布2024-05-10 02:55:44
2510
发布2024-05-10 02:55:44
举报
文章被收录于专栏:五分钟学K8S

端口映射

图片
图片

▌Linux 底层原理

    在 Linux 操作系统中,端口映射依赖于网络命名空间(Network Namespace)和 iptables 技术。每个网络命名空间都提供了一个隔离的网络环境,使得网络配置和接口与其他命名空间中的相同部分隔离开来。iptables 是一个强大的工具,它可以对进入和离开特定命名空间的网络流量进行细致的控制和转换。这对于容器化尤为重要,因为它允许多个容器拥有自己独立的网络配置而不相互冲突。

▌Docker 端口映射原理

    Docker 利用 iptables 来实现端口映射,使得容器内的服务能够通过宿主机的公共端口与外界通信。当启动容器并指定端口映射时,Docker 会在宿主机上创建新的 iptables 规则,这些规则定义了如何将外部流量路由至容器内部。这通常涉及两个步骤:

  1. DNAT (Destination NAT):将宿主机上指定的端口(例如,宿主机的 88 端口)的入站流量重定向至容器的内部端口(例如,容器的 80 端口)。
  2. SNAT (Source NAT):将容器发出的响应流量反向路由回宿主机的原始端口,以便客户端可以接收到正确的响应。

这种机制不仅保证了容器对外界网络的透明性,还确保了容器的安全性和网络隔离性。

图片
图片

▌常见写法与案例分析

基本端口映射
代码语言:javascript
复制
docker container run -d -p 88:80 nginx:1.20.1

在这个命令中,我们将宿主机的 88 端口映射到容器内部的 80 端口,使得任何访问宿主机 88 端口的 HTTP 请求都会被转发到容器的 80 端口。

指定协议
代码语言:javascript
复制
docker container run -d -p 89:80/tcp nginx:1.20.1

虽然默认情况下 Docker 假设映射是基于 TCP 的,但在这里明确指定协议有助于清晰理解端口映射的意图。

UDP 端口映射
代码语言:javascript
复制
docker container run -d -p 53:53/udp nginx:1.20.1

对于 UDP 服务,如 DNS,需要明确指定协议以确保正确配置 iptables 规则。

随机端口映射
代码语言:javascript
复制
docker container run -dP nginx:1.20.1

使用 -P 参数时,Docker 自动为所有通过 EXPOSE 指令在 Dockerfile 中声明的端口分配宿主机的随机高端口。

端口范围映射
代码语言:javascript
复制
docker container run -idp 10.0.0.101:20-21:20-21 alpine

这里将宿主机的 20-21 端口范围映射到容器的同一端口范围内,适用于需要连续端口的情况。

存储卷

    在 Docker 的世界里,容器是短暂的,而数据需要持久化。Docker 数据卷作为解决这一矛盾的关键技术,允许用户将数据持久化存储,并在容器间共享数据。本文将深入探讨 Docker 数据卷的概念、作用、底层原理以及具体的使用案例。

▌数据卷的概念

Docker 数据卷是 Docker 技术中的一个核心特性,它提供了一种绕过联合文件系统(Union File System)的方式来持久化存储数据,并实现容器间的数据共享。

  • 持久化存储:容器产生的数据可以通过数据卷独立于容器的生命周期进行持久化保存。
  • 数据共享:容器之间可以通过数据卷实现数据的共享。

▌数据卷的作用与特点

数据卷的设计目的是数据的持久化和共享,具有以下特点:

  1. 独立于容器生命周期:数据卷的生命周期与容器的生命周期无关,即使容器被删除,数据卷中的数据也不会丢失。
  2. 即时生效:对数据卷的更改会立即反映在所有挂载该卷的容器中。
  3. 不包含在镜像更新中:数据卷中的更改不会影响 Docker 镜像的更新,这有助于分离容器的静态镜像和动态数据。
  4. 生命周期管理:数据卷的生命周期会持续到没有任何容器使用它为止。

▌数据卷的底层原理

    Docker 数据卷背后的原理是利用了 Linux 的文件系统挂载机制。在 Docker 中,数据卷是文件系统的一个特定区域,它可以被一个或多个容器挂载。这些挂载点独立于容器的生命周期,因此提供了数据的持久化存储。

▌数据卷的操作与命令

创建数据卷
代码语言:javascript
复制
docker volume create my-volume
运行时挂载数据卷
代码语言:javascript
复制
docker run -d -v my-volume:/opt/sre-docker sre-nginx:v2.075662332cb5a1e2242fd24ec18c39bcaad9ab0fdda2a6967399a49221dbbdac7

这里 my-volume 是已创建的数据卷,/opt/sre-docker 是容器内部的挂载点。

查看挂载信息
代码语言:javascript
复制
docker inspect 容器IDdocker inspect 75662332cb5a        "Mounts": [            {                "Type": "volume",                "Name": "my-volume",                "Source": "/var/lib/docker/volumes/my-volume/_data",                "Destination": "/opt/sre-docker",                "Driver": "local",                "Mode": "z",                "RW": true,                "Propagation": ""            }        ],
删除数据卷
代码语言:javascript
复制
docker volume rm my-volume
挂载宿主机目录
代码语言:javascript
复制
docker run -v /宿主机路径:/容器内路径 myimage
Dockerfile 中添加数据卷

Dockerfile 中使用 VOLUME 指令:

代码语言:javascript
复制
VOLUME ["/dataVolumeContainer"]
数据卷容器

通过命名的容器挂载数据卷,其他容器可以使用 --volumes-from 选项来共享数据。

代码语言:javascript
复制
docker run -d --name data-container -v /data busybox9cf1605b91a997c55d5781cf137716f53ca5ac42aedf33cc92bc44522126c87adocker run -d --name consumer-container --volumes-from data-container alpined5771ff7d53b4839fbc5798ec1d92fea67447addacdff840c0fe8bc230055065

▌案例分析

数据持久化案例

场景:需要持久化存储数据库数据。

操作

  1. 创建数据卷 db-volume
  2. 使用 db-volume 运行数据库容器。

命令

代码语言:javascript
复制
docker volume create db-volumedocker run -d -v db-volume:/var/lib/mysql --name db-container mysql

解析:这样,即使 db-container 被删除,db-volume 中的数据也不会丢失。

容器间数据共享案例

场景:多个应用容器需要共享配置文件。

操作

  1. 运行一个包含配置文件的容器 config-container
  2. 使用 --volumes-from 让其他容器共享这些配置文件。

命令

代码语言:javascript
复制
docker run -d --name config-container -v /config alpinedocker run -d --name app-container --volumes-from config-container busybox

解析app-container 可以访问 config-container 中的 /config 目录,实现配置文件的共享。

数据卷的备份与迁移

数据卷的备份与迁移是 Docker 数据管理中的重要部分。由于数据卷独立于容器的生命周期,它们为数据的备份和迁移提供了便利。以下是具体的操作步骤和案例分析

备份命令
代码语言:javascript
复制
docker run -v my-mysql-volume:/var/lib/mysql --volumes-from mysql_container --rm -it busybox tar cvzf mysql_backup.tar.gz /var/lib/mysql
备份解析
  • docker run:创建一个新的容器来执行备份任务。
  • -v my-mysql-volume:/var/lib/mysql:将 MySQL 数据卷挂载到新容器中。
  • --volumes-from mysql_container:从运行 MySQL 的容器 mysql_container 中挂载数据卷。
  • --rm:备份完成后,自动删除新创建的容器。
  • -it:交互式终端。
  • busybox tar cvzf mysql_backup.tar.gz /var/lib/mysql:使用 BusyBox 的 tar 命令创建压缩文件。

案例解析

步骤 1:在源服务器上备份数据卷。

代码语言:javascript
复制
docker run -v my-mysql-volume:/var/lib/mysql --volumes-from mysql_container --rm -it busybox tar cvzf /path/to/backup/mysql_backup.tar.gz /var/lib/mysql

步骤 2:将备份文件复制到目标服务器。

可以使用 scp 或其他文件传输方法。

步骤 3:在目标服务器上恢复数据卷。

代码语言:javascript
复制
docker run -v my-mysql-volume:/var/lib/mysql --volumes-from target_mysql_container --rm -it busybox tar xvzf /path/to/backup/mysql_backup.tar.gz

步骤 4:启动目标服务器上的 MySQL 容器。

代码语言:javascript
复制
docker run -d -v my-mysql-volume:/var/lib/mysql --name target_mysql_container mysql

▌温馨提示

  • Docker卷的生命周期独立于容器,非常适合持久化存储。
  • 使用docker volume inspect可以查看卷的详细信息。
  • docker volume prune命令可以清理不再使用的卷,节省资源。
  • 存储卷是容器间数据共享的理想选择,但需注意数据一致性。
  • 在设计存储解决方案时,要考虑到数据的安全性和完整性。

通过合理使用数据卷,可以实现容器数据的持久化存储和容器间的高效数据共享,从而提高 Docker 容器的灵活性和可用性。

小结

 Docker 的端口映射和存储卷是构建和运行容器化应用的关键特性。端口映射允许外部访问容器内部的服务,而存储卷提供了数据持久化和共享的解决方案。理解并熟练使用这些特性,对于任何希望在生产环境中有效使用 Docker 的 SRE 或开发者来说都是必要的。

我正在参与2024腾讯技术创作特训营最新征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 端口映射
    • ▌Linux 底层原理
      • ▌Docker 端口映射原理
        • ▌常见写法与案例分析
          • 基本端口映射
          • 指定协议
          • UDP 端口映射
          • 随机端口映射
          • 端口范围映射
      • 存储卷
        • ▌数据卷的概念
          • ▌数据卷的作用与特点
            • ▌数据卷的底层原理
              • ▌数据卷的操作与命令
                • ▌案例分析
                  • 数据卷的备份与迁移
                    • ▌温馨提示
                    相关产品与服务
                    容器服务
                    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档