Docker学习5 - network容器网络、compose容器编排、简单Demo演示Redis、MySQL、SpringBoot项目编排部署

x33g5p2x  于2022-07-26 转载在 Docker  
字(10.2k)|赞(0)|评价(0)|浏览(558)

容器网络-network

概念

背景: docker容器内部的IP是有可能变动

作用: 1. 容器间的互联、通信记忆端口映射、2. 容器IP变动时可以通过服务名直接网络通信而不受影响

默认的docker0网卡网桥: 将所有容器和本地主机都放到同一个物理网络,Docker默认指定了docker0接口的IP地址和子网掩码,让主机和容器之间可以通过桥相互通信

docker进程启动后,系统会多出一个叫docker0的网卡信息

网络模式

默认--network bridge--network host很少用到--network none--network container:NAMEDocker网络模式bridge:桥接模式-为没给个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥host:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口none:容器有独立的 Network namespace,但并没有对其进行任何网络设置,如分配veth pair和网桥连接,IP等container:新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等自定义网络

bridge-docker0网桥 - 使用虚拟的IP、端口

默认网络模式下:容器内的网关其实就是docker0

概念
  1. 整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair)
  2. 每个容器实例内部也有一块网卡,每个接口叫etho
  3. docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。通过上述,将宿主机上的所有容器都连接到这个内部网络上,两个容器在同一个网络下,会从这个网关下各自拿到分配的ip,此时两个容器的网络是互通的

案例讲解
# 两个实例出来的容器容器方式
# 这样启动默认的网络就是使用 docker0的桥接模式
docker run -d -p 80:8080 --name=my-spring-boot my-spring-boot:1.0

docker run -d -p 81:8080 --name=my-spring-boot2 my-spring-boot:1.0

host - 使用物理机的IP、端口
概念

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

简单理解: 相当于你把项目部署在宿主机上,你怎么访问宿主机的项目你就怎么访问–net=host的部署的容器项目,可能会出现部署失败,由于宿主机可能有其他项目占用宿主机的端口

案例
#会报警告说  使用 --net=host模式   -p端口映射不会起任何作用
docker run -d -p 8081:8080 --net=host --name=my-spring-boot3 my-spring-boot:1.0

# 改成这样就不会发出警告
docker run -d  --net=host --name=my-spring-boot3 my-spring-boot:1.0

none - 很少用
概念

禁用网络功能,只有lo标识(就是127.0.0.1表示本地回环)

详细: 此模式下,并不为Docker容器进行任何网络配置。这个Docker容器没有网卡、IP、路由等信息,只有一个lo链路回环,需要我们自己为此Docker容器添加网卡、配置IP等信息

案例

container - 利用其他运行中容器的虚拟网卡信息
概念

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

案例

自定义网络 - 用于划分某几个容器共处一个网络方便管理
桥接模式

注意1: 使用默认的桥接模式,使用:ping 容器名 === 不能互相ping通、使用:ping 容器IP === 能互相ping通

注意2: 指定同一个自定义桥接类型的网络容器内使用:ping 容器名 === 能互相ping通、使用:ping 容器IP === 能互相ping通

案例

命令

network

docker network --help

Usage:  docker network COMMAND

Manage networks

Commands:
  connect     Connect a container to a network
  create      Create a network
  disconnect  Disconnect a container from a network
  inspect     Display detailed information on one or more networks
  ls          List networks
  prune       Remove all unused networks
  rm          Remove one or more networks

ls、inspect - docker所有网络、详细查看具体的某个网络信息
//查看ls的使用文档
docker network ls --help

//默认会创建3大网络模式,如下图
docker network ls

//查看inspect使用文档
docker network inspect  --help

//查看网络详细信息
docker network inspect 网络ID

查看系统所有网络相关

查看某个网络详细信息相关

create、rm - docker中创建、删除网络
//网络创建使用文档
docekr network create --help

//默认 桥接模式
docekr network create 新网络名字

//网络删除使用文档
docekr network rm --help

docekr network rm 网络的ID

创建网络相关

删除网络相关

容器编排-compose

概述

解决: Docker容器集群的快速编排 — 很多容器间启动顺序、网络通信的调用等等的管理

docker-compose.yml: 写好多个容器之间的调用关系。只用一个命令就可同时启动、关闭这些容器

compose命令官网: https://docs.docker.com/compose/reference/

compose文件官网: https://docs.docker.com/compose/compose-file/

安装注意: 根据最新的官网下载docker,docker-compose会内置集成为成docker一个基础命令
安装官网: https://docs.docker.com/engine/install/centos/

定义多个容器的编排docker-compose核心概念一文件:docker-compose.yml两要素服务:多个应用容器实例工程:由多个容器实例组成的一个完整业务单元

