docker-compose 构建Springboot+Nginx+Mysql+Redis一站式部署说明

1,411 阅读7分钟

docker-compose 构建Springboot+Nginx+Mysql+Redis一站式部署说明

Untitled.png

0.说在最前面

0.1 文件目录结构

Untitled 1.png

0.2 注意点

其中

mysql的my.cnf

nginx的配置

redis的配置需要提前准备好

项目需要提前准备好Dockerfile 文件

1.Nginx

# 配置nignx服务
  nginx:
    # nginx最新镜像
    image: nginx:latest
    # 定义容器名称
    container_name: nginx-compose
    # 配置nginx环境
    environment:
      - TZ=Asia/Shanghai
    # 配置端口
    ports:
      - "80:80"
      - "8080:8080"
    # 配置挂载的文件夹
    volumes:
      # nginx配置文件夹
      - /workspace/docker-compose/nginx/conf.d:/etc/nginx/conf.d
      # nginx静态文件
      - /workspace/docker-compose/nginx/html:/etc/nginx/html
      # nginx日志
      - /workspace/docker-compose/nginx/logs:/var/log/nginx
    # 自动重启
    restart: always

配置文件定义了镜像/容器名称/运行环境/端口/挂载路径/自动启动等信息

其中挂载路径这样详细说明:

/workspace/docker-compose/nginx/conf.d:/etc/nginx/conf.d

将宿主机的 /workspace/docker-compose/nginx/conf.d 映射到 容器的/etc/nginx/conf.d 路径

然后只需要将nginx的配置文件放在 /workspace/docker-compose/nginx/conf.d 下即可

其中说明:我们这边没有直接映射nginx.conf文件,而是映射配置配置文件子文件夹,因为主配置文件nginx.conf 引入了此文件夹下的所有文件。

