9.docker入门到精通—Docker网络

Docker启动时会在主机上自动创建一个docker0网桥,即一个Linux网桥。容器借助网桥和主机或者其他容器进行通讯。

1.docker启动与不启动时的网络情况

一:不启动docker时

  • ens33是宿主机ip

可以发现是在同一网段

  • lo是回环链路网络

  • virbr0

当选择虚拟化相关的服务后,启动网卡时就会有一个网桥连接的私网地址virbr0网卡(有一个固定的ip地址192.168.122.1),是做虚拟网桥使用的,其作用是连接虚拟机上的虚拟网卡,提供NAT访问外网的功能。

二:启动docker时

会产生一个名为docker0的虚拟网桥

2.docker网络的相关命令

查看docker网络的相关命令

docker network --help
 docker network ls                     查看网络
docker network create 网络名           创建网络
docker network connect 网络名          为容器连接到网络
docker network disconnect 网络名       断开容器的网络
docker network inspect 网络名          查看网络源数据
docker network rm 网络名字             删除网络
docker network prune                  删除所有无用的网络

3.docker网络的作用

  • 容器间的互联和通信以及端口映射

  • 容器IP变动时候可以通过服务名直接网络通信而不受到影响

4.docker网络模式

4.1 docker网络模式分类

查看bridge网桥

docker network inspect bridge

4.2 容器实例内默认网络 IP 生产规则

1 先启动两个ubuntu容器实例

docker run -it--name u1 ubuntu bash
docker run -it--name u2 ubuntu bash

2 查看容器ip

docker inspect 容器ID or 容器名字
eg: docker inspect u3 | tail -n20

3 关闭u2实例,新建u3,查看ip变化

docker rm-f u2
docker run -it--name u3 ubuntu bash

【结论】: docker 容器内部的 ip 是有可能会发生改变的

4.3 案例说明

4.3.1 bridge

是什么?

Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信。

# 查看 bridge 网络的详细信息,并通过 grep 获取名称项
docker network inspect bridge | grep name

在宿主机内通过【ip addr|tail -8】查看:

新建两个tomcat实例,进入容器内【ip addr】查看:

docker run -d-p8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
docker run -d-p8082:8080 --name tomcat82 billygoo/tomcat8-jdk8

4.3.2 host

是什么?

直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行NAT 转换。

容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机的 IP 和端口。

新建tomcat3实例:

docker run -d-p8083:8080 --network host --name tomcat83 billygoo/tomcat8-jdk8

问题:

docke 启动时总是遇见标题中的警告

原因:

docker 启动时指定--network=host 或-net=host,如果还指定了-p 映射端口,那这个时候就会有此警告,并且通过-p 设置的参数将不会起到任何作用,端口号会以主机端口号为主,重复时则递增。

解决:

解决的办法就是使用 docker 的其他网络模式,例如--network=bridge,这样就可以解决问题,或者直接无视

正确方式(不指定端口):

先删除tomcat83,再重新启动:
docker rm-f tomcat83
docker run -d           --network host --name tomcat83 billygoo/tomcat8-jdk8

无之前的配对显示了,看容器实例内部

docker inspect tomcat84|tail -n20

没有设置-p 的端口映射了,如何访问启动的 tomcat83??

在 CentOS 里面用默认的火狐浏览器访问容器内的tomcat83 看到访问成功.

http://宿主机 IP:8080/
eg: http://192.168.3.15:8080/

4.3.3 none

禁用网络功能,只有 lo 标识(就是 127.0.0.1 表示本地回环)

在none模式下,并不为Docker容器进行任何网络配置。 
也就是说,这个Docker容器没有网卡、IP、路由等信息,只有一个lo,需要我们自己为Docker容器添加网卡、配置IP等。

案例:

docker run -d-p8084:8080 --network none --name tomcat84 billygoo/tomcat8-jdk8

进入容器内部查看

 [root@localhost ~]# docker exec -it tomcat84 bash
root@bd397fc27e22:/usr/local/tomcat# ip addr

在容器外部查看

[root@localhost ~]# docker inspect tomcat84|tail -n 20

4.3.4 container

新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。

测试

创建一个tomcat85容器,再创建第二个tomcat86容器,创建第二个容器的时候指定使用第一个tomcat85容器的网络配置。

docker run -d-p8085:8080                              --name tomcat85 billygoo/tomcat8-jdk8
docker run -d-p8086:8080 --network container:tomcat85 --name tomcat86 billygoo/tomcat8-jdk8

但是会提示端口号冲突,因为两台tomcat公用8080端口。

换一个Alpine演示:

Alpine Linux 是一款独立的、非商业的通用 Linux 发行版,专为追求安全性、简单性和资源效率的用户而设计。 可能很多人没听说过这个 Linux 发行版本,但是经常用 Docker 的朋友可能都用过,因为他小,简单,安全而著称,所以作为基础镜像是非常好的一个选择,可谓是麻雀虽小但五脏俱全,镜像非常小巧,不到6M的大小,所以特别适合容器打包。

docker run -it--name alpine1 alpine /bin/sh
docker run -it--network container:alpine1 --name alpine2 alpine /bin/sh

验证两台容器共用同一个IP。

测试:将alpine1停掉,查看alpine2的ip(只有lo):

4.3.5 自定义网络

before(不用自定义网络)
docker run -d-p8081:8080 --name tomcat81 billygoo/tomcat8-jdk8
docker run -d-p8082:8080 --name tomcat82 billygoo/tomcat8-jdk8

现象:

tomcat81和tomcat82通过ip可以互相ping通。

tomcat81和tomcat82通过name互相ping不通。

存在问题:

容器挂掉的话,重新启动后,ip是会变的,ip变化就会导致服务之间找不到。

after

自定义网络默认使用的是桥接网络 bridge

新建自定义网络

docker network create zzyy_network

新建容器加入上一步新建的自定义网络

docker run -d-p8081:8080 --network zzyy_network --name tomcat81 billygoo/tomcat8-jdk8
docker run -d-p8082:8080 --network zzyy_network --name tomcat82 billygoo/tomcat8-jdk8

此时tomcat81和tomcat82通过name互相可以ping通。

【结论】:自定义网络本身就维护好了主机名和 ip 的对应关系(ip 和域名都能通)

猜你喜欢

转载自blog.csdn.net/weixin_54514751/article/details/129683057