docker 网络

目录

 

默认的Docker网络驱动

1 bridge网络

2 host网络

3 overlay网络

4 macvlan网络

5 none网络

一些命令

docker network

通过bridge在同一个宿主机上实现不同容器间的通信

通过host网络连接


默认的Docker网络驱动

  • bridge(桥梁)
  • host(主机)
  • overlay(覆盖)
  • macvlan(mac虚拟网)
  • none(无)

1 bridge网络

bridge网络是一种用户定义的网络,它允许所有链接到同一个网络的容器进行通信。其好处是,相同bridge网络上的容器能够相互连接、发现和通信,而未处于相同bridge网络上的那些容器则不能直接进行相互通信。当运行在同一宿主机上的容器需要相互通信时,bridge网络非常有用。如果需要通信的容器位于不同的Docker宿主机上,则可能需要overlay网络。

安装并启动Docker时,就会创建一个默认的bridge网络,并且新启动的容器会连接到这个网络。不过更好的做法时自己是手动创建个bridge网络。原因如下:

  • 更好的跨容器隔离。处于统一bridge网络上的容器都是可被发现并且可以相互通信的。它们相互之间自动公开所有端口,并且不会向外部公开任何端口。针对每个应用程序配置一个单独的用户自定义的bridge网络,能提供不同应用程序容器间更好的隔离。

  • 简单的跨容器名称解析。对于联结到同一桥接网络的服务而言,容器可以通过名称彼此连接,对于处于默认桥接网络上的容器而言,容器彼此连接的唯一方式就是通过IP地址(或者使用--link标记bridge,而这个标记早已经过时了,我下面会BB)

  • 对于处于默认网络上的容器而言,分离这些容器的唯一方式就是停止运行容器并在新的网络上重建它。

2 host网络

使用host网络,容器就会被附加到Docker宿主机上。这意味着,所有通向该主机的流量都会被路由到容器。由于所有容器的端口都被直接附加到主机,所以在这个模式中,发布端口这一概念不再有任何意义。如果Docker宿主机仅运行着一个容器,那么主机模式就是完美适用的。

3 overlay网络

overlay网络会创建一个跨多个Docker宿主机的网络。之所以称之为overlay网络,是因为它会覆盖现有的主机网络,从而允许连接到该overlay网络的容器进行跨多个主机的通信。

4 macvlan网络

5 none网络

none网络就是说容器未连接到任何网络接口,并且不接收任何网络流量。在这种网络模式中,仅会创建环回接口,从而允许容器与自己通信,而不与外部或者与其他容器通信。(一个运维大佬,说他工作几年,没用过none网络。。)

 



一些命令

docker network

Usage:    docker network COMMAND

Manage networks

Options:
      --help   Print usage

Commands:
  connect     Connect a container to a network
  create      Create a network
  disconnect  Disconnect a container from a network
  inspect     Display detailed information on one or more networks
  ls          List networks
  prune       Remove all unused networks
  rm          Remove one or more networks

docker network ls                  查看有哪些网络可以可用。

docker network inspect     <network id or name>

docker network inspect bridge       查看bridge详情信息。


 

通过bridge在同一个宿主机上实现不同容器间的通信

 

1 使用默认的bridge(估计已经不常用了)

启动容器时默认会连接到默认的bridge,通过默认bridge可以实现通信。但是,默认只能通过容器的id来指定。或者运行时指定--link 参数,则可以通过容器名来通信。

docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=dontusethisinprod mysql
# 启动mysql
docker logs -f mysql
# 跟踪日志, 查看是否正常启动


run -d --name adminer -p 8080:8080 adminer
# 启动adminer, 我也没用过,就当是个可视化的mysql客户端吧
docker logs -f adminer
# 追踪日志,查看是否正常启动


# 然后常看这两个容器
docker inspect mysql | jq .[0].NetworkSettings.Networks
docker inspect adminer | jq .[0].NetworkSettings.Networks

# 看到mysql 的 IPAddress 是172.17.0.2
#  adminer 的IPAddress 是 172.17.0.3

不过,正如前面所说的,默认的桥接网络不会根据服务名称来进行DNS解析,也不允许通过服务名称进行连接,只能通过IP地址进行连接。

