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–networkbridgedocker0 虚拟网桥上,这也是默认网络模式
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)桥接模式原理图

在这里插入图片描述

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)主机模式原理图

在这里插入图片描述

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)容器模式原理图

在这里插入图片描述

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

五、 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:远程主机

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

在这里插入图片描述

如果远程主机没有开通相应的端口,则如下图所示
在这里插入图片描述

方法三、curl

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

curl ip:port

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

如果远程主机开通了相应的端口,都会输出信息,如果没有开通相应的端口,则没有任何提示,需要CTRL+C断开。。
在这里插入图片描述

方法四、wget

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

如果远程主机不存在端口则会一直提示连接主机。
在这里插入图片描述
如果远程主机存在端口则会看到相应的信息,如下图所示。

在这里插入图片描述

八 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网卡的问题,而且不删除掉网卡重启都没用,只能删除;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/72946.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker部署springboot

基础知识 什么是docker 官网&#xff1a; Docker Docs: How to build, share, and run applications | Docker Documentation Docker 是一个基于go语言开发的开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到…

97. Interleaving String 72. Edit Distance 121. 122. 123

​​​​​​97. Interleaving String 72. Edit Distance 一个bottomup&#xff08;棋盘从右下角外围逼近[0,0]&#xff09;如果横轴是string1的index i&#xff0c;纵轴string2的index j&#xff0c;那么&#xff0c;很奇妙的是i和j一起&#xff08;从右下角的格子看&#xf…

11.Eclipse 注释模板的说明及设置

1.在eclipse中点击Window——>java——>Code Style——>CodeTemplates——>Comments 2.常用Variable 3. 我的注释模板 ①Files 文件 /** * Title: ${file_name}* Description: ${todo}* author Jeremy* date ${currentDate:date(yyyy-MM-dd hh:mm:ss)} */ ②Typ…

Kotlin入门:变量和函数——02

目录 一、Kotlin 基本数据类型 ​编辑 二、变量 val 关键字&#xff1a; var 关键字: 类型推断: 可空类型: 三、函数 基本函数语法&#xff1a; 单表达式函数&#xff1a; 默认参数值&#xff1a; 命名参数&#xff1a; 一、Kotlin 基本数据类型 Kotlin 的基本数…

树结构--介绍--二叉树遍历的递归实现

目录 树 树的学术名词 树的种类 二叉树的遍历 算法实现 遍历命名 二叉树的中序遍历 二叉树的后序遍历 二叉树的后序遍历迭代算法 二叉树的前序遍历 二叉树的前序遍历迭代算法 树 树是一种非线性的数据结构&#xff0c;它是由n(n≥0)个有限节点组成一个具有层次关系…

中电金信:ChatGPT一夜爆火,知识图谱何以应战?

随着ChatGPT的爆火出圈 人工智能再次迎来发展小高潮 那么作为此前搜索领域的主流技术 知识图谱前路又将如何呢&#xff1f; 事实上&#xff0c;ChatGPT也并非“万能”&#xff0c;作为黑箱模型&#xff0c;ChatGPT很难验证生成的知识是否准确。并且ChatGPT是通过概率模型执行推…

Django入门

Day1 django环境安装 创建虚拟环境 # step1 创建虚拟环境 python3 -m venv datawhale_django # step2 mac进入虚拟环境 source ./datawhale_django/bin/activate # step3 退出虚拟环境 deactivate安装包 pip3 install django ​pip3 install djangorestframework​​ pip3 …

Jenkins自动化打包脚本

一、背景 jenkins可以设置定时任务打包&#xff0c;也已手动点按钮打包&#xff0c;还可以通过执行http请求打包&#xff0c;今天我们就通过shell脚本&#xff0c;通过curl命令进行jenkins打包。 二、步骤 2.1 在jenkins上构建项目 设置触发器 2.2 通过shell脚本触发远程构…

电商财务新时代:轻松自动对账,财务效率倍增

