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:testdb@mymongoxx: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:testdb@localhost: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

猜你喜欢

转载自www.cnblogs.com/zhzhlong/p/10082969.html