可以使用--link来指定

docker --name -d adminer --link mysql -p 3306:3306 -e 变量 adminer
# 没实际用过,我估计能运行,是要在adminer主动连接mysql, 所以要在要主动提出连接的一方主动设置--link参数。

 

2 用自己定义的网络进行连接

docker network create database <network name>         不加-d 指定网络驱动,则默认是bridge

可以创建个database(就是个网络的名字,相当于个变量,叫啥随意,别想复杂了)网络并尝试将MySQL和Adminer容器连接到该网络

docker network create database
或者
docker network create -d bridge database  
# -d 指定驱动是啥,就是none,host那几个, 不指定默认是bridge

docker network inspect database
# 查看详情,看到Driver是bridge说明设置成功了

停止并删除前面启动的容器

docker stop adminer
docker rm adminer

docker stop mysql
docker rm mysql

启动MySQL容器

docker run -d --network database --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=dontuswthisinprod mysql

# -d 后台 --network 指定网络 --name 起的名字 -p 映射端口 -e 指定变量
docker logs -f mysql
# 追从mysql, 看启动情况

docker inspect mysql | jq .[0].NetworkSettings.Networks
# 查看详情

# 也可以动过docker network 查看情况
docker network inspect database jq .[0].Containers

再启动Adminer容器, 注意,启动时没指定network

docker run -d --name adminer -p 8080:8080 adminer
docker inspect adminer | jq .[0].NetworkSettings.Networks
# 常看详情, 发现没指定连的是默认的bridge, 这不是废话么,,,,

dokcer允许我们,在已经运行的容器上指定要连接的网络,

docker network connect <network name> <container name>        注意这个对运行的容器的命令

docker network connect database adminer
docker inspect adminer | jq .[0].NetworkSettings.Networks
# 发现容器有两个网络,一个是默认的bridge和自己创建的database

删除多余的默认bridge网络

docker network disconnection <network name> <container name>

docker network disconnect bridge adminer

# 检查容器的网络
docker inspect adminer | jq .[0].NetworkSettings.Networks
# 发现只有自己创建的网络了

两个容器可以直接通过容器名进行通信了。

3 别的一个小demo,也是说的这个事

还是link参数

docker run -d --nmae test2 --link test1 busybox /bin/sh-c "while true; do sleep 3600; done"
docker exec -it test2 /bin/sh
# 交互式进入特殊test2
ping 172.17.0.3     # test1 的ip  发现可以ping 通, (可以交互式进入test1 然后执行 ip a, 查看ip)
ping test1           也可以ping通

注意啊,如果交互式进入test1, 执行ping test2 会报错, 因为--link 时单方面的,只用启动带了link,才能使用。

4 总结

  • 直接run 不加--network 参数时,(可能要指定-p 端口映射,容器才有的ip地址)默认连接到的是bridge网络,连接到bridge网络的几个容器是可以通过,只能通过IP地址通信的。。也可以在一个容器指定--link 参数,这个容器就可以通过对方的容器名,和对方通信。但是link是单方向的,只有指定link参数的那一方容器可以通过容器名和对方通信。
  • 当run时指定了 --network 参数, 容器就只有指定的网络了。
  • 还可以通过 docker network connect <network name> <container name> 来改变正在运行的容器连接的网络,但是要注意通过这种方法,容器还会保留默认的bridge网络
  • 可以通过 dockers network disconnect <network name> <container name> 来删除默认的bridge网络
  • docker network create database <network name>   来创建自定义的网络, 连接自定义网络的容器们就可以通过容器名访问对方容器了。

 

通过host网络连接

在host网络中Docker不会为容器创建虚拟网络。而是将Docker宿主机的网络接口绑定到容器。

当宿主机上仅运行着一个容器时,host网络就会非常有效,并且无需任何桥接网络,也无需网络隔离。

docker run -d --network host -p 8080:8080 nginx:alpine
# 会出现警告,说什么当使用host网络模型时,发布的端口将会被抛弃,就是说你指定网络驱动是host时,即使指定端口,端口也会被抛弃。

docker run -d --network host nginx:alpine

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值