最强docker部署模板

news2024/12/24 9:09:58

00.背景

最近学校让一个小组做一个web项目最后部署到linux服务器上,项目本身并不难就是简单的增删改查,但是我想借着这个机会写一个docker部署的模板,方便自己以后用,也希望可以帮助到大家。

01.docker简介

docker可以快捷 轻量 高效 简单的部署服务,docker有两个重要概念 镜像(image)与容器(container) 镜像可以理解为类 容器可以理解为对象,假如我们需要部署一个web项目 这个项目由 vue springboot mysql构成,我们就可以先创造所需的镜像,再创造对应的容器 容器之间进行交互 最终实现这个服务。容器与容器之间是相互隔离的 只有身处同一个网络才能交互,一个镜像产生可以由很多容器。

02.环境整体目录


蓝色节点是目录 红色节点是压缩包 其余是文件。

03.所需材料

这是一个简单的web项目,总共有四大部分,前端vue 后端springboot 数据库mysql 以及nginx服务器。

04.创造镜像

拉取镜像

docker pull nginx 
docker pull openjdk:8 
docker pull mysql:5.7

这里我们拉取了三个镜像
nginx:用于反向代理 可以简单的理解为 我们前端的请求都会通过nginx进行转发
openjdk:8:jdk8 Java运行环境 我们的springboot项目需要java支持
mysql:5.7 :mysql数据库
除了这三个镜像外我们还需要springboot后端的镜像

05.创造后端镜像

首先我们要用maven打包

我们把打包出来的app.jar放到app目录下
编写dockerfile文件

FROM openjdk:8
EXPOSE 8080
ADD ./app.jar /app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-jar","/app.jar","--spring.profiles.active=prod"]

dockerfile文件的作用是创造一个镜像,这个镜像创造过程有许多层,例如第一层是FROM openjdk:8 作用就是在openjdk:8环境的基础上搭建镜像,EXPOSE 8080则是这个镜像创造的容器向外暴露的端口
用dockerfile构建后端镜像app
在app目录下构建后端镜像

docker build -f ./dockerfile -t app .

查看现有镜像

docker images


可以看到我们现在有四个镜像,分别是app后端镜像、nginx服务器镜像、mysql镜像、jdk8镜像

06.创造mysql容器

我们首先创造宿主机(本机linux服务器)目录

mkdir -p /mnt/docker/mysql
cd /mnt/docker/mysql

创造mysql容器

docker run -id \
-p 3307:3306 \
--name=mysql \
-v /mnt/docker/mysql/data:/var/lib/mysql \   # 目录挂载
-e MYSQL_ROOT_PASSWORD=root \
mysql:5.7

参数解释

-p 宿主机端口:容器端口,我们后端调用数据库需要调用3307端口 Navicat连接数据库也需要连接3307端口
-v 宿主机mysql目录:容器mysql目录,目录挂载的目的是 把容器与宿主机的目录数据同步,防止因为删除容器而导致数据库中数据丢失

查看容器是否启动

docker ps


可以看到我们启动成功了

07.docker-compose服务编排

服务编排的目的是利用Docker Compose将springboot和nginx容器分批启动
安装Docker Compose

curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 设置文件可执行权限 
chmod +x /usr/local/bin/docker-compose
# 查看版本信息 
docker-compose -version

编写docker-compose.yml文件
进入docker-compose目录 编写docker-compose.yml文件

version: '3'
services:
  nginx:
   image: nginx
   container_name: nginx
   ports: #ports:绑定容器的端口到主机的端口,前者为主机端口;expose:将当前容器的端口暴露给link到本容器的容器。
    - 80:80
   depends_on:
    - app
   volumes: #将本地目录挂载到容器的目录下,前者为linux的目录,后者为容器目录。(访问容器的目录即可访问到被挂载目录下的所有文件)
    - /mnt/docker/docker-compose/nginx/:/etc/nginx/
   network_mode: "bridge"
  app:
    image: app
    container_name: app
    ports:
     - 8080:8080
    network_mode: "bridge"

参数解释

version    docker-compose版本
services   容器服务
image      容器属于那镜像
container_name 容器名
ports      宿主机端口:容器端口
depends_on 此容器启动所依赖的容器
volumes    挂载到宿主机的哪个目录
network_mode 容器网络,必须处于同一网络下容器才能互相访问

08.nginx相关配置

nginx的作用是反向代理和负载均衡
反向代理:反向代理简单来说就是nginx服务器监听网站请求,并且把这些请求转发到其它服务器处理。反向代理与正向代理相反,正向代理是服务器主动请求,比如我们常用的游戏加速器,比如这个游戏只能在美国玩,此时我们就需要一个美国服务器,此时我们自己的服务器并不会直接连接游戏而且把请求发给美国服务器再由美国服务器请求这个游戏,这个过程就是正向代理。
负载均衡:当我们网站的请求被nginx服务器监听到后 nginx会根据规则把这些请求发送给指定的服务器,比如我们有两个后端服务 一个是java一个是go,我们的其中一部分请求nginx转发给java服务另一部分转发给go服务,通过规则的合理分配以达到最优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。