电商领域频繁的多平台财务对账常常令企业头痛不已。然而&#xff0c;随着轻易云数据集成平台的崭新解决方案&#xff0c;财务对账的痛点迎刃而解。本文通过引人入胜的实例&#xff0c;深入探讨电商财务对账的现状&#xff0c;突出轻易云数据集成平台在自动对账中的强大作用&…

感受RFID服装门店系统的魅力

嘿&#xff0c;亲爱的时尚追随者们&#xff01;今天小编要给你们带来一股时尚新风潮&#xff0c;让你们感受一下什么叫做“RFID服装门店系统”&#xff0c;这个超酷的东西&#xff01; 别着急&#xff0c;先别翻白眼&#xff0c;小编来解释一下RFID是什么玩意儿。它是射频识别…

RFID技术助力半导体制造行业自动化生产

由于芯片短缺问题和近2年海运拥堵和成本上升等因素&#xff0c;致使全球资本对于芯片制造工厂的投入增大&#xff0c;而中兴、华为的例子已经凸显出国产半导体供应链的重要性&#xff0c;除去地缘政治上的意义&#xff0c;发展半导体其实是中国经济的转型的必走之路。 半导体生…

Programming abstractions in C阅读笔记:p107-p110

《Programming Abstractions In C》学习第46天&#xff0c;p107-p110&#xff0c;3.1小节——“The concept of interface”&#xff0c;总结如下&#xff1a; 一、技术总结 1.client p108&#xff0c;调用library的program称为client。 2.interface p108&#xff0c;“To do …

【刷题笔记8.13】【动态规划相关】LeetCode题目:斐波那契数列、爬楼梯

【动态规划相关】LeetCode题目&#xff1a;斐波那契数列、爬楼梯 &#xff08;一&#xff09;爬楼梯 题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 提示&#xff1a; 1 < n <…

第57步 深度学习图像识别:CNN可视化(Pytorch)

基于WIN10的64位系统演示 一、写在前面 由于不少模型使用的是Pytorch&#xff0c;因此这一期补上基于Pytorch实现CNN可视化的教程和代码&#xff0c;以SqueezeNet模型为例。 二、CNN可视化实战 继续使用胸片的数据集&#xff1a;肺结核病人和健康人的胸片的识别。其中&…

CSS变形与动画(一):transform变形 与 transition过渡动画 详解(用法 + 代码 + 例子 + 效果)

文章目录 变形与动画transform 变形translate 位移scale 缩放rotate 旋转skew 倾斜多种变形设置变形中心点 transition 过渡动画多种属性变化 变形与动画 transform 变形 包括&#xff1a;位移、旋转、缩放、倾斜。 下面的方法都是transform里的&#xff0c;记得加上。 展示效…

pconsc4 安装

Pconsc4 安装遇到的问题 Pconsc4-github 按照红框给的一行命令&#xff0c;一行毁所有。 1 gcc and g not found # 1 Start by updating the packages list:sudo apt update# 2 Install the build-essential package by typing:sudo apt install build-essential## The comm…

在 Windows 中恢复数据的 5 种方法

发生数据丢失的原因有多种。无论是因为文件被意外删除、文件系统或操作系统损坏&#xff0c;还是由于软件或硬件级别的存储故障&#xff0c;数据都会在您最意想不到的时候丢失。今天我们重点介绍五种数据恢复方法&#xff0c;以应对意外情况的发生。 1.从另一台机器启动硬盘 如…

MyBatis-Plus学习笔记(尚硅谷)

一、MyBatis-Plus 1.简介 MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window)的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 我们的愿景是成为 MyBatis 最好的搭档&…

深入了解 Rancher Desktop 设置

Rancher Desktop 设置的全面概述 Rancher Desktop 拥有方便、强大的功能&#xff0c;是最佳的开发者工具之一&#xff0c;也是在本地构建和部署 Kubernetes 的最快捷方式。 本文将介绍 Rancher Desktop 的功能和特性&#xff0c;以及 Rancher Desktop 作为容器管理平台和本地…