Docker 网络配置

Docker 网络配置

  • 前言
  • Docker 网络配置
  • 外部访问 Docker 容器
  • Docker 部署 SpringCloud项目
    • Idea 中 springcloud项目 打成 jar 包
    • Docker 部署 springcloud

本章知识:

1、Docker 网络配置
2、Docker 部署SpringCloud项目

前言

当你开始大规模使用 Docker 时,你会发现需要了解很多关于网络的知识。
Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。
然而,Docker 同样有着很多不完善的地方,网络方面就是 Docker 比较薄弱的部分。

因此,我们有必要 深入了解 Docker 的网络知识,以满足更高的网络需求。

Docker 作为目前最火的轻量级容器技术,牛逼的功能,如 Docker 的镜像管理,不足的地方网络方面。

Docker 有自身的4种网络工作方式,和一些自定义网络模式。

安装 Docker 时,它会自动创建三个网络,bridge(创建容器默认连接到此网络)、 none 、host

Bridge:此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机通信。

host:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。

Container:创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围。

None:该模式关闭了容器的网络功能。

以上都是不用动手的,真正需要配置的是自定义网络。


Docker 网络配置

Docker 网络模式介绍:

Docker在创建容器时有四种网络模式:bridge、host、container、none

bridge 为默认不需要用 --net 去指定,其他三种模式需要在创建容器时使用 --net 去指定

  1. bridge 模式 (默认模式)

    当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。
    虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

    从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。
    在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。
    可以通过brctl show命令查看。

    bridge模式是docker的默认网络模式,不写–net参数,就是bridge模式。
    使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。
    可以使用iptables -t nat -vnL 查看。

    docker run 时使用 --net=bridge,这种模式会为每个容器分配一个独立的Network Namespace,
    同一个宿主机上的所有容器会在同一个网段下,相互之间是可以通信的。

    注意:bridge 为默认模式,不需要使用参数 --net 去指定,使用了 --net 参数反而无效
    bridge模式无法指定容器 IP(但非绝对)

    bridge 模式图解:
    Docker 网络配置_第1张图片

  2. host 模式

    如果启动容器的时候使用 host模式,那么这个容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个Network Namespace。
    容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。
    但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

    docker run 时使用 --net=host容器将不会虚拟出IP/端口,而是使用宿主机的IP和端口。

     	 docker run -itd --net=host 961769676411
    

    注意:host模式不能使用端口映射和自定义路由规则,这些都与主机一致,-p 与-icc 参数是无效的

    host 模式图解:
    Docker 网络配置_第2张图片

  3. container 模式

    不常用

    这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。
    新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。
    同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

    container 模式图解 :
    Docker 网络配置_第3张图片

  4. none 模式

    不常用

    使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。
    也就是说,这个Docker容器没有网卡、IP、路由等信息。
    需要我们自己为Docker容器添加网卡、配置IP等。

    none 模式图解:
    Docker 网络配置_第4张图片

  5. 跨主机通信

    Docker默认的网络环境下,单台主机上的Docker容器可以通过docker0网桥直接通信,而不同主机上的Docker容器之间只能通过在主机上做端口映射进行通信。
    这种端口映射方式对很多集群应用来说极不方便。
    如果能让Docker容器之间直接使用自己的IP地址进行通信,会解决很多问题。
    按实现原理可分别直接路由方式、桥接方式(如pipework)、Overlay隧道方式(如flannel、ovs+gre)等。

    以上四种均未跨主机,也就是说容器均运行在一台宿主机上,但实际生产环境不可能只用一台来跑。
    肯定会用到多台,那么多台主机之间的容器如何通信 ?

    1. 使用路由机制打通网络
    2. 使用Open vSwitch(OVS)打通网络
    3. 使用flannel来打通网络
    4. 使用Quagga来实现自动

