Docker-完整项目的部署(保姆级教学)

news/2024/7/27 8:11:12/文章来源:https://blog.csdn.net/qq_71654538/article/details/136520075

目录

1 手动部署(白雪版)

1.1 创建网络

1.2 MySQL的部署

1.2.1 准备

1.2.2 部署

1.3 Java项目的部署

1.3.1 准备

1.3.1.1 将Java项目打成jar包

1.3.1.2 编写Dockerfile文件

1.3.2 部署

1.3.2.1 将jar包、Dockerfile文件放在linux同一个文件夹下

1.3.2.2 构建镜像

1.3.2.3 创建并运行容器

1.4 前端项目的部署

1.4.1 准备挂载文件

1.4.2 部署

1.5 测试

1.5.1 获取宿主机linux的IP地址

1.5.2 进行访问

2 DockerCompose自动化部署(章鱼哥直接拿捏)

2.1 从docker run到DockerCompose的过渡

2.2 常用命令

2.3 部署

2.3.1 编写docker-compose.yml文件

2.3.2 部署运行


1 手动部署(白雪版)

1.1 创建网络

指令

#创建网络
docker network create
#查看网络
docker network ls

 示例

注意

后面的部署都需使用该网络,这样不同容器之间才能互联,且能通过容器名访问,而不是IP。

1.2 MySQL的部署

1.2.1 准备

在/root下创建mysql文件夹,然后在mysql文件夹中创建data、conf、init三个文件夹,分别用于挂载数据目录、配置文件、初始化脚本。挂载后容器和主机的对应文件夹就可以相互影响。

向conf文件夹中添加配置文件(.cnf),本人使用的是Xftp 7

配置文件内容大概如下,设置编码格式:

[client]
default_character_set=utf8mb4
[mysql]
default_character_set=utf8mb4
[mysqld]
character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'

向init的文件夹中添加.sql文件,挂载数据卷后自动创建数据库 、自动建表。所创建的东西都会保存在data文件夹下

大致内容如下:

-- 导出 mall 的数据库结构
DROP DATABASE IF EXISTS `hmall`;
CREATE DATABASE IF NOT EXISTS `hmall`;
USE `hmall`;-- 导出  表 hmall.address 结构
DROP TABLE IF EXISTS `address`;
CREATE TABLE IF NOT EXISTS `address` (-- 其它内容
);-- 其它内容

1.2.2 部署

指令

docker run -d \--name mysql \-p 3306:3306 \-e TZ=Asia/Shanghai \-e MYSQL_ROOT_PASSWORD=123 \-v /root/mysql/data:/var/lib/mysql \-v /root/mysql/conf:/etc/mysql/conf.d \-v /root/mysql/init:/docker-entrypoint-initdb.d \--network project \mysql

指令解析

  • docker run -d: 后台运行容器。
  • --name mysql: 指定容器的名称为 "mysql"。
  • -p 3306:3306: 将主机的 3306 端口映射到容器的 3306 端口,使得可以通过主机访问 MySQL 服务。
  • -e TZ=Asia/Shanghai: 设置容器的时区为亚洲/上海。
  • -e MYSQL_ROOT_PASSWORD=123: 设置 MySQL root 用户的密码为 "123"。
  • -v /root/mysql/data:/var/lib/mysql: 将主机上 /root/mysql/data 目录挂载到容器的 /var/lib/mysql 目录,用于持久化存储 MySQL 数据。
  • -v /root/mysql/conf:/etc/mysql/conf.d: 将主机上 /root/mysql/conf 目录挂载到容器的 /etc/mysql/conf.d 目录,用于提供自定义的 MySQL 配置文件。
  • -v /root/mysql/init:/docker-entrypoint-initdb.d: 将主机上 /root/mysql/init 目录挂载到容器的 /docker-entrypoint-initdb.d 目录,该目录下的 SQL 脚本将在容器启动时执行,用于初始化数据库。
  • --network project: 将容器连接到名为 "project" 的 Docker 网络。

最后,mysql 表示使用的是官方 MySQL 镜像,并且没有指定版本,将默认使用最新版本。

运行结果

这时候再打开data文件夹我们就可以看到,数据库和表自动被创建好了 

1.3 Java项目的部署

1.3.1 准备

1.3.1.1 将Java项目打成jar包

pom.xml中添加插件:

<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><!-- 其它内容 --><build><pluginManagement><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>11</source> <!-- depending on your project --><target>11</target> <!-- depending on your project --></configuration></plugin></plugins></pluginManagement></build>
</project>

使用Maven打包

找到jar包: 

1.3.1.2 编写Dockerfile文件

代码如下: 

# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY hm-service.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

