Docker网络network详解

这篇具有很好参考价值的文章主要介绍了Docker网络network详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、概述

Docker容器每次重启后容器ip是会发生变化的。

这也意味着如果容器间使用ip地址来进行通信的话,一旦有容器重启,重启的容器将不再能被访问到。

Docker 网络就能够解决这个问题。

Docker 网络主要有以下两个作用:

  • 容器间的互联和通信以及端口映射

  • 容器IP变动时候可以通过服务名直接网络通信而不受到影响

因此只要是处于同一个Docker 网络下的容器就可以使用服务名进行直接访问,而无需担心重启。

这也是Docker 网络最基本和常用的应用场景。

二、Docker的四种网络模式

网络模式 命令指定方式 描述
bridge –network bridge 为每一个容器分配、设置 ip ,并将容器连接到 docker0 虚拟网桥上,这也是默认网络模式
host –network host 容器不会创建自己的网卡,配置 ip 等,而是使用宿主机的 ip 和端口
container –network 容器名称或id 新创建的容器不会创建自己的网卡和配置自己的ip,而是和一个指定的容器共享ip、端口范围
none –network none 容器有独立的Network namespace,但并没有对其进行任何网络设置

如果觉得–network太长了也可以使用简写-net,效果是一样的

Docker 安装完成时,一般会自动创建三个网络:

NETWORK ID          NAME                DRIVER              SCOPE
40547f9137a5        bridge              bridge              local
b40bdb8f0356        host                host                local
0c7f9938f868        none                null                local

可以使用下列命令查看:

docker network ls

2.1 桥接模式–bridge

Docker服务启动 时,默认会创建一个名称为 docker0 网桥(其上有一个名称为 docker0 内部接口)。

该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。

Docker会 默认指定docker0ip地址和子网掩码,让主机和容器之间可以通过网桥相互通信。

1)桥接模式原理图

docker network,Docker,docker,网络,容器

2)桥接模式解析
  • Docker使用Linux桥接的方式,在宿主机虚拟一个Docker容器网桥(docker0)。

    Docker每启动一个容器时会根据Docker网桥的网段分配给容器一个ip地址。

    同时Docker网桥是每个容器的默认网关。

    同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。

  • docker run创建容器的时,未指定network的容器默认的网络模式就是bridge,使用的就是docker0

    在宿主机ifconfig,就可以看到docker0和自己创建的network

    • eth0eth1……代表网卡一,网卡二……
    • lo代表127.0.0.1(localhost)
    • inet addr表示网卡的ip地址
  • 网桥docker0会创建一对对等虚拟设备接口:一个叫veth,另一个叫eth0,成对匹配。

    • 整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth

      在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair);

    • 每个容器实例内部也有一块网卡,每个接口叫eth0

    • docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对。

2.2 主机模式–host

不创建任何网络接口,直接使用宿主机的 ip地址与外界进行通信,不再需要额外进行NAT转换。

在主机模式下不能publish port

1)主机模式原理图

docker network,Docker,docker,网络,容器

2)主机模式解析

容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace

容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口。

容器共享宿主机网络ip,这样的好处是外部主机与容器可以直接通信。

小拓展:

Docker启动时指定--network=host-net=host,如果还指定了-p映射端口,此时就会有如下警告:

NARNING: Published ports are discarded when using host network mode

并且通过-p设置的参数将不会起到任何作用,端口号会以主机端口号为主,重复时则递增。

可以选择无视这个警告或者使用Docker的其他网络模式,例如--network=bridge

2.3 容器模式–container

1)容器模式原理图

docker network,Docker,docker,网络,容器

2)容器模式解析

新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。

新创建的容器不会创建自己的网卡,配置自己的ip,而是和一个指定的容器共享ip、端口范围等。

两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。

2.4 none模式

none模式下,并不为Docker容器进行任何网络配置。

也就是说,这个Docker容器没有网卡、ip、路由等信息,只有一个lo接口。

lo标识代表禁用网络功能,即:127.0.0.1,本地回环的意思

需要我们自己为Docker容器添加网卡、配置IP等。

三、常用命令

在学习Docker 各种网络模式前,先要了解Docker 网络的常用命令。

2.1 查看网络

docker network ls

2.2 创建网络

# 基础用法
docker network create 网络名称

