DevOps
docker
docker
  • 基础知识
    • 概述
      • 核心概念
      • Docker 引擎
      • 基本架构
      • 联合文件系统
      • 网络虚拟化
    • 安装
      • 安装Docker Engine
      • 以非 root 用户使用 Docker
      • 配置 Docker 服务
    • 3. Docker镜像
      • 3.1 获取镜像(pull)
      • 3.2 查看镜像信息
        • images
        • tag
        • inspect
        • history
      • 3.3 搜寻镜像(search)
      • 3.4 删除镜像(rmi)
      • 3.5 清理镜像(prune)
      • 3.6 创建镜像
        • 基于已有容器创建
        • 基于本地模板导入
        • 基于Dockerfile创建
      • 3.7 导出镜像(save)
      • 3.8 导入镜像(load)
      • 3.9 上传镜像(push)
    • 4. Docker容器
      • 4.1 新建容器(create)
      • 4.2 启动容器(start)
      • 4.3 新建并启动容器(run)
      • 4.4 查看容器输出(logs)
      • 4.5 暂停容器(pause)
      • 4.6 恢复容器(unpause)
      • 4.7 停止止容器(stop)
      • 4.8 清除容器(prune)
      • 4.9 重启容器(restart)
      • 4.10 进入容器
      • 4.11 删除容器(rm)
      • 4.12 导出容器(export)
      • 4.13 导入容器(import)
      • 4.14 查看容器详情(inspect)
      • 4.15 查看容器内进程(top)
      • 4.16 查看统计信息(stats)
      • 4.17 复制文件(cp)
      • 4.18 查看变更(diff)
      • 4.19 更新配置(update)
    • 5. Docker仓库
      • 5.1 Docker Hub
      • 5.2 本地私有仓库
        • 使用HTTPS协议
        • 添加用户认证
        • 使用push时遇到的一些坑
    • 6. Docker数据管理
      • 6.1 数据卷
      • 6.2 数据卷容器
      • 6.3 利用数据卷容器来迁移数据
    • 7. 端口映射与容器互联
      • 7.1 端口映射
      • 7.2 容器互联
    • 8. Dockerfile
      • 8.1 基本结构
      • 8.2 指令说明
        • ARG
        • FROM
        • LABEL
        • EXPOSE
        • ENV
        • ENTRYPOINT
        • VOLUME
        • USER
        • WORKDIR
        • ONBUILD
        • STOPSIGNAL
        • HEALTHCHECK
        • SHELL
        • RUN
        • CMD
        • ADD
        • COPY
      • 8.3 创建镜像
      • 8.4 最佳实践
    • 9. Compose
      • 9.1 安装
      • 9.2 Compose文件
        • 9.2.1 services
        • 9.2.2 networks
        • 9.2.3 多文件Compose
          • Extend
          • Merge
          • Include
        • 9.2.4 锚点和别名
      • 9.3 Compose命令
      • 9.4 实例
  • 中间件安装
    • 安装tomcat
    • 安装redis
      • 单机
      • Cluster集群
    • 安装mysql
    • 安装ssh服务
      • 基于commit命令创建
      • 使用Dockerfile创建
    • 安装Apache
    • 安装ngnix
  • 操作系统镜像
    • BusyBox
    • ☑️Alpine
    • Debian/Ubuntu
    • CentOS/Fedora
  • Tips
    • docker 引擎开启远程访问
    • dockerfile-maven-plugin
    • IDEA 连接远程 docker
Powered by GitBook
On this page
  • 基本原理
  • 网络创建过程

Was this helpful?

Edit on GitHub
  1. 基础知识
  2. 概述

网络虚拟化

Previous联合文件系统Next安装

Last updated 1 year ago

Was this helpful?

Docker 的本地网络实现其实就是利用了 Linux 上的网络命名空间和虚拟网络设备(特别是 veth pair)。

基本原理

Docker 中的网络接口默认都是虚拟接口。虚拟接口的最大优势就是转发效率极高。这是因为 Linux 通过在内核中进行数据复制来实现虚拟接口之间的数据转发,即发送接口的发送缓存中的数据包将被直接复制到接收接口的接收缓存中,而无须通过外部物理网络设备进行交换。对于本地系统和容器内系统来看,虚拟接口跟一个正常的以太网卡相比并无区别,只是它的速度要快得多。

Docker 容器网络就很好地利用了 Linux 虚拟网络技术,它在本地主机和容器内分别创建一个虚拟接口,并连通(这样的一对虚拟接口叫做 veth pair),如图所示:

网络创建过程

一般情况下,Docker 创建一个容器的时候,会具体执行如下操作:

  1. 创建一对虚拟接口,分别放到本地主机和新容器的命名空间中;

  2. 本地主机一端的虚拟接口连接到默认的 docker0 网桥或指定网桥上,并具有一个以 veth 开头的唯一名字,如 veth1234;

  3. 容器一端的虚拟接口将放到新创建的容器中,并修改名字作为 eth0。这个接口只在容器的命名空间可见;

  4. 从网桥可用地址段中获取一个空闲地址分配给容器的 eth0(例如 172.17.0.2/16),并配置默认路由网关为 docker0 网卡的内部接口 docker0 的 IP 地址(例如 172.17.42.1/16)。

完成这些之后,容器就可以使用它所能看到的 eth0 虚拟网卡来连接其他容器和访问外部网络。

在使用 docker [container] run 命令启动容器的时候,可以通过 --net 参数来指定容器的网络配置。有 5 个可选值 bridge、none、container、host 和用户定义的网络:

  • --net=bridge:默认值,在 Docker 网桥 docker0 上为容器创建新的网络栈;

  • --net=none:让 Docker 将新容器放到隔离的网络栈中,但是不进行网络配置。之后,用户可以自行配置;

  • --net=container:NAME_or_ID:让 Docker 将新建容器的进程放到一个已存在容器的网络栈中,新容器进程有自己的文件系统、进程列表和资源限制,但会和已存在的容器共享 IP 地址和端口等网络资源,两者进程可以直接通过 lo 环回接口通信;

  • --net=host:告诉 Docker 不要将容器网络放到隔离的命名空间中,即不要容器化容器内的网络。此时容器使用本地主机的网络,它拥有完全的本地主机接口访问权限。容器进程跟主机其他 root 进程一样可以打开低范围的端口,可以访问本地网络服务(比如 D-bus),还可以让容器做一些影响整个主机系统的事情,比如重启主机。因此使用这个选项的时候要非常小心。如果进一步使用 --privileged=true 参数,容器甚至会被允许直接配置主机的网络栈;

  • --net=user_defined_network:用户自行用 network 相关命令创建一个网络,之后将容器连接到指定的已创建网络上去。