Docker第七篇【Docker网络】

Docker 专栏收录该内容
7 篇文章 0 订阅

注:此笔记依据B站狂神说,想学习点此链接可直接跳转

学习之前可以先把所有的镜像和容器清理一下:
docker rm -f $(docker ps -aq)
docker rmi -f $(docker images -aq)

一、Docker 网络是如何互通的

查看 docker 地址
在这里插入图片描述
启动容器再查看一下地址发现多了两个地址,其实就是这两个容器的地址

[root@VM-12-16-centos ~]# docker run -d -P --name tomcat01 tomcat
[root@VM-12-16-centos ~]# docker run -d -P --name tomcat02 tomcat
bb3a61b3fdf8efce477dc33b80d7e91b90359d768fc975083b9d5c9f3e846d87
[root@VM-12-16-centos ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 52:54:00:93:b6:9d brd ff:ff:ff:ff:ff:ff
    inet 10.0.12.16/22 brd 10.0.15.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fe93:b69d/64 scope link 
       valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:d6:6d:78:5e brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:d6ff:fe6d:785e/64 scope link 
       valid_lft forever preferred_lft forever
65: veth651e8d4@if64: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether a2:56:40:05:02:9f brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::a056:40ff:fe05:29f/64 scope link 
       valid_lft forever preferred_lft forever
67: veth5c96724@if66: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether ba:c6:3e:12:d9:9d brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::b8c6:3eff:fe12:d99d/64 scope link 
       valid_lft forever preferred_lft forever
# 查看容器内部的网络地址 ip addr 再ping 一下这两个地址发现是可以ping通的
[root@VM-12-16-centos ~]# docker exec -it tomcat01 ip addr

那么 docker 是如何处理容器网络访问的?

我们每启动一个docker容器, docker就会给docker容器分配一个ip, 我们只要安装了docker,就会有一个网卡 docker0桥接模式,使用的技术是veth-pair技术!

我们发现这个容器带来网卡,都是一对对的
veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连。
正因为有这个特性,veth-pair充当一个桥梁, 连接各种虚拟网络设备 OpenStac,Docker容器之间的链接,OVS的链接, 都是使用veth-pair技术。

所以容器与容器之间是可以相互ping通的!
可以参考下图:
在这里插入图片描述
tomcat01和tomcat02是共用的一个路由器,docker0

所有容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用IP

Docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥docker0.

在这里插入图片描述
Docker中的所有的网络接口都是虚拟的,虚拟的转发效率高!(内网传递文件!)

只要容器删除,对应的网桥一对就没有了!

查看docker 默认的网桥配置

[root@VM-12-16-centos home]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
4eeea67ae2bb   bridge    bridge    local
a51c91b7885e   host      host      local
a6cd251f4f91   none      null      local
[root@VM-12-16-centos home]# docker inspect 4eeea67ae2bb
[
    {
        "Name": "bridge",
        "Id": "4eeea67ae2bba616b0dee0243dca1a97fec2d279c9776dc347b87cccfd4a5c5a",
        "Created": "2021-12-26T16:46:03.152021037+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16", # 255*255
                    "Gateway": "172.17.0.1" #docker0
                }
            ]
        },

二、容器互联 - - link 和 自定义网络

思考一个场景,我们编写了一个微服务,database url =ip; 项目不重启,数据ip换掉了,我们希望可以处理这个问题,可以按名字来进行访问容器

[root@VM-12-16-centos]# docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known
 
#如何可以解决呢?
#通过--link既可以解决网络连通问题
[root@VM-12-16-centos ~]# docker run -d -P  --name tomcat03 --link tomcat02 tomcat
3a2bcaba804c5980d94d168457c436fbd139820be2ee77246888f1744e6bb473
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
3a2bcaba804c        tomcat              "catalina.sh run"   4 seconds ago       Up 3 seconds        0.0.0.0:32772->8080/tcp   tomcat03
f22ed47ed1be        tomcat              "catalina.sh run"   57 minutes ago      Up 57 minutes       0.0.0.0:32771->8080/tcp   tomcat02
9d97f93401a0        tomcat              "catalina.sh run"   About an hour ago   Up About an hour    0.0.0.0:32770->8080/tcp   tomcat01
[root@VM-12-16-centos ~]# 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.129 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.100 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.110 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.107 ms
 
#反向可以ping通吗?
[root@VM-12-16-centos ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known

其实这个tomcat03就是在本地配置了tomcat02的配置!

[root@VM-12-16-centos ~]# 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 f22ed47ed1be
172.17.0.4  3a2bcaba804c

本质探究:–link 就是我们在hosts配置中增加了一个172.17.0.3 tomcat02 f22ed47ed1be
我们现在玩Docker已经不建议使用--link了!
自定义网络!不使用Docker0!
Docker0的问题:它不支持容器名链接访问!

自定义网络

查看所有的docker网络

网络模式

  • bridge: 桥接模式,桥接 docker 默认,自己创建的也是用brdge模式
  • none: 不配置网络
  • host: 和宿主机共享网络
  • container:容器网络连通!(用的少, 局限很大)

测试:

# 我们直接启动的命令默认有一个 --net bridge,而这个就是我们的docker0
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat
 
# docker0特点,默认,容器名不能访问, --link可以打通连接!
# 我们可以自定义一个网络!
# --driver bridge
# --subnet 192.168.0.0/16 可以支持255*255个网络 192.168.0.2 ~ 192.168.255.254
# --gateway 192.168.0.1
[root@VM-12-16-centos ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
26a5afdf4805d7ee0a660b82244929a4226470d99a179355558dca35a2b983ec
[root@VM-12-16-centos ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
30d601788862        bridge              bridge              local
226019b14d91        host                host                local
26a5afdf4805        mynet               bridge              local
7496c014f74b        none                null                local

我们自己创建的网络就ok了!

三、SpringBoot微服务打包Docker镜像

1、构建springboot项目

2、打包应用

3、编写Dockerfile

FROM java:8
 
COPY *.jar /app.jar
 
CMD ["--server.port=8080"]
 
EXPOSE 8080
 
ENTRYPOINT ["java", "-jar", "/app.jar"]

4、构建镜像

5、发布运行!

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页

打赏作者

TMLNICK

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值