代码解析(大同小异,改改就能用)

  1. FROM openjdk:11.0-jre-buster: 指定了基础镜像为 OpenJDK 11 的运行环境,基于 Debian Buster 操作系统。

  2. ENV TZ=Asia/Shanghai: 设置环境变量 TZ 为亚洲/上海时区。

  3. RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone: 在容器内运行命令,将时区链接到 /etc/localtime,并设置容器的时区。

  4. COPY hm-service.jar /app.jar: 将主机上的 hm-service.jar 文件复制到容器内的 /app.jar

  5. ENTRYPOINT ["java", "-jar", "/app.jar"]: 指定容器启动时执行的命令,即运行 Java 应用程序的 JAR 文件 /app.jar

1.3.2 部署

1.3.2.1 将jar包、Dockerfile文件放在linux同一个文件夹下

1.3.2.2 构建镜像

指令: 

docker build -t hmall .

指令解读: 

这个命令中,最后一部分表示在目录中查找名为 Dockerfile 的文件(如果是点则表示当前目录),并使用它来构建(-t)一个名为 hmall版本号为latest(没指定版本号默认latest)的Docker镜像。

运行截图

1.3.2.3 创建并运行容器

指令

#部署并运行容器
docker run -d --name hmall --network project -p 8080:8080 hmall
#查看容器日志
docker logs hmall

运行截图

1.4 前端项目的部署

1.4.1 准备挂载文件

一共需要两个文件(夹),一个是我们的前端项目文件夹,一个是我们的nginx配置文件,将他们都放在linux同一个文件夹下,这里使用的是/root/nginx文件夹下

其中配置文件的内容如下(大同小异改改就能用):

worker_processes  1;events {worker_connections  1024;
}http {include       mime.types;default_type  application/json;sendfile        on;keepalive_timeout  65;server {listen       18080;# 指定前端项目所在的位置(容器内的位置)location / {root /usr/share/nginx/html/hmall-portal;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}location /api {rewrite /api/(.*)  /$1 break;# 容器在同一个网络,可以使用容器名访问,hamll就代表了其IPproxy_pass http://hmall:8080;}}server {listen       18081;# 指定前端项目所在的位置(容器内的位置)location / {root /usr/share/nginx/html/hmall-admin;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}location /api {rewrite /api/(.*)  /$1 break;# 容器在同一个网络,可以使用容器名访问,hamll就代表了其IPproxy_pass http://hmall:8080;}}
}

1.4.2 部署

docker run -d \--name nginx \-p 18080:18080 \-p 18081:18081 \-v /root/nginx/html:/usr/share/nginx/html \-v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \--network project \nginx

注意:端口号要与项目一致

1.5 测试

1.5.1 获取宿主机linux的IP地址

如果不能使用ifconfig命令,则先使用如下命令,下载相关应用:

sudo yum install net-tools -y

1.5.2 进行访问

能够成功访问就成功了,撒花!!! 

2 DockerCompose自动化部署(章鱼哥直接拿捏)

在我们的手动部署的过程中,非常繁琐且容易出错,接下来我将介绍更加高效且优雅的方式。"章鱼哥"--DockerCompose

2.1 从docker run到DockerCompose的过渡

以mysql的docker run部署指令为例,如下:

docker run -d \--name mysql \-p 3306:3306 \-e TZ=Asia/Shanghai \-e MYSQL_ROOT_PASSWORD=123 \-v /root/mysql/data:/var/lib/mysql \-v /root/mysql/conf:/etc/mysql/conf.d \-v /root/mysql/init:/docker-entrypoint-initdb.d \--network projectmysql

如果使用docker-compose.yml,可以转变如下:

version: "3.8"services:mysql:image: mysqlcontainer_name: mysqlports:- "3306:3306"environment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: 123volumes:- "/root/mysql/conf:/etc/mysql/conf.d"- "/root/mysql/data:/var/lib/mysql"networks:- new
networks:new:name: project

我们可以看到,两者实际上是一一对应的,这是语法风格不同罢了,其中version: "3.8"是DockerCompose的语法版本。 

与上述例子我们可以得到对应表,如下: 

docker run参数DockerCompose指令说明
--namecontainer_name容器名称
-pports设置端口映射
-eenvironment环境设置
-vvolumes数据卷挂载
--networknetworks网络设置
镜像名称(这里是mysql)image镜像名称

2.2 常用命令

docker compose [OPTIONS] [COMMAND]

OPTIONS和COMMAND都是可选参数,比较常见的有,该图片来自黑马程序员:

2.3 部署

2.3.1 编写docker-compose.yml文件

大同小异,先CV再改改:

version: "3.8"services:mysql:image: mysqlcontainer_name: mysqlports:- "3306:3306"environment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: 123volumes:- "./mysql/conf:/etc/mysql/conf.d"- "./mysql/data:/var/lib/mysql"- "./mysql/init:/docker-entrypoint-initdb.d"networks:- hm-nethmall:build: context: .dockerfile: Dockerfilecontainer_name: hmallports:- "8080:8080"networks:- hm-netdepends_on:- mysqlnginx:image: nginxcontainer_name: nginxports:- "18080:18080"- "18081:18081"volumes:- "./nginx/nginx.conf:/etc/nginx/nginx.conf"- "./nginx/html:/usr/share/nginx/html"depends_on:- hmallnetworks:- hm-net
networks:hm-net:name: project

不过这里有几个点需要注意: 

①被depends_on指令标记的会被优先部署,在这里mysql就会被优先部署

②build是用来构建镜像的,context表示资源路径(点表示当前路径),dockerfile用于寻找我们的Dockerfile文件(默认就是Dockerfile,可以不写,除非将Dockerfile改名了)

③由于我们没给hamll指定镜像名称,docker会自动给它起名root-xx,这里是root-hmall

2.3.2 部署运行

根据docker-compose.yml文件中的路径,将所需的jar包和Dockerfile文件(详情可看1.3.2.1)、mysql文件夹(详情可看1.2.1)、nginx文件夹(详情可看1.4.1)、以及docker-compose.yml放在对应路径下,我这里全部放在一个文件夹下,如下:

docker-compose.yml目录下执行指令,进行部署: 

docker compose up -d

测试和访问参考1.5

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BUUCTF-DASBOOK1

[第一章][1.3.5 案例解析][极客大挑战 2019]Http 1 1.启动靶机 2.查看源代码&#xff0c;发现有链接 3.点击链接&#xff0c;跳转页面有提示&#xff0c;意思是&#xff1a;它并不来自于https:/Sycsecret.buuoj.cn 打开hackbar&#xff0c;如图所示&#xff0c;然后执行 4.得到…

docker搭建dashdot

Dashdot 是一个指标收集工具&#xff0c;用于报告 Kubernetes 集群中的资源使用情况。假设你想要使用 Docker 来搭建 Dashdot&#xff0c;你需要制作或获取一个 Dashdot 的 Docker 镜像&#xff0c;然后可以通过 Docker CLI 命令或者使用 Docker Compose 来配置和运行这个容器。…

TCP包头

TCP包头: 1.序号:发送端发送数据包的编号 2.确认号:已经确认接收到的数据的编号(只有当ACK为1时,确认号才有用) TCP为什么安全可靠: 1.在通信前建立三次握手连接 SYN SYNACK ACK SYN是TCP包头的一个字段 tcp.port 端口号 抓包数据 2.在通信过程中通过序…

数据结构八大算法详解

一、直接插入排序 直接插入排序的核心思想就是&#xff1a;将数组中的所有元素依次跟前面已经排好的元素相比较&#xff0c;如果选择的元素比已排序的元素小&#xff0c;则交换&#xff0c;直到全部元素都比较过。 因此&#xff0c;从上面的描述中我们可以发现&#xff0c;直接…

奖励建模(Reward Modeling)实现人类对智能体的反馈

奖励建模&#xff08;Reward Modeling&#xff09;是强化学习中的一个重要概念和技术&#xff0c;它主要用于训练智能体&#xff08;如AI机器人或大型语言模型&#xff09;如何更有效地学习和遵循人类期望的行为。在强化学习环境中&#xff0c;智能体通过尝试不同的行为获得环境…

【外汇天眼】外汇投资策略:区间突破交易系统

RangeBreak系统介绍 RangeBreak区间突破交易系统被市场广泛用于日内交易&#xff0c;曾经连续多年在《美国期货杂志》盈利交易系统排行榜中位居前十。 目前该交易系统也仍旧被很多专业机构和个人投资者所推崇。 交易者可根据自己的交易习惯和性格特点进行改进&#xff0c;并不…

深入分析Android运行时环境ART:原理、特点与优化策略

摘要 随着移动互联网的快速发展&#xff0c;智能手机的性能和功能日益强大&#xff0c;其中Android操作系统因其开放性和灵活性而占据主导地位。Android运行时环境&#xff08;ART&#xff09;作为执行应用程序代码的关键组件&#xff0c;在系统性能和用户体验方面起着至关重要…

Docker创建nacos容器

1.创建数据库tq_nacos,sql文件可以从 下面地址中下载nacos安装包&#xff0c;解压后获取到sql文件nacos-mysql.sql https://github.com/alibaba/nacos/releases/tag/1.1.4 2.拉取镜像&#xff0c;创建简单容器 docker search nacosdocker pull nacos/nacos-serverdocker run…

Android使用WebView打开内嵌H5网页

Android打开外部网页链接请参考上一篇文章 https://public.blog.csdn.net/article/details/136384559 继上篇&#xff0c;新建assets文章夹&#xff0c;将H5的网页资源放到此文件夹下 把H5的资源文件都拷进来 这个时候&#xff0c;将添加打开本地网页的代码&#xff1a; //打…

3.8 动态规划 背包问题

一.01背包 46. 携带研究材料&#xff08;第六期模拟笔试&#xff09; (kamacoder.com) 代码随想录 (programmercarl.com) 携带研究材料: 时间限制&#xff1a;5.000S 空间限制&#xff1a;128MB 题目描述: 小明是一位科学家&#xff0c;他需要参加一场重要的国际科学大会…

friend(c++ 关键字)

定义 C中&#xff0c;friend关键字用于声明友元函数或友元类&#xff0c;它们可以访问类的私有&#xff08;private&#xff09;和保护&#xff08;protected&#xff09;成员&#xff0c;即使它们不是类的成员。这提供了一种突破数据封装和隐藏的方式&#xff0c;使得某些函数…

[进程间通信]管道通信【初识IPC/模拟匿名管道/模拟进程池】

文章目录 0.认识IPC1.什么是进程间通信&#xff1f;2.IPC的手段3.进程间通信的必要性4.进程间通信的技术背景5.进程间通信的本质理解6.IPC的标准 1.学习管道1.1.管道的认识1.2管道的工作原理1.3管道的特点 2.模拟匿名管道3.模拟进程池3.1task.hpp3.2processpool.cc 0.认识IPC …

AntV L7的pointLayer点图层

本案例使用L7库和Mapbox GL JS创建点数据并加载进地图。 文章目录 1. 引入 CDN 链接2. 引入组件3. 创建地图4. 创建场景5. 创建点数据5.1. 普通 json 数据5.2. geojson 数据 6. 创建点图层6.1. 普通 json 数据6.2. geojson 数据 7. 演示效果8. 代码实现 1. 引入 CDN 链接 <s…

持续集成(CICD)- gogs仓库的部署和使用

文章目录 一、gogs的介绍二、部署gog仓库三、首次启动gogs四、登录五、创建一个非空仓库六、从仓库拉取代码到本地七、把本地编辑的代码上传到仓库 一、gogs的介绍 Gogs作为一个轻量级、易于部署和使用的自托管Git服务&#xff0c;为小型团队和个人开发者提供了一个简单而强大…

985硕的4家大厂实习与校招经历专题分享(part2)

我的个人经历&#xff1a; 985硕士24届毕业生&#xff0c;实验室方向:CV深度学习 就业&#xff1a;工程-java后端 关注大模型相关技术发展 校招offer: 阿里巴巴 字节跳动 等10 研究生期间独立发了一篇二区SCI 实习经历:字节 阿里 京东 B站 &#xff08;只看大厂&#xff0c;面试…

稀碎从零算法笔记Day6-LeetCode:长度最小的子数组

前言&#xff1a;做JD的网安笔试题&#xff0c;结果查找子串&#xff08;单词&#xff09;这个操作不会。痛定思痛&#xff0c;决定学习滑动数组 题型&#xff1a;数组、双指针、滑动窗口 链接&#xff1a;209. 长度最小的子数组 - 力扣&#xff08;LeetCode&#xff09; 来…

VS配置开发与远程调试笔记

先简单写一下&#xff0c;后续详细补充 场景&#xff1a;本地机器开发&#xff0c;虚拟机调试 准备工作&#xff1a; 由于要将生成的文件生成在虚拟机&#xff0c;避免反复拷贝&#xff0c;直接配置虚拟机共享文件夹进行写入&#xff0c;步骤如下&#xff1a; 虚拟机打开网…

修复通达OA 百度ueditor 文件上传漏动

前些日子&#xff0c;服务器阿里云监控报警&#xff0c;有文件木马文件&#xff0c;因为非常忙&#xff0c;就没及时处理&#xff0c;直接删除了木马文件了事。 谁知&#xff0c;这几天对方又上传了木马文件。好家伙&#xff0c;今天不花点时间修复下&#xff0c;你都传上瘾了…

hadoop学习中遇到的问题一

由于看视频总是断断续续&#xff0c;经常遇到各种报错&#xff0c;现将遇到的问题进行总结。 hadoop学习中遇到的问题&#xff1a;hadoop拒绝连接 hadoop安装好之后&#xff0c;在本地浏览器输入地址http://192.168.222.102:9870&#xff0c;提示拒绝连接。在网上找了很多相关…