IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Docker-网络模式、自定义桥接、网段、手动指定IP、不同网段通信、容器通信 -> 正文阅读

[系统运维]Docker-网络模式、自定义桥接、网段、手动指定IP、不同网段通信、容器通信

我们需要将前面的docker-compose仓库停掉

[root@server1 harbor]# docker-compose stop  

请添加图片描述

一.Docker网络

docker的镜像是令人称道的地方,但网络功能还是相对薄弱的部分。
docker安装后会自动创建3种网络:bridge、host、none

1.桥接网络

安装桥接网络

ip addr show  docker0
 yum install bridge-utils -y

请添加图片描述

[root@server1 ~]# brctl show

请添加图片描述
运行一个容器查看桥接

root@server1 ~]# docker run -d --name demo nginx
[root@server1 ~]# brctl show

请添加图片描述

当我们删除掉容器之后,桥接又消失了!

docker rm -f demo
brctl show

请添加图片描述

2.host网络模式

需要我们指定network host

我们可以看到我们的桥接口上没有出现新的桥接口

[root@server1 ~]# docker run -d --name demo --network host nginx
[root@server1 ~]# brctl show
[root@server1 ~]# brctl show docker0

请添加图片描述

我们查看端口,可以发现docker运行的镜像nginx占用的是80端口!

[root@server1 ~]# netstat -antlp

请添加图片描述
这个时候,我们再运行一个容器起名为demo2,注意观察,启动之后,查看进程有两个进程demo,demo2。但是很快在查看进程,demo2消失了!
再也不会出现。
为什么?
因为加上参数–network host会占用虚拟机的80端口,所以刚开始尝试启动会看到进程,但是会被demo的80端口挤掉demo2!!

[root@server1 ~]# docker run -d --name demo2 --network host nginx
[root@server1 ~]# docker ps

请添加图片描述
我们查看日志就知道:
docker logs
请添加图片描述

3.none模式

none模式是指禁用网络功能,只有lo接口,在容器创建时使用!
先删除掉刚才创建的容器,重新运行容器:

[root@server1 ~]# docker rm -f demo   
[root@server1 ~]# docker rm -f demo2
[root@server1 ~]# netstat -antlp ##80端口随之消失!
[root@server1 ~]# docker run -it --rm --network=none busybox
/ # ip addr

请添加图片描述

请添加图片描述

我们发现ip addr的时候:只有lo接口
请添加图片描述

二.自定义网络

1.创建自定义网桥

建议使用自定义的网络来控制哪些容器可以相互通信,还可以自动DNS解析容器名称到IP地址。

创建网桥!!查看类型为brodge!!

[root@server1 ~]# docker network create mynet1
[root@server1 ~]#docker network ls

请添加图片描述
测试:
这时我们发现我们是可以ping demo可以直接成功,说明这模式是可以给提供解析的

[root@server1 ~]# docker run -d --name demo1 --network mynet1 nginx 
[root@server1 ~]# docker run -it --rm --network mynet1 busybox
/ # ip addr
/ # ping demo

请添加图片描述

请添加图片描述

请添加图片描述

注意:
我们再开一个nginx,停掉所有的demo,再次开启时,顺序反一下,查看ip变化

[root@server1 ~]# docker run -d --name demo2 --network mynet1 nginx
[root@server1 ~]# docker stop demo1
[root@server1 ~]# docker stop demo2
[root@server1 ~]# docker start demo2
[root@server1 ~]# docker start demo1
[root@server1 ~]# docker inspect  demo2
[root@server1 ~]# docker inspect  demo1
[root@server1 ~]# docker ps

[root@server1 ~]# docker attach 8095eebc598a            ##进入busybox查看
/ # ping demo2
PING demo2 (172.17.0.2):
/ # ping demo
PING demo1 (172.17.0.4): 

请添加图片描述

我们会发现之前的demo1是172.17.0.2,demo2是172.17.0.4,
现在IP地址反过来了! 为什么?
这说明:系统会自动分配ip,按照启动顺序ip单调递增,但是ping名称的时候会自动解析地址!

2.自定义网段

创建时指定参数:–subnet 、–gateway

[root@server1 ~]# docker network rm mynet1    ##定义的网络删掉
[root@server1 ~]# docker network create --subnet 172.20.0.0/24 --gateway 172.20.0.1 mynet1

请添加图片描述

[root@server1 ~]# docker inspect mynet1 

请添加图片描述

3.手动指定ip

使用–ip参数可以指定容器ip地址,但必须是在自定义网桥上

[root@server1 ~]# docker rm demo
demo
[root@server1 ~]# docker rm demo2
demo2
[root@server1 ~]# docker run -it --rm --ip 172.20.0.10 --network mynet1 busybox
[root@server1 ~]# docker run -it --rm  --network mynet1 busybox
ip addr
[root@server1 ~]# docker inspect mynet1 

