容器在运行当中, 经常需要连接到其他容器, 比如web程序需要连接到数据库
docker容器使用link
参数来实现容器之间的连接, 从而可以完成不同容器之间的交互工作
SpringBoot程序容器化
例如在这个程序当中需要连接mysql与redis
启动reids与mysql容器
拉取镜像
1 | docker pull redis:4.0 |
启动容器
1 | # 启动redis容器 |
这里指定了容器的名字( 在之后的容器连接当中要用到 )
并且设置redis和mysql的密码
查看容器的运行情况
我们在启动mysql容器的时候没有映射到宿主机端口
如果要连接进行数据库导入操作
可以查看这个容器的IP
这里推荐一个mysql的命令行客户端工具mycli
具备语法补全功能, 是python写的
在ubuntu下使用apt install mycli
安装
在centos下使用pip install mycli
安装
这里我们就要根据容器的虚拟IP进行连接了
1 | mycli -h 172.17.0.3 |
之后创建数据库testdb
创建用户test_user, 设置密码为abc123456, 并进行授权
SpringBoot配置文件
application.yml
1 | server: |
这里把mysql与redis的主机地址单独拿出来作为一个配置项, 为了容器启动时可以方便进行传参控制
项目代码
需要引入redis连接以及mysql连接相关的jar包
pom.xml
1 | <!-- 整合redis --> |
配置执行连接redis的bean
1 |
|
构建镜像
将项目打包的jar文件放在一个独立目录当中(这里打包的文件是 demo-1.0.0.jar)
创建Dockerfile文件
1 | FROM java:openjdk-8-jre |
RUN
指定运行了一个在打包镜像时执行的初始化脚本
如果没有可执行的, 可以去掉ENTRYPOINT
在容器运行时执行, 也可以使用CMD- 传递mysql-host与redis-host是springboot本身支持的特性, 命令行传参的优先级比配置文件更高, 将会在运行时生效
1 | # 打包镜像 |
启动容器
1 | docker run -d \ |
link是用来指定与哪个容器进行连接
例如redis-server
是容器的名称, 后面的redishost
是给这个连接指定一个别名
原理浅析
这里我创建的容器ID是6f1e5d0844c5
我们可以通过shell进入这个容器查看内容
1 | docker exec -it 6f1e5d0844c5 bash |
内容如下
1 | 127.0.0.1 localhost |
显然, 运行容器时link参数的作用只是在hosts里面给另外几个容器的添加了别名
所以我们执行数据库连接时才可以使用jdbc:mysql://mysqlhost:3306/testdb
作为URL地址
那么同理
使用mysql-server
或者直接用IP172.17.0.3
都没问题
至此也就可以理解了, link参数并不是必须的
在一台宿主机上运行的所有容器, 之间构成了一个虚拟的局域网
他们之间都可以直接进行访问
当然知道应用容器的IP之后, 我们可以指定mysql数据库里面test_user的绑定IP是
172.17.0.4
而不是%
以便保证安全