docker网络

docker network

选项

  connect     将容器连接到网络
  create      创建网络
  disconnect  断开容器与网络的连接
  inspect     检查显示一个或多个网络上的详细信息
  ls          列出网络
  prune       删除所有未使用的网络
  rm          删除一个或多个网络

容器间的互联

通过自定义容器名称互联

在同一个宿主机上的容器之间可以通过自定义的容器名称相互访问,由于容器在启动的时候内部IP地址是DHCP随机分配的,所以如果通过内部访问的话,自定义名称是相对比较固定的,因此比较适用于此场景。

  1. 启动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
  1. 创建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地址

  1. 修改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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值