docker 项目搭建

上次用docker-compose搭建了软件工程的项目后,此次就直接搭建计量的项目了,记录搭建过程当中遇到问题。html

后台

mysqlredis搭建方法不变,以前spring-boot是在容器内编译打包的,感受这样太费时了也不安全。因此此次直接用jdk8的镜像运行打包后的jar包。本觉得挺简单的,没想到却遇到了很多问题。java

首先项目是微服务搭建的,最后生成的jar包有三个。原本我想的是直接把jar都复制到容器中,用jdk环境直接运行全部jar包就行了。开始我是这样写的:mysql

FROM openjdk:8-jre-alpine  
  
WORKDIR /app  
  
COPY api .  
  
ENTRYPOINT ["java", "-jar", "*.jar"]

api 下的文件夹:
image.pngnginx

目的就是运行这个文件下全部jar包,没想到一运行时就出错了。web

image.png

看样子它是把*.jar看成运行jar包了。但这不是我本意,个人本意是把 * 当作通配符来使用的。redis

排查问题,原来我在dockerfile中直接使用的java命令,而 * 通配符是bash才有的功能。修改成:ENTRYPOINT ["sh", "-c", "java", "-jar", "*.jar"]spring

本意为这样万无一失,结果又出岔子了。控制台仅仅打印了gateway 的jar包日志。进入容器内部查看,也确实只运行了gateway 的jar包。这让我百思不得其解,不知道又是那出错了。我在手动运行jar包时忽然想到,运行jar包时,程序并无终止,会不会是由于运行第一个jar包没有结束,因此轮不到后一个jar包运行。sql

写一个脚本后台运行jar包,将脚本复制到容器中运行查看效果:docker

#!/bin/sh
java -jar /app/gateway/*.jar &
java -jar /app/module1/*.jar &
java -jar /app/resource/*.jar
FROM openjdk:8-jre-alpine  
  
WORKDIR /app  
  
COPY api .  
  
COPY api/command.sh command.sh  
  
RUN \["chmod", "+x", "command.sh"\]  
  
RUN apk add --update bash  
  
CMD \["sh","command.sh"\]

这样一来终于成功了,可是这么写太麻烦了。要是能在sh中后台运行全部通配符文件就行了,惋惜没找到。api

前台

前台使用nginx构建,也很简单,基于nginx镜像,把打包后的dist文件复制到容器中,再把自定义的nginx.conf复制到容器中,启动nginx就好了。

FROM nginx:alpine  
RUN rm -rf /usr/share/nginx/html/\*  
COPY nginx.conf /etc/nginx/nginx.conf  
COPY dist /usr/share/nginx/html  
EXPOSE 80  
CMD \["nginx", "-g", "daemon off;"\]
user root;
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    server {
      listen       80;
      include /etc/nginx/mime.types;
      server_name  localhost;

      location / {
         root   /usr/share/nginx/html;
         index  index.html index.htm;
      }

      location /resource/ {
              proxy_set_header terminal-type "web";
              proxy_pass http://app-server:8084/;
              ........
      }
........

这里须要注意的是要把转发的后台地址改成docker-compose.yml中的后台服务名。nginx转发基于后台,因此在docker-compose.yml中也要声明前台服务基于后台depends_on:- app-server

数据共享

docker容器中经过网络和数据卷实现容器的交互。好比在后台中保存的文件储存在后台服务容器中,这时候前台服务容器的nginx是获取不到数据的。这时候只能经过数据卷来实现数据共享。
好比后台存储的资源文件路径在/resources中,前台须要获取的资源文件在/app/resources ,这时候就能够 经过挂载数据卷来实现数据的 共享。

# docker-compose.yml

volumes:
  resources:

app-server:
    ........
    volumes:
     -resources:/resources
     
app-web:
    .........
    volumes:
      - resources:/app/resources

先声明数据卷,以后分别挂载到容器对应路径便可。

相关文章
相关标签/搜索