Docker网络及SpringBoot应用打包

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

6.6 测试访问

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值