docker部署项目实战

         部署前请先安装docker以及docker-compose,已经安装的请跳过,未安装的同学到我的文章中有docker以及docker-compose的安装方法。

一、 下载基础镜像

1. 搜索想下载的镜像

docker search ××       //××代表想要查找的镜像

如:

docker search openjdk

1.下载jdk8镜像

sudo docker pull openjdk:8-jre

2. 下载mysql镜像

sudo docker pull mysql:8.0.21

 二、创建容器

本文以mysql演示以基础镜像创建容器运行

1. 创建docker-compose.yml文件

 vim /root/data/mysql/docker-compose.yml

2. 创建数据挂载

mkdir -p /root/mysql/data

mkdir -p /root/mysql/config

 3. 编辑docker-compose.yml

version: '3'

services:

  mysql:
    # 指定容器的名称
    container_name: mysql     
    # 指定镜像和版本
    image: mysql:8.0.21      

     #端口映射,将 mysql的3306映射到32306对外访问  
    ports:
      - "32306:3306"        

    #配置容器在退出时自动重启

    restart: always    
    # 容器日志大小配置
    logging:
      driver: 'json-file'
      options:
        max-size: '3g'
    environment:
      # 配置root密码
      MYSQL_ROOT_PASSWORD: uksuh123

      TZ: Asia/Shanghai
    volumes:     

       # 挂载数据目录
      - /root/mysql/data:/var/lib/mysql
      # 挂载配置文件目录
      - /root/mysql/conf.d:/etc/mysql/conf.d
      # 映射日志
      - /root/mysql/logs:/var/log/mysql
      # 让容器的时钟与宿主机时钟同步,避免时间的问题

      - /etc/localtime:/etc/localtime:ro 

        在上述配置中,我们使用了 MySQL 8 的官方镜像,并指定了一个容器名称为 mysql。我们还设置了 MySQL 的 root 用户密码,并将主机的 3306 端口映射到容器的 3306 端口。此外,我们将 MySQL 的数据目录挂载到主机的 ./data 目录下,以便数据可以持久化保存。
       在这个例子中,/var/lib/mysql 是 MySQL 数据库容器内的默认数据目录,而 /root/mysql/data 是主机上的目录,用于存储 MySQL 数据库的数据文件。

4. 配置my.cnf(有额外配置使用,否则可以忽略)

###### [client]配置模块 ######
[client]
default-character-set=utf8mb4
socket=/var/lib/mysql/mysql.sock

###### [mysql]配置模块 ######
[mysql]
# 设置MySQL客户端默认字符集
default-character-set=utf8mb4
socket=/var/lib/mysql/mysql.sock

###### [mysqld]配置模块 ######
[mysqld]
port=3306
user=mysql
# 设置sql模式 sql_mode模式引起的分组查询出现*this is incompatible with sql_mode=only_full_group_by,这里最好剔除ONLY_FULL_GROUP_BY
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
server-id = 1

# MySQL8 的密码认证插件 如果不设置低版本navicat无法连接
default_authentication_plugin=mysql_native_password

# 禁用符号链接以防止各种安全风险
symbolic-links=0

# 允许最大连接数
max_connections=1000

# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8mb4

# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB

# 表名存储在磁盘是小写的,但是比较的时候是不区分大小写
lower_case_table_names=0
max_allowed_packet=16M 

# 设置时区
default-time_zone='+8:00'

5. 启动容器

启动:docker-compose up -d

停止:docker-compose down

三、部署java项目

1. 上传jar包

admin-2.1.jar

2. 编写docker-compose发布jar

version: '3'
services:

#服务的名称
  admin:
    restart: always

    # 使用jdk基础镜像
    image: openjdk:8-jre

    #指定容器名称
    container_name: admin
    ports:
      - '8080:8080'
    volumes:

       #配置日志输出
      - ./logs/:/logs/

      # 将jar包挂载到jdk容器,并命名为app.jar
      - ./admin-2.1.jar:/app.jar
    environment:
      - TZ=Asia/Shanghai
      - SPRING_DATASOURCE_URL=jdbc:mysql://127.0.0.1:3306/mysql?useUnicode=true&characterEncoding=UTF8&useSSL=false
      - SPRING_DATASOURCE_USERNAME=root
      - SPRING.DATASOURCE.PASSWORD=usjshb123
      - KNIFE4J.PRODUCTION=true

     # 启动时执行该命令
    command: java -server -jar app.jar