nginx相关配置文件编写

在nginx目录下编写nginx.conf

user nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    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;
}

我们可以看到这里面引入了两个文件 /etc/nginx/mime.types;与 /etc/nginx/conf.d/* .conf;
mime.types文件


types {
    text/html                                        html htm shtml;
    text/css                                         css;
    text/xml                                         xml;
    image/gif                                        gif;
    image/jpeg                                       jpeg jpg;
    application/javascript                           js;
    application/atom+xml                             atom;
    application/rss+xml                              rss;

    text/mathml                                      mml;
    text/plain                                       txt;
    text/vnd.sun.j2me.app-descriptor                 jad;
    text/vnd.wap.wml                                 wml;
    text/x-component                                 htc;

    image/png                                        png;
    image/svg+xml                                    svg svgz;
    image/tiff                                       tif tiff;
    image/vnd.wap.wbmp                               wbmp;
    image/webp                                       webp;
    image/x-icon                                     ico;
    image/x-jng                                      jng;
    image/x-ms-bmp                                   bmp;

    font/woff                                        woff;
    font/woff2                                       woff2;

    application/java-archive                         jar war ear;
    application/json                                 json;
    application/mac-binhex40                         hqx;
    application/msword                               doc;
    application/pdf                                  pdf;
    application/postscript                           ps eps ai;
    application/rtf                                  rtf;
    application/vnd.apple.mpegurl                    m3u8;
    application/vnd.google-earth.kml+xml             kml;
    application/vnd.google-earth.kmz                 kmz;
    application/vnd.ms-excel                         xls;
    application/vnd.ms-fontobject                    eot;
    application/vnd.ms-powerpoint                    ppt;
    application/vnd.oasis.opendocument.graphics      odg;
    application/vnd.oasis.opendocument.presentation  odp;
    application/vnd.oasis.opendocument.spreadsheet   ods;
    application/vnd.oasis.opendocument.text          odt;
    application/vnd.openxmlformats-officedocument.presentationml.presentation
                                                     pptx;
    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
                                                     xlsx;
    application/vnd.openxmlformats-officedocument.wordprocessingml.document
                                                     docx;
    application/vnd.wap.wmlc                         wmlc;
    application/x-7z-compressed                      7z;
    application/x-cocoa                              cco;
    application/x-java-archive-diff                  jardiff;
    application/x-java-jnlp-file                     jnlp;
    application/x-makeself                           run;
    application/x-perl                               pl pm;
    application/x-pilot                              prc pdb;
    application/x-rar-compressed                     rar;
    application/x-redhat-package-manager             rpm;
    application/x-sea                                sea;
    application/x-shockwave-flash                    swf;
    application/x-stuffit                            sit;
    application/x-tcl                                tcl tk;
    application/x-x509-ca-cert                       der pem crt;
    application/x-xpinstall                          xpi;
    application/xhtml+xml                            xhtml;
    application/xspf+xml                             xspf;
    application/zip                                  zip;

    application/octet-stream                         bin exe dll;
    application/octet-stream                         deb;
    application/octet-stream                         dmg;
    application/octet-stream                         iso img;
    application/octet-stream                         msi msp msm;

    audio/midi                                       mid midi kar;
    audio/mpeg                                       mp3;
    audio/ogg                                        ogg;
    audio/x-m4a                                      m4a;
    audio/x-realaudio                                ra;

    video/3gpp                                       3gpp 3gp;
    video/mp2t                                       ts;
    video/mp4                                        mp4;
    video/mpeg                                       mpeg mpg;
    video/quicktime                                  mov;
    video/webm                                       webm;
    video/x-flv                                      flv;
    video/x-m4v                                      m4v;
    video/x-mng                                      mng;
    video/x-ms-asf                                   asx asf;
    video/x-ms-wmv                                   wmv;
    video/x-msvideo                                  avi;
}

这个文件的作用是定义用户访问的文件类型
/etc/nginx/conf.d/ .conf;*
这个则是引入了conf.d下的所有文件
这里主要指的是app.conf

gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_comp_level 2;
gzip_vary off;
upstream appstream{

        server 私网ip:8080;
}

server {

   listen    80;

   server_name  公网ip;

    error_page   500 502 503 504  /50x.html;
    error_page  404             /404.html;
        location = /50x.html {
                root   html;
        }
        location = /404.html{
                root   html;
        }

   location /api/ {

                proxy_pass http://appstream/;
   }

   location / {
                   root /etc/nginx/html;
                   index index.html;
   }
}

参数解释

upstream appstream  代表上游服务,也就是nginx把请求转发给它,这里指的是本地的8080端口也就是后端服务

server              nginx监听的服务

listen              监听的端口 这里是80

server_name         监听的ip

error_page          出现错误指定请求哪个文件

location = /404.html 
{root   html;}      当请求产生404报错时,nginx展示html目录下404.html

location /api/ 
{ proxy_pass http://appstream/;}
	所有的80端口的请求带/api的都由上游服务处理 这里指的是后端处理,比如我们现在请求
	http://公网ip/api/sub/findAccounts 通过 nginx转发就变为了 
	http://私网ip/sub/findAccounts

location / {
                   root /etc/nginx/html;
                   index index.html;
		   }             
		   同理所以/(根目录)的请求都转发到/etc/nginx/html/index.html

09.前端文件

你们可能发现一个问题前端为什么没有镜像,因为前端只是一堆静态文件,并不需要处理请求,只是用来发送请求接收响应,所以我们只需要把前端放到特点位置,然后我们的nginx根据服务规则 调用需要的前端文件 就像上述app.conf中的location /,http://47.95.49.40/(根请求)就转发到了/etc/nginx/html/index.html 这个指定的前端文件,从而展示前端。
打包前端
我们通过 npm run build 命令打包vue项目 打包完成后会有一个文件一个目录

我们把它们放到html目录下,同时我们可以发现html目录下处理这两个文件 还有一个404.html与50x.html 这两个是我专门写的如果出现错误 指定展示的文件

10 编排启动

我们进入docker-compose 目录下

docker-compose up #直接启动

docker-compose up -d #代表后台启动

docker-compose down  #停止并删除容器

docker-compose start #启动已有容器

docker-compose stop  #停止运行的容器

我们执行docker-compose up -d 启动 nginx容器与app容器
查看此时的容器

docker ps


我们可以看到我们现在有三个容器 分别是 nginx、app、mysql。
此时我们这个网站就部署成功了

11 整个项目的运行逻辑

首先我们访问 公网ip:80 也就是直接访问公网ip 例如http://47.95.49.40/,此时我们先访问了/(根目录),通过nginx的转发我们知道 展示了/etc/nginx/html/index.html 也就是上述的登录界面,之后我们输入账号密码,发送请求 http://47.95.49.40/api/user/login 我们发现请求是带着/api的 此时我们的nginx转发到我们的后端进行处理 http://私网ipi/user/login 最终完成请求、转发、响应,实现了一个基本的网站。

12 总结

总的来说,我们在用docker部署时要先确定目录结构,之后便是 理清自己的镜像需要哪些依赖从而编写dockerfile文件 ,理清自己需要的容器之间的关系 编写docker-compose.yml文件,理清前后端请求的逻辑编写nginx相关配置。注意要把所需端口放开
最后 祝各位小伙伴都能部署顺利。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/114050.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis原理篇—网络模型

Redis原理篇—网络模型 笔记整理自 b站_黑马程序员Redis入门到实战教程 用户空间和内核态空间 服务器大多都采用 Linux 系统,这里我们以 Linux 为例来讲解: ubuntu 和 Centos 都是 Linux 的发行版,发行版可以看成对 Linux 包了一层壳,任何 …

第八章:数据库编程

一、嵌入式、过程化SQL、存储过程和函数 1、【单选题】 下表为oracle数据库表cj.temp_20221106的数据。建立存储过程: CREATE OR REPLACE PROCEDURE proc_temp_20221106(i INT) IS CURSOR c_temp IS SELECT * FROM cj.temp_20221106; ROW_NR c_temp%ROWTYPE; i_count …

【Linux】基础IO——系统文件IOfd重定向理解

文章目录一、回顾C文件接口1.打开和关闭2.读写文件3.细节二、系统文件I/O 1.open和closeumask小细节2.read和write1.write2.read3.小总结三、理解文件四、文件描述符fd1.引入2.理解3.分配规则4.close(1)问题五、重定向1.重定向2.接口3.追加重定向4.输入重定向六、Linux一切皆文…

信息技术 定义内涵

工作流运行 定义内涵 工作流运行是工作流模板的依次执行,在工作流运行时,用户可以随时取消或查看正在 运行的任务。由于工作流运行的模板的不同,运行过程中可能会产生不同的新资源,如数据 处理类型的工作流会产生新的数据集&…

Java框架精品项目【用于个人学习】

难度系数说明: 难度系数用来说明项目本身进行分析设计的难度 难度系数大于1的项目可用作参赛作品、大作业、计算机毕业设计等需求 前言 大家好,我是二哈喇子,此博文整理了各种项目需求,用于博主自己学习,当做个人笔记…

黑烟车识别抓拍系统 python

黑烟车识别抓拍系统利用Python基于YOLOv5通过道路已有卡口相机对现场画面中包括黑烟车、车牌信息、车头车尾照片、林格曼黑度等级数据回传给后台。Python是一种由Guido van Rossum开发的通用编程语言,它很快就变得非常流行,主要是因为它的简单性和代码可…

IMX6ULL学习笔记(14)——GPIO接口使用【C语言方式】

一、GPIO简介 i.MX6ULL 芯片的 GPIO 被分成 5 组,并且每组 GPIO 的数量不尽相同,例如 GPIO1 拥有 32 个引脚, GPIO2 拥有 22 个引脚, 其他 GPIO 分组的数量以及每个 GPIO 的功能请参考 《i.MX 6UltraLite Applications Processor Reference M…

【魔法圣诞树】代码实现详解 --多种实战编程技巧倾情打造

一、前言 本文会基于C# GDI技术 从零到一 实现一颗 魔法圣诞树!源码和素材在文末全部都有! 二、魔法圣诞树 对于用代码画圣诞树,网上各种编程语言像python、css、java、c/c我们都有见到过了,那么在绘图方面,还有一位…

从刘润的商业简史,预测互联网与能源的未来,辉煌的人生需要顺势而为

所有理所当然的现在,都是曾经看起来不可能的未来。 所有现在看起来不可想象的未来,可能都是明天理所当然的现在。 未来已来,只是尚未流行。 “一切历史都是当代史。”学习历史的目的,正是为了从中总结规律,然后用这些…

第四章:数据库安全性

一、数据库安全概述和控制 1、【单选题】TCSEC/TDI安全级别划分中,C1级需要实现的安全策略为: 我的答案:A 2、【单选题】能够对系统的数据加以标记,对标记的主体和客体实施强制存取控制(MAC)、审计等安全机…

绿盟SecXOps安全智能分析技术白皮书 工作流运行

工作流运行 定义内涵 工作流运行是工作流模板的依次执行,在工作流运行时,用户可以随时取消或查看正在 运行的任务。由于工作流运行的模板的不同,运行过程中可能会产生不同的新资源,如数据 处理类型的工作流会产生新的数据集&…

【关于时间序列的ML】项目 10 :用机器学习预测降雨

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

浅谈会话技术:Cookie,Session、Token

◼️ 什么是会话 会话: 数据交互的过程,在web中指 浏览器从发出一个请求到浏览器关闭,这个过程就是一个会话。在这个过程中,需要有很多的状态和数据需要我们关注,记录,这个就是我们要研究的会话 ◼️ 什么…

基于主从博弈的社区综合能源系统分布式协同优化运行策略(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

源码系列 之 HashMap

简介 HashMap可能是Java程序员最常用的集合之一了,面试也是常考题之一。那么我们平时了解到的特性都是怎么来的呢,什么一会儿是链表,一会儿又是红黑树。八股文选手现在已经像高中背《滕王阁序》一样,肌肉反应似的在脑子背过一遍了…

Github一夜爆火,不愧是阿里、字节高级架构师联合创作的Netty核心原理手册

讲到这里,你可能要问了:如果我的工作中涉及网络编程的内容并不多,那我是否还有必要花精力学习 Netty 呢?其实在互联网大厂(阿里、腾讯、美团等)的中高级 Java 开发面试中,经常会问到涉及到 Nett…

【Javassist】快速入门系列06 当检测到构造方法调用时替换方法调用的内容

系列文章目录 01 在方法体的开头或结尾插入代码 02 使用Javassist实现方法执行时间统计 03 使用Javassist实现方法异常处理 04 使用Javassist更改整个方法体 05 当有指定方法调用时替换方法调用的内容 06 当有构造方法调用时替换方法调用的内容 文章目录系列文章目录前言引入J…

python数据分析 股票预测

目录 ​​​​​​​一:股票预测数据分析 二:K线图数据分析 ​​​​​​​一:股票预测数据分析 1-1 导入需要使用到的库 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns 1-2 读取csv数据…

Xray正向及反向漏洞检测

文章目录软件介绍下载地址安装教程使用教程主动扫描被动扫描软件介绍 xray 是从长亭洞鉴核心引擎中提取出的社区版漏洞扫描神器,支持主动、被动多种扫描方式,自备盲打平台、可以灵活定义 POC,功能丰富,调用简单,支持 …

Vue3安装scss教程

在开发新项目的时候打算使用scss,新项目使用的是vue3框架,所以发一下scss安装的教程 scss是sass的超集,其实可以说是安装sass Vue3安装scss教程安装依赖vite.config.js配置使用安装依赖 npm install node-sass -S npm install sass-loader …