0
点赞
收藏
分享

微信扫一扫

Docker(五)--docker网络--原生和自定义网络

眼君 2022-01-12 阅读 54

1. harbor仓库的镜像关闭

[root@server1 ~]# cd harbor/
[root@server1 harbor]# docker-compose stop  ##先停掉,使用的时候在打开

 

 

2. Docker原生网络

- docker安装后会自动创建3种网络:bridge、host、none
- 可以使用以下命令查看:
- 	[root@server2 ~]# docker network ls
		NETWORK ID     NAME      DRIVER    SCOPE
		6fa32c74c660   bridge    bridge    local
		ef3462119082   host      host      local
		8eb9e5d0f35d   none      null      local

 

2.1 bridge网络

2.1.1 理论

- bridge模式下容器没有一个公有ip,只有宿主机可以直接访问,外部主机是不可见的。
- 容器通过宿主机的NAT规则后可以访问外网。

 

 2.1.2 实操

 

####实验前一定要开启sysctl net.ipv4.ip_forward=1  开启forawrd网络
 
[root@server2 ~]# yum install -y bridge-utils.x86_64 ##安装操作工具
[root@server2 ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
6fa32c74c660   bridge    bridge    local
ef3462119082   host      host      local
8eb9e5d0f35d   none      null      local
[root@server2 ~]# docker ps -a 
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@server2 ~]# docker run -it --rm busybox  
/ # ip addr    ##此处退出使用ctrl+p+q
 
 
[root@server2 ~]# brctl show   ##查看桥接的文件
bridge name	bridge id		STP enabled	interfaces
docker0		8000.0242ccbd60fb	no		veth752a1a1(自动生成的刚才的后台桥接)
[root@server2 ~]# docker run  -d --name demo reg.westos.org/nginx  ##在运行一个
[root@server2 ~]# docker ps   ##查看进程
[root@server2 ~]# brctl show  ##显示桥接文件
bridge name	bridge id		STP enabled	interfaces
docker0		8000.0242ccbd60fb	no		veth752a1a1
							vethcb2ac9d (新生成的)

 

 

 自动分配IP 

 

 

2.2 hosts模式

2.2.1 理论

host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。

 

2.2.2 实操

[root@server2 ~]# docker ps    ##查看运行的进程,然后删除
[root@server2 ~]# docker rm -f a98aaaba77b3 11483b1847ba 
 
[root@server2 ~]# docker run -d --name demo --network=host reg.westos.org/nginx  ##运行镜像
[root@server2 ~]# brctl show     ##没有运行的桥接文件,因为是host模式

与主机共享eth0 

 

 host模式和宿主机使用的是同一个ip及端口,不需要进行端口映射 
host模式下网络是唯一的,如80端口只能用一个。启动容器也会冲突。

 

查看日志发现80被占用  

 

但是如果不加host参数,可以俩个同时运行,会自动分配ip-----第一种bridge模式 

 2.3 none模式

 

- none模式是指禁用网络功能,只有lo接口,在容器创建时使用
-  --network=none指定。

 

[root@server2 ~]# docker rm -f demo2 
[root@server2 ~]# docker run -it --rm --network=none busybox
/ # ip addr 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever

 

3. 自定义网络(以bridge为主)  

 3.1 理论

 

- 自定义网络模式,docker提供了三种自定义网络驱动:
	bridge
	overlay    应用层
	macvlan   物理层  通信更快
	bridge驱动类似默认的bridge网络模式,但增加了一些新的功能,
	overlay和macvlan是用于创建跨主机网络。
 
- 建议使用自定义的网络来控制哪些容器可以相互通信,还可以自动DNS解析容器名称到IP地址。

3.2 观察俩个容器的ip切换 

 

[root@server2 ~]# docker images     ##查看镜像
[root@server2 ~]# docker ps -a      ##保证没有任何进程
[root@server2 ~]# docker run -d --name demo busybox   ##运行镜像
[root@server2 ~]# docker inspect demo | grep "IPAddress"  ##查看ip 
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",   
 
[root@server2 ~]# docker stop demo    ##停止当前demo
 
 
[root@server2 ~]# docker run -d --name demo2 nginx ##重新运行镜像demo2
[root@server2 ~]# docker inspect demo2 | grep "IPAddress"  ##查看ip 变成2,
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",
 
