1、查看当前阿里云的一网络信息
# 命令 ip addr
2、查看容器内部网络地址
这里使用上一篇博客的自定义Dockerfile文件构建的tomcat,因为默认拉取的镜像是没有ip add 和 ifconfig命令的
详情点击链接
2.1 启动镜像
[root@wkf /]# docker run -d -P --name tomcat01 mytomcat
2.2 查看容器内部的ip信息
[root@wkf build]# docker exec -it tomcat01 ip addr
2.3、外部ping内部
[root@wkf ~]# ping 172.17.0.2
2.4 原理
1、每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0,桥接模式,使用的技术是evth-pair技术
外部再次测试 ip addr,发现除了docker0 出现了一个新的网卡
2、再启动一个tomcat02
[root@wkf build]# docker run -d -p 8081:8080 --name tomcat02 mytomcat
3、测试tomcat01 ping tomcat02
结果可以ping通
结论:tomcat01 和tomcat02 是共用的一个路由器,docker0
所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用ip
docker使用的是Linux的桥接,宿主机是一个Docker容器的网桥 docker0
docker中的所有的网络接口都是虚拟的。虚拟的转发效率高!
只要容器删除,对应网桥就没了
2.5 --link 解决网络连通
2.5.1 直接用服务名ping 发现ping不通
[root@wkf ~]# docker exec -it tomcat01 ping tomcat02
ping: tomcat02: Name or service not known
2.5.2 在启动一个tomcat03 使用–link命令连接tomcat03到tomcat02
docker run -d -P --name tomcat03 --link tomcat02 mytomcat
2.5.3 测试tomcat03去ping tomcat02,发现ping成功了
[root@wkf ~]# docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.136 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.095 ms
2.5.4 反向 tomcat02去ping tomcat03,发现失败了
[root@wkf ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known
2.5.5 查看所有的网络 docker network ls
# bridge 就是网桥 docker0
[root@wkf ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
583488748f8c bridge bridge local
af41c422f293 host host local
5a1e992daa1a none null local
2.5.6 查看网桥信息 docker network inspect 网络id
[root@wkf ~]# docker network inspect 583488748f8c
2.5.7 外部查看容器tomcat02的网络信息
[root@wkf ~]# docker inspect tomcat02 | grep Networks -A 20
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "583488748f8ccc3e0d1c71f8ab3f0a720eaa3e937650cb86d096dee57341f80d",
"EndpointID": "23fc6265ac97252eaba6510bbd9f074ce04ad97d7697d8fc225aede11509adee",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:03",
"DriverOpts": null
}
}
}
}
]
2.5.8 进入容器查看tomcat03 的网络信息
[root@wkf ~]# docker exec -it tomcat03 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.3 tomcat02 b011c81343a5
172.17.0.4 818fa124c3fc
本质探究:–link 就是我们在hosts配置中增加了一个172.17.0.3 tomcat02 b011c81343a5
现在已经不建议使用 --link了!现在使用自定义网络!不适用docker0
docker0的缺点:不支持容器名连接访问
3、自定义网络
3.1 查看所有的docker网络
网络模式
bridge:桥接 docker (默认,自己创建也使用桥接模式)
nono:不配置网络
host:和宿主机共享网络
container:容器网络连通!(用得少!)
3.2 测试
# 之前我们直接启动的命令 默认--net bridge,而这个就是我们的docker0
docker run -d -P --name tomcat01 mytomcat
docker run -d -P --name tomcat01 --net bridge mytomcat
#docker0特点:默认,域名不能访问, --link 可以打通连接
# 我们可以自定义一个网络
# --driver bridge
# --subnet 192.168.0.0/16 范围192.168.0.2 -> 192.168.255.255
# --gateway 192.168.0.1
[root@wkf ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
b3c00bbdf4244fe20f9e070ad7b3b5780499ff9985e3d008b1d07cfb150410c7
[root@wkf ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
583488748f8c bridge bridge local
af41c422f293 host host local
b3c00bbdf424 mynet bridge local
5a1e992daa1a none null local
自己的网络
3.3 自定义网络启动
# docker run -d -P --name 容器名字 --net 自定义网络名 镜像名
[root@wkf ~]# docker run -d -P --name tomcat-net-01 --net mynet mytomcat
2cc83fde438dda9c80d48beac122a6693b0e705117b1e75f525c3baf10135bec
[root@wkf ~]# docker run -d -P --name tomcat-net-02 --net mynet mytomcat
fd5b3dbad0af2ff9e5651d3fc7f9de701d6e1ea968b95ff6ed9a57346a5b895f
# 查看自定义网络信息 docker network inspect 自定义网络名
[root@wkf ~]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "b3c00bbdf4244fe20f9e070ad7b3b5780499ff9985e3d008b1d07cfb150410c7",
"Created": "2022-07-14T23:18:36.278740549+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"2cc83fde438dda9c80d48beac122a6693b0e705117b1e75f525c3baf10135bec": {
"Name": "tomcat-net-01",
"EndpointID": "8d351bf3d4c644a737b142479aece1ec5e94318dd2cd35f663ee312fcc629bf1",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
},
"fd5b3dbad0af2ff9e5651d3fc7f9de701d6e1ea968b95ff6ed9a57346a5b895f": {
"Name": "tomcat-net-02",
"EndpointID": "288e6ab708fd9d3c17c6807585e1e3b12f67f5df4d26ca4c2ed11634608c70cf",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
3.4 使用自定义网络启动的两个容器互相ping
# 使用ip去ping
[root@wkf ~]# docker exec -it tomcat-net-01 ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.132 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.095 ms
^Z64 bytes from 192.168.0.3: icmp_seq=3 ttl=64 time=0.095 ms
# 使用容器名字去ping 不使用--link 也可以ping名字
[root@wkf ~]# docker exec -it tomcat-net-01 ping tomcat-net-02
PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.078 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.095 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.093 ms
自定义的docker网络已经维护好对应的关系,docker0不支持
4、网络连通
4.1 命令
docker network --help
4.2 连接
# 连接mynet和tomcat01
# 命令 docker network connect 网络名 容器名
[root@wkf ~]# docker network connect mynet tomcat01
# 查看mynet的信息
[root@wkf ~]# docker network inspect mynet
# 发现tomcat01 已经被放到了mynet网络下
结论 :
一个容器两个ip
# 01 已经打通了
[root@wkf ~]# docker exec -it tomcat01 ping tomcat-net-01
PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.128 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.114 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.091 ms
# 02 还是没有打通
[root@wkf ~]# docker exec -it tomcat02 ping tomcat-net-01
ping: tomcat-net-01: Name or service not known
# 将tomcat02 绑定到mynet上,在测试连接,发现连接成功
[root@wkf ~]# docker network connect mynet tomcat02
[root@wkf ~]# docker exec -it tomcat02 ping tomcat-net-01
PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.129 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.106 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.114 ms
5、创建一个Redis集群
5.1 自定义一个redis网卡
# --subnet 172.38.0.0/16 范围172.38.0.2 -> 1;72.38.255.255
docker network create redis --subnet 172.38.0.0/16
5.2 通过脚本创建6个redis配置
for port in $(seq 1 6);\
do \
mkdir -p /mydata/redis/node-${port}/conf
mkdir -p /mydata/redis/node-${port}/data
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >> /mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
# 开启集群
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
5.3 启动6个redis容器
# 启动一个
docker run -d -p 6371:6379 -p 16371:16379 --name redis-1 -v /mydata/redis/node-1/data:/data -v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
# 使用shell脚本启动另外5个
for port in $(seq 2 6);
do
docker run -d -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} -v /mydata/redis/node-${port}/data:/data -v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
done
5.4 创建集群
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
--cluster create 表示创建集群,后面跟要加入集群的各节点ip地址和端口(包括master和slave)
--cluster replicas 用来指定集群master对应的副本(slave)数量;它会根据我们指定的数量,去创建master和slave,并把16384个槽位平均分配给对应的master节点,并且会自动关联master和slave的关系;
5.5 查看集群信息
# 1、查看信息
/data # redis-cli -c
127.0.0.1:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:301
cluster_stats_messages_pong_sent:309
cluster_stats_messages_sent:610
cluster_stats_messages_ping_received:304
cluster_stats_messages_pong_received:301
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:610
# 2、查看节点
127.0.0.1:6379> cluster nodes
626480098675304221cf409cc68e31e4b124afb4 172.38.0.13:6379@16379 master - 0 1657973990000 3 connected 10923-16383
dad46032b1d23e39d4595832c419a3f2309259bf 172.38.0.12:6379@16379 master - 0 1657973991519 2 connected 5461-10922
506e5740046a0c06ee7b24bd8a924019d165558f 172.38.0.15:6379@16379 slave 8fbdaa0003dbe63bbf95f64d9563fe46610363a5 0 1657973990000 5 connected
8fbdaa0003dbe63bbf95f64d9563fe46610363a5 172.38.0.11:6379@16379 myself,master - 0 1657973990000 1 connected 0-5460
101cb4b3a7a8e24c7499bf2301a1dab4895fd47d 172.38.0.16:6379@16379 slave dad46032b1d23e39d4595832c419a3f2309259bf 0 1657973989513 6 connected
a2feca3361242a5b1f4382e5ad834e24bb49ca85 172.38.0.14:6379@16379 slave 626480098675304221cf409cc68e31e4b124afb4 0 1657973990917 4 connected
5.6 测试主从复制
# set a b 发现set到13主机上了
127.0.0.1:6379> set a b
-> Redirected to slot [15495] located at 172.38.0.13:6379
OK
# 停掉redis-3 即13主机
[root@wkf ~]# docker stop redis-3
# get a 发现get的数据是从14从机上获取到的
/data # redis-cli -c
127.0.0.1:6379> get a
-> Redirected to slot [15495] located at 172.38.0.14:6379
"b"
# 再次查看节点 13挂掉了 14变成主机
172.38.0.14:6379> cluster nodes
626480098675304221cf409cc68e31e4b124afb4 172.38.0.13:6379@16379 master,fail - 1657974278493 1657974278386 3 connected
dad46032b1d23e39d4595832c419a3f2309259bf 172.38.0.12:6379@16379 master - 0 1657974894051 2 connected 5461-10922
101cb4b3a7a8e24c7499bf2301a1dab4895fd47d 172.38.0.16:6379@16379 slave dad46032b1d23e39d4595832c419a3f2309259bf 0 1657974894000 6 connected
a2feca3361242a5b1f4382e5ad834e24bb49ca85 172.38.0.14:6379@16379 myself,master - 0 1657974893000 7 connected 10923-16383
506e5740046a0c06ee7b24bd8a924019d165558f 172.38.0.15:6379@16379 slave 8fbdaa0003dbe63bbf95f64d9563fe46610363a5 0 1657974894752 5 connected
8fbdaa0003dbe63bbf95f64d9563fe46610363a5 172.38.0.11:6379@16379 master - 0 1657974894552 1 connected 0-5460
6 SpringBoot 微服务打包Docker镜像
6.1 构建springboot项目c
6.2 打包应用
6.3 编写Dockerfile
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
6.4 构建镜像
[root@wkf idea]# docker build -t hellotest .
6.5 发布运行
[root@wkf idea]# docker run -d -p 8080:8080 --name demo-test-hello hellotest