• 主页
  • 归档
  • 分类
  • 照片墙
所有文章 友情链接 关于我

  • 主页
  • 归档
  • 分类
  • 照片墙
  1. 1. SpringBoot程序容器化
    1. 1.1. 启动reids与mysql容器
    2. 1.2. SpringBoot配置文件
    3. 1.3. 项目代码
    4. 1.4. 构建镜像
    5. 1.5. 启动容器
    6. 1.6. 原理浅析

3.5、Docker(5)-容器连接

2018-07-09 10:02:52
总字数 1.2k
预计阅读时间 5 分钟

容器在运行当中, 经常需要连接到其他容器, 比如web程序需要连接到数据库
docker容器使用link参数来实现容器之间的连接, 从而可以完成不同容器之间的交互工作

SpringBoot程序容器化

例如在这个程序当中需要连接mysql与redis

启动reids与mysql容器

拉取镜像

1
2
docker pull redis:4.0
docker pull mysql:5.7

启动容器

1
2
3
4
5
6
7
8
9
10
11
12
13
# 启动redis容器
docker run \
-d \
--name redis-server \
redis:4.0 \
--requirepass "xyz654321"

# 启动mysql容器
docker run \
-d \
--name mysql-server \
--env MYSQL_ROOT_PASSWORD=123456 \
mysql:5.7

这里指定了容器的名字( 在之后的容器连接当中要用到 )
并且设置redis和mysql的密码
查看容器的运行情况
mysql与redis容器
我们在启动mysql容器的时候没有映射到宿主机端口
如果要连接进行数据库导入操作
可以查看这个容器的IP
mysql容器IP地址

这里推荐一个mysql的命令行客户端工具mycli
具备语法补全功能, 是python写的
mycli
在ubuntu下使用apt install mycli安装
在centos下使用pip install mycli安装

这里我们就要根据容器的虚拟IP进行连接了

1
mycli -h 172.17.0.3

之后创建数据库testdb
创建用户test_user, 设置密码为abc123456, 并进行授权

SpringBoot配置文件

application.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server:
port: 9000

mysql-host: 127.0.0.1
redis-host: 127.0.0.1

spring:
datasource:
url: jdbc:mysql://${mysql-host}:3306/testdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8
username: test_user
password: abc123456
redis:
host: ${redis-host}
port: 6379
password: xyz654321

这里把mysql与redis的主机地址单独拿出来作为一个配置项, 为了容器启动时可以方便进行传参控制

项目代码

需要引入redis连接以及mysql连接相关的jar包
pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!-- 整合redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>

<!-- spring data jpa -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector.version}</version>
</dependency>

配置执行连接redis的bean

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
@Configuration
public class RedisConfig {
@Value("${spring.redis.host}")
private String host;

@Value("${spring.redis.port}")
private int port;

@Value("${spring.redis.password}")
private String password;

@Bean
public JedisConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration redisConfiguration = new RedisStandaloneConfiguration();
redisConfiguration.setHostName(host);
redisConfiguration.setPort(port);
redisConfiguration.setPassword(RedisPassword.of(password));

JedisClientConfigurationBuilder clientConfig = JedisClientConfiguration.builder();
clientConfig.connectTimeout(Duration.ofSeconds(60));// 60s connection timeout

return new JedisConnectionFactory(redisConfiguration, clientConfig.build());
}

@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);

// 使用JdkSerializationRedisSerializer来序列化和反序列化redis的value值
RedisSerializer serializer = new JdkSerializationRedisSerializer();
template.setValueSerializer(serializer);
template.afterPropertiesSet();
return template;
}
}

构建镜像

将项目打包的jar文件放在一个独立目录当中(这里打包的文件是 demo-1.0.0.jar)
创建Dockerfile文件

1
2
3
4
5
6
7
8
FROM java:openjdk-8-jre
COPY . /app
WORKDIR /app
RUN /bin/bash ./init.sh
EXPOSE 9000
ENTRYPOINT ["java","-jar","demo-1.0.0.jar", \
"--mysql-host=mysqlhost", \
"--redis-host=redishost"]
  • RUN指定运行了一个在打包镜像时执行的初始化脚本
    如果没有可执行的, 可以去掉
  • ENTRYPOINT在容器运行时执行, 也可以使用CMD
  • 传递mysql-host与redis-host是springboot本身支持的特性, 命令行传参的优先级比配置文件更高, 将会在运行时生效
1
2
# 打包镜像
docker build -t demo:1.0.0 /root/demo

启动容器

1
2
3
4
5
6
docker run -d \
--rm \
--link redis-server:redishost \
--link mysql-server:mysqlhost \
-p 9000:9000 \
demo:1.0.0

link是用来指定与哪个容器进行连接
例如redis-server是容器的名称, 后面的redishost是给这个连接指定一个别名

原理浅析

这里我创建的容器ID是6f1e5d0844c5
我们可以通过shell进入这个容器查看内容

1
2
3
docker exec -it 6f1e5d0844c5 bash
# 此时会切换到 root@6f1e5d0844c5 的shell
cat /etc/hosts

内容如下

1
2
3
4
5
6
7
8
9
127.0.0.1       localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 redishost 7bb1eb2c8edc redis-server
172.17.0.3 mysqlhost b71e6ce961f0 mysql-server
172.17.0.4 6f1e5d0844c5

显然, 运行容器时link参数的作用只是在hosts里面给另外几个容器的添加了别名
所以我们执行数据库连接时才可以使用
jdbc:mysql://mysqlhost:3306/testdb作为URL地址
那么同理
使用mysql-server或者直接用IP172.17.0.3都没问题

至此也就可以理解了, link参数并不是必须的
在一台宿主机上运行的所有容器, 之间构成了一个虚拟的局域网
他们之间都可以直接进行访问

当然知道应用容器的IP之后, 我们可以指定mysql数据库里面test_user的绑定IP是172.17.0.4而不是%
以便保证安全

  • linux
  • docker
  • linux

扫一扫,分享到微信

react-native(1)-初见
Hexo服务器静态化部署 
© 2024 夏夜梦星辰
鲁ICP备19028444号
Power By Hexo
  • 所有文章
  • 友情链接
  • 关于我
{{searchItem.query}}
标签: 分类:
  • maven
  • 持续集成
  • JMS
  • 线程
  • JavaScript
  • ECMAScript6
  • 单元测试
  • Promise
  • Web Worker
  • 函数
  • prototype
  • 模块化
  • 正则表达式
  • 数据库
  • MongoDB
  • 索引
  • 集群
  • 全文检索
  • flutter
  • dart
  • git
  • 版本控制
  • linux
  • shell
  • docker
  • nginx
  • jenkins
  • opencv
  • vim
  • react
  • react native
  • 前端
  • css
  • HTML5
  • Hexo
  • sass
  • Three.js
  • TypeScript
  • Vue
  • 组件化
  • base64
  • webpack
  • nodejs
  • gulp
  • TensorFlow
  • 机器学习
  • 算法
  • 动态规划
  • 数据结构
  • Java
  • JavaScript
  • MongoDB
  • flutter
  • Git
  • linux
  • react
  • 前端杂烩
  • 男生女生
  • 算法
  • 十年饮冰,难凉热血
  • †少女癌†
  • 猫与向日葵
  • coderfun
  • JENKINS
  • API管理后台
愿你最终能接纳每一面每一种的自己
独自活着便是团圆