0
点赞
收藏
分享

微信扫一扫

Docker第七篇【Docker网络】

罗蓁蓁 2022-01-09 阅读 53

学习之前可以先把所有的镜像和容器清理一下:
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 是如何处理容器网络访问的?

所以容器与容器之间是可以相互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 和 自定义网络

[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的问题:它不支持容器名链接访问!

自定义网络

网络模式

  • 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镜像

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

相关推荐

0 条评论