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

先聲明數據卷,以後分別掛載到容器對應路徑便可。

相關文章
相關標籤/搜索