docker — 容器网络

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

一、概述

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

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

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

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

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

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

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

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

二 Docker网络实现原理

  1. docker使用linux桥接,在宿主机虚拟一个docker容器网桥(docker0)
  2. docker启动一个容器时会根据docker网桥的网段分配给容器一个IP地址,称为Container-IP
  3. 同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能通过容器的Container-IP直接通信。

docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法直接通过Container-IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主机(端口映射),即docker run 创建容器的时候,通过-p或者-P参数来启用。访问容器的时候,就通过【宿主机IP】:【容器端口】访问容器。

二、Docker的四种网络模式

二、Docker的四种网络模式

网络模式 命令指定方式 描述
bridge –networkbridge 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会 默认指定docker0 的 ip地址和子网掩码,让主机和容器之间可以通过网桥相互通信。

1)桥接模式原理图

docker 容器网络,linux,docker,docker,网络

2)桥接模式解析

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

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

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

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

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

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

eth0,eth1……代表网卡一,网卡二……
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 容器网络,linux,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 容器网络,linux,docker,docker,网络

2)容器模式解析

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

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

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

2.4 none模式

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

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

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

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

三、常用命令

在学习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这个自定义网络当中了。

五、 docker网络端口映射

在Docker中,内网和外网映射是非常重要的概念。这篇文章将会为您介绍如何在Docker中进行内网和外网映射。Docker中,每个容器都有自己的IP地址,这个IP地址是在Docker内部使用,不可直接从外部访问。然而,为了在容器内运行的应用程序可以通过网络访问,我们需要对容器的端口进行映射。

对于内网映射,我们可以使用Docker的端口映射功能。这个功能可以将宿主机的端口映射到容器的端口,从而可以在宿主机的网络中访问容器内运行的应用程序。例如,我们可以使用下面的命令将宿主机的端口8080映射到容器的端口80:

docker run -p 8080:80 nginx

这个命令会启动一个NGINX容器,并将它的80端口映射到宿主机的8080端口。现在,我们可以在宿主机的浏览器中通过http://localhost:8080来访问容器内运行的NGINX。

另外,在进行内网映射时,我们也要注意容器内部的防火墙。在某些情况下,需要在容器内部打开端口才能访问容器内的应用程序。例如,我们可以使用下面的命令在容器内部 --expose 参数命令打开容器的端口暴露80
http://<宿主机IP>:80来访问容器内运行的

六、 docker 防火墙

Docker防火墙通常用于保护Docker容器中的应用程序免遭恶意攻击。防火墙通过过滤流入和流出的网络流量来维护应用程序的安全。在Docker中,防火墙相关的规则都是基于iptables来实现的。因此,使用Docker防火墙之前需要了解iptables的相关知识。
Docker防火墙中的主要配置文daemon.json。

/etc/docker/daemon.json
/etc/docker/conf.d/daemon.json

在这个配置文件中,可以定义防火墙规则和防火墙的默认行为。以下是一些常用的设置:

{
    "iptables": false,
    "ip-masq": true,
    "iptables-snat": true
}

在上面的配置文件中,“iptables”: false 表示关闭iptables,而其他两个选项则是启用iptables功能的设置。

构建Docker防火墙

构建Docker防火墙的步骤如下:

1. 安装iptables

首先需要安装iptables,可以使用以下命令进行安装:

sudo apt-get install iptables

2. 配置iptables规则

接下来需要配置iptables规则,以确保Docker容器中的应用程序可以安全地运行。以下是一个简单的iptables规则示例:

# 允许从所有地址接受TCP和UDP连接
iptables -A INPUT -p tcp -j ACCEPT
iptables -A INPUT -p udp -j ACCEPT

# 允许从特定地址接受SSH连接
iptables -A INPUT -p tcp -s 192.168.0.1 --dport 22 -j ACCEPT

# 允许从特定地址通过HTTP访问
iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 80 -j ACCEPT

# 默认设置为DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP

3. 添加规则至daemon.json

在添加规则至daemon.json文件之前,需要先确认防火墙的默认行为是否正确。通常情况下,推荐使用iptables的默认行为DROP。

接下来,需要在daemon.json文件中添加iptables规则:

{
    "iptables": true,
    "iptables-forward": true,
    "iptables-default": "DROP",
    "iptables-nat": false,
    "iptables-filter": [
        {
            "name": "allow-all",
            "rule": [
                "-j ACCEPT"
            ],
            "chain": "DOCKER-USER"
        },
        {
            "name": "allow-ssh",
            "rule": [
                "-p tcp --dport 22 -j ACCEPT"
            ],
            "chain": "DOCKER-USER"
        }
    ]
}

