docker配合nginx代理springboot项目发布到外网_docker springboot nginx-程序员宅基地

技术标签: java  nginx  运维  linux  docker  

使用docker(使用docker-compose.yml)配合nginx在linux上运行springboot项目上线,docker上运行了java,mysql,redis,nginx,所以本地可以不需要安装这些

linux安装docker

  1. 安装docker命令:

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

  1. 安装docker-compose命令:
sudo pip3 install -U pip setuptools
sudo pip3 install docker-compose
  1. 测试Compose是否安装成功:

docker-compose --version

  1. 启动docker:

sudo systemctl start docker

  1. 设置开机自启:

systemctl enable docker.service

安装好了之后,测试一下

  1. 运行

sudo docker run hello-world

  1. 然后我报了以下一个错误,说我们docker没有启动
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
  1. 随后我就再次启动了一下,运行:

sudo systemctl start docker

  1. 如果弹出有以下内容就说明可以正常运行docker了:
Digest: sha256:9ade9cc2e26189a19c2e8854b9c8f1e14829b51c55a630ee675a5a9540ef6ccf
Status: Downloaded newer image for hello-world:latest

设置compose运行nginx、java、mysql、redis

  1. 编写docker-compose.yml,注意文件一定要取这个名字,下面内容的一些挂载的东西稍后在解释
version: "1"
services:
  nginx: # 服务名称,用户自定义
    image: nginx:latest  # 镜像版本
    container_name: nginx  #启动的别名
    restart: always #docker启动的时候会自动启动这个服务
    network_mode: host #不在对应某个端口,我认为的解释是对应所有端口了
    volumes: # 挂载到本地服务器的具体文件内(前面是本地的具体目录以及文件,可以根据自己的需求改动,后面的是docker上的)
      - /home/docker/nginx/www:/usr/share/nginx/html
      - /home/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      - /home/docker/nginx/cer:/usr/share/nginx/cer
    privileged: true # 这个必须要,解决nginx的文件调用的权限问题
  mysql:
    image: mysql:5.7
    container_name: mysql
    restart: always
    ports:
      - 3306:3306
    volumes:
      - /home/mysql/conf.d:/etc/mysql/conf.d
      - /home/mysql/mysql:/var/lib/mysql
    environment: # 指定用户root的密码
      - TZ=Asia/Shanghai
      - MYSQL_ROOT_PASSWORD=123456 #设置mysql的密码
  redis:
    image: redis:latest
    container_name: redis
    restart: always
    ports:
      - 6379:6379
    volumes:
      - /home/redis/redis.conf:/etc/redis/redis.conf
      - /home/redis/data:/data
    environment:
      - TZ=Asia/Shanghai
    command: redis-server --requirepass 123456 --appendonly yes
  vuestudy:
    build: . # 表示以当前目录下的Dockerfile开始构建镜像
    image: vuestudy:latest
    restart: always
    container_name: vuestudy
    ports:
      - 8080:8080
    volumes:
      - /home/docker/vuestudy.jar:/home/first/vuestudy.jar
  vuestudy2:
    image: vuestudy:latest
    restart: always
    container_name: vuestudy2
    ports:
      - 8081:8080
    volumes:
      - /home/docker/vuestudy.jar:/home/first/vuestudy.jar

  1. 编写Dockerfile文件,文件名字也必须是这个
FROM openjdk:8
EXPOSE 8080
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
ENTRYPOINT ["java","-jar", "/home/first/vuestudy.jar", "--server.port=8080", "--spring.profiles.active=prod"]
  1. 详解docker的挂载
  • Dockerfile相当于自己创建了个docker镜像,在这个镜像下运行springboot项目,如果目录不同需要自己看着修改
  • mysql挂载是将docker上的mysql数据映射到本地,之后docker上的mysql镜像删掉了也没事,我将mysql映射在了本地的home/mysql文件夹中,创建该文件夹后,运行命令将需要用的数据复制到本地,但是我们现在还没有启动mysql,所以需要先运行一下mysql:

docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7

  • mysql运行成功之后

    1. 运行完了之后可以使用 docker ps 查看运行的容器状态,以及使用 docker exec -it mysql bash 进入容器,但是我们只需要把需要的东西复制到我们本地就行了,运行以下命令即可复制:

      docker cp mysql:/etc/mysql/conf.d /home/mysql/

      docker cp mysql:/var/lib/mysql /home/mysql/

    2. 复制完成后可将mysql容器停止删除,再删除镜像:

      docker stop $(docker ps -aq) //停止所有容器

      sudo docker rm $(sudo docker ps -a -q) //删除所有未运行的容器

      docker rmi $(docker images -q) //删除所有的镜像

    3. 但是我在后续的使用中mysql的时间以及编码有问题,我回过头来修改了以下配置,如果你们遇到了就到这来修改,进入本地的home/mysql/conf.d目录下,vi 编写my.cnf文件:
      [client]
      default-character-set=utf8mb4
      [mysql]
      default-character-set=utf8mb4
      [mysqld]
      default-time-zone = '+08:00'
      lower_case_table_names = 1
      character-set-server=utf8mb4 
      collation-server=utf8mb4_general_ci
      
  • redis与mysql同理,但不需要运行,创建文件夹在本地的home/redis下再创建data目录,下载该文件 redis.conf,然后修改以下内容放入redis文件夹中:

    1. bind 127.0.0.1 #注释掉这部分,这是限制redis只能本地访问
    2. daemonize no # 设置为no
    3. protected-mode no # 默认yes,开启保护模式,限制为本地访问
    4. requirepass 123456 # 是否需要密码,不需要注释掉
  • 关于nginx的挂载

    1. /home/docker/nginx/www在本地创建了文件目录是放置静态资源文件,用以nginx容器启动后可调用本地静态数据
    2. /home/docker/nginx/cer在本地创建该文件夹是放置cer证书的,用以使用https时需要调用到
    3. /home/docker/nginx/conf/nginx.conf为nginx最关键的配置,我们也放以本地,方便修改,以下是nginx.conf的内容,在编写nginx.conf的时候不要在windows写完直接复制进去,会乱码的,最好用 vi 命令编写复制,根据自己的需求适当修改噢
      #nx worker进程运行用户以及用户组,默认nobody账号运行
      user  nginx;
      
      
      #worker_processes指定nginx要开启的子进程数量,运行过程中监控每个进程
      #消耗内存(一般几M~几十M不等)根据实际情况进行调整,通常数量是CPU内核数量的整数倍
      worker_processes  2;
      
      
      #定义错误日志文件的位置及输出级别【debug / info / notice / warn / error / crit】
      #error_log  logs/error.log;
      #error_log  logs/error.log  notice;
      error_log  /var/log/nginx/error.log warn;
      
      #用来指定进程id的存储文件的位置
      pid        /var/run/nginx.pid;
      
      #用于指定一个进程可以打开最多文件数量的描述
      worker_rlimit_nofile 65535;
      worker_cpu_affinity 01 10;
      
      #针对nginx服务器的工作模式的一些操作配置
      events {
              
      #指定最大可以同时接收的连接数量,这里一定要注意,最大连接数量是和worker processes共同决定的。
      worker_connections  51200;
      #配置指定nginx在收到一个新连接通知后尽可能多的接受更多的连接
      #multi_accept on;
      #配置指定了线程轮询的方法,如果是linux2.6+,使用epoll,如果是BSD如Mac请使用Kqueue
      use epoll;
      }
      
      #作为web服务器,http模块是nginx最核心的一个模块
      http {
              
          ##
          # 基础配置
          ##
          #配置on让sendfile发挥作用,将文件的回写过程交给数据缓冲去去完成,而不是放在应用中完成,这样的话在性能提升有有好处
          sendfile on;
              #让nginx在一个数据包中发送所有的头文件,而不是一个一个单独发
          #tcp_nopush on;
              #让nginx不要缓存数据,而是一段一段发送,如果数据的传输有实时性的要求的话可以配置它,发送完一小段数据就立刻能得到返回值,但是不要滥用
          tcp_nodelay on;
              #给客户端分配连接超时时间,服务器会在这个时间过后关闭连接。一般设置时间较短,可以让nginx工作持续性更好
          keepalive_requests 50000;
          keepalive_timeout 1000;
              #混淆数据,影响三列冲突率,值越大消耗内存越多,散列key冲突率会降低,检索速度更快;值越小key,占用内存较少,冲突率越高,检索速度变慢
          types_hash_max_size 2048;
              #虽然不会让nginx执行速度更快,但是可以在错误页面关闭nginx版本提示,对于网站安全性的提升有好处
          # server_tokens off;
          # server_names_hash_bucket_size 64;
          # server_name_in_redirect off;
          #指定在当前文件中包含另一个文件的指令
          include       /etc/nginx/mime.types;
          #指定默认处理的文件类型可以是二进制
          default_type  application/octet-stream;
      	proxy_intercept_errors on;
      
          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;
          #设置存储记录错误发生的日志
          error_log   /var/log/nginx/error.log;
      
      
      
          ##
          # SSL证书配置
          ##
              #指令用于启动特定的加密协议,nginx在1.1.131.0.12版本后默认是ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2,
              #TLSv1.1与TLSv1.2要确保OpenSSL >= 1.0.1 ,SSLv3 现在还有很多地方在用但有不少被攻击的漏洞。
          #ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
              #设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件
          #ssl_prefer_server_ciphers on;
      
      
          ##
          # Gzip 压缩配置
          ##
          #是告诉nginx采用gzip压缩的形式发送数据。这将会减少我们发送的数据量。
           gzip  on;
              #为指定的客户端禁用gzip功能。我们设置成IE6或者更低版本以使我们的方案能够广泛兼容。
               gzip_disable "msie6";
      
              #upstream模块主要负责负载均衡的配置,通过默认的轮询调度方式来分发请求到后端服务器
              upstream tomcatserver1 {
              
                              #指定请求调度算法,默认是weight权重轮询调度,可以指定
                              #ip_hash; 每个请求按照访问ip(即Nginx的前置服务器或者客户端IP)的hash结果分配,
                              #这样每个访客会固定访问一个后端服务器,可以解决session一致问题。
                              #server host:port:分发服务器的列表配置,172.16.147.149是我服务器的地址,你们需要改成你们自己的
                              server 172.16.147.149:8080 weight=1 max_fails=2 fail_timeout=10s;
                              server 172.16.147.149:8081 weight=1 max_fails=2 fail_timeout=10s;
                              #down:表示该主机暂停服务
                              #max_fails:表示失败最大次数,超过失败最大次数暂停服务
                              #fail_timeout:表示如果请求受理失败,暂停指定的时间之后重新发起请求
               }
      
      
          #一个虚拟主机的配置,一个http中可以配置多个server
          #主机配置
      	server {
              
              #监听的端口号,使用80的话域名就可以不加端口号了
              listen       80;
                      #用来指定ip地址或者域名,多个配置之间用空格分隔,假如在本地运行,配置www.xx.com就需要去更改电脑的host文件
                      #如何更改host:在C:\Windows\System32\drivers\etc目录下的host文件中添加一条DNS记录:127.0.0.1  www.helloworld.com
              server_name  127.0.0.1;
              #用于设置www/路径中配置的网页的默认编码格式
              charset        utf-8;
      		#这是容器静态文件地址,因为上方使用了挂载,所以会访问至我们本地的www文件夹
              location /love {
              
                      alias /usr/share/nginx/html;
                      index index.html;
              }
              #反向代理代理服务器访问模式,通过proxy_set配置让客户端访问透明化
              location / {
              
      			#tomcatserver1需要与上方一致,取什么名字都行只要一样
                   proxy_pass    http://tomcatserver1;
                         proxy_redirect    off;
                         proxy_set_header   Host $host:80;
                         proxy_set_header   X-Real-IP $remote_addr;
                         proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
                         client_max_body_size   1024m;
                         client_body_buffer_size   1024k;
                         proxy_connect_timeout   15;
                         proxy_send_timeout   15;
                         proxy_read_timeout   15;
                         proxy_buffer_size   8k;#
                         proxy_buffers   4 64k;
                         proxy_busy_buffers_size   128k;
                         proxy_temp_file_write_size  128k;
              }
      
              # redirect server error pages to the static page /50x.html
              #
              #error_page   500 502 503 504  /50x.html;
              #location = /50x.html {
              
              #    root   html;
              #}
      
          }
      	#这是我的https,如果不需要可删除
          server {
              
               listen 443 ssl;
               server_name localhost;
               root html;
               index index.html index.htm;
               ssl_certificate /usr/share/nginx/cer/cert-file-name.pem;   #需要将cert-file-name.pem替换成已上传的证书文件的名称。
               ssl_certificate_key /usr/share/nginx/cer/cert-file-name.key;   #需要将cert-file-name.key替换已上传的证书密钥文件的名称。
               ssl_session_timeout 5m;
               ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
               ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
               ssl_prefer_server_ciphers on;
               location / {
              
                   proxy_pass    http://tomcatserver1;
                         proxy_redirect    off;
                         proxy_set_header   Host $host:80;
                         proxy_set_header   X-Real-IP $remote_addr;
      				   proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
                         client_max_body_size   1024m;
                         client_body_buffer_size   1024k;
                         proxy_connect_timeout   15;
                         proxy_send_timeout   15;
                         proxy_read_timeout   15;
                         proxy_buffer_size   8k;#
                         proxy_buffers   4 64k;
                         proxy_busy_buffers_size   128k;
                         proxy_temp_file_write_size  128k;
              }
      
          }
       }
      
      
  • 一切准备就绪了,接下来在home目录下创建docker文件夹,然后将docker-compose.yml、Dockerfile、vuestudy.jar(springboot项目)放入docker文件夹中,再在此创建nginx文件夹,目录结构以下图片:

  • Alt

  • Alt

  • 最后运行

    cd /home/docker //进入yml文件目录

    docker-compose up -d //执行compose

  1. 上述步骤正常运行成功后,可以使用docker ps 查看容器运行状态,项目就启动好啦,可以试着访问了,以上目录结构图片就是我放在上面的静态文件夹www里面的,成功访问

