那这些变量是在哪设置的呢?待会儿编写 Dockerfile 的时候就可以看到,会在 Dockerfile 里设置这几个变量为环境变量,当启动 Docker 容器的时候,程序就会读取到 Dockerfile 中设置的值并应用到项目中。
编写Dockerfile
下面是 education 模块的 Dockerfile:
- FROM java:8
- VOLUME /tmp
- ADD education.jar app.jar
- RUN bash -c 'touch /app.jar'
-
- ENV SPRING-CLOUD-EUREKA-ZONE http://123.456.789.10:8761/eureka/
- ENV SPRING-CLOUD-MYSQL-HOST 123.456.789.10
- ENV SPRING-CLOUD-DB-NAME edu
- ENV SPRING-CLOUD-RABBIT-MQ-HOST 123.456.789.10
- ENV SPRING-CLOUD-REDIS-HOST 123.456.789.10
-
- ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
- EXPOSE 8899
简单的解释下每句话的作用:
- FROM java:8:指定基础镜像,必须为第一个命令
- VOLUME /tmp:用于指定持久化目录
- ADD education.jar app.jar:将本地文件 education.jar 添加到容器中并命名为 app.jar。注意这里的 education.jar 要换成你自己项目打包出来的 jar 包名字,如果你打的包名字叫 abc.jar,那应该这么写:ADD abc.jar app.jar。
- RUN bash -c 'touch /app.jar':在镜像容器中执行的命令,运行 jar 包。
- ENV:这几行以 ENV 开头的是设置环境变量,还记得上面 application-pro.yml 文件里的那几个 ${} 变量吗?就是在这里设置的。把该填地址的地方都换成这台服务器的公网 IP 地址,本配置假设你服务器的地址是 123.456.789.10 ,用的时候把这个地址换成你自己服务器地址即可。
- ENTRYPOINT:配置容器,使其可执行化。
- EXPOSE 8899:对外暴露 8899 端口。这个端口要和项目的配置文件中 server.port 设置的端口一致。
总结一下,Dockerfile 文件你要改的,只有三个地方:
- 第三行 education.jar 换成你打包出来的 jar 包名字
- ENV 开头的环境变量自己根据 application-pro.yml 的配置进行设置
- 最后一行 EXPOSE 8899 改成你项目的端口号
再贴一个模块的 Dockerfile 作对比:
- FROM java:8
- VOLUME /tmp
- ADD gateway.jar app.jar
- RUN bash -c 'touch /app.jar'
-
- ENV SPRING-CLOUD-EUREKA-ZONE http://123.456.789.10:8761/eureka/
- ENV SPRING-CLOUD-REDIS-HOST 123.456.789.10
-
- ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
- EXPOSE 8888
按照这种方法,把每个需要打包的微服务项目的 Dockerfile 写好。
打包
配置好三个 applicaiton.yml 和 Dockerfile(其实打包这一步用不到 Dockerfile),在项目的根目录下执行以下命令打包:
- mvn clean package -Dmaven.test.skip=true
看到控制台输出 SUCCESS 则打包成功:
打完的包在项目目录/target 里,如图:
检查一下 jar 包的大小,如果是好几十 M 就没啥问题,如果是几百 K 那就是打包配置有问题,检查 pom.xml 文件的 标签配置是否正确。
附 <build>配置:
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- <executions>
- <execution>
- <goals>
- <goal>repackage</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- <finalName>education</finalName>
- </build>
编写自动化脚本
写完 Dockerfile 文件还要执行命令打包成 image 镜像,还需要运行起容器,两行代码虽然不多但每次写还是麻烦,把它封装成一个 sh 脚本,每次直接运行脚本省时省力。
(编辑:ASP站长网)
|