实验环境
OS Version Ubuntu 19.04
Java Version openjdk:8-jdk
Docker Version 19.03.2
Mysql Version 5.7.27
Spring Boot Version 2.1.1.RELEASE
Spotify Version 1.4.8
Maven Version 3.6.1
Docker + Mysql
编写Dockerfile 制作基础镜像
FROM mysql:5.7.27
MAINTAINER waichan
VOLUME /tmp
ENV LANG C.UTF-8
docker build -t waichan/mysql:temp .
运行基础镜像,连接运行的容器,在容器中配置Mysql环境
docker run --name mysql-temp -d waichan/mysql:temp
docker exec -ti mysql-temp bash
apt-get update
apt-get install vim
cd /etc/mysql/mysql.conf.d
vim mysqld.cnf
docker stop mysql-temp
docker commit mysql-temp waichan/mysql:5.7.27
到现在为止我们制作了mysql镜像 waichan/mysql:5.7.27,它和官网上的Docker镜像相比有如下三点区别:
- 将Docker的语言环境修改为UTF-8
- 配置Linux mysql 忽略表名大小写敏感
- 设置mysql 字符集编码为utf8
当然现在还不能满足我们实际使用需求,一个是没有暴露访问服务的端口,二是没有数据,现在我们运行制作好的waichan/mysql:5.7.27镜像
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password -d waichan/mysql:5.7.27
docker cp HOST_SQL_PATH/mysql.sql mysql:/tmp
docker exec -ti mysql bash
> mysql -uroot -p
> password
> show databases;
> create database ry;
> use ry;
> source /tmp/mysql.sql;
到目前为止我们已经制作并运行了mysql镜像,现在我们可以登录为root账号通过3306端口访问mysql容器。
Docker + Spring Boot
Spring Boot 项目基于Maven项目构建,在制作镜像之前需要编写Dockerfile文件,并在pom中配置com.spotify.dockerfile-maven-plugin插件。
制作Dockerfile, 基础镜像基于openjdk:8-jdk(如果想要制作更小的镜像可以选择openjdk:8-jdk-slim, openjdk:8-jdk-alpine), 这里除了将Docker的语言环境设置为UTF-8, 还将时区设置为Asia/Shanghai.
FROM openjdk:8-jdk
MAINTAINER waichan
VOLUME /tmp
EXPOSE 8080
ARG JAR_FILE
ENV LANG C.UTF-8
ENV TZ=Asia/Shanghai
RUN set -eux
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime
RUN echo $TZ > /etc/timezone
ADD ${JAR_FILE} /target/app.jar
ENTRYPOINT ["mkdir", "/tmp/logs"]
ENTRYPOINT ["mkdir", "/tmp/profile"]
ENTRYPOINT ["java", "-jar", "/target/app.jar"]
在pom.xml中配置spotify插件, 将镜像制作的生命周期绑定到maven的生命周期中
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>${dockerfile.maven.version}</version>
<executions>
<execution>
<id>default</id>
<goals>
<goal>build</goal>
<goal>push</goal>
</goals>
</execution>
</executions>
<configuration>
<repository>waichan/${project.artifactId}</repository>
<tag>${project.version}</tag>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
运行mvn install命令, 创建docker 镜像, 并运行waichan/project.artifactId:project.version, 连接mysql镜像, 这里值得注意的是SpringBoot项目中连接mysql的数据源配置不需要使用明确的Ip地址, 直接使用mysql别名即可(mysql:3306)
mvn install
docker run --name spring-boot --link mysql:mysql -p 8080:8080 -d waichan/${project.artifactId}:${project.version}