vlambda博客
学习文章列表

DOCKER 学习笔记5 Springboot+nginx+mysql 容器编排

前言

在上节的内容中,我们已经通过一个简单的实例,将Docker-compose 进行了实际的应用。这一小节中。我们将通过学习和了解,着重认识容器的编排,上一节只算是一个小小的测试。在这一节中。我们将用最常见的技术。

  • Springboot 作为后端应用

  • Nginx 作为反向代理

  • Mysql 持久化数据

Springboot 后端应用

引入JPA支持,以及MySQL的驱动

 
   
   
 
  1. <dependency>

  2. <groupId>org.springframework.boot</groupId>

  3. <artifactId>spring-boot-starter-data-jpa</artifactId>

  4. </dependency>

  5. <dependency>

  6. <groupId>mysql</groupId>

  7. <artifactId>mysql-connector-java</artifactId>

  8. </dependency>

配置JPA 的基本属性

 
   
   
 
  1. spring.jpa.properties.hibernate.hbm2ddl.auto=update

  2. spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

  3. spring.jpa.show-sql=true

定义控制器

通过定义这样一个简单的控制器,访问 /index 后就往数据库插入一条访问记录。

 
   
   
 
  1. @RestController

  2. @RequestMapping

  3. public class UserController {


  4. @Autowired

  5. private UserRep userRep;


  6. @GetMapping("/index")

  7. public String index(HttpServletRequest request) {


  8. UserEntity userEntity = new UserEntity();


  9. userEntity.setName("guest");

  10. userEntity.setCreateTime(new Date());

  11. userEntity.setIp(request.getRemoteAddr());

  12. userEntity.setStatus(1);


  13. userRep.save(userEntity);


  14. return "hello-docker-nginx";

  15. }


  16. }

实例代码:

自定义镜像

是否记得上次我们在使用 Dockerfile 自定义镜像?请参照:

https://www.cnblogs.com/ChromeT/p/12283482.html#label10

这里我就不重复写了,差不多都一样的。

Dockerfile 还是放置到 src/docker/ 下,不管放置到哪儿,只要你YML里面配置了一样的位置即可。

 
   
   
 
  1. ## 依赖基础镜像 maven 3.5 这个镜像里面已经包含有java

  2. FROM maven:3.5-jdk-8

这可能会有疑惑?为什么看不到 RUN CMD 命令了,因为我们在后面将这些命令都指定到 docker-compose.yml 文件里面了。

配置NGINX

 
   
   
 
  1. version: "3.0"

  2. services:

  3. nginx:

  4. container_name: my-nginx

  5. image: nginx:1.13

  6. restart: always

  7. ports:

  8. - 8080:80

  9. - 8443:443

  10. volumes:

  11. - ./nginx/conf.d:/etc/nginx/conf.d

https://hub.docker.com/_/nginx?tab=tags

简单说下一下:

version

这个就简单了,指明 docker-compose 文件的语法信息。当然,这个版本信息也不能忽视,从官网的一张表里面说明你的docker 版本与之对应的yml 文件的版本。需要查询自己docker 的版本后填写。

我这里是1.13.1

 
   
   
 
  1. [root@mrclinux ~]# docker -v

  2. Docker version 1.13.1, build 4ef4b30/1.13.1

container_name

这个就字面意思了,容器的名称

image

指定容器的构建镜像

restart

 
   
   
 
  1. restart: "no"

  2. restart: always

  3. restart: on-failure

  4. restart: unless-stopped

No 是默认的重新启动策略,在任何情况下都不会重新启动容器。always,若没有启动成功,则容器始终重新启动。(常用) 如果退出代码指示出现 on-failure 错误,则启动失败策略重新启动容器。

ports

将宿主主机上的端口与容器服务端口进行绑定,比如 808080 就是将宿主主机的8080端口绑定到这个服务的80端口

volumes

挂载主机路径或命名卷,指定为服务的子选项。就意思说:把指定的路径挂载到服务当中。在这个例子里,

 
   
   
 
  1. ./nginx/conf.d:/etc/nginx/conf.d

就是将本文件夹 ./nginx/conf.d 映射到(挂载)到容器的 /etc/nginx/conf.d

就是把NGINX 的配置文件夹给映射出来了。方便我们修改。

