服务准备
创建docker-compose本次实战的目录,这里就以我实战的目录来讲解:***/data/docker/compose/web***
应用服务
- 创建服务目录:mkdir web-app
- 上传准备的jar包和相关配置到当前目录,如:docker-web.jar,我的这个jar包是一个spring-boot的简单项目,只有一个请求接口并返回统计表的数据量(这里会有几个容易忽略的坑,在后面错误记录会展示)
- 当前目录准备Dockerfile:vim Dockerfile
FROM openjdk:8u302-jre
LABEL version="1.0.0"
MAINTAINER xxxx
WORKDIR /usr/local/web
ADD docker-web.jar .
EXPOSE 8080
CMD ["java", "-jar", "docker-web.jar"]
数据库服务
- 创建服务目录(回到web目录):mkdir web-db
- 准备数据库出初始化sql:建库/建表/表数据(*.sql)
- 当前目录准备Dockerfile:vim Dockerfile
FROM mysql:5.7
LABEL version="1.0.0"
MAINTAINER xxx
WORKDIR /docker-entrypoint-initdb.d
ADD component.sql .
ENV MYSQL_USER=xxx
ENV MYSQL_PASSWORD=xxx
EXPOSE 3306 33060
CMD ["mysqld"]
docker-compose.yml配置
回到web目录,***编辑docker-compose.yml(文件名称固定)***:vim docker-compose.yml
version: '3.3'
#一下是容器编排工具所涉及到的服务,被依赖的服务位置在前面
services:
#容器名称,可以用作容器间通信的服务名称
db:
#使用web目录下,web-db文件夹中的Dockerfile构建镜像
build: ./web-db/
restart: always
environment:
#设置mysql的root账号密码,类似于mysql容器启动时的-e命令
MYSQL_ROOT_PASSWORD: root
app:
build: ./web-app/
#表示当前应用需要依赖db服务
depends_on:
- db
#当前服务所在主机的端口和服务端口的映射关系,类似于服务启动时的-p命令
ports:
- "8080:8080"
restart: always
docker-compose相关命令
服务和配置都已经准备完全了,开始准备使用docker-compose工具对容器进行编排工作,首先介绍下一下几个命令:
- docker-compose up #开始编排/构建镜像,并启动对应的服务
- docker-compose down #服务下线
注意:docker-compose的命令,只能在对应的docker-compose.yml文件的目录执行,这样才能准确的进行编排/启动/下线等工作
服务请求
服务启动之后,肯定要进行验证,查看两个应用是否能通行,请求web服务的url查看是否返回预期结果,在这里我遇到几个问题,这里分享下,希望看到的朋友不会在犯这个错。
错误记录
-
找不到主机:这里需要将mysql连接url中的主机名称改为docker-compose.yml中的服务名称,如: jdbc:mysql://db:3306/dbname
-
Caused by: java.net.ssl.SSLHandshakeException: No appropriate protocol(protocol is disabled or cipher suites are inappropriate): 这个问题是由于mysql的url中没有加上useSSL=false,加上后问题得到解决
还有一个问题,我们在web-db的Dockerfile文件中,配置来非root账号的用户名和密码,这时候如果我们在web-app中使用的是非root账号的用户名和密码的话,会导致查询出问题,具体原因就是:新建的普通用户没有相应的库和表的权限