容器编排使用步骤1. Dockerfile定义各个微服务应用并构建出对应的镜像文件2. 使用docker-compose.yml,定义一个完整业务单元,安排好整体应用中的各个容器服务3. 执行docker-compose up命令来启动并运行整个应用程序,完成一键部署上线

命令

概述
# 帮助文档
docker compose --help

# docker-compose版本
docker compose version

# 检测当前目录下docker-compose.yml语法是否正确 == 结果没任何消息说明语法正确
# 下面两个命令是一样的
docker compose config -q
docker compose convert -q

# 基于当前目录的docker-compose.yml启动一系列容器
docker compose up -d

简单Demo演示
Springboot项目

项目结构

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>work.linruchang</groupId>
    <artifactId>docker-springboot-test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>docker-springboot-test</name>
    <description>docker-springboot-test</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>

        <!-- https://mvnrepository.com/artifact/com.github.xiaoymin/knife4j-spring-boot-starter -->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>


        <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.4</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.29</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.7.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/p6spy/p6spy -->
        <dependency>
            <groupId>p6spy</groupId>
            <artifactId>p6spy</artifactId>
            <version>3.9.1</version>
        </dependency>



        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

application.yml

server:
  port: 8080

# 数据库设置
spring:
  datasource:
    username: root
    password: root
#    url: jdbc:p6spy:mysql://192.168.19.107:3306/lrc_blog?useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    url: jdbc:p6spy:mysql://mysql:3306/lrc_blog?useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    driver-class-name: com.p6spy.engine.spy.P6SpyDriver
  redis:
#    host: 192.168.19.107
    host: redis
    port: 6379
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher


# mybatisplus设置
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true
    cache-enabled: true
  mapper-locations: classpath:mapper/*Mapper.xml
  global-config:
    db-config:
      id-type: assign_uuid
      logic-delete-value: 1
      logic-not-delete-value: 0
      logic-delete-field: is_del
      where-strategy: not_empty  #不where非empty的字段【空字符、null值】
      update-strategy: not_empty
      insertStrategy: not_empty

SpringConfig.yml

@Configuration
@EnableSwagger2
public class SpringConfig {

    @Bean(value = "defaultApi2")
    public Docket defaultApi2() {
        Docket docket = new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(new ApiInfoBuilder()
                        //.title("swagger-bootstrap-ui-demo RESTful APIs")
                        .description("# swagger-bootstrap-ui-demo RESTful APIs")
                        .termsOfServiceUrl("http://www.xx.com/")
                        .contact(new Contact("xx@qq.com","xx@qq.com","xx@qq.com"))
                        .version("1.0")
                        .build())
                //分组名称
                .groupName("2.X版本")
                .select()
                //这里指定Controller扫描包路径
                .apis(RequestHandlerSelectors.basePackage("work.linruchang.dockerspringboottest"))
                .paths(PathSelectors.any())
                .build();
        return docket;
    }

}

IndexController.yml

@RestController
public class IndexController {

    @Autowired
    Environment environment;

    @GetMapping
    public Dict getInfo() {

        return Dict.create()
                .set("name", "lrc")
                .set("port", environment.getProperty("server.port"));
    }

}

UserController.yml

@RestController
@RequestMapping("user")
public class UserController {

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    VUserService vUserService;

    private final String redis_user_key = "user_";

    @GetMapping("/{userId}")
    public Object getUserById(@PathVariable("userId") Long userId) {

        String redisKey = redis_user_key + userId;

        VUser user = (VUser) redisTemplate.opsForValue().get(redisKey);
        if( user == null ) {
            user = vUserService.getById(userId);
            if(user != null) {
                redisTemplate.opsForValue().set(redisKey,user);
                return user;
            }
        }
        return user;
    }


}
docker-compose文件编写

docker-compose.yml

version: "3"

services:
  microService:
    image: my-spring-boot:2.0
    container_name: my-spring-boot-redis-mysql
    ports:
      - "8080:8080"
    volumes:
      - /app/microService:/data
    networks:
      - lrcMicroService
    depends_on:
      - redis
      - mysql

  redis:
    image: redis:latest
    container_name: redis
    ports:
      - "6379:6379"
    volumes:
      - /www/server/redis/redis.conf:/etc/redis/redis.conf
      - /www/server/redis/data:/data
    networks:
      - lrcMicroService
    command:
      - redis-server
      - /etc/redis/redis.conf

  mysql:
    image: mysql:latest
    container_name: mysql
    ports:
      - "3306:3306"
    volumes:
      - /www/server/mysql/conf.d:/etc/mysql/conf.d
      - /www/server/mysql/data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: 'root'

    networks:
      - lrcMicroService

networks:
  lrcMicroService:
启动项目、浏览器测试、停止项目
//基于docker-compose.yml启动项目
docker compose up -d 

//基于docker-compose.yml删除容器,停止项目
docker compose down

相关文章