• Docker高级-3.Docker网络与Docker-compose容器编排


    目录

    一、Docker网络

    1.1基本概念

    1.2 关于Docker网络的命令

    1.3 各网络模式的详细介绍

    1.3.1 bridge

    1.3.2 host

    1.3.3 none

    1.3.4 container

    1.3.5 自定义网络

    二、Docker-compose容器编排

    2.1 基本概念

    2.2 使用

    2.2.1 安装与卸载

    2.2.2 使用步骤

    2.2.3 常用命令

    2.2.4 示例介绍


    一、Docker网络

    1.1基本概念

            首先我们先明确一点:Docker启动之后,系统中会产生一个名为docker0虚拟网桥

            而docker中默认创建三个网络bridge、host、none

    docker network ls

            Docker网络能干什么?

           负责容器间的互联和通信以及端口映射,通过自定义网络容器IP变动时候可以通过服务名直接进行网络通信而不受影响(容器的ip可不是固定的哦)。

    1.2 关于Docker网络的命令

    docker network ls                                      查看网络

    docker network inspect    网络名             查看网络源数据

    docker network rm     网络名                    删除网络

    docker network create     网络名              添加网络

    1.3 各网络模式的详细介绍

    1.3.1 bridge

            使用 --network  bridge 指定,默认使用docker0

            1 Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0)Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
     
            2 docker run 的时候,没有指定network的话默认使用的网络模式就是bridge,使用的就是docker0。在宿主机ifconfig,就可以看到docker0和自己create的network(后面讲):eth0,eth1,eth2……代表网卡一,网卡二,网卡三……,lo代表127.0.0.1,即localhost,inet addr用来表示网卡的IP地址
     


            3 网桥docker0创建一对对等虚拟设备接口,一个叫veth,另一个叫eth0成对匹配
              3.1 整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair);
              3.2 每个容器实例内部也有一块网卡,每个接口叫eth0;
              3.3 docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。


            通过上述,将宿主机上的所有容器都连接到这个内部网络上,两个容器在同一个网络下,会从这个网关各自拿到分配的ip,此时两个容器的网络是互通的。

            # 查看 bridge 网络的详细信息,并通过 grep 获取名称项 

    docker network inspect bridge | grep name

    1.3.2 host

            使用 --network host 指定

            容器将不会获得一个独立的Network Namespace, 而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机IP端口

            若网络模式指定为host,则自行设置的映射端口无效的。端口号会以主机端口号为主,重复时则递增。

    1.3.3 none

            使用 --network none 指定

            在none模式下,并不为Docker容器进行任何网络配置。 也就是说,这个Docker容器没有网卡、IP、路由等信息,只有一个lo(就是127.0.0.1表示本地回环)。需要我们自己为Docker容器添加网卡、配置IP等。相当于禁用了网络功能!

    1.3.4 container

             使用 --network container:NAME/容器ID 指定

            新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。当然,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。

    1.3.5 自定义网络

             自定义网络默认使用的是桥接网络bridge

    docker network create mynetwork

            分别在自定义的网络下运行两个容器实例 

    docker run -d -p xxx:xxx--network mynetwork  --name c1 xxx
    docker run -d -p xxx:xxx--network mynetwork  --name c2 xxx

            在两个容器 c1、c2 中互相ping(使用实例名,而不是IP),成功连通!

            所以,自定义网络本身就维护好了主机名ip对应关系ip域名都能通)!!!

    二、Docker-compose容器编排

    2.1 基本概念

            docker建议我们每一个容器中只运行一个服务,因为docker容器本身占用资源极少,所以最好是将每个服务单独的分割开来。但是这样我们又面临了一个问题:
            如果我需要同时部署好多个服务,难道要每个服务单独写Dockerfile然后在构建镜像,构建容器?这样累都累死了,所以docker官方给我们提供了docker-compose多服务部署的工具
            例如要实现一个Web微服务项目,除了Web服务容器本身,往往还需要再加上后端的数据库mysql服务容器,redis服务器,注册中心eureka,甚至还包括负载均衡容器等等。。。。。。

            Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目project)。可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。Docker-Compose 解决了容器与容器之间如何管理编排的问题

            compose的两大要素

                    服务(service):一个个应用容器实例,比如订单微服务、库存微服务、mysql容器、nginx容器或者redis容器

                    工程(project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

    2.2 使用

    2.2.1 安装与卸载

            安装:

    1. curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    2. chmod +x /usr/local/bin/docker-compose
    3. docker-compose --version

            卸载:

    sudo rm /usr/local/bin/docker-compose

    2.2.2 使用步骤

            1.编写Dockerfile定义各个微服务应用并构建出对应的镜像文件

            2.使用 docker-compose.yml 定义一个完整业务单元,安排好整体应用中的各个容器服务。

            3.最后执行docker-compose up命令 来启动并运行整个应用程序,完成一键部署上线

    2.2.3 常用命令

    docker-compose -h                              # 查看帮助
    docker-compose up                             # 启动所有docker-compose服务
    docker-compose up -d                         # 启动所有docker-compose服务并后台运行
    docker-compose down                         # 停止并删除容器、网络、卷、镜像。
    docker-compose exec  yml里面的服务id        # 进入容器实例内部  docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
    docker-compose ps                            # 展示当前docker-compose编排过的运行的所有容器
    docker-compose top                           # 展示当前docker-compose编排过的容器进程
     
    docker-compose logs  yml里面的服务id     # 查看容器输出日志
    docker-compose config                              # 检查配置
    docker-compose config -q                          # 检查配置,有问题才有输出
    docker-compose restart                             # 重启服务
    docker-compose start                                # 启动服务
    docker-compose stop                                # 停止服务

    2.2.4 示例介绍

             假设现在有这样的项目包括:一个微服务工程、mysql服务器、redis服务器。可以写出docker-compose.yml 示例如下:

    1. version: "3"
    2. services:
    3. microService:
    4. image: zzyy_docker:1.6
    5. container_name: ms01
    6. ports:
    7. - "6001:6001"
    8. volumes:
    9. - /app/microService:/data
    10. networks:
    11. - atguigu_net
    12. depends_on:
    13. - redis
    14. - mysql
    15. redis:
    16. image: redis:6.0.8
    17. ports:
    18. - "6379:6379"
    19. volumes:
    20. - /app/redis/redis.conf:/etc/redis/redis.conf
    21. - /app/redis/data:/data
    22. networks:
    23. - atguigu_net
    24. command: redis-server /etc/redis/redis.conf
    25. mysql:
    26. image: mysql:5.7
    27. environment:
    28. MYSQL_ROOT_PASSWORD: '123456'
    29. MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
    30. MYSQL_DATABASE: 'db2021'
    31. MYSQL_USER: 'zzyy'
    32. MYSQL_PASSWORD: 'zzyy123'
    33. ports:
    34. - "3306:3306"
    35. volumes:
    36. - /app/mysql/db:/var/lib/mysql
    37. - /app/mysql/conf/my.cnf:/etc/my.cnf
    38. - /app/mysql/init:/docker-entrypoint-initdb.d
    39. networks:
    40. - atguigu_net
    41. command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
    42. networks:
    43. atguigu_net:
    1. docker-compose up #开启
    2. docker-compose stop #关闭

            注意,我们自定义了网络,所以在微服务中配置的数据库地址应由IP地址改为服务名称数据库以及还是要自己创建的!

  • 相关阅读:
    Debezium系列之:使用逻辑命名空间为不同的表做个性化设置
    转行网络工程师,软考和华为认证选哪个?
    R语言绘制时间序列的偏自相关函数图:使用pacf函数可视化时间序列数据的偏自相关系数图、分析是否存在自相关性以及显著相关的个数
    JVM学习之 内存结构
    一篇文章搞懂:词法作用域、动态作用域、回调函数及闭包
    【GNN报告】ICT敖翔:图机器学习应对金融欺诈对抗攻击
    centos安装docker
    Day49 力扣单调栈 : 739. 每日温度 |496.下一个更大元素 I
    TCP延申
    vs code 好用的插件
  • 原文地址:https://blog.csdn.net/weixin_62427168/article/details/126681899