简单演示:
在这里插入图片描述
Docker 网络配置_第5张图片
在这里插入图片描述
Docker 网络配置_第6张图片
上面通过宿主机访问容器里的tomcat
在这里插入图片描述
效果:8080/8081都可以访问到!!!


外部访问 Docker 容器

  1. bridge 模式

      docker run -itd -p 7101:7101 镜像ID
      ## -p参数可以出现多次,绑定多个端口号
      docker run -itd -p 8080:8080 -p 8088:8088 镜像ID
    

    实例:
    docker run -it --name mytomcat02 -p 8081:8080 882487b8be1d
    http://192.168.147.142:8081/

  2. host 模式

     	 docker run -itd --net=host 镜像ID
    

    实例:
    docker run -itd --net=host 882487b8be1d
    http://192.168.147.142:8080/

    注1:不需要添加-p参数,因为它使用的就是主机的IP和端口,添加-p参数后,反而会出现以下警告:
    WARNING: Published ports are discarded when using host network mode
    注2:宿主机的ip路由转发功能一定要打开,否则所创建的容器无法联网!
    echo 1 > /proc/sys/net/ipv4/ip_forward

  3. 相关命令

          #停止并删除所有容器
          docker stop $(docker ps -aq) && docker rm $(docker ps -aq)
    
  4. 网桥查看工具 bridge-utils

      apt install bridge-utils
      brctl show
    

Docker 部署 SpringCloud项目

相关的学习资料:

SpringCloud 基本入门

Eureka 集群 及 自我保护机制

Ribbon 负载均衡 及 Feign消费者调用服务

zuul 网关基本入门

SpringCloud 服务配置中心

先确保工程能够正常访问:

http://eureka2001.dj.com:2001/
http://localhost:1005/student/list
http://localhost/student/list

以这五个部署为例


Idea 中 springcloud项目 打成 jar 包

  1. 在idea运行springcloud项目,不报错,均可正常访问

  2. 修改主模块的pom

        <version>0.0.1-SNAPSHOT</version>
         <!-- 1.注意更改为pom而不是jar -->
         <!--
         <packaging>jar</packaging>
         -->
         <packaging>pom</packaging> 
    
         <!-- 2.主模块不要配置插件 -->
         <build></build>
    
  3. 在各个子 module 模块的 pom.xml 文件中添加插件依赖

    <build>
            <plugins>
                <!--添加maven插件-->
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <configuration>
                        <!--添加自己的启动类路径!-->
                        <mainClass>!!!这里是该启动类的路径!!!</mainClass>
                    </configuration>
                    <executions>
                        <execution>
                            <goals>
                                <!--可以把依赖的包都打包到生成的Jar包中-->
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
         </build>
    

    在这里插入图片描述

  4. 点击 idea 的 view ——> Tool windows ——> maven projects
    先双击 clean(去掉之前打的包target文件夹)——> 再创建 install
    Docker 网络配置_第7张图片

  5. 将项目各子模块 target 目录下的 jar 包,复制到指定目录,再通过java命令直接运行
    Docker 网络配置_第8张图片
    先测试一下能不能用:

    把jar包复制出来,在存放的目录下 按住 Shift键并鼠标右击,选择“在此处打开 Powershell 窗口(S)”
    Docker 网络配置_第9张图片

     	     java -jar *.jar --spring.profiles.active=xxx
    

    例如:

    java -jar microservice-eureka-server.jar --spring.profiles.active=eureka2001
    java -jar microservice-eureka-server.jar --spring.profiles.active=eureka2002
    java -jar microservice-student-provider-hystrix.jar --spring.profiles.active=provider-hystrix-1005
    java -jar microservice-student-provider-hystrix.jar --spring.profiles.active=provider-hystrix-1006
    java -jar microservice-student-consumer-feign-80.jar

    效果:
    Docker 网络配置_第10张图片
    Docker 网络配置_第11张图片

