0


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

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就代表了其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

标签: linux docker java

本文转载自: https://blog.csdn.net/qq_71654538/article/details/136520075
版权归原作者 厂里英才 所有, 如有侵权,请联系我们删除。

“Docker-完整项目的部署(保姆级教学)”的评论:

还没有评论