Docker应用-自定义网络连接

Docker网络

文章目录

  • Docker网络
    • 网络的基础配置
    • 自定义网络
    • 网络连通

网络的基础配置

大量的互联网应用服务包括多个服务组件,这往往需要多个容器之间通过网络通信进行互相配合。

目前Docker提供了映射容器端口到宿主机主机和容器互联机制来为容器提供网络服务:

  1. 使用端口映射机制来将容器内应用服务提供给外部网络(在之前的博客已经提到过)
  2. 通过容器互联系统让多个容器之间进行快捷的网络通信

对于一个微服务而言,database uri=ip,如果docker容器重启那么ip也会更改,所以我们希望可以通过名字来访问容器

举个例子:

# 启动两个tomcat容器
[root@VM-4-17-centos home]# docker run -d -P --name tomcat01 tomcat
[root@VM-4-17-centos home]# docker run -d -P --name tomcat02 tomcat
# 直接通过ping名称的方式进行测试
[root@VM-4-17-centos home]# docker exec -it tomcat02 ping tomcat01

在这里插入图片描述

如何解决这个问题docker提供了方案。容器的连接(link),它会在源和接受容器直接建立一个隧道。

# 通过link的方式再启动一个容器
[root@VM-4-17-centos home]# docker run -d -P --name tomcat04 --link tomcat02 tomcat
#再尝试ping一下,可以解决
[root@VM-4-17-centos tomcat]# docker exec -it tomcat04 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.117 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.076 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.081 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.064 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=5 ttl=64 time=0.076 ms

上面我们可以看到tomcat04可以ping通tomcat02,但是返回来是不行的,具体原因进入容器查看

[root@VM-4-17-centos tomcat]# docker exec -it tomcat04 cat /etc/hosts

Docker应用-自定义网络连接_第1张图片

当我们使用–link时源容器会在hosts文件中绑定目标容器的ip地址,反观tomcat02是没有的

Docker应用-自定义网络连接_第2张图片

但是在生产实际中不建议使用–link。

自定义网络

查看所有的docker网络

Docker应用-自定义网络连接_第3张图片

网络模式

  1. bridge:桥接模式(默认)
  2. none:不配置网络
  3. host:和宿主机共享网络
  4. container:容器网络连通

自己创建一个docker网络

# --subnet是子网掩码
# --driver是驱动模式,默认是bridge
# --gateway是网关
[root@VM-4-17-centos tomcat]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

# 查看
[root@VM-4-17-centos tomcat]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
a78167e0dd78   bridge    bridge    local
5780db889845   host      host      local
b97d4c33f32a   mynet     bridge    local
b2642377e6c3   none      null      local

# docker network inspect mynet查看具体信息

Docker应用-自定义网络连接_第4张图片

不适用–link启动tomcat

#启动两个tomcat容器
[root@VM-4-17-centos tomcat]# docker run -d -P --name tomcat01 --net mynet diytomcat
[root@VM-4-17-centos tomcat]# docker run -d -P --name tomcat02 --net mynet diytomcat

#再次查看网络信息

Docker应用-自定义网络连接_第5张图片

启动完之后再尝试ping连接

#通过ip
[root@VM-4-17-centos tomcat]# docker exec -it tomcat01 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.107 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.079 ms
64 bytes from 192.168.0.3: icmp_seq=3 ttl=64 time=0.080 ms
64 bytes from 192.168.0.3: icmp_seq=4 ttl=64 time=0.078 ms
#通过名称
[root@VM-4-17-centos tomcat]# docker exec -it tomcat01 ping tomcat02
PING tomcat02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.069 ms
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.078 ms
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.082 ms
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=4 ttl=64 time=0.078 ms

通过自定义网络docker帮我们维护好了对应的关系,这样做有一个好处就是不同的集群使用不同的网络,保证集群的安全。

网络连通

# 通过docker默认网卡启动两个tomcat容器
[root@VM-4-17-centos tomcat]# docker run -d -P --name tomcatd01 tomcat
[root@VM-4-17-centos tomcat]# docker run -d -P --name tomcatd02 tomcat

如何将tomcatd01和tomcat01连通起来?

Docker应用-自定义网络连接_第6张图片

# 使用docker network connect
[root@VM-4-17-centos tomcat]# docker network connect --help

Usage:  docker network connect [OPTIONS] NETWORK CONTAINER

Connect a container to a network

Options:
      --alias strings           Add network-scoped alias for the container
      --driver-opt strings      driver options for the network
      --ip string               IPv4 address (e.g., "172.30.100.104")
      --ip6 string              IPv6 address (e.g., "2001:db8::33")
      --link list               Add link to another container
      --link-local-ip strings   Add a link-local address for the container

打通tomcatd01 --> mynet

# 建立连接
[root@VM-4-17-centos tomcat]# docker network connect mynet tomcatd01
# 查看mynet信息
[root@VM-4-17-centos tomcat]# docker network inspect mynet

Docker应用-自定义网络连接_第7张图片

连通的最终效果就是将tomcatd01放到了mynet网络下,这就是所谓的一个容器两个ip。

尝试ping连接tomcat01

[root@VM-4-17-centos tomcat]# docker exec -it tomcatd01 ping tomcat01
PING tomcat01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.095 ms
64 bytes from tomcat01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.077 ms
64 bytes from tomcat01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.077 ms
64 bytes from tomcat01.mynet (192.168.0.2): icmp_seq=4 ttl=64 time=0.077 ms

64 time=0.077 ms
64 bytes from tomcat01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.077 ms
64 bytes from tomcat01.mynet (192.168.0.2): icmp_seq=4 ttl=64 time=0.077 ms


假如我们需要跨网络操作,就需要使用docker connect连通,如上操作即可!

你可能感兴趣的:(docker,docker,容器,运维)