背景: 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、端口范围等自定义网络
默认网络模式下:容器内的网关其实就是docker0
# 两个实例出来的容器容器方式
# 这样启动默认的网络就是使用 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
概念: 容器将不会获得一个独立的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
禁用网络功能,只有lo标识(就是127.0.0.1表示本地回环)
详细: 此模式下,并不为Docker容器进行任何网络配置。这个Docker容器没有网卡、IP、路由等信息,只有一个lo链路回环,需要我们自己为此Docker容器添加网卡、配置IP等信息
新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的器共享IP、端口范围等。但是,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。
注意1: 使用默认的桥接模式,使用:ping 容器名 === 不能互相ping通、使用:ping 容器IP === 能互相ping通
注意2: 指定同一个自定义桥接类型的网络容器内使用:ping 容器名 === 能互相ping通、使用:ping 容器IP === 能互相ping通
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的使用文档
docker network ls --help
//默认会创建3大网络模式,如下图
docker network ls
//查看inspect使用文档
docker network inspect --help
//查看网络详细信息
docker network inspect 网络ID
查看系统所有网络相关
查看某个网络详细信息相关
//网络创建使用文档
docekr network create --help
//默认 桥接模式
docekr network create 新网络名字
//网络删除使用文档
docekr network rm --help
docekr network rm 网络的ID
创建网络相关
删除网络相关
解决: 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
项目结构
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.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
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_39651356/article/details/125962056
内容来源于网络,如有侵权,请联系作者删除!