[root@server2 ~]# docker start  demo   ##重新启动demo
[root@server2 ~]# docker inspect demo | grep "IPAddress"  ##ip发生变化
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.3",
                    "IPAddress": "172.17.0.3",

 建立新容器,自动分配IP

 

 

停止后,新建demo2,ip为172.17.0.2,自动将demo1ip回收 

 

 

当demo1重新启动递归分配 

 

 

 

3.3 自定义一个网络 

 

[root@server2 ~]# docker rm -f demo
[root@server2 ~]# docker rm -f demo2
[root@server2 ~]# docker ps -a 
[root@server2 ~]# docker network --help
 
[root@server2 ~]# docker network create mynet1   ##自定义一个网络(默认是bridge)
2040f995f99339201ce2ca76fd72c80c54cdb383cbe05c17decb5e0331432181
[root@server2 ~]# docker network ls  ##查看网络列表
NETWORK ID     NAME      DRIVER    SCOPE
6fa32c74c660   bridge    bridge    local
ef3462119082   host      host      local
2040f995f993   mynet1    bridge    local
8eb9e5d0f35d   none      null      local
容器镜像
[root@server2 ~]# docker inspect demo | grep "IPAddress"  ##查看ip 
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.18.0.2",  ##从新生成一个网段

 

 

3.4 bridge自定义网络的操作

[root@server1 ~]# docker network create -d bridge my_net1  ##默认建立的就是bridge网络,所以加不加-d参数都可以
[root@server1 ~]# docker network ls 
NETWORK ID     NAME                        DRIVER    SCOPE
27be8b95433a   mynet1                     bridge    local

 3.4.1 建立子网和网关

 

## 使用--ip参数可以指定容器ip地址,但必须是在自定义网桥上,默认的bridge模式不支持,同一网桥上的容器是可以互通的。
 
[root@server2 ~]# docker network ls 
[root@server2 ~]# docker network create --subnet 172.10.0.0/24 --gateway 172.10.0.1 mynet2    ##自定义子网和网关
[root@server2 ~]# docker inspect  mynet2
[root@server2 ~]# ip addr
[root@server2 ~]# docker run -it --rm --ip 172.10.0.10 --network mynet2 busybox
	/ # ip addr 	

 

 

3.4.2 实现俩个docker不同网关之间的通信 

- 桥接到不同网桥上的容器,彼此是不通信的。
- docker在设计上就是要隔离不同network的。

 

 建立172.10.0.0网段

[root@server2 ~]# docker run -d --name demo1 --network mynet2 --ip 172.10.0.10 nginx
b1735154824e1303b6f2ad062b268320f94e04f9e201f20adf0c7069d226ab70
[root@server2 ~]# docker inspect  demo2  | grep "IPAddress"
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.10.0.2",
##mynet1不支持指定ip
[root@server2 ~]# docker run -d --name demo2 --network mynet1  nginx
b1735154824e1303b6f2ad062b268320f94e04f9e201f20adf0c7069d226ab70
[root@server2 ~]# docker ps -a

 

 

 

 

与容器交互发现同网段是可以ping通  

 

iptables -nL 发现网络相互独立  

 

建立双网卡

[root@server2 ~]# docker run -it --name demo3 --network mynet1  busybox
[root@server2 ~]# docker ps 
[root@server2 ~]# docker inspect  demo | grep "IPAddress"  ##查看添加的ip
 
[root@server2 ~]# docker network connect mynet2 demo3  ##为demo建立双网卡
[root@server2 ~]# docker inspect  demo  | grep "IPAddress"
            "SecondaryIPAddresses": null,
            "IPAddress": "172.18.0.2",
                    "IPAddress": "172.18.0.2",
                    "IPAddress": "172.10.0.3",
[root@server2 ~]# docker inspect  demo  | grep "Gateway"  
            "Gateway": "172.18.0.1",
            "IPv6Gateway": "",
                    "Gateway": "172.18.0.1",
                    "IPv6Gateway": "",
                    "Gateway": "172.10.0.1",
                    "IPv6Gateway": "",

 

结果发现18网段与10网段可以实现网络互通 

 

举报

相关推荐

0 条评论