文章目录
- 回顾
- Docker相关文件及目录
- 目录结构
- 与Docker相关的部分源码
- 编辑IDEA项目配置文件
- 拉取镜像
- 配置Docker镜像与容器
- 启动并访问项目
- 启动项目
- 访问项目
- 注意问题
- 文件类型错误
- 不能直接将jar包位置指定为target目录
回顾
这里用到的知识,在之前的文章中就有提及,所以说不明白的地方可以看这里:
由于这一篇文章中涉及到项目的发布,而这里所发布的项目采用的是之前文章中提及的注册中心Eureka,因而不清楚的可以看这里:
Docker相关文件及目录
目录结构
与Docker相关的部分源码
由于这里项目的源码在之前的文章Spring Cloud与微服务之注册中心Eureka中都有,所以说这里就单单上传一下与Docker相关的源码。
而这里,即便是与Docker相关的源码,其都在使用Dockerfile创建Docker镜像中有提及,而这里之所以再次罗列出来,仅仅是其中只有少数的不同之处,这里就索性都写出来了。
app-entrypoint.sh源码:
#!/bin/bash
#上面是固定的开头
# 命令行运行项目jar包指令
java -jar /spring-cloud/springcloud-eureka.jar
Dockerfile源码:
#镜像出处
FROM java:8
#维护者信息
MAINTAINER zzy
#镜像操作指令
#在容器的根目录中创建spring-cloud文件夹
RUN mkdir -p /spring-cloud
#将本地项目jar包拷贝到Docker容器中的位置
COPY ./springcloud-eureka.jar /spring-cloud/springcloud-eureka.jar
#将本地的可执行文件拷贝到Docker容器中的根目录下
COPY ./app-entrypoint.sh /
#给app-entrypoint.sh赋予可执行权限
RUN chmod +x /app-entrypoint.sh
#对外暴漏的端口号
EXPOSE 6868
#开机启动
ENTRYPOINT ["/app-entrypoint.sh"]
编辑IDEA项目配置文件
拉取镜像
这里的镜像采用的是java:8
,所以说需要我们优先拉取该镜像。
配置Docker镜像与容器
在IDEA顶部的菜单栏中找到图示的Edit Configurations
选项,点击打开配置面板:
点击上面的+
并依次点击Docker
->Dockerfile
然后在打开的配置面板中进行如下配置:
Name:命名为eureka
,它指的是该项配置文件将被命名为eureka
。
Dockerfile指的是Dockerfile文件的文件路径,这里通过手选就可以了,我这里的路径如下:
springcloud-eureka\docker-dir\Dockerfile
Image tag:指的是将项目jar包打成镜像后,该镜像的名称以及tag标签,我的如下:
springcloud-eureka:1.0
Container name:指的是项目容器在加载打成的Docker镜像后,其容器的名称,由于容器就是运行着的项目,也就是说是我们的eureka服务,因此这里将容器的名称命名为:
eureka-server
Command:这里指的是在容器运行时加载的其它指令,这里的指令为:
-t (--tty=false 分配tty设备,该可以支持终端登录)
Bind ports:这里指的是绑定的容器与本机的端口号,在端口号指定方面,我们应该尽量与项目中的配置文件的端口号保持一致,也即是6868
。
端口号的绑定也很简单,就是如下:
在绑定端口号后,我们的项目就已经成功的配置好了Docker,表面上我们是在配置Docker,实际上我们是在拼接Docker的相关命令行语句,该语句在点击Command preview后即可查看,如下:
docker build -t springcloud-eureka:1.0 .
&& docker run
-p 6868:6868
--name eureka-server
springcloud-eureka:1.0 -t
上面的语句和我们之前在使用Dockerfile创建Docker镜像的文章中所提到的语句其实是一样的。
当我们点击Apply
、OK
按钮后,Docker配置完成。
启动并访问项目
启动项目
启动Docker时,直接点击图示的运行图标。
springcloud-eureka项目将被自动打成Docker镜像,然后自动创建并启动Docker容器加载该创建的Docker镜像,其结果如下图所示:
在上面的截图中,我们可以清楚的看到新创建的docker镜像springcloud-eureka:1.0与容器eureka-server,同时我们还看到,在Log控制台中打印出了当前的项目启动日志。
访问项目
由于容器中的项目已经被启动起来了,因而我们可以在浏览器中直接访问项目。
此时我们访问的项目路径不是下面的地址:
http://localhost:6868/
因而此时的Docker分配的ip地址并不是本机的ip地址,而是
192.168.99.100
自然,在浏览器中访问的IP地址应该如下:
http://192.168.99.100:6868/
访问之后的结果如下:
其登录后的主界面如下;
至此,我们在IDEA中配置的Docker已经运行成功。
注意问题
文件类型错误
有时我们启动时会出现下面异常:
standard_init_linux.go:190: exec user process caused "no such file or directory"
此时是由于我们创建的app-entrypoint.sh
可执行文件是在Windows中所创建的,其在创建时就被添加了一些Windows格式,因而该问题的解决办法是直接在Linux中创建,然后手动导出。
不能直接将jar包位置指定为target目录
如果是细心的话,我们会发现,在Dockerfile中存在下面的语句:
COPY ./springcloud-eureka.jar /spring-cloud/springcloud-eureka.jar
而如果我们将其改成下面的语句时,似乎是更简化了:
COPY ../target/springcloud-eureka.jar /spring-cloud/springcloud-eureka.jar
这样我们不用再将项目的jar包拷贝到docker-dir目录中,直接在target目录中指定就可以了,这样看似是可以的,但是实际上却不行,因而COPY
的行为不能发生在target目录中。
所以此时会出现如下异常:
Step 4/8 : COPY ../target/springcloud-eureka.jar /spring-cloud/springcloud-eureka.jar
Error: ResponseItem.ErrorDetail[code=<null>,message=COPY failed: Forbidden path outside the build context: …/target/springcloud-eureka.jar ()]
Failed to deploy ‘eureka-server Dockerfile: springcloud-eureka/docker-dir/Dockerfile’: COPY failed: Forbidden path outside the build context: …/target/springcloud-eureka.jar ()