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