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高级-3.Docker网络与Docker-compose容器编排_第1张图片

        Docker网络能干什么?

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

Docker高级-3.Docker网络与Docker-compose容器编排_第2张图片

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地址
 

Docker高级-3.Docker网络与Docker-compose容器编排_第3张图片


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

Docker高级-3.Docker网络与Docker-compose容器编排_第4张图片


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

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

docker network inspect bridge | grep name

1.3.2 host

        使用 --network host 指定

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

Docker高级-3.Docker网络与Docker-compose容器编排_第5张图片

        若网络模式指定为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、端口范围等。当然,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。

Docker高级-3.Docker网络与Docker-compose容器编排_第6张图片

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 安装与卸载

        安装:

curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

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 示例如下:

version: "3"
 
services:
  microService:
    image: zzyy_docker:1.6
    container_name: ms01
    ports:
      - "6001:6001"
    volumes:
      - /app/microService:/data
    networks: 
      - atguigu_net 
    depends_on: 
      - redis
      - mysql
 
  redis:
    image: redis:6.0.8
    ports:
      - "6379:6379"
    volumes:
      - /app/redis/redis.conf:/etc/redis/redis.conf
      - /app/redis/data:/data
    networks: 
      - atguigu_net
    command: redis-server /etc/redis/redis.conf
 
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: '123456'
      MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
      MYSQL_DATABASE: 'db2021'
      MYSQL_USER: 'zzyy'
      MYSQL_PASSWORD: 'zzyy123'
    ports:
       - "3306:3306"
    volumes:
       - /app/mysql/db:/var/lib/mysql
       - /app/mysql/conf/my.cnf:/etc/my.cnf
       - /app/mysql/init:/docker-entrypoint-initdb.d
    networks:
      - atguigu_net
    command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
 
networks: 
   atguigu_net: 
docker-compose up      #开启
docker-compose stop    #关闭

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

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