最后在总结一下docker的常用命令吧

systemctl restart docker //重启docker

docker exec <容器 ID> //进入容器

docker attach 容器名或者容器ID bash //进入容器

docker exec -it 容器名或者容器ID bash //进入容器

docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql:5.7 //启动容器

docker ps (-a)所有 (-l)最后一个 //查看容器运行

docker logs #id //查看容器内的日志输出

docker stop #id //停止容器

docker #指令 --help //查看指令具体信息

docker pull #容器名称(ubuntu) //获取镜像容器

docker start #id //启动一个已停止的容器

docker restart <容器 ID> //重启容器

docker export <容器 ID> ubuntu.tar //导出容器

docker rm -f <容器 ID> //删除容器

docker images //列出镜像列表

docker search <镜像名称>(httpd) //查询镜像

docker rmi <镜像名称>(hello-word) //删除镜像

docker exec -it mysql /bin/bash //进入容器

mysql -h localhost -u root -p //进入mysql容器之后进入mysql

第一次使用docker的总结就到这结束了,有问题和错误的地方请指出,谢谢大家啦

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhuzhufeixia520/article/details/120705690

智能推荐

机器学习模型评分总结(sklearn)_model.score-程序员宅基地

文章浏览阅读1.5w次,点赞10次,收藏129次。文章目录目录模型评估评价指标1.分类评价指标acc、recall、F1、混淆矩阵、分类综合报告1.准确率方式一:accuracy_score方式二:metrics2.召回率3.F1分数4.混淆矩阵5.分类报告6.kappa scoreROC1.ROC计算2.ROC曲线3.具体实例2.回归评价指标3.聚类评价指标1.Adjusted Rand index 调整兰德系数2.Mutual Informa..._model.score