Docker 部署 springcloud

  1. 宿主机修改 hosts 文件

    加入虚拟机的映射

        vim /etc/hosts
    

    在这里插入图片描述

       	 	    ## 在里面添加要映射的域名即可
    		    127.0.0.1  eureka2001.dj.com
      			127.0.0.1  eureka2002.dj.com
    

    Docker 网络配置_第12张图片

  2. 宿主机创建文件夹 apps,rz 上传 eureka-server-cluster.jar包 到 apps文件夹中

         ## 此目录稍后作为数据卷,在宿主机和容器之间共享数据
     	 mkdir /apps
    

    Docker 网络配置_第13张图片
    在这里插入图片描述

  3. 使用 jre:8 镜像 启动容器,并挂载指定目录为数据卷

    也就是说apps是作为一个共享目录而存在,所有的容器都能访问它。

          docker run -d \
            -it \
            --net=host \
            --name eureka-server-peer1 \
            --mount type=bind,source=/javadj_docker/apps,target=/javadj_docker/apps \
            镜像ID   
    

    注意:jre:8是自定义镜像,已安装jre1.8

    举例:

     docker run -di \
     	       --net=host \
     	       --name eureka-server-peer1 \
     	       --mount type=bind,source=/javadj_docker/apps,target=/javadj_docker/apps \
     	       e0f00637d32e  
    

    效果:
    Docker 网络配置_第14张图片在这里插入图片描述

  4. 进入容器,java命令启动微服务

          docker exec -it eureka-server-peer1 /bin/sh
         
          java -jar microservice-eureka-server.jar --spring.profiles.active=eureka2001
    

    进入容器:
    在这里插入图片描述
    切换到共享目录 apps 里面,java命令启动微服务 eureka2001:

    Docker 网络配置_第15张图片

          同理可以启动eureka-server-peer2
          docker start $(docker ps -aq)
    

    测试:

    浏览器访问:192.168.153.130:2001
    Docker 网络配置_第16张图片
    浏览器访问:192.168.153.130:2002
    Docker 网络配置_第17张图片

    注意:如果浏览器访问不了,建议检查一下防火墙的状态,需要关闭防火墙!!!

     	 systemctl status firewalld
    

    Docker 网络配置_第18张图片

    上图所示,我的防火墙是开着的,现在关闭防火墙:

      systemctl stop firewalld.service
      systemctl disable firewalld.service
    

    在这里插入图片描述
    这样就OK啦!!!

~o(°~ω~°)0~\ノ完结撒花!


本章小结:

  1. Docker 的网络配置

    桥接模式 Bridge

    会在每一个容器中虚拟一个IP出来
    容器中的端口需要与宿主机中的端口完成映射,不然外界无法访问
    宿主机的一个端口只能映射一次

    	Docker run -di --name xxx -p 8081:8080 镜像ID
    

    仅主机 host 模式

    容器与宿主机共享IP,所以宿主机的端口就是容器的端口,无需映射

    	Docker run -di --name xxx -net=host 镜像ID
    
  2. Docker 部署 SpringCloud 项目

    1. 将要部署的项目打包

      父工程的packing --> pom 注意:build标签不能出现,父工程及共有工程不需要配置maven打包插件

      在各个需要打包的子工程中配置maven打包插件(里面要配置相对应的子工程的启动类)

    2. xxx.jar

      利用 cmd 命令切换到 jar 所在位置,然后执行 Java -jar xxx.jar 测试打出来的 jar 是没有任何问题

    3. 在宿主机中创建 apps 目录,作为后续的共享目录存在,将 xxx.jar 文件进行上传

    4. 根据 apps 作为数据卷目录创建两个容器,这两个容器是根据 jre 镜像创建的,从而就拥有 Java 的运行环境

    5. 进入创建好的容器

      Docker exec -it 容器的ID\容器名 /bin/sh
      在进入容器中的 apps 目录就可以看到 xxx.jar
      Jaca -jar xxx.jar

你可能感兴趣的:(Docker,Linux,SpringCloud,Docker,网络配置)