在上面的配置文件中,“iptables”: true 表示开启iptables,“iptables-default”: “DROP” 表示设置iptables默认行为为DROP,iptables-filter则是针对Docker容器的iptables规则,分别对应"allow-all"和"allow-ssh"两种规则,前者允许所有的流量,而后者允许SSH连接。

使用Docker防火墙

使用Docker防火墙是一项非常重要的操作,如果使用不当,可能导致应用程序无法运行或者被攻击。以下是一些使用Docker防火墙的技巧:

1. 允许特定端口

如果需要允许特定端口通过Docker防火墙,可以使用以下命令:

iptables -A INPUT -p tcp --dport 80 -j ACCEPT
2. 展示规则

可以使用以下命令来展示所有的iptables规则:

iptables -L
3. 修改规则

可以使用以下命令来修改iptables规则:

iptables -R INPUT 1 -p tcp --dport 22 -j DROP
4. 清除规则

可以使用以下命令来清除所有的iptables规则:

iptables -F

维护和优化Docker防火墙

维护和优化Docker防火墙是非常重要的,以下是一些可以使用的技巧:

1. 定期备份规则

由于iptables规则非常复杂,因此建议定期备份规则以免丢失数据。可以使用以下命令来备份规则:

iptables-save > /root/iptables.save
2. 清理旧规则

由于iptables规则非常复杂,建议定期清理旧规则以保持系统的健康。可以使用以下命令来清理旧规则:

iptables -L --line-numbers | grep DROP | awk '{print$1}' | xargs -I{} iptables -D INPUT {}
3. 压缩规则

iptables规则越多,系统负担也就越大。因此建议压缩规则以减少负担,以下是一个简单的压缩规则示例:

iptables-save | python -c "import re, sys; chain = ''; iptables = sys.stdin.readlines(); [print(f'{l.strip()}') if 'ACCEPT' in l or '\n' in l else exec(f'chain = re.match(r\'\:([A-Z]+)\', l).group(1)'); print(l.strip()) for l in iptables if l.strip() != '' ]" | iptables-restore

以上是一些Docker防火墙的维护和优化技巧,可以帮助用户更好地维护系统并优化iptables规则。

七、 测试网络端口

方法一、telnet

telnet ip port

方法二、ssh

SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议,在linux上可以通过ssh命令来测试端口的连通性,具体用法格式如下:

ssh -v -p port username@ip

说明:
-v 调试模式(会打印日志)
-p 指定端口
username:远程主机的登录用户
ip:远程主机

如果远程主机开通了相应的端口,会有如下图所示的建立成功的提示

docker 容器网络,linux,docker,docker,网络

如果远程主机没有开通相应的端口,则如下图所示
docker 容器网络,linux,docker,docker,网络

方法三、curl

curl是利用URL语法在命令行方式下工作的开源文件传输工具。也可以用来测试端口的连通性,具体用法:

curl ip:port

说明:
ip:是测试主机的ip地址
port:是端口,比如80

如果远程主机开通了相应的端口,都会输出信息,如果没有开通相应的端口,则没有任何提示,需要CTRL+C断开。。
docker 容器网络,linux,docker,docker,网络

方法四、wget

wget是一个从网络上自动下载文件的自由工具,支持通过HTTP、HTTPS、FTP三个最常见的TCP/IP协议下载,并可以使用HTTP代理。wget名称的由来是“World
Wide Web”与“get”的结合,它也可以用来测试端口的连通性具体用法:
wget ip:port
说明:
ip:是测试主机的ip地址
port:是端口,比如80

如果远程主机不存在端口则会一直提示连接主机。
docker 容器网络,linux,docker,docker,网络
如果远程主机存在端口则会看到相应的信息,如下图所示。

docker 容器网络,linux,docker,docker,网络

八 docke容器网络常见问题

1.docker容器无法访问

vm宿主机无法访问容器;
虚拟机curl localhost也无法访问;
端口映射正常;
然后检查内核版本和docker版本也没问题;
然后重启docker包括容器,kill进程什么都试过了还是无济于事;

2.最终解决方案

systemctl stop docker # 停止docker 服务
pkill docker # 杀掉docker进程
iptables -t nat -F # 清理iptables
ip link set docker0 down # 停止docker0网卡
brctl delbr docker0 # 删除docker0网卡--重点!
systemctl start docker # 启动docker服务

