1. 程式人生 > >spring-boot-nginx代理-docker-compose部署

spring-boot-nginx代理-docker-compose部署

在本地測試,使用docker部署不用在意環境

java測試專案:

  • web框架:spring boot 框架
  • 專案管理:maven
  • 資料庫:redis + postgres + mongo
  • 部署相關:nginx + docker-compose

專案目錄:

專案結構如圖,廢話不多說,上程式碼

一、本地web程式碼測試和打包jar

1、首先需要原生代碼能跑起來

2、打包成jar,(具體打包檢視spring官網:http://spring.io/guides/gs/rest-service/),打包後,在target目錄下生成一些資料夾和檔案,重要的看專案結構圖紅框圈中的檔案,就是它:gs-spring-boot-0.1.0.jar

二、使用jar包製作docker映象

使用docker把jar檔案做成映象,使用Dockerfile方式

Dockerfile內容:

FROM java:8
ADD ./target/gs-spring-boot-0.1.0.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-jar","/app.jar"]

注意:Dockerfile檔案放哪隨便(不要放到target下),路徑不一樣,需要更改 ADD指令後面的路徑地址,確保能通過相對路徑找到並新增jar包

進入到Dockerfile所在目錄,執行docker build 命令,製作映象:

docker build -t java_compose .

點".",代表使用當前路徑下的Dockerfile檔案,可以不進入Dockerfile所在目錄執行build命令,需要把 點“.” 換成絕對路徑或相對路徑,找到Dockerfile檔案

然後可以檢視映象:

docker images

 

redis、postgres、mongo、nginx映象都是從官方拉取的映象,不多少了

三、docker-compose.yml檔案

docker-compose.yml:

version: '3'
services:
  nginxxx:
    image: nginx:latest
    container_name: nginxxx
    restart: unless
-stopped ports: - 8080:80 volumes: - ./nginx.conf:/etc/nginx/conf.d/default.conf //docker容器啟動停止,內部配置消失,所以掛在外面的配置檔案,不會丟失 redisxx: image: redis:latest container_name: redisxx restart: unless-stopped env_file: .env ports: - 6378:6379 # volumes: # - redis-data:/bitnami/redis postgresxx: image: postgres:latest container_name: postgresxx restart: unless-stopped env_file: .env command: postgres -c 'max_connections=200' ports: - 5431:5432 environment: - POSTGRES_USER=testdb //建立使用者名稱 - POSTGRES_PASSWORD=testdb //建立密碼 有這兩個引數,可以不用再建立資料庫,會預設建立和使用者名稱一樣的資料庫,如果想建立其他的資料庫名字,可以再加引數POSTGRES_DB=your_db_name # volumes: # - pg-data:/var/lib/postgresql/data mymongoxx: image: mongo:latest container_name: mymongoxx restart: unless-stopped env_file: .env ports: - 27016:27017 environment: - MONGO_INITDB_ROOT_USERNAME=testdb //建立root使用者名稱 - MONGO_INITDB_ROOT_PASSWORD=testdb //建立root使用者密碼 注意:建立使用者名稱和密碼後,會開啟auth認證,xxxx_application.properties需要配置認證資料庫配置資訊spring.data.mongodb.authentication-database=testdb - MONGO_INITDB_DATABASE=testdb //建立集合(資料庫) # volumes: #- mongo-data:/data/db javaxx: image: java_compose:latest restart: always container_name: javaxx ports: - 9002:9001 depends_on: - postgresxx - redisxx - mymongoxx environment: - REDIS_HOST=redisxx //host注意:只寫容器名字,不用加http:// - REDIS_PORT=6379 - POSTGRES_URL=postgresql://postgresxx:5432/testdb?useSSL=false //注意,沒有http:// - POSTGRES_USERNAME=testdb - POSTGRES_PASSWORD=testdb - MONGO_URL=mongodb://testdb:[email protected]:27017/

四、Nginx配置檔案

因為使用docker容器,配置檔案需要掛載

nginx.conf

map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
proxy_ignore_client_abort on;
}

server {
    listen    80;
    server_name   localhost;

    location / {
        proxy_pass http://javaxx:9002;
        proxy_set_header   Host             $proxy_host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }

}

因為使用docker-compose部署,都是容器間通訊,所以地址都是容器的名字,javaxx就是專案容器名字(docker-compose.yml檔案裡面的container_name:javaxx)

五、環境變數

其實為了省事,環境變數都寫在docker-compose.yml裡面了,如果還有其他變數不方便寫到yml檔案裡,可以寫到.env檔案,docker-compose.yml檔案會去.env檔案讀取變數

六、docker-compose啟動

進入到docker-compose目錄,執行命令:

docker-compose -f docker-compose.yml up

停止:

docker-compose -f docker-compose.yml down

如果有容器啟動失敗,可以檢視log,看看到底什麼原因造成的

docker logs -f 容器名

OK,搞定

補充:application.properties

server.port=9002

# Redis資料庫索引(預設為0)
spring.redis.database=0
# Redis伺服器地址
spring.redis.host=${REDIS_HOST:localhost}
# Redis伺服器連線埠
spring.redis.port=${REDIS_PORT:6379}



#postgresql:
#DB properties:
spring.datasource.url=jdbc:${POSTGRES_URL:postgresql://localhost:5432/testdb?useSSL=false}
spring.datasource.username=${POSTGRES_USERNAME:testdb}
spring.datasource.password=${POSTGRES_PASSWORD:testdb}
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL9Dialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.generate-ddl=true


spring.data.mongodb.uri=${MONGO_URL:mongodb://testdb:[email protected]:27017/}
spring.data.mongodb.database=testdb
# docker-compose 配置了MONGO_INITDB_ROOT_USERNAME和MONGO_INITDB_ROOT_PASSWORD,需要auth認證,這樣就需要設定認證的資料庫
# 同時配置了MONGO_INITDB_DATABASE=testdb, 所以這裡設定testdb為認證資料庫
spring.data.mongodb.authentication-database=testdb