docker network
选项
connect 将容器连接到网络
create 创建网络
disconnect 断开容器与网络的连接
inspect 检查显示一个或多个网络上的详细信息
ls 列出网络
prune 删除所有未使用的网络
rm 删除一个或多个网络
容器间的互联
通过自定义容器名称互联
在同一个宿主机上的容器之间可以通过自定义的容器名称相互访问,由于容器在启动的时候内部IP地址是DHCP随机分配的,所以如果通过内部访问的话,自定义名称是相对比较固定的,因此比较适用于此场景。
- 启动tomcat容器
#启动tomcat-web1
[root@localhost ~]# docker run -it -d --name tomcat-web1 -p 8801:8080 tomcat-base:8.5.42
b1f74f1a913dd8d22002a74576cc1c380c8d51673d24ab67c9c97507d7b26ad6
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b1f74f1a913d tomcat-base:8.5.42 "/run.sh" 2 minutes ago Up 2 minutes 0.0.0.0:8801->8080/tcp tomcat-web1
#查看tomcat-web1 hosts
[root@localhost ~]# docker exec -it tomcat-web1 bash
[root@b1f74f1a913d /]# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 b1f74f1a913d
- 创建nginx容器
#创建nginx-web1,link tomcat-web1
[root@localhost ~]# docker run -it -d -p 80:80 --name nginx-web1 --link tomcat-web1 nginx-base:1.16.1
c5f7b3747f9e15567e0c7ee635d54f4899531086d9188cee8af7daa34c368f4e
#查看hosts
[root@localhost ~]# docker exec -it nginx-web1 sh
/usr/local/nginx # cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 tomcat-web1 b1f74f1a913d
172.17.0.3 c5f7b3747f9e
注意: nginx-web1 link容器之后会在hosts中生成名称加IP地址
- 修改nginx.conf
#配置访问tomcat
location /tomcat {
proxy_pass http://tomcat-web1:8080;
}
通过自定义容器别名互联
docker run -d --name 新容器名称 --link 目标容器名称:自定义的名称 -p 本地端口:容器端口 镜像名称
创建nginx容器
#创建nginx-web1,link tomcat-web1
[root@localhost ~]# docker run -it -d -p 80:80 --name nginx-web1 --link tomcat-web1:java-web1 nginx-base:1.16.1
c5f7b3747f9e15567e0c7ee635d54f4899531086d9188cee8af7daa34c368f4e
docker网络类型
Host模式
Host模式,使用参数 --net=host指定。
启动的容器如果指定了使用host模式,那么新创建的容器不会创建自己的虚拟网卡,而是直接使用宿主机的网卡和IP地址,因此在容器里面查看到的IP信息就是宿主机的信息,访问容器的时候直接使用宿主机IP+容器端口即可,不过容器的其他资源们必须文件系统、系统进程等还是和宿主机保持隔离。
此模式的网络性能最高,但是个容器之间端口不能相同,适用于运行容器端口比较固定的业务。
host模式不支持端口映射。
none模式
none模式,使用参数 --net=none指定
在使用none模式后,Docker容器不会进行任何网络配置,其没有网卡、没有IP也没有路由,因此默认无法与外界通信,需要手动添加网卡配置IP等,所以极少使用
Container模式
Container模式,使用参数 --net=container:名称或ID指定。
使用此模式创建的容器需指定和一个已经存在的容器共享一个网络,而不是和宿主机共享网络,新创建的容器不会创建自己的网卡也不会配置自己的IP,而是和一个已经存在的被指定的容器东西IP和端口范围,因此这个容器的端口不能和被指定的端口冲突,除了网络之外的文件系统、进程信息等仍然保持相互隔离,两个容器的进程可以通过lo网卡及容器IP进行通信。
bridge模式
docker的默认模式即不指定任何模式就是bridge模式,也是使用比较多的模式,此模式创建的容器会为每一个容器分配自己的网络IP等信息,并将容器连接到一个虚拟网桥与外界通信
不同主机之间容器互通
1.环境
主机A:本机IP192.168.8.20;修改容器网络为192.168.2.0/24段
主机B:本机IP192.168.8.30;修改容器网络为192.168.3.0/24段
主机A
[root@localhost docker]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://kls8vom3.mirror.aliyuncs.com"],
"bip":"192.168.2.1/24"
}
主机B
[root@localhost docker]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://kls8vom3.mirror.aliyuncs.com"],
"bip":"192.168.3.1/24"
}
systemctl restart docker
2.宿主机添加路由
主机A
route add -net 192.168.3.0/24 gw 192.168.8.30
#iptables允许来自192.168.8.0/24段的IP转发
iptables -A FORWARD -s 192.168.8.0/24 -j ACCEPT
主机B
route add -net 192.168.2.0/24 gw 192.168.8.20
#iptables允许来自192.168.8.0/24段的IP转发
iptables -A FORWARD -s 192.168.8.0/24 -j ACCEPT
3.宿主机启动容器
主机A
docker run -d -it -p 80:80 --name nginx nginx:latest
主机B
docker run -d -it --name tomcat tomcat:latest
4.进入容器
主机A
docker exec -it nginx bash
apt intsall iputils-ping net-tools traceroute
主机B
docker exec -it tomcat bash
apt intsall iputils-ping net-tools traceroute
5.测试网络是否连通
主机A
[root@localhost ~]# docker exec -it nginx bash
root@706ae45228ef:/# traceroute 192.168.3.2
traceroute to 192.168.3.2 (192.168.3.2), 30 hops max, 60 byte packets
1 192.168.2.1 (192.168.2.1) 0.052 ms 0.010 ms 0.007 ms
2 192.168.8.30 (192.168.8.30) 0.268 ms 0.200 ms 0.152 ms
3 192.168.3.2 (192.168.3.2) 0.213 ms 0.214 ms 0.141 ms
主机B
[root@localhost ~]# docker exec -it tomcat bash
root@fd83897c415f:~# traceroute 192.168.2.2
traceroute to 192.168.2.2 (192.168.2.2), 30 hops max, 60 byte packets
1 192.168.3.1 (192.168.3.1) 0.034 ms 0.008 ms 0.007 ms
2 192.168.8.20 (192.168.8.20) 0.239 ms 0.235 ms 0.190 ms
3 192.168.2.2 (192.168.2.2) 0.260 ms 0.216 ms 0.212 ms
创建自定义网络
本机容器默认网络192.168.2.0/24段
新建网络10.10.0.0/24段
目标:相互通信
1.创建
docker network create -d bridge --subnet 10.10.0.0/24 --gateway 10.10.0.1 timetovers-net
-d:指定网络类型,不指定默认为bridge
--subnet:指定网段
--gateway:指定网管
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
a26409eec3c8 bridge bridge local
80a6758e11a1 host host local
e2bf8d70a717 none null local
8116e6cf41cd timetovers-net bridge local
2.启动容器
docker run -it -d -p 8080:8080 --net=timetovers-net --name nginx-web nginx:latest
3.修改iptables规则,使一个宿主机上不通网络通信
#将规则导出修改
iptables-save > iptables.txt
#修改规则,将关于br-8116e6cf41cd和docker0两个网卡的DROP规则注释
vim iptables.txt
# Generated by iptables-save v1.4.21 on Thu Jun 3 22:03:49 2021
*filter
:INPUT ACCEPT [1369:82172]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [1069:203011]
:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o br-8116e6cf41cd -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o br-8116e6cf41cd -j DOCKER
-A FORWARD -i br-8116e6cf41cd ! -o br-8116e6cf41cd -j ACCEPT
-A FORWARD -i br-8116e6cf41cd -o br-8116e6cf41cd -j ACCEPT
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -s 192.168.8.0/24 -j ACCEPT
-A DOCKER -d 192.168.2.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT
-A DOCKER -d 10.10.0.2/32 ! -i br-8116e6cf41cd -o br-8116e6cf41cd -p tcp -m tcp --dport 8080 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i br-8116e6cf41cd ! -o br-8116e6cf41cd -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
#-A DOCKER-ISOLATION-STAGE-2 -o br-8116e6cf41cd -j DROP
#-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
COMMIT
# Completed on Thu Jun 3 22:03:49 2021
# Generated by iptables-save v1.4.21 on Thu Jun 3 22:03:49 2021
*nat
:PREROUTING ACCEPT [55:3853]
:INPUT ACCEPT [19:1502]
:OUTPUT ACCEPT [12:907]
:POSTROUTING ACCEPT [12:907]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 10.10.0.0/24 ! -o br-8116e6cf41cd -j MASQUERADE
-A POSTROUTING -s 192.168.2.0/24 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 192.168.2.2/32 -d 192.168.2.2/32 -p tcp -m tcp --dport 80 -j MASQUERADE
-A POSTROUTING -s 10.10.0.2/32 -d 10.10.0.2/32 -p tcp -m tcp --dport 8080 -j MASQUERADE
-A DOCKER -i br-8116e6cf41cd -j RETURN
-A DOCKER -i docker0 -j RETURN
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.2:80
-A DOCKER ! -i br-8116e6cf41cd -p tcp -m tcp --dport 8080 -j DNAT --to-destination 10.10.0.2:8080
COMMIT
# Completed on Thu Jun 3 22:03:49 2021
#iptables导入回去
iptables-restore < iptables.txt
4.测试同一宿主机,不通网络不通容器通信
[root@localhost ~]# docker exec -it nginx-web bash
root@342547572aac:/# traceroute 192.168.2.2
traceroute to 192.168.2.2 (192.168.2.2), 30 hops max, 60 byte packets
1 10.10.0.1 (10.10.0.1) 0.113 ms 0.010 ms 0.006 ms
2 192.168.2.2 (192.168.2.2) 0.098 ms 0.016 ms 0.113 ms