配置转发

 
   
   
 
  1. server {

  2. listen 80;

  3. charset utf-8;

  4. access_log off;


  5. location / {


  6. proxy_set_header Host $host:$server_port;

  7. proxy_set_header X-Forwarded-Host $server_name;

  8. proxy_set_header X-Real-IP $remote_addr;

  9. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;


  10. proxy_pass http://app:8080;

  11. }


  12. }

这个就简单了。没啥可说的, proxy_pass http://app:8080;主要一下,因为app 这个服务和nginx 不在一个服务内,所以需要通过服务名的方式进行转发。

配置MYSQL

 
   
   
 
  1. mysql:

  2. container_name: my-mysql

  3. image: mysql:8.0

  4. environment:

  5. MYSQL_DATABASE: demo

  6. MYSQL_ROOT_PASSWORD: root

  7. MYSQL_ROOT_HOST: '%'

  8. ports:

  9. - "3306:3306"

  10. volumes:

  11. - /root/database/mysql:/var/lib/mysql

  12. restart: always

environment

环境变量,这个主要用于设置一些比如数据库的名称、以及用户密码等信息。

详见MYSQL 环境变量 https://hub.docker.com/_/mysql?tab=description

 
   
   
 
  1. MYSQL_ROOT_PASSWORD

  2. 这个变量是强制性的,它指定将为 MySQL root 超级用户帐户设置的密码。


  3. MYSQL_DATABASE

  4. 此变量是可选的,并允许您指定要在映像启动时创建的数据库的名称。

注意点

  • 因为容器停止后,其里面的数据也会消失,这是我们所不能接受的,所以,将MYSQL 里面用来存储数据库的路径映射出来,映射到本机上我们所熟知的位置,这样就好了。

  • mkdir-p/root/database/mysql/ 创建本地路径

  • /root/database/mysql:/var/lib/mysql 组成映射关系。

配置后台Springboot

 
   
   
 
  1. app:

  2. container_name: my-app

  3. build: .

  4. working_dir: /app

  5. volumes:

  6. - ./:/app

  7. - ~/.m2:/root/.m2

  8. expose:

  9. - "8080"

  10. depends_on:

  11. - nginx

  12. - mysql

  13. command: mvn clean spring-boot:run -Dspring-boot.run.profiles=docker

build

指定自定义镜像文件 Dockerfile 的目录,用于构建镜像

working_dir

指定功能目录

expose

在不将端口发布到主机的情况下公开端口——它们只能被链接的服务访问。只能指定内部端口。

depends_on

启动顺序,意思是需要先启动 nginx mysql 而后启动本应用。

command

容器启动执行命令进行重写,其实就是将这个JAR包运行起来。

注意

~/.m2:/root/.m2 其实就是把宿主主机的Maven仓库映射到镜像内。./:/app 其实就是将当前目录挂载到容器内 /app 下

运行测试

 
   
   
 
  1. ## 克隆仓库到服务器

  2. git clone https://gitee.com/mrc1999/springboot-nginx-mysql-docker-compose.git


  3. cd springboot-nginx-mysql-docker-compose


  4. ## 运行docker-compose 进行编排

  5. docker-compose up

通过运行UP命令进行容器的编排与部署,观察打印的内容是否正确,若没有错误,则出现以下部分内容。

 
   
   
 
  1. my-app | Downloaded from central: https://repo.maven.apache.org/maven2/org/apache/maven/maven-model/3.3.9/maven-model-3.3.9.jar (164 kB at 155 kB/s)

  2. my-app |

  3. my-app | . ____ _ __ _ _

  4. my-app | /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \

  5. my-app | ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \

  6. my-app | \\/ ___)| |_)| | | | | || (_| | ) ) ) )

  7. my-app | ' |____| .__|_| |_|_| |_\__, | / / / /

  8. my-app | =========|_|==============|___/=/_/_/_/

  9. my-app | :: Spring Boot :: (v2.1.6.RELEASE)

  10. my-app |

  11. my-app | 2020-02-10 03:39:14.574 INFO 1 --- [ main] com.example.demo.DemoApplication : Starting DemoApplication on f27ac469d127 with PID 1 (/app/target/classes started by root in /app)

  12. my-app | 2020-02-10 03:39:14.588 INFO 1 --- [ main] com.example.demo.DemoApplication : The following profiles are active: docker

Springboot 启动正常,因为这个时候是直接运行容器服务的,我们可以尝试使用 CTRL+C 进行关闭,而后通过后台的方式运行

