FROM openjdk:8u201-jdk-alpine3.9
#作者
MAINTAINER BolingCavalry [email protected]
#系统编码
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
#path
ENV PATH /opt/conda/bin:$PATH
#安装必要的软件
#RUN apt-get update --fix-missing && apt-get install -y wget
RUN apk update && apk add wget
#下载下来的压缩文件名称
ENV NACOS_FILE_NAME nacos-server-1.1.0.tar.gz
#把启动时用到的文件准备好
COPY ./docker-entrypoint.sh /docker-entrypoint.sh
#解压后的文件夹名称
ENV NACOS_FOLDER_NAME nacos
RUN wget https://github.com/alibaba/nacos/releases/download/1.1.0/nacos-server-1.1.0.tar.gz -O ~/$NACOS_FILE_NAME && \
tar -zxf ~/$NACOS_FILE_NAME -C ~/ && \
rm ~/$NACOS_FILE_NAME && \
chmod a+x /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]
EXPOSE 8848
从Dockerfile内容中可见,先去nacos的github下载安装包,然后解压,再复制docker-entrypoint.sh到镜像中,最后将nacos的8848端口暴露出来;
再来看看docker-entrypoint.sh文件的内容,该文件在容器启动时会被执行,内容很简单,就是进入nacos的bin目录,执行启动文件,再将start.out输出到控制台:
#!/bin/sh
echo "Starting nacos"n && \
cd ~/nacos/bin && \
./startup.sh -m standalone && \
cd …/logs && \
tail -f start.out
有两个重要信息需要注意:
nacos的官方参考启动命令是./startup.sh -m standalone,这个命令会将jvm的输出重定向到start.out文件,也就是说nacos的JVM进程是在后台运行的,不会占用控制台(相比之下,spring boot应用使用java -jar启动时会占用控制台),对于docker来说,容器内的进程如果不占用控制台,docker就认为该容器已经结束工作,就会停止该容器,所以,为了避免nacos在docker刚刚启动就退出,需要用tail -f start.out来占领控制台;
用tail -f start.out来占领控制台可以避免容器刚刚启动就退出,但也有个弊端,就是容器中有了多个进程,并且nacos进程的PID不是1,所以在执行docker stop命令时,结束进程的信号量不会到nacos进程,而是去了PID等于1的进程,所以nacos进程不会立即退出,只能等到30秒后被强制kill,这个问题最好的解法是修改nacos的startup.sh,让nacos进程始终保持在控制台,不要重定向到后台,但这样就导致Dockerfile不好处理了,每次下载和解压了nacos安装包后,都要用本地的startup.sh去替换原有的,这样做的话,如果nacos升级版本,这边本地的startup.sh也要随之更新,很是麻烦…
)构建镜像
docker build -t bolingcavalry/nacossimpleprovider:1.0-SNAPSHOT
docker push bolingcavalry/nacossimpleprovider:1.0-SNAPSHOT
Nacos镜像的制作已经完成,接下来制作一个java应用的镜像:服务提供者;
)java应用的父工程
接下来要开发的simple-provider和simple-consumer两个应用都是java应用,为了管理方便,做一个基于maven的父工程,再将simple-provider和simple-consumer以module的形式加入到这个父工程中;
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”> 4.0.0 simpleconsumer simpleprovider org.springframework.boot spring-boot-starter-parent 2.0.5.RELEASE com.bolingcavalry nacosdemo pom 1.0-SNAPSHOT org.springframework .cloud spring-cloud-dependencies ${spring.cloud.version} pom import org.springframework.cloud spring-cloud-alibaba-dependencies ${spring.cloud.alibaba.version} pom import org.apache.maven.plugins maven-compiler-plugin ${java.version} ${project.build.sourceEncoding} 可见这是个普通的父工程,里面对spring cloud和spring cloud alibaba的版本做了控制,避免子工程还要各种指定版本的繁琐操作; )制作服务提供者镜像 simple-provider是个java web应用,使用了spring cloud alibaba的依赖库之后可以使用Nacos的注册发现服务,整个工程的开发步骤如下: xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”> nacosdemo com.bolingcavalry 1.0-SNAPSHOT 4.0.0 simpleprovider org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-starter-alibaba-nacos-discovery org.springframework.boot spring-boot-maven-plugin com.google.cloud.tools jib-maven-plugin 1.3.0 openjdk:8u201-jdk-alpine3.9 bolingcavalry/nacos p r o j e c t . a r t i f a c t I d : {project.artifactId}: project.artifactId:{project.version} -Xms1g -Xmx1g 上述内容有两点需要注意: a. 依赖spring-cloud-starter-alibaba-nacos-discovery,这样可以用上spring cloud nacos的服务; b. 使用了maven插件jib-maven-plugin,用于将应用构建成docker镜像,此插件相关的详情请参考[《Docker与Jib(maven插件版)实战》]( ); 2. 配置文件application.properties,配置应用名称和nacos地址,注意这里nacos地址配置的是nacoshost,对应的是后面docker-compose.yml中的link参数: spring.application.name=simple-provider spring.cloud.nacos.discovery.server-addr=nacoshost:8848 package simpleprovider; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @EnableDiscoveryClient @SpringBootApplication public class SimpleProviderApplication { public static void main(String[] args) { SpringApplication.run(SimpleProviderApplication.class, args); } } package simpleprovider.controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import java.text.SimpleDateFormat; import java.util.Date; /** @Description: 提供web服务的controller @author: willzhao E-mail: [email protected] @date: 2019/7/28 11:08 */ @RestController public class ProviderController { @RequestMapping(value = “/hello/{name}”, method = RequestMethod.GET) public String hello(@PathVariable(“name”) String name){ return "hello " + name + ", " + new SimpleDateFormat(“yyyy-mm-dd HH:mm:ss”).format(new Date()); } } mvn compile jib:dockerBuild )制作服务消费者镜像 simple-consumer是个java web应用,启动后对外提供http服务,响应的时候,通过nacos取得simple-provider的地址,然后向simple-provider发请求,将响应返回给浏览器: xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”> nacosdemo com.bolingcavalry 1.0-SNAPSHOT 4.0.0 simpleconsumer org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-starter-alibaba-nacos-discovery【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
[](
[](