include /etc/nginx/conf.d/*.conf;
# 静态文件配置
server {
    listen       80;
    server_name  localhost;

    location / {
        root   html; # 此处默认/etc/nginx/html 路径,可以另外指定路径
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html; # 此处默认/etc/nginx/html 路径,可以另外指定路径
    }
}

#ecapi-compose
server {
    listen 8080;
    server_name  localhost;

    client_max_body_size 100m;

    location / {
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://100.100.200.213:8181;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;# 此处默认/etc/nginx/html 路径,可以另外指定路径
    }
}

2.Mysql

# 配置mysql服务
  mysql:

    # 这里指定我们的镜像文件,mysql版本是5.7,
    image: mysql:5.7
    # 配置我们容器的名字
    container_name: mysql-compose
    # 通过我们的宿主机的3306端口映射到容器里的3306端口,
		# 因为容器内的网络与我们外界是不互通的,只有宿主机能够去访问我们的容器,
		# 这样我们就能通过宿主机的3306端口去访问容器的mysql了
    ports:
      - "3306:3306"
    # 配置环境,主要是配置我们的mysql的登陆密码,
		# mysql容器创建出来默认可以用不同的ip地址访问,所以这里不用进行配置
    environment:
      TZ: Asia/Shanghai
      MYSQL_DATABASE: ecdb
      MYSQL_ROOT_PASSWORD: 123456a?
      MYSQL_ROOT_HOST: '%'
      # 等同于 -e MYSQL_ROOT_PASSWORD指定root的登录密码
      #- MYSQL_ROOT_PASSWORD=123456a?
      #- MYSQL_ALLOW_EMPTY_PASSWORD='no'
      # 这里这个指令compose启动成功后会自动创建名为docker的数据库
      #- MYSQL_DATABASE='ecdb02'
      # 此处就是相当于 mysql create user,创建了数据库的登录用户
      #- MYSQL_USER='ecuser'
      #- MYSQL_PASSWORD='123456a?'

      # 配置挂载的文件夹
    volumes:
      # 配置文件(conf.d mysql.conf.d my.cnf,需要在/workspace/docker-compose/mysql/conf下新建)
      - /workspace/docker-compose/mysql/conf:/etc/mysql
      # mysql数据
      - /workspace/docker-compose/mysql/data:/var/lib/mysql
      # 数据库日志
      - /workspace/docker-compose/mysql/logs:/var/log/mysql
      # 初始化数据库
      - /workspace/docker-compose/mysql/init/:/docker-entrypoint-initdb.d/
    # 设置命令
    command:
      [
        '--character-set-server=utf8mb4',
        '--collation-server=utf8mb4_unicode_ci',
        # 这行代码解决无法访问的问题
        '--default-authentication-plugin=mysql_native_password'
      ]

    # 自动重启
    restart: always

其中 /workspace/docker-compose/mysql/conf 需要新建conf.d mysql.conf.d 两个文件夹,不让回启动报错提示没有此文件夹,至于my.cnf 配置不在此说明

3.Redis

# 配置redis服务
  redis:

    # 设置容器对应的镜像
    image: redis:latest
    # 设置容器名
    container_name: redis-compose
    # 配置环境
    environment:
      - TZ=Asia/Shanghai
    # 同上,作为端口映射
    ports:
      - "6379:6379"
    # 同上,挂载文件夹
    volumes:
      # 配置文件(需要在宿主机路径上传redis.conf文件)
      - /workspace/docker-compose/redis/redis.conf:/etc/redis/redis.conf
      # 数据
      - /workspace/docker-compose/redis/data:/data
      # 日志
      - /workspace/docker-compose/redis/logs:/var/log/redis
    # 设置命令
    command: redis-server /etc/redis/redis.conf --appendonly yes --requirepass 123456
    # 自动重启
    restart: always

其中redis.conf配置 不在这边说了

4.SpringBoot 应用

# 配置springboot服务
  springboot:
    # 生成镜像,用.它会自动去指定目录下面去找一个Dockerfile的文件,
		#然后根据里面的配置去生成一个镜像
    build: ./projects
    # 指定我们生成的镜像的名字和版本号
    image: ecapi-images:2.0
    # 指定容器名
    container_name: ecapi02
    # 同上,做端口映射
    ports:
      - "8181:8181"
    # 同上,挂载文件夹,配置文件外挂
    volumes:
      - /workspace/docker-compose/projects/config:/home/ecapi/config
    # 写清楚我们springboot依赖的服务,有mysql以及redis,这里的名称是service名
    depends_on:
      - nginx
      - mysql
      - redis
    # 自动重启
    restart: always

注意点:外部配置文件需要配置挂载目录

对于mysql和redis 相关的配置地方 需要改成服务名称而不是ip地址

5.完整的配置文件

docker-compose.yml

#表示注释

# 指定我们docker-compose的版本
version: "3"

# 设置我们的服务
services:

  # 配置nignx服务
  nginx:
    # nginx最新镜像
    image: nginx:latest
    # 定义容器名称
    container_name: nginx-compose
    # 配置nginx环境
    environment:
      - TZ=Asia/Shanghai
    # 配置端口
    ports:
      - "80:80"
      - "8080:8080"
    # 配置挂载的文件夹
    volumes:
      # nginx配置文件夹
      - /workspace/docker-compose/nginx/conf.d:/etc/nginx/conf.d
      # nginx静态文件
      - /workspace/docker-compose/nginx/html:/etc/nginx/html
      # nginx日志
      - /workspace/docker-compose/nginx/logs:/var/log/nginx
    # 自动重启
    restart: always

  # 配置mysql服务
  mysql:

    # 这里指定我们的镜像文件,mysql版本是5.7,这里要使用docker命令拉取镜像,这里先写着,后面我教大家怎么拉取镜像
    image: mysql:5.7
    # 配置我们容器的名字
    container_name: mysql-compose
    # 通过我们的宿主机的3306端口映射到容器里的3306端口,因为容器内的网络与我们外界是不互通的,只有宿主机能够去访问我们的容器,这样我们就能通过宿主机的3306端口去访问容器的mysql了
    ports:
      - "3306:3306"
    # 配置环境,主要是配置我们的mysql的登陆密码,mysql容器创建出来默认可以用不同的ip地址访问,所以这里不用进行配置
    environment:
      TZ: Asia/Shanghai
      MYSQL_DATABASE: ecdb
      MYSQL_ROOT_PASSWORD: 123456a?
      MYSQL_ROOT_HOST: '%'
      # 等同于 -e MYSQL_ROOT_PASSWORD指定root的登录密码
      #- MYSQL_ROOT_PASSWORD=123456a?
      #- MYSQL_ALLOW_EMPTY_PASSWORD='no'
      # 这里这个指令compose启动成功后会自动创建名为docker的数据库
      #- MYSQL_DATABASE='ecdb02'
      # 此处就是相当于 mysql create user,创建了数据库的登录用户
      #- MYSQL_USER='ecuser'
      #- MYSQL_PASSWORD='123456a?'

      # 配置挂载的文件夹
    volumes:
      # 配置文件(conf.d mysql.conf.d my.cnf)
      - /workspace/docker-compose/mysql/conf:/etc/mysql
      # mysql数据
      - /workspace/docker-compose/mysql/data:/var/lib/mysql
      # 数据库日志
      - /workspace/docker-compose/mysql/logs:/var/log/mysql
      # 初始化数据库
      - /workspace/docker-compose/mysql/init/:/docker-entrypoint-initdb.d/
    # 设置命令
    command:
      [
        '--character-set-server=utf8mb4',
        '--collation-server=utf8mb4_unicode_ci',
        # 这行代码解决无法访问的问题
        '--default-authentication-plugin=mysql_native_password'
      ]

    # 自动重启
    restart: always
    # 加入指定网络,容器间必须要处于同一个网络才能通过容器名称进行调用
    #networks:
    #  - my_network

  # 配置redis服务
  redis:

    # 设置容器对应的镜像
    image: redis:latest
    # 设置容器名
    container_name: redis-compose
    # 配置环境
    environment:
      - TZ=Asia/Shanghai
    # 同上,作为端口映射
    ports:
      - "6379:6379"
    # 同上,挂载文件夹
    volumes:
      # 配置文件(需要在宿主机路径上传redis.conf文件)
      - /workspace/docker-compose/redis/redis.conf:/etc/redis/redis.conf
      # 数据
      - /workspace/docker-compose/redis/data:/data
      # 日志
      - /workspace/docker-compose/redis/logs:/var/log/redis
    # 设置命令
    command: redis-server /etc/redis/redis.conf --appendonly yes --requirepass 123456
    # 自动重启
    restart: always
    # 加入指定网络,容器间必须要处于同一个网络才能通过容器名称进行调用
    #networks:
    #  - my_network

  # 配置springboot服务
  springboot:
    # 生成镜像,用.它会自动去当前目录下面去找一个Dockerfile的文件,然后根据里面的配置去生成一个镜像
    build: ./projects
    # 指定我们生成的镜像的名字和版本号
    image: ecapi-images:2.0
    # 指定容器名
    container_name: ecapi02
    # 同上,做端口映射
    ports:
      - "8181:8181"
    # 同上,挂载文件夹
    volumes:
      - /workspace/docker-compose/projects/config:/home/ecapi/config
    # 加入指定网络,容器间必须要处于同一个网络才能通过容器名称进行调用
    #networks:
    #  - my_network
    # 写清楚我们springboot依赖的服务,有mysql以及redis,这里的名称是service名
    depends_on:
      - nginx
      - mysql
      - redis
    # 自动重启
    restart: always

# 创建网络
#networks:
  # 默认将会创建为 docker-compose.yml所在 文件夹名_my_network 网络名称
  #my_network: