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网段可以实现网络互通