docker配合nginx代理springboot项目发布到外网

关于docker配合nginx代理springboot项目

    • linux安装docker
    • 安装好了之后,测试一下
    • 设置compose运行nginx、java、mysql、redis
    • 最后在总结一下docker的常用命令吧
    • 第一次使用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 curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  1. 设置Compose为可执行文件:

sudo chmod +x /usr/local/bin/docker-compose

  1. 创建软链:

sudo ln -s /usr/local/bin/docker-compose /usr/bin/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文件夹,目录结构以下图片:

  • docker配合nginx代理springboot项目发布到外网_第1张图片

  • docker配合nginx代理springboot项目发布到外网_第2张图片

  • 最后运行

    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的总结就到这结束了,有问题和错误的地方请指出,谢谢大家啦

你可能感兴趣的:(docker,nginx,运维,java,linux)