# 创建网络时是可以添加一系列参数的:
# --driver:驱动程序类型
# --gateway:主子网的IPV4和IPV6的网关
# --subnet:代表网段的CIDR格式的子网
# mynet:自定义网络名称
docker network create --driver=bridge --gateway=192.168.137.1 --subnet=192.168.137.0/16 mynet

不指定任何选项的时候默认的–driver(网络模式)也是bridge(桥接)

但是gateway和subnet会自动生成

2.3 查看网络数据源

docker network inspect 网络名称 

2.4 将容器连接到指定网络

docker network connect 网络名称 容器名称

2.5 断开容器的网络

docker network disconnect 网络名称 容器名称

2.6 删除所有不在使用的网络

docker network prune

2.7 删除一个或多个网络

docker network rm 网络名称 

四、使用示例

4.1 创建容器时挂载网络

1)创建一个桥接类型的网络

docker network create --driver=bridge --gateway=192.168.137.1 --subnet=192.168.137.0/16 myNet1

2)创建并运行容器时指定网络

docker run --name containerName -p 80:80 -d --network myNet1 myNginx

3)不想用时可以断开网络

docker network disconnect myNet1 myNginx

4.2 容器已存在时连接到新网络

1)创建一个桥接类型的网络

docker network create --driver=bridge --gateway=192.168.137.1 --subnet=192.168.137.0/16 myNet2

2)为容器连接新的网络

# 执行后myNginx容器的网络就变成了myNet2
docker network connect myNet2 myNginx

3)不想用时可以断开网络

docker network disconnect myNet2 myNginx

4.3 使用docker-compose给一组容器挂载网络

有如下docker-compose.yml文件。

一般来说此时使用如下面命令编排的一组容器时会默认创建一个网络,并且这组容器全部都会加入到网络当中。

docker-compose up -d

这也是这一组容器之间可以直接使用服务名去直接通信的原因。

version: '3'
services:
  nginx:
    image: nginx:alpine
    container_name: nginx-dev
    environment:
      - TZ=Asia/Shanghai
    ports:
      - "80:80"
    volumes:
      - /usr/local/docker/workspace/nginx/html:/usr/share/nginx/html
      - /usr/local/docker/workspace/nginx/conf/nginx.conf:/etc/nginx/conf.d/default.conf
      
  mysql:
    image: mysql:8
    container_name: mysql-dev
    environment:
      - TZ=Asia/Shanghai
      - MYSQL_ROOT_PASSWORD=89225300
      - MYSQL_DATABASE=nacos_config
      - MYSQL_USER=gddst
      - MYSQL_PASSWORD=123456
    ports:
      - "3306:3306"
    volumes:
      - /usr/docker/docker/workspace/mysql/data:/var/lib/mysql
      - /usr/docker/docker/workspace/mysql/mysql.cnf:/etc/mysql/conf.d/mysql.cnf
      - /usr/docker/docker/workspace/mysql/initdb:/docker-entrypoint-initdb.d

但是如果想要显示的指定网络,可以参考如下配置:

networks:
  mynet:
    driver: bridge
    ipam:
      config:
        - subnet: "192.168.0.101/16"
          gateway: 192.168.0.100

配置好网络后,在每个服务下可以指定使用的网络,这里就以nginx为例:

version: '3'
services:
  nginx:
    image: nginx:alpine
    container_name: nginx-dev
    environment:
      - TZ=Asia/Shanghai
    ports:
      - "80:80"
    volumes:
      - /usr/local/docker/workspace/nginx/html:/usr/share/nginx/html
      - /usr/local/docker/workspace/nginx/conf/nginx.conf:/etc/nginx/conf.d/default.conf
    networks:
      - mynet
      
networks:
  mynet:
    driver: bridge
    ipam:
      config:
        - subnet: "192.168.0.101/16"
          gateway: 192.168.0.100

这样容器编排时,所有容器都会加入到mynet这个自定义网络当中了。文章来源地址https://www.toymoban.com/news/detail-782883.html