3. 启动容器

启动:docker-compose up -d

停止:docker-compose down

4. 日志

 docker中日志通常输出到控制台,不会输出到日志文件,导致日志排查困难,所以添加以下解决方案:

在resources下边添加logback.xml文件,打进包中即可。

<?xml version="1.0" encoding="UTF-8"?>

<configuration scan="true" scanPeriod="10 seconds" debug="false">
    <!-- 应用名称 -->
    <contextName>api</contextName>

    <!-- 向控制台输出日志 -->
    <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-M-d HH:mm:ss} [%thread] %p [%logger{0}]:%L %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 向文件输出日志 -->
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>./logs/admin-info.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>./logs/admin-info-%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-M-d HH:mm:ss} [%thread] %p [%logger{0}]:%L %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- druid连接池的日志级别 -->
    <logger name="com.alibaba.druid" level="DEBUG" />

    <!-- snow_credit的日志级别 -->
    <logger name="cn.enilu.flash" level="DEBUG" />

    <!-- root级别的logger -->
    <root level="INFO">
        <appender-ref ref="file" />
        <appender-ref ref="stdout" />
    </root>
</configuration>

 四、安装nginx

1. 下载nginx

docker pull nginx

默认下载最新稳定版本,如果想指定版本号,则为docker pull nginx:1.24.0。

2. 配置docker-compose

version: '3'      #版本号
services:
  nginx:
    image: nginx:1.24.0                 # 镜像nginx:1.24.0
    container_name: nginx               # 容器名为'nginx'
    restart: always                     # 指定容器退出后的重启策略为始终重启,但是不考虑在Docker守护进程启动时就已经停止了的容器
    volumes:                            

        # 数据卷挂载路径设置,将本机目录映射到容器目录,冒号前边的是本地目录,后边的容器中对应目录
      - /root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf  # 存放主配置文件的位置
      - /root/nginx/html:/usr/share/nginx/html    #存放html文件的位置
      - /root/nginx/log:/var/log/nginx # 存放日志文件的位置
      - /root/nginx/www:/var/www   # 存放前端文件的位置
      - /root/nginx/cert:/usr/share/nginx/conf/cert  # 存放https文件的位置
      - /root/nginx/conf/conf.d:/etc/nginx/conf.d  # 存放虚拟机文件的位置
    environment:                        # 设置环境变量,相当于docker run命令中的-e
      TZ: Asia/Shanghai
      LANG: en_US.UTF-8
    ports:                              # 映射端口
      - 80:80
      - 443:443
    privileged: true

3.启动nginx

启动:docker-compose up -d

停止:docker-compose down

五、部署前端项目

1. 上传前端项目到nginx下的www文件夹

2. 添加前端到nginx配置文件

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    }

    # 配置前端的server
    server {
        listen 65501;                              #端口
        # server_name example.com;   #域名
    add_header Strict-Transport-Security max-age=15768000;
        client_max_body_size 50M;    

        location / {
            root /var/www/admin-ui;     #指定前端文件的地址
            index index.html;
            }
    }

   #配置后端的server

    server {
        listen 8888; #端口

        # localhost;   #域名

        location / {
       proxy_pass http://127.0.0.1:8082;    #这里为127.0.0.1 如果访问不通,可以改为服务器外网ip
       proxy_set_header Host $host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header X-Forwarded-Proto $scheme;
           proxy_connect_timeout 5;    
         proxy_http_version 1.1;
       proxy_cache_bypass $http_upgrade;
    }
    }

    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

3. 配置nginx的docker-compose

注意:需要将前端和后端的端口添加到docker-compose中的ports下,否则会导致nginx启动后,断后任然报错访问不到的情况。

   ports:                              # 映射端口
      - 80:80
      - 443:443
      - 65501:65501
      - 8888:8888

4. 启动nginx

启动:docker-compose up -d

停止:docker-compose down

 ————————————————
版权声明:本文为CSDN博主「暗夜里的一束光」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

  • 30
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值