13.Docker(四)-----网络(基本网络配置、自定义网络、容器通信)

一、Docker原生网络

  • docker的镜像是令人称道的地方,但网络功能还是相对薄弱的
    部分。
  • docker安装后会自动创建3种网络:bridge、host、none
  • 可以使用以下命令查看:
    请添加图片描述
[root@server1 ~]# docker run -d --name demo nginx
420b622af5e1a25b79b7ac31acc269bb3b5bca1ce0c4e583b176de9487667138
[root@server1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
420b622af5e1        nginx               "/docker-entrypoint.…"   5 seconds ago       Up 4 seconds        80/tcp              demo

请添加图片描述

1.bridge网络

  • docker安装时会创建一个名为 docker0 的Linux bridge,新建的容器会自动桥接到这个接口。
    请添加图片描述
  • bridge模式下容器没有一个公有ip,只有宿主机可以直接访问,外部主机是不可见的,但容器通过宿主机的NAT规则后可以访问外网

2.host模式

  • host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。host网络模式需要在容器创建时指定–network=host
[root@server1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@server1 ~]# docker run -d --name demo --network=host nginx
c59841230be3d8b6ba7f1c1c67b02efadab2a7ecaa2e4c869d308795579db376
[root@server1 ~]# brctl show

请添加图片描述
请添加图片描述

3.none网络

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

  • Container 网络模式是 Docker 中一种较为特别的网络的模式。在容器创建时使用–network=container:vm1指定。(vm1指定的是运行的容器名)

  • 处于这个模式下的 Docker 容器会共享一个网络栈,这样两个
    容器之间可以使用localhost高效快速通信。

[root@server1 ~]# yum install -y bridge-utils
[root@server1 ~]# brctl show
[root@server1 ~]# docker run -d --name demo nginx
[root@server1 ~]# docker rm -f demo
demo
[root@server1 ~]# brctl show

请添加图片描述

二、Docker自定义网络

1.简介

  • 自定义网络模式,docker提供了三种自定义网络驱动:
    • bridge
    • overlay
    • macvlan
  • bridge驱动类似默认的bridge网络模式,但增加了一些新的功能,overlay和macvlan是用于创建跨主机网络。
  • 建议使用自定义的网络来控制哪些容器可以相互通信,还可
    以自动DNS解析容器名称到IP地址。
[root@server2 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@server2 ~]# docker network create mynet1
11f2c2d1a87e36ef83728c22549c225b817564fb2537eac6d4d0170078b36779
[root@server2 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
1742bfd1d359        bridge              bridge              local
c5342bf3f5ed        host                host                local
11f2c2d1a87e        mynet1              bridge              local
15130254f68b        none                null                local
[root@server2 ~]# docker inspect demo
[root@server2 ~]# docker run -d --name demo1 --network=mynet1 game2048
3be27a3ab248e78a4f349452a9eab7b23bbf49856d01da656d319b96c78f71a3

请添加图片描述
请添加图片描述

2.自定义网桥

[root@server1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
4aea56af23f3        nginx               "/docker-entrypoint.…"   6 minutes ago       Up 6 minutes                            demo
[root@server1 ~]# docker network create mynet1
757f35b459e6c2900caa6254f0f7245e6551157f20e2ef1be6efb40913167a63
[root@server1 ~]# docker network ls
NETWORK ID          NAME                        DRIVER              SCOPE
fc9a888df2b3        bridge                      bridge              local
4c94aee4e765        harbor_harbor               bridge              local
af758bd837cc        harbor_harbor-chartmuseum   bridge              local
69dc4aefc8dd        harbor_harbor-clair         bridge              local
c6abd970defd        harbor_harbor-notary        bridge              local
fde416c81c9f        harbor_notary-sig           bridge              local
8f2f908b8ad4        host                        host                local
757f35b459e6        mynet1                      bridge              local
88f88be8be8b        none                        null                local
[root@server1 ~]# docker inspect demo
[root@server1 ~]# docker run -it --rm --network=mynet1 nginx
[root@server1 ~]# docker run -it --rm --network=mynet1 busybox

请添加图片描述

[root@server2 ~]# docker stop demo
demo
[root@server2 ~]# docker stop demo1
demo2
[root@server2 ~]# docker start demo1
demo2
[root@server2 ~]# docker start demo
demo

请添加图片描述
请添加图片描述
请添加图片描述

3.自定义网段

[root@server2 ~]# docker network create --subnet 172.20.0.0/24 --gateway 172.20.0.1 net1 
[root@server2 ~]# docker network ls
6009d43a932a   net1      bridge    local
[root@server2 ~]# docker inspect net1
                    "Subnet": "172.20.0.0/24",
                    "Gateway": "172.20.0.1"
[root@server2 ~]# ip addr

请添加图片描述
请添加图片描述
请添加图片描述

三、Docker容器通信

  • 容器之间除了使用ip通信外,还可以使用容器名称通信。
  • docker 1.10开始,内嵌了一个DNS server。
  • dns解析功能必须在自定义网络中使用。
  • 启动容器时使用 --name 参数指定容器名称。

1.–link可以用来链接2个容器

  • -link 可以用来链接2个容器。
  • -link的格式:
  • -link :alias
    name和id是源容器的name和id,alias是源容器在link下的别名。

容器如何访问外网是通过iptables的SNAT实现的

在这里插入图片描述
在这里插入图片描述

[root@server2 ~]# docker load -i nginx.tar
d0f104dc0a1f: Loading layer  72.49MB/72.49MB
0338db614b95: Loading layer  64.31MB/64.31MB
a4d893caa5c9: Loading layer  3.072kB/3.072kB
22ea89b1a816: Loading layer  4.096kB/4.096kB
550333325e31: Loading layer  3.584kB/3.584kB
Loaded image: nginx:latest
[root@server2 ~]# docker run -d --name demo nginx
[root@server2 ~]# docker run -it --rm --link demo:nginx busybox

请添加图片描述
请添加图片描述

[root@server2 ~]# docker run -d --name demo2 nginx
[root@server2 ~]# docker stop demo
demo
[root@server2 ~]# docker inspect demo2
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.4",
[root@server2 ~]# docker start demo
demo
[root@server2 ~]# docker inspect demo
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",

请添加图片描述
请添加图片描述

请添加图片描述
请添加图片描述

2.外网如何访问容器

端口映射
-p 选项指定映射端口

  • 外网访问容器用到了docker-proxy和iptables DNAT
    • 宿主机访问本机容器使用的是iptables DNAT
    • 外部主机访问容器或容器之间的访问是docker-proxy实现
      在这里插入图片描述
[root@server2 ~]# docker run -d --name demo1 -p 8080:8080 nginx
b8ee081228936bdc317062e225317d94d2d7d983b9fae7c14e7577f0cf3c2117
[root@server2 ~]# iptables -t nat -nL

请添加图片描述

[root@server2 ~]# cd /etc/docker/
[root@server2 docker]# ls
certs.d  daemon.json  key.json
[root@server2 docker]# vim daemon.json 
[root@server2 docker]# systemctl reload docker
[root@server2 docker]# docker pull radial/busyboxplus
[root@server2 docker]# docker tag radial/busyboxplus:latest busyboxplus:latest
[root@server2 docker]# docker rmi radial/busyboxplus
[root@server2 docker]# docker images
[root@server2 docker]# docker run -it --rm busyboxplus

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

[root@server2 docker]# curl localhost:8080
curl: (7) Failed connect to localhost:8080; Connection refused
[root@server1 ~]# curl 172.17.0.2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

请添加图片描述
请添加图片描述

四、跨主机容器网络

跨主机容器网络

  • 跨主机网络解决方案
    • docker原生的overlay和macvlan
    • 第三方的flannel、weave、calico
  • 众多网络方案是如何与docker集成在一起的
    • libnetwork docker容器网络库
    • CNM (Container Network Model)这个模型对容器网络进行了抽象
  • CNM分三类组件
    • Sandbox:容器网络栈,包含容器接口、dns、路由表。(namespace)
    • Endpoint:作用是将sandbox接入network (veth pair)
    • Network:包含一组endpoint,同一network的endpoint可以通信。

在这里插入图片描述

  • macvlan网络方案实现
    • LInux kernel提供的一种网卡虚拟化技术。
    • 无需Linux bridge,直接使用物理接口,性能极好。

1.在两台docker主机上各添加一块网卡,打开网卡混杂模式:

请添加图片描述
请添加图片描述
请添加图片描述

2.配置网卡

[root@server1 ~]# cd /etc/sysconfig/network-scripts/
[root@server1 network-scripts]# ls
[root@server1 network-scripts]# cp ifcfg-eth0 ifcfg-eth1
[root@server1 network-scripts]# vim ifcfg-eth1
[root@server1 network-scripts]# cat ifcfg-eth1
BOOTPROTO=none
DEVICE=eth1
ONBOOT=yes

请添加图片描述
请添加图片描述
请添加图片描述

[root@server1 ]# ip link set eth1 promisc on		#打开混杂模式
[root@server1 ]# ip addr show eth1
[root@server2 ]# ip link set eth1 promisc on

3.在两台docker主机上各创建macvlan网络:

[root@server1 ]# docker network create -d macvlan --subnet 172.20.0.0/24 --gateway=172.21.0.1 -o parent=eth1 macvlan1
[root@server2 ]# docker network create -d macvlan --subnet 172.20.0.0/24 --gateway=172.21.0.1 -o parent=eth1.1 macvlan2

[root@server1 ]# docker run -it --rm --network macvlan1 --ip 172.21.0.11 busybox
[root@server2 ]# docker run -it --rm --network macvlan1 --ip 172.21.0.12 busybox

[root@server1 harbor]# docker run -it --rm --network macvlan2 --ip 172.22.0.21 busybox
/ # ping 172.22.0.22
[root@server2 docker]# docker run -it --rm --network macvlan2 --ip 172.22.0.22 busybox

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

  • macvlan网络间的隔离和连通
    • macvlan网络在二层上是隔离的,所以不同macvlan网络的容器是不能通信的。
    • 可以在三层上通过网关将macvlan网络连通起来。
    • docker本身不做任何限制,像传统vlan网络那样管理即可。

五、总结

  • 主要讲解了docker各种网络模型的配置与实现,并从ip管理、隔离、性能等方面做了对比。
docker network子命令
connect		连接容器到指定网络
create			创建网络
disconnect	断开容器与指定网络的连接
inspect		显示指定网络的详细信息
ls			显示所有网络
rm			删除网络
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值