Apache虚拟主机配置mod_jk_apache mod_jk 虚拟-程序员宅基地

文章浏览阅读344次。因工作需要,在Apache上使用,重新学习配置mod_jk1. 分别安装Apache和Tomcat:2. 编辑httpd-vhosts.conf: LoadModule jk_module modules/mod_jk.so #加载mod_jk模块 JkWorkersFile conf/workers.properties #添加worker信息 JkLogFil_apache mod_jk 虚拟

Android ConstraintLayout2.0 过度动画MotionLayout MotionScene3_android onoffsetchanged-程序员宅基地

文章浏览阅读335次。待老夫kotlin大成,扩展:MotionLayout 与 CoordinatorLayout,DrawerLayout,ViewPager 的 交互众所周知,MotionLayout 的 动画是有完成度的 即Progress ,他在0-1之间变化,一.CoordinatorLayout 与AppBarLayout 交互时,其实就是监听 offsetliner 这个 偏移量的变化 同样..._android onoffsetchanged

【转】多核处理器的工作原理及优缺点_多核处理器怎么工作-程序员宅基地

文章浏览阅读8.3k次,点赞3次,收藏19次。【转】多核处理器的工作原理及优缺点《处理器关于多核概念与区别 多核处理器工作原理及优缺点》原文传送门  摘要:目前关于处理器的单核、双核和多核已经得到了普遍的运用,今天我们主要说说关于多核处理器的一些相关概念,它的工作与那里以及优缺点而展开的分析。1、多核处理器  多核处理器是指在一枚处理器中集成两个或多个完整的计算引擎(内核),此时处理器能支持系统总线上的多个处理器,由总..._多核处理器怎么工作

