Using docker to build spring-boot applications is to build the compiled jar package into the image.
This article runs spring-boot together with the database as a set of docker services.
Here I just record my own operations. For the complete running code, see the content in Quote 1 in "Reference".
(How I modify the mysql mapping directory and obtain the remote IP)
Main steps:
Build a simple springboot application
Adding support under docker to the application
Writing dockercompose configuration file
Practical operation
Build a simple springboot application
Make a web application and count the number of IP visits to the site.
And stored in the mysql database, here we use jpa to access the database.
Dependencies
<parent> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-parent</artifactid> <version>2.0.0.release</version> </parent>
Web, jpa, mysql, tset library dependencies
<dependencies> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-data-jpa</artifactid> </dependency> <dependency> <groupid>mysql</groupid> <artifactid>mysql-connector-java</artifactid> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-test</artifactid> <scope>test</scope> </dependency> </dependencies>
Configuration file
spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.driver spring.jpa.properties.hibernate.hbm2ddl.auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.mysql5innodbdialect spring.jpa.show-sql=true
Core code
@restcontroller public class visitorcontroller{ @autowired private visitorrepository repository; @requestmapping("/") public string index(httpservletrequest request) { string ip= request.getheader("x-real-ip"); if(ip== null || "".equals(ip)) { ip = request.getremoteaddr(); } visitor visitor = repository.findbyip(ip); if(visitor == null) { visitor = new visitor(); visitor.setip(ip); visitor.settimes(1l); } else { visitor.settimes(visitor.gettimes()+1); } repository.save(visitor); return "ip:"+visitor.getip()+" "+visitor.gettimes()+" times."; } }
Entity class
@entity public class visitor { @id @generatedvalue private long id; @column(nullable=false) private long times; @column(nullable=false) private string ip; // get,set 方法略 }
Repository layer code refers to jpa related content.
The local database is opened, and the password is the one in the above configuration. After running it using mvn spring-boot:run, you can see the number of IPs, which will increase after each statistics.
dockercompose configuration file
Create a new docker-compose.yaml file, as follows:
version: '3' services: nginx: container_name: v-nginx image: nginx:1.13 restart: always ports: - 80:80 - 443:443 volumes: - ./nginx/conf.d:/etc/nginx/conf.d mysql: container_name: v-mysql image: mysql/mysql-server:5.7 environment: mysql_database: test mysql_root_password: root mysql_root_host: '%' ports: - "3306:3306" volumes: - ./mysqldata:/var/lib/mysql restart: always app: restart: always build: ./app working_dir: /app volumes: - ./app:/app - ~/.m2:/root/.m2 expose: - "8080" depends_on: - nginx - mysql command: mvn clean spring-boot:run -dspring-boot.run.profiles=docker
Mainly explain this configuration file, and Add relevant configurations to the file system.
There are three services under services nginx, mysql, app.
images specifies the use of images. nginx and mysql are directly taken from the docker warehouse.
The image is not specified in the app, but the directory where the dockerfile is located is specified with build.
volumes specifies the mapping between files in the local directory and the container target address.
environment configures the environment variables required by the container
ports configures the mapping port between the local and the container, with the local port in front and the container port in the back
The role of volumes configuration under ngixn: The nginx configuration file we wrote directly overwrites the default nginx configuration file in the container.
The role of volumes configuration under mysql: maps the mysql data files to the local mysqldata directory. When the container is deleted, the data is still there.
The role of volumes configuration under app: The first line is to map the code file to the container. The second line is to map the maven warehouse file to the local. After deleting the container, build it again without re-downloading the dependency packages.
command: mvn clean spring-boot:run -dspring-boot.run.profiles=docker
The command is to compile and run the project in the container, use docker profiles.
So the file we want to add
dockerfile: Create a new file and add a line from maven:3.5-jdk-8
docker profiles: Copy application.properties to application-docker.properties, and change the database connection address in application-docker.properties to jdbc:mysql://mysql:3306/test.
nginx configuration file
server { listen 80; charset utf-8; access_log off; location / { proxy_pass http://app:8080; proxy_set_header host $host:$server_port; proxy_set_header x-forwarded-host $server_name; proxy_set_header x-real-ip $remote_addr; proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for; } location /static { access_log off; expires 30d; alias /app/static; } }
Deployment verification
Put the overall file Copy it to the server and run it using docker-compose up
.
The above is the detailed content of How to use dockercompose to build springboot-mysql-nginx application. For more information, please follow other related articles on the PHP Chinese website!