请添加图片描述

请添加图片描述

请添加图片描述

4.双网卡来实现不同网段间通信

桥接到不同网桥上的容器,彼此是不通信的。
如何使两个不同网桥的容器通信呢:
使用 docker network connect命令为demo添加一块mynet1 的网卡。

[root@server1 ~]# docker rm -f demo1
[root@server1 ~]# docker network rm mynet1
[root@server1 ~]# docker network create --subnet 172.20.0.0/24 --gateway 172.20.0.1 mynet2

请添加图片描述

[root@server1 ~]#docker run -d --name demo --network mynet1 --ip 172.20.0.10 nginx 

请添加图片描述

[root@server1 ~]#docker run -it --rm --network mynet1 busybox
ip addr

请添加图片描述

[root@server1 ~]#docker run -it --rm --network mynet2 busybox
ip addr

请添加图片描述

docker inspect demo 查看id
[root@server1 ~]# docker inspect  demo
[root@server1 ~]# docker network connect mynet1 demo(或1b22f***)
[root@server1 ~]# docker attach 1b22f******
ip addr

我们可以看到mynet1,mynet2的ip都出现在了里面!说明通信成功!
请添加图片描述

然后可以直接在容器里面:ping demo成功!

请添加图片描述

三.Docker容器通信

容器之间除了使用ip通信外,还可以使用容器名称通信。
dns解析功能必须在自定义网络中使用。
在容器创建时使用–network=container:vm1指定。(vm1指定的是运行的容器名)

[root@server1 ~]# docker run  -it --rm --network container:demo busybox
/ # ip addr

请添加图片描述

处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信。
–link 可以用来链接2个容器。
–link的格式:
–link **:alias

name是源容器的name,alias是源容器在link下的别名。

[root@server1 ~]# docker pull nginx:latest
[root@server1 ~]# docker run -d --name demo nginx
[root@server1 ~]# docker run -it --rm --link demo:web busybox
/ # ping demo
/ # env

请添加图片描述

请添加图片描述

我们再次打开一个终端链接server1:

[root@server1 ~]# docker stop demo 
[root@server1 ~]# docker run -d --name test nginx
[root@server1 ~]# docker start demo

请添加图片描述
请添加图片描述

我们再一次ping,发现ip变了(由 172.17.02 >>172.17.0.4),但是仍然可以ping名字demo成功!说明它i的名字随着IP实时更新变化的!!
请添加图片描述
这时我们查看/etc/hosts,发现他已经给我们自动修改了解析

请添加图片描述

1.内部访问外部

容器内部也是可以访问外部网络的

sysctl -a | grep ip_forward

可以看到路由转发功能是开启的为1
请添加图片描述
那么我们在容器里面可以ping baidu.com

docker run -it --rm --link demo:web busybox
ping baidu.com

请添加图片描述

2.外部访问内部

容器如何访问外网是通过iptables的SNAT实现的

外网如何访问容器:
端口映射
-p 选项指定映射端口

[root@server1 ~]# docker rm -f demo
[root@server1 ~]# docker rm -f test
docker history nginx 看到本身的端口为80
[root@server1 ~]# docker run -d --name demo -p 80:80 nginx
[root@server1 ~]# docker port demo
[root@server1 ~]# iptables -t nat -nL
[root@server1 ~]#netstat -antlp

请添加图片描述

请添加图片描述

请添加图片描述
netstat -antlp查看端口发现有docker-proxy
请添加图片描述

3.原理

外网访问容器用到了docker-proxy和iptables DNAT
宿主机访问本机容器使用的是iptables DNAT
外部主机访问容器或容器之间的访问是docker-proxy实现

测试:

[root@server1 ~]# curl 172.25.0.1
[root@server1 ~]# curl localhost

都是nginx的发布页面
请添加图片描述
现在尝试将iptables里面的策略时删除,再次测试

iptables -t nat -D DOCKER 6

请添加图片描述
已经删掉了策略!

[root@server1 ~]# iptables -t nat -nL

请添加图片描述

[root@server1 ~]# curl localhost

发现nginx发布页面还在
请添加图片描述
但是如果将docker-proxy进程杀掉,再次访问查看效果
请添加图片描述
已经访问不到了
请添加图片描述
当我们重新添加iptables策略

[root@server1 ~]# iptables -t nat -A DOCKER -p tcp --dport 80 -j DNAT --to-det 172.17.0.2:80

请添加图片描述
再次在真机上访问curl 172.25.0.1
或者在server1上访问本地localhost
发现又可以访问到nginx的发布页面了!!!
请添加图片描述所以总结:docker-proxy,iptables里面的策略至少需要存在一个才可以!!

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-07-22 14:38:04  更:2021-07-22 14:38:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/3 11:58:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码