到了这里,关于Docker网络network详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Docker】Docker Network(网络)

    容器的网络默认与宿主机及其他容器都是相互隔离 , 但同时我们也要考虑下面的一些问题, 比如: 多个容器之间是如何通信的 容器和宿主机是如何通信的 容器和外界主机是如何通信的 容器中要运行一些网络应用(如 nginx、 web 应用、数据库等),如果要让外部也可以访问这

    2024年04月27日
    浏览(39)
  • 【Docker】Docker高级网络(NetWork)

    参考文档:高级网络配置 · Docker – 从入门到实践 (docker-practice.github.io) 当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。 同时,Docker 随机分配一个本地未占用的私有

    2024年02月16日
    浏览(33)
  • 同一台宿主机不同的docker-compose下的容器互相通信;查看docker的network使用情况

    我的 docker 版本: 24.0.2 docker-compose 版本: 1.29.2 linux 是 ubuntu 20.04 在使用 docker 部署环境的时候大多用 docker-compose 来编排,参数的配置会清晰一点。 通常一个容器一个 docker-compose.yml 文件。 这就使得不同 docker-compose 下的容器不能自动的互相通信。 那么顺着这个思路往下想,

    2024年02月08日
    浏览(45)
  • Docker学习:容器五种(3+2)网络模式 | bridge模式 | host模式 | none模式 | container 模式 | 自定义网络模式详解

    本讲是从Docker系列讲解课程,单独抽离出来的一个小节,重点介绍 容器网络模式 , 属于了解范畴,充分了容器的网络模式, 更有助于更好的理解Docker的容器之间的访问逻辑 。 疑问: 为什么要了解容器的网络模式? 首先, 容器之间 虽然不是物理隔离,但是它们彼此之间

    2024年02月09日
    浏览(42)
  • docker network网络

    bridge是docker默认网络模式,docker安装后会选择一个私有网段作为bridge的子网,在我们创建容器时默认会将容器网络加入到这个子网中。 原理:Docker Daemon(后台进程) 利用 veth pair 技术 ,在宿主机上创建一对对等虚拟网络接口设备(veth pair)用于连接网桥(docker0)和容器,

    2024年01月24日
    浏览(32)
  • 一文解读Docker 网络Network

    目录 基本介绍 四种网络模式 常用命令  Docker网络是Docker容器之间和容器与外部网络之间的通信和连接的一种机制。在Docker中,每个容器都可以有自己的网络栈,包括网络接口、IP地址和网络配置。Docker网络提供了一种灵活且可定制的方式, 使得容器之间可以相互通信,并与

    2024年02月05日
    浏览(28)
  • Docker进阶 - 7. docker network 网络模式之 host

    目录 1. host 模式概述 2. host模式代码语法 3. docker inspect 查看 bridge/host模式 容器元数据 4. ip addr 进入 tomcat83 (host模式) 容器内部查看容器ip 5. 如何访问启动 tomcat83 (host模式) 1. host 模式概述 直接使用宿主机的IP地址 与外界进行通信,不再需要额外进行NAT转换。容器将不会获得一

    2024年02月11日
    浏览(32)
  • Docker 启动容器报错: Error response from daemon: network XXX not found

    以上为报错信息,之前的桥接这些都是配置好的。 解决方案: 即可解决。 场景:         在做生产上线的时候,之前docker启动的gitlab,突然端口不能被访问到了,查看了对应服务器监听端口也没问题。可以ping通,telnet端口就是不通。着急上线,最后不得不重启服务器,重

    2024年02月12日
    浏览(65)
  • 【Docker】Docker network之bridge、host、none、container以及自定义网络的详细讲解

    🚀欢迎来到本文🚀 🍉个人简介:陈童学哦,目前学习C/C++、算法、Python、Java等方向,一个正在慢慢前行的普通人。 🏀系列专栏:陈童学的日记 💡其他专栏:C++STL,感兴趣的小伙伴可以看看。 🎁希望各位→点赞👍 + 收藏⭐️ + 留言📝 ​ ⛱️万物从心起,心动则万物动🏄

    2024年02月12日
    浏览(37)
  • 【Docker存储】Docker的容器迁移方式详解

    在Docker中,有多种方式可以进行容器的迁移,以便在不同的环境中部署和运行。 Docker镜像迁移: 通过将Docker镜像导出为文件,然后在目标环境中导入该文件,可以实现镜像的迁移。 导出镜像:在源环境中运行以下命令,将镜像导出为文件。 导入镜像:将导出的镜像文件传输

    2024年02月08日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包