个人小结---eclipse/myeclipse配置lombok_eclispe每次运行个新项目都需要重新配置lombok吗-程序员宅基地

文章浏览阅读306次。1. eclipse配置lombok 拷贝lombok.jar到eclipse.ini同级文件夹下,编辑eclipse.ini文件,添加: -javaagent:lombok.jar2. myeclipse配置lombok myeclipse像eclipse配置后,定义对象后,直接访问方法,可能会出现飘红的报错。 如果出现报错,可按照以下方式解决。 ..._eclispe每次运行个新项目都需要重新配置lombok吗

【最新实用版】Python批量将pdf文本提取并存储到txt文件中_python批量读取文字并批量保存-程序员宅基地

文章浏览阅读1.2w次,点赞31次,收藏126次。#注意:笔者在2021/11/11当天调试过这个代码是可用的,由于pdfminer版本的更新,网络上大多数的语法没有更新,我也是找了好久的文章才修正了我的代码,仅供学习参考。1、把pdf文件移动到本代码文件的同一个目录下,笔者是在pycharm里面运行的项目,下图中的x1文件夹存储了我需要转换成文本文件的所有pdf文件。然后要在此目录下创建一个存放转换后的txt文件的文件夹,如图中的txt文件夹。2、编写代码 (1)导入所需库# coding:utf-8import ..._python批量读取文字并批量保存

随便推点

Scala:访问修饰符、运算符和循环_scala ===运算符-程序员宅基地

文章浏览阅读1.4k次。http://blog.csdn.net/pipisorry/article/details/52902234Scala 访问修饰符Scala 访问修饰符基本和Java的一样,分别有:private,protected,public。如果没有指定访问修饰符符,默认情况下,Scala对象的访问级别都是 public。Scala 中的 private 限定符,比 Java 更严格,在嵌套类情况下,外层_scala ===运算符

MySQL导出ER图为图片或PDF_数据库怎么导出er图-程序员宅基地

文章浏览阅读2.6k次,点赞7次,收藏19次。ER图导出为PDF或图片格式_数据库怎么导出er图

oracle触发器修改同一张表,oracle触发器中对同一张表进行更新再查询时,需加自制事务...-程序员宅基地

文章浏览阅读655次。CREATE OR REPLACE TRIGGER Trg_ReimFactBEFORE UPDATEON BP_OrderFOR EACH ROWDECLAREPRAGMA AUTONOMOUS_TRANSACTION;--自制事务fc varchar2(255);BEGINIF ( :NEW.orderstate = 2AND :NEW.TransState = 1 ) THENBEG..._oracle触发器更新同一张表

debounce与throttle区别及其应用场景_throttle和debounce应用在哪些场景-程序员宅基地

文章浏览阅读513次。目录概念debouncethrottle实现debouncethrottle应用场景debouncethrottle场景举例debouncethrottle概念debounce字面理解是“防抖”,何谓“防抖”,就是连续操作结束后再执行,以网页滚动为例,debounce要等到用户停止滚动后才执行,将连续多次执行合并为一次执行。throttle字面理解是“节流”,何谓“节流”,就是确保一段时..._throttle和debounce应用在哪些场景

java操作mongdb【超详细】_java 操作mongodb-程序员宅基地

文章浏览阅读526次。regex() $regex 正则表达式用于模式匹配,基本上是用于文档中的发现字符串 (下面有例子)注意:若未加 @Field("名称") ,则识别mongdb集合中的key名为实体类属性名。也可以对数组进行索引,如果被索引的列是数组时,MongoDB会索引这个数组中的每一个元素。也可以对整个Document进行索引,排序是预定义的按插入BSON数据的先后升序排列。save: 若新增数据的主键已经存在,则会对当前已经存在的数据进行修改操作。_java 操作mongodb

github push 推送代码失败. 使用ssh rsa key. remote: Support for password authentication was removed._git push remote: support for password authenticati-程序员宅基地

文章浏览阅读1k次。今天push代码到github仓库时出现这个报错TACKCHEN-MB0:tc-image tackchen$ git pushremote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.remote: Please see https://github.blog/2020-12-15-token-authentication_git push remote: support for password authentication was removed on august 1