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


    目录

    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 创建网络

    指令

    1. #创建网络
    2. docker network create
    3. #查看网络
    4. docker network ls

     示例

    注意

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

    1.2 MySQL的部署

    1.2.1 准备

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

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

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

    1. [client]
    2. default_character_set=utf8mb4
    3. [mysql]
    4. default_character_set=utf8mb4
    5. [mysqld]
    6. character_set_server=utf8mb4
    7. collation_server=utf8mb4_unicode_ci
    8. init_connect='SET NAMES utf8mb4'

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

    大致内容如下:

    1. -- 导出 mall 的数据库结构
    2. DROP DATABASE IF EXISTS `hmall`;
    3. CREATE DATABASE IF NOT EXISTS `hmall`;
    4. USE `hmall`;
    5. -- 导出 表 hmall.address 结构
    6. DROP TABLE IF EXISTS `address`;
    7. CREATE TABLE IF NOT EXISTS `address` (
    8. -- 其它内容
    9. );
    10. -- 其它内容

    1.2.2 部署

    指令

    1. docker run -d \
    2. --name mysql \
    3. -p 3306:3306 \
    4. -e TZ=Asia/Shanghai \
    5. -e MYSQL_ROOT_PASSWORD=123 \
    6. -v /root/mysql/data:/var/lib/mysql \
    7. -v /root/mysql/conf:/etc/mysql/conf.d \
    8. -v /root/mysql/init:/docker-entrypoint-initdb.d \
    9. --network project \
    10. 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中添加插件:

    1. <project xmlns="http://maven.apache.org/POM/4.0.0"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <build>
    5. <pluginManagement>
    6. <plugins>
    7. <plugin>
    8. <groupId>org.apache.maven.pluginsgroupId>
    9. <artifactId>maven-compiler-pluginartifactId>
    10. <version>3.8.1version>
    11. <configuration>
    12. <source>11source>
    13. <target>11target>
    14. configuration>
    15. plugin>
    16. plugins>
    17. pluginManagement>
    18. build>
    19. project>

    使用Maven打包

    找到jar包: 

    1.3.1.2 编写Dockerfile文件

    代码如下: 

    1. # 基础镜像
    2. FROM openjdk:11.0-jre-buster
    3. # 设定时区
    4. ENV TZ=Asia/Shanghai
    5. RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    6. # 拷贝jar包
    7. COPY hm-service.jar /app.jar
    8. # 入口
    9. 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 创建并运行容器

    指令

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

    运行截图

    1.4 前端项目的部署

    1.4.1 准备挂载文件

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

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

    1. worker_processes 1;
    2. events {
    3. worker_connections 1024;
    4. }
    5. http {
    6. include mime.types;
    7. default_type application/json;
    8. sendfile on;
    9. keepalive_timeout 65;
    10. server {
    11. listen 18080;
    12. # 指定前端项目所在的位置(容器内的位置)
    13. location / {
    14. root /usr/share/nginx/html/hmall-portal;
    15. }
    16. error_page 500 502 503 504 /50x.html;
    17. location = /50x.html {
    18. root html;
    19. }
    20. location /api {
    21. rewrite /api/(.*) /$1 break;
    22. # 容器在同一个网络,可以使用容器名访问,hamll就代表了其IP
    23. proxy_pass http://hmall:8080;
    24. }
    25. }
    26. server {
    27. listen 18081;
    28. # 指定前端项目所在的位置(容器内的位置)
    29. location / {
    30. root /usr/share/nginx/html/hmall-admin;
    31. }
    32. error_page 500 502 503 504 /50x.html;
    33. location = /50x.html {
    34. root html;
    35. }
    36. location /api {
    37. rewrite /api/(.*) /$1 break;
    38. # 容器在同一个网络,可以使用容器名访问,hamll就代表了其IP
    39. proxy_pass http://hmall:8080;
    40. }
    41. }
    42. }

    1.4.2 部署

    1. docker run -d \
    2. --name nginx \
    3. -p 18080:18080 \
    4. -p 18081:18081 \
    5. -v /root/nginx/html:/usr/share/nginx/html \
    6. -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \
    7. --network project \
    8. 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部署指令为例,如下:

    1. docker run -d \
    2. --name mysql \
    3. -p 3306:3306 \
    4. -e TZ=Asia/Shanghai \
    5. -e MYSQL_ROOT_PASSWORD=123 \
    6. -v /root/mysql/data:/var/lib/mysql \
    7. -v /root/mysql/conf:/etc/mysql/conf.d \
    8. -v /root/mysql/init:/docker-entrypoint-initdb.d \
    9. --network project
    10. mysql

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

    1. version: "3.8"
    2. services:
    3. mysql:
    4. image: mysql
    5. container_name: mysql
    6. ports:
    7. - "3306:3306"
    8. environment:
    9. TZ: Asia/Shanghai
    10. MYSQL_ROOT_PASSWORD: 123
    11. volumes:
    12. - "/root/mysql/conf:/etc/mysql/conf.d"
    13. - "/root/mysql/data:/var/lib/mysql"
    14. networks:
    15. - new
    16. networks:
    17. new:
    18. 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再改改:

    1. version: "3.8"
    2. services:
    3. mysql:
    4. image: mysql
    5. container_name: mysql
    6. ports:
    7. - "3306:3306"
    8. environment:
    9. TZ: Asia/Shanghai
    10. MYSQL_ROOT_PASSWORD: 123
    11. volumes:
    12. - "./mysql/conf:/etc/mysql/conf.d"
    13. - "./mysql/data:/var/lib/mysql"
    14. - "./mysql/init:/docker-entrypoint-initdb.d"
    15. networks:
    16. - hm-net
    17. hmall:
    18. build:
    19. context: .
    20. dockerfile: Dockerfile
    21. container_name: hmall
    22. ports:
    23. - "8080:8080"
    24. networks:
    25. - hm-net
    26. depends_on:
    27. - mysql
    28. nginx:
    29. image: nginx
    30. container_name: nginx
    31. ports:
    32. - "18080:18080"
    33. - "18081:18081"
    34. volumes:
    35. - "./nginx/nginx.conf:/etc/nginx/nginx.conf"
    36. - "./nginx/html:/usr/share/nginx/html"
    37. depends_on:
    38. - hmall
    39. networks:
    40. - hm-net
    41. networks:
    42. hm-net:
    43. 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

  • 相关阅读:
    Transformer 估算 101
    自定义卡包效果实现
    Java之lambda表达式与函数式接口
    JAVA“陶瓷的世界”网页的实际与实现计算机毕业设计Mybatis+系统+数据库+调试部署
    MT2041 三角形的个数
    “2021年中国种业十件大事”发布 国稻种芯百团计划行动
    复现文件上传四次绕过
    【Java并发编程八】synchronized原理
    云服务器最佳实践-Linux云服务器SSH登录的安全加固
    Spring Cloud Alibaba系列之nacos:(3)服务集成Nacos
  • 原文地址:https://blog.csdn.net/qq_71654538/article/details/136520075