后台运行

docker-compose up-d

 
   
   
 
  1. [root@mrclinux springboot-nginx-mysql-docker-compose]# docker-compose up -d

  2. my-nginx is up-to-date

  3. Starting my-mysql ... done

  4. Starting my-app ... done

检查容器运行情况

docker-compose ps 查看当前编排容器的运行情况

 
   
   
 
  1. [root@mrclinux springboot-nginx-mysql-docker-compose]# docker-compose ps

  2. Name Command State Ports

  3. -----------------------------------------------------------------------------------------------

  4. my-app /usr/local/bin/mvn-entrypo ... Up 8080/tcp

  5. my-mysql docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp, 33060/tcp

  6. my-nginx nginx -g daemon off; Up 0.0.0.0:8443->443/tcp, 0.0.0.0:8080->80/tcp

docker ps

通过运行 docker-ps 后发现,所有的镜像也已经存在。

 
   
   
 
  1. [root@mrclinux springboot-nginx-mysql-docker-compose]# docker ps

  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

  3. f27ac469d127 springboot-nginx-mysql-docker-compose_app "/usr/local/bin/mv..." 6 minutes ago Up 31 seconds 8080/tcp my-app

  4. 5c0e28096c35 mysql:8.0 "docker-entrypoint..." 6 minutes ago Up 32 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp my-mysql

  5. 2565244279b4 nginx:1.13 "nginx -g 'daemon ..." 6 minutes ago Up 30 seconds 0.0.0.0:8080->80/tcp, 0.0.0.0:8443->443/tcp my-nginx

docker-compose down

停止容器并且移除容器

 
   
   
 
  1. [root@mrclinux springboot-nginx-mysql-docker-compose]# docker-compose down

  2. Stopping my-app ... done

  3. Stopping my-mysql ... done

  4. Stopping my-nginx ... done

  5. Removing my-app ... done

  6. Removing my-mysql ... done

  7. Removing my-nginx ... done

  8. Removing network springboot-nginx-mysql-docker-compose_default

尝试发现

MYSQL 数据库持久化 ?

我们通过使用 volumes 将宿主主机的一个文件夹挂载到 my-mysql 容器下的 /var/lib/mysql 目录,那我们产生的数据呢?是否正常保存了么?

 
   
   
 
  1. [root@mrclinux springboot-nginx-mysql-docker-compose]# ls /root/database/mysql/

  2. auto.cnf binlog.000003 ca.pem demo ib_logfile0 #innodb_temp performance_schema server-cert.pem undo_001

  3. binlog.000001 binlog.index client-cert.pem ib_buffer_pool ib_logfile1 mysql private_key.pem server-key.pem undo_002

  4. binlog.000002 ca-key.pem client-key.pem ibdata1 ibtmp1 mysql.ibd public_key.pem sys

通过发现后得知,宿主主机的目录下已经产生了demo 的一个数据库。我们的挂载没有问题,下次还是从这里面读取即可。所以持久化数据没有问题。

working_dir 有啥用?

在容器运行的时候,我们尝试使用 dockerexec-itmy-app bash 使用命令行连接容器后,我们会发现

 
   
   
 
  1. [root@mrclinux springboot-nginx-mysql-docker-compose]# docker exec -it my-app bash

  2. root@f27ac469d127:/app#

  3. root@f27ac469d127:/app#

  4. root@f27ac469d127:/app# ls

  5. Dockerfile docker-compose.yml maven mvnw mvnw.cmd nginx pom.xml src target

原来通过 working_dir 其实就是将当前目录的所有文件挂载到容器 /app 下。里面存在的文件,均是我通过映射拿进去的文件。

参考以及小结

通过这一节学习,基本上容器部署这些主流的MYSQL 以及NGINX 等已经全部没有任何问题了。学习到了卷的挂载。以及MYSQL 持久化数据的方式 要是遇到一些新的命令或者语法,再来记录吧~

参考

DOCKER 官网 https://docs.docker.com/compose/compose-file/ DOCKER 官网 https://docs.docker.com/storage/volumes/ DOCKER 官网 https://docs.docker.com/compose/gettingstarted/

纯洁的微笑 https://www.cnblogs.com/ityouknow/p/8661644.html

码云示例

https://gitee.com/mrc1999/springboot-nginx-mysql-docker-compose