08-网络
2021-12-10 本文已影响0人
紫荆秋雪_文
净化docker系统
docker system prune
一、云服务器网络
image.png场景:当购买云服务器后部署应用后,使用其他终端并不能访问到该云服务器中的资源,还需要网络配置
二、Docker网络
1、网络原理
Docker使用 Linux 桥接,在宿主机虚拟一个 Docker 容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个 IP 地址,称为 Container-IP,同时 Docker 网桥是每个容器的默认网关。因为在同一宿主机内的容器都介入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
Linux虚拟网络技术.png
Docker容器网络就很好的利用了 Linux 虚拟网络技术,在本地主机和容器内分别创建一个虚拟接口,并让它们彼此联通(这对接口叫做 veth pair)
Docker中的网络接口默认都是虚拟的接口。虚拟接口的优势就是转发效率极高(因为Linux是在内核中进行数据的复制来实现虚拟接口之间的数据转发,无需通过外部的网络设备交换),对于本地系统和容器系统来说,虚拟接口跟一个正常的以太网卡相比并没有区别,只是它的速度块很多
2、查看宿主机网络
image.png- lo:本地网络
- eth0:私有网络
3、安装Docker后宿主机网络
image.png- lo:本地网络
- eth0:私有网络
- docker0:每一个安装了Docker的Linux主机都有一个 docker0 的虚拟网卡。桥接网卡
创建容器
3.1、查看宿主机网络
- 创建容器后,宿主机多了一个网络 image.png
3.2、容器ip
为了查看容器ip,所以需要使用前台启动命令
docker run -it alpine
- 查看容器ip
ip addr
image.png
- 每启动一个容器 Linux 主机都会多一个虚拟网卡
三、网络模式
1、bridge 模式
- 使用 --net=bridge 来配置
- 默认使用bridge模式,在 Docker 网桥 docker0 上为容器创建新的网络栈
2、none 模式
- 使用 --net=none 来配置
- 不配置网络,用户可以稍后进入容器,自行配置
3、Container 模式
- 使用 --net=container:NAME/ID
- 容器和另外一个容器共享Network Namespace。Kubernetes 中的 pod 就是多个容器共享一个 Network Namespace
4、host 模式
- 使用 --net=host 来配置
- 容器和宿主机共享 Network Namespace
5、用户自定义
- 使用 --net=自定义网络名称
- 用户自己使用 Network 相关命令定义网络,创建容器的时候可以指定自己定义的网络
四、桥接(bridge)网络原理
A:外界资源如何访问容器
- 创建一个Tomcat容器(latest版本有问题,无法显示Tomcat界面,V8.0 OK)
- 创建一个Redis 容器
- 查看容器
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e6169e94ea18 redis:latest "docker-entrypoint.s…" 18 seconds ago Up 18 seconds 0.0.0.0:6379->6379/tcp hungry_panini
53f2f7e3716c tomcat:8.0 "catalina.sh run" 5 minutes ago Up 5 minutes 0.0.0.0:8080->8080/tcp sleepy_bassi
- 查看ip链路
# iptables -nL
Chain DOCKER (1 references)
target prot opt source destination(容器的虚拟ip)
ACCEPT tcp -- 0.0.0.0/0 172.17.0.2 tcp dpt:8080 # 容器端口
ACCEPT tcp -- 0.0.0.0/0 172.17.0.3 tcp dpt:6379 # 容器端口
- 查看网络监听端口
# netstat -nl | grep 8080
tcp6 0 0 :::8080 :::* LISTEN
小结:当外界通过公网ip访问+端口访问(8080)访问Tomcat时
- 1、在创建容器的时候,已经指定了容器端口与主机端端口的映射
- 2、当外界通过ip+port方式请求时,主机网卡会判断是否有监听该port 主机监听端口.png
- 3、通过 iptables -nL 命令可知,docker是可以接收任何来源的流量,列出了容器端口及容器ip iptables -nL.png
-
4、通过上面的1-3步骤就可以知道该访问那个容器
image.png
B:查看docker 网络
- 查看 docker 网络
# docker network ls
NETWORK ID NAME DRIVER SCOPE
9521b1c99f21 bridge bridge local
31f0dfdda38a host host local
4841cdf0c375 none null local
- 查看 bridge 详情
# docker inspect 9521b1c99f21
[
{
"Name": "bridge",
"Id": "9521b1c99f216ed7f176942329843a96f6d9b84a3d241a01896a4a3463e4a825",
"Created": "2021-12-10T14:21:22.818210801+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16", # 子网
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": { # 容器网络
"53f2f7e3716c7dc8d89417e85c3c973867a0c18c46dc0b6eb33a3c855d345305": {
"Name": "sleepy_bassi",
"EndpointID": "4c73e10da636aac4468b7ee95b85ebdf0e0a637e1504c1dce3be3e7a1c83599c",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
},
"942a4b5030f272c8c2da2415ce87a0b0fc1d44c247f1e5c60acf87c6467c8ce6": {
"Name": "magical_elbakyan",
"EndpointID": "a748a3efad11d2e541f2b43eb4eae85f1d98c702df1f2c2f27721aa7e4cdddfd",
"MacAddress": "02:42:ac:11:00:04",
"IPv4Address": "172.17.0.4/16",
"IPv6Address": ""
},
"e6169e94ea18297811ec63274d00a6f2d6e11353dca1d9bf35665e562b3fbce6": {
"Name": "hungry_panini",
"EndpointID": "f56298d396424d40ffb8434dfd9abe4dc24cc7549a3079287b25f13540e86833",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
C:容器访问容器(容器间是互通的)
场景:在 Tomcat 容器访问 Redis,这就需要在Tomcat容器中可以ping通Redis容器
- 第一种方案(同出一个子网域):是直接通过ip来访问,而且在 Tomcat 容器中可以ping通 Redis 容器 ip,但是当 Redis 异常重新创建后可能重新分配新ip,这样就需要不断的修改Redis的ip;(不推荐)
- 第二种方案:可以通过访问域名的方式来访问 Redis(Redis直接申请公网ip,但是需要费用)
- 第三种方案:如果可以通过访问固定名称(域名、容器名)这样就不怕容器的ip变动了。(自定义网络)
D:自定义网络
- 创建自定义网络
docker network create --subnet=192.168.0.0/16 --gateway=192.168.0.1 raven-net
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
- 查看docker网络
docker network ls
image.png
- 创建容器时把容器加入到自定义网络
docker run -dP --network raven-net --name=redis1 redis:latest
docker run -dP --network raven-net tomcat:8.0
#不加入自定义网络
docker run -dP --name=redis2 redis:latest
-
进入Tomcat 容器 直接ping redis1 和 redis2
image.png
E:容器安装ping命令
apt-get update
apt install net-tools
apt install iputil-ping
五、容器(Container)网络
场景:如果需要在Redis容器中ping www.baidu.com 发现没有ping命令,方式一是可以直接安装ping工具,方式二可以再起一个可以执行ping命令容器(alpine)让容器(test)和容器Redis共用同一个网络
- Redis容器无法执行ping命令 Redis容器无法执行ping命令.png
- 创建一个alpine容器,使用Redis容器网络
docker run -it --network container:redis2 alpine
容器网络.png