最后证明果然是docker0网卡的问题,而且不删除掉网卡重启都没用,只能删除;文章来源地址https://www.toymoban.com/news/detail-803574.html

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

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

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

相关文章

  • Docker网络---容器互联

    前言: 虽然每个docker容器之间都能通过ip来进行互联,但当容器重新启动,ip就会被重新分配给重新启动的容器,这时同个容器由于重启导致ip不一样了,这时就会导致开发和运维的困难程度大大增加,这时候就要考虑能不能不通过ip互联,而是通过容器的名称或id来实现容器

    2024年02月16日
    浏览(32)
  • 【Docker】网络模式详解及容器间网络通信

    目录 一、概述 二、默认网络 三、网络模式及应用 1. Bridge模式 2. Host模式 3. none网络模式 四、自定义网络应用 1. 网络相连 2. 自定义通讯 3. 自定义IP 每篇一获 在 Docker 中,网络设置包括 IP 地址、子网掩码、网关、DNS 和端口号等关键组成部分。下面我将为您详细介绍这些概念

    2024年01月18日
    浏览(31)
  • Docker网络模型:理解容器网络通信和连接

    🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通Golang(基础入门篇)》学会Golang语言

    2024年02月14日
    浏览(30)
  • docker网络配置固定容器ip

    如果不固定ip,每次启动时,docker会动态给容器分配ip,有些时候会造成影响。 1)创建自定义docker内部网络 docker network 官方文档 (看不懂可用浏览器翻译):https://docs.docker.com/engine/reference/commandline/network_create/ –subnet:指定网段的 CIDR 格式的子网 其中 172.172.0.0/16 表示子网范

    2024年02月15日
    浏览(31)
  • ①【Docker】Linux安装Docker容器教程

    个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 查看系统内核版本 : [root@localhost ~]# uname -r 3.10.0-957.el7.x86_64 x86 64位系统,如果是32位则无法安装docker 更新

    2024年03月23日
    浏览(43)
  • Ubantu docker学习笔记(七)容器网络

    容器网络主要用于容器和容器之间、容器与外网、容器和宿主机的通信和连接。 参数 命令 -f 过滤条件 -format string 格式化打印结果 –no-trunc 不缩略显示 -q 只显示网络号 参数 命令 -d 指定网络格式 –subnet strings 指定子网网段 –ip-range strings 指定容器的IP范围 –gateway strings 子

    2023年04月27日
    浏览(28)
  • 【Docker 那些事儿】容器网络的 “梦华录”(上篇)

    当企业开始大规模使用 Docker 时,工程师就需要掌握很多关于网络的知识。   Docker 作为目前流行的轻量级容器技术,有很多令人称道的功能,如前面介绍的 Docker 镜像管理。   然而, Docker 也有很多不完善的地方,网络方面就是 Docker 比较薄弱的部分。   作为初学者的我们来

    2024年02月01日
    浏览(36)
  • 让Docker容器内的服务能够访问宿主机上的其他容器的端口,可以使用Docker的网络功能

    要让Docker容器内的服务能够访问宿主机上的其他容器的端口,可以使用Docker的网络功能。 Docker提供了多种网络驱动程序,例如 bridge 、 host 、 overlay 等。其中, bridge 是默认的网络驱动程序,它会在每个Docker容器内创建一个虚拟的网卡,同时会为每个容器分配一个独立的IP地址

    2024年02月14日
    浏览(29)
  • Docker网络配置与自定义IP容器通信

    目录 前言 一、docker网络配置 1. bridge 虚拟网桥 2. host 网络模式 3. none 网络模式 4. 自定义container网络模式 二、自定义IP容器通信 1. 自定义IP 2. 创建所需容器(mysql,tomcat) 3. 准备项目资源 4. 构建Nginx实现负载均衡          当项目大规模使用 Docker 时,容器通信的问题也就

    2024年01月25日
    浏览(36)
  • 大白话说说Docker容器默认网络模型工作原理

    Docker的默认网络模型 —— 桥接模式(Bridge) 当你不做任何特殊设置时,Docker会使用一种叫做“桥接模式”的网络设置。这就像是给你的容器小房子安装了一个虚拟的桥接网络。这座桥连接着容器和你的电脑(宿主机),还能与外界通信。 虚拟网络桥 :想象一下,在你的电

    2024年02月21日
    浏览(34)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包