Docker-完整项目的部署(保姆级教学)
创始人
2025-01-10 19:08:02
0

目录

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中添加插件:

                                                                      org.apache.maven.plugins                     maven-compiler-plugin                     3.8.1                                              11                          11                                                                   

使用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就代表了其IP             proxy_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就代表了其IP             proxy_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 project   mysql

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

version: "3.8"  services:   mysql:     image: mysql     container_name: mysql     ports:       - "3306:3306"     environment:       TZ: Asia/Shanghai       MYSQL_ROOT_PASSWORD: 123     volumes:       - "/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: mysql     container_name: mysql     ports:       - "3306:3306"     environment:       TZ: Asia/Shanghai       MYSQL_ROOT_PASSWORD: 123     volumes:       - "./mysql/conf:/etc/mysql/conf.d"       - "./mysql/data:/var/lib/mysql"       - "./mysql/init:/docker-entrypoint-initdb.d"     networks:       - hm-net   hmall:     build:        context: .       dockerfile: Dockerfile     container_name: hmall     ports:       - "8080:8080"     networks:       - hm-net     depends_on:       - mysql   nginx:     image: nginx     container_name: nginx     ports:       - "18080:18080"       - "18081:18081"     volumes:       - "./nginx/nginx.conf:/etc/nginx/nginx.conf"       - "./nginx/html:/usr/share/nginx/html"     depends_on:       - hmall     networks:       - 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

相关内容

热门资讯

绝活儿辅助!广西老友玩老是输怎... 绝活儿辅助!广西老友玩老是输怎么办(辅助挂)都是真的有辅助app(讲解有挂)在进入广西老友玩老是输怎...
法门辅助!福建13水插件(辅助... 法门辅助!福建13水插件(辅助挂)一贯是有辅助技巧(有挂技术)1、许多玩家不知道福建13水插件辅助怎...
办法辅助!潮友会app下载官方... 办法辅助!潮友会app下载官方辅助器(辅助挂)真是真的是有辅助app(有挂教程)该软件可以轻松地帮助...
妙招辅助!邯郸胡乐挂辅助(辅助... 妙招辅助!邯郸胡乐挂辅助(辅助挂)好像存在有辅助插件(有挂方略)1、上手简单,内置详细流程视频教学,...
教程书辅助!乐酷辅助(辅助挂)... 教程书辅助!乐酷辅助(辅助挂)其实存在有辅助脚本(有挂细节)乐酷辅助能透视中分为三种模型:乐酷辅助模...
学习辅助!决战卡五星辅助(辅助... 学习辅助!决战卡五星辅助(辅助挂)本来真的是有辅助软件(有人有挂)学习辅助!决战卡五星辅助(辅助挂)...
绝活辅助!边锋嘉兴麻将辅助器(... 绝活辅助!边锋嘉兴麻将辅助器(辅助挂)真是真的有辅助神器(新版有挂)1、边锋嘉兴麻将辅助器公共底牌简...
举措辅助!枫叶辅助器(辅助挂)... 举措辅助!枫叶辅助器(辅助挂)本来存在有辅助技巧(竟然有挂)1、下载好枫叶辅助器正确养号方法之后点击...
讲义辅助!点我达辅助(辅助挂)... 讲义辅助!点我达辅助(辅助挂)一直存在有辅助技巧(有人有挂)1、点我达辅助辅助器安装包、点我达辅助辅...
模块辅助!威信茶馆有挂的吗(辅... 模块辅助!威信茶馆有挂的吗(辅助挂)一直真的是有辅助脚本(揭秘有挂)1、玩家可以在威信茶馆有挂的吗线...