从零开始使用IDEA搭建Springboot+JPA+Swagger2.0+Logback+Lombok+Redis+Shiro1.4项目(九)
Docker-Compose整合多个镜像
什么是Docker-Compose
一个项目是一个镜像,一个镜像启动一个容器,代表一个环境。如果项目需要多个坏境,如Java
、MySQL
、Redis
,那一个镜像肯定满足不了。使用Docker-Compose
将多个Docker
整合在一起共同作用,就可以呈现出一个完整的项目。
准备工作
修改 application.yml
Docker-Compose
将多个Docker
变成一个整体,所以不能在使用外部端口。将项目依赖的MySQL
和Redis
路径改为Docker
镜像名。
原配置:
spring:
datasource:
url: jdbc:mysql://localhost:3306/userinfo?serverTimezone=Asia/Shanghai
redis:
host: local
修改后:
spring:
datasource:
url: jdbc:mysql://mysql:3306/userinfo?serverTimezone=Asia/Shanghai
redis:
host: redis
打包
将权限系统打成jar
包。
下载 Docker-Compose
下载Docker-Compose,下载速度相当慢。
~$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
授权
~$ sudo chmod +x /usr/local/bin/docker-compose
检查版本,则安装成功。
~$ docker-compose --version
部署
拉取镜像
拉取最新的MySQL
镜像和Redis
镜像。
~$ docker search mysql
~$ docker pull mysql:8.0.17
~$ docker search redis
~$ docker pull redis
配置 docker-compose.yml 文件
创建docker-compose.yml
文件。
version: '2'
services:
mysql:
environment:
MYSQL_ROOT_PASSWORD: "root"
MYSQL_DATABASE: userinfo
image: "mysql:8.0.17"
ports:
- "3306:3306"
volumes:
- ./mysql/db:/var/lib/mysql
- ./mysql/conf:/etc/my.cnf
- ./mysql/init:/docker-entrypoint-initdb.d/
command: [
'--character-set-server=utf8',
'--collation-server=utf8_general_ci',
'--default-time-zone=+8:00'
]
springboot:
image: "authority-demo:latest"
ports:
- "8080:8080"
depends_on:
- mysql
- redis
redis:
image: "redis:latest"
ports:
- "6379:6379"
volumes:
- ./redis/conf:/user/local/etc/redis
- ./redis/data:/data
command:
redis-server
environment:
- TZ=Asia/Shanghai
- LANG=en_US.UTF-8
创建文件夹docker/authority
,将jar
包和docker-compose.yml
文件复制到路径内,根据volumes
属性在authority
路径下创建相应文件夹。
将数据库数据导出,放入路径./mysql/init
下。
启动
进入docker-compose.yml
文件所在路径,启动docker-compose
。
可以设置在后台运行:-d
,如果不设置,要停止时需要新开一个命令行窗口。
~$ cd docker/authority
~$ docker-compose up
测试
打开Ubuntu
的火狐浏览器,输入http://localhost:8080/swagger-ui.html
。
关闭
如果不使用后台运行,则新开一个命令行窗口进行关闭。
~$ docker-compose down
总结
application.yml
使用docker-compose
时是将多个docker
变成一个整体,没有暴露在外的端口,因此容器间互相访问需要依赖镜像名,打包前需要将配置文件中的端口改为对应的镜像名。
docker-compose.yml
一个完整的docker-compose.yml
文件需要包含version、services、networks三个部分。
version
:定义版本信息
services
:服务的详细配置信息
networks
:定义网络信息,加入某个特定网络
配置信息:
services
标签下的二级标签为服务名,一般根据镜像命名,方便区分。
services:
springboot:
......
mysql:
......
reddis:
......
image
:服务所使用的镜像名。如果本地没有会自动尝试拉取该镜像
image:redis
image:mysql:8.0.17
port
:映射端口,暴露端口
ports:
- "3306:3306"
- "8080:8080"
- "6379:6379"
environment
:设置镜像的变量,如MySQL的密码和数据库选用,redis的时区和字符编码
environment:
MYSQL_ROOT_PASSWORD: "root"
MYSQL_DATABASE: userinfo
- TZ=Asia/Shanghai
- LANG=en_US.UTF-8
volumes
:挂载目录或者数据卷容器
volumes:
- ./mysql/db:/var/lib/mysql
- ./mysql/conf:/etc/my.cnf
- ./mysql/init:/docker-entrypoint-initdb.d/
- ./redis/conf:/user/local/etc/redis
- ./redis/data:/data
command
:覆盖容器启动后默认执行的命令,如修改MySQL
的默认字符编码
command: [
'--character-set-server=utf8',
'--collation-server=utf8_general_ci',
'--default-time-zone=+8:00'
]
depends_on:容器依赖,决定容器的启动顺序。例如先启动MySQL
和Redis
才能启动Springboot
services:
springboot:
......
depends_on:
- mysql
